第五講-VHDL數(shù)據(jù)對(duì)象及屬性課件_第1頁
第五講-VHDL數(shù)據(jù)對(duì)象及屬性課件_第2頁
第五講-VHDL數(shù)據(jù)對(duì)象及屬性課件_第3頁
第五講-VHDL數(shù)據(jù)對(duì)象及屬性課件_第4頁
第五講-VHDL數(shù)據(jù)對(duì)象及屬性課件_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1VHDL處理靜態(tài)數(shù)據(jù)的兩種對(duì)象:const和generic。VHDL處理非靜態(tài)數(shù)據(jù)的兩種對(duì)象:信號(hào)和變量。常量和信號(hào)是全局的,既可以用于順序代碼,也可用于并發(fā)代碼;變量只能在順序代碼中使用,相對(duì)于信號(hào)而言,變量只能是局部的,所以變量值不能傳遞到process、function和procedure外部。但是,在有些情況下,選擇信號(hào)還是變量卻是比較難以抉擇的。

信號(hào)(Signal)和變量(Variable)。1VHDL處理靜態(tài)數(shù)據(jù)的兩種對(duì)象:const和generic12常量用于確定默認(rèn)值,語法結(jié)構(gòu):CONST常量名:type:=值;例子:CONSTset_bit:BIT:=‘1’;CONSTdatamemory:memory:=((‘0’,’0’,’1’,’1’),‘0’,’0’,’1’,’1’));常量可以在包集、實(shí)體或結(jié)構(gòu)體中聲明:包集中:全局;實(shí)體中:對(duì)該實(shí)體內(nèi)的所有結(jié)構(gòu)體而言是全局的;結(jié)構(gòu)體中:結(jié)構(gòu)體內(nèi)是全局的。2常量用于確定默認(rèn)值,語法結(jié)構(gòu):CONST常量名:typ23信號(hào)VHDL中‘信號(hào)’代表電路單元、功能模塊間的硬件連線,也可表示電路單元的IN/OUT端口;實(shí)體的所有端口都默認(rèn)為信號(hào),語法結(jié)構(gòu):Signal

信號(hào)名:type[range][:=初始值];注意:當(dāng)信號(hào)用于順序描述語句如process中時(shí),其值不是立刻更新的;只有當(dāng)其所在的process、函數(shù)或過程完成之后才進(jìn)行更新。3信號(hào)VHDL中‘信號(hào)’代表電路單元、功能模塊間的硬件連線34信號(hào)的賦值符號(hào):<=注意1:對(duì)信號(hào)賦初值的操作是不可綜合的,通常只用于仿真。例如:signalcontrol:BIT:=‘0’;注意2:不要對(duì)同一個(gè)信號(hào)進(jìn)行多重賦值。(buffer模式的端口信號(hào)除外?。├纾?/p>

process(...).....foriIN0TO10LOOP

control<=control+1;--error!或最后一次有效!

......4信號(hào)的賦值符號(hào):<=45例1“1”計(jì)數(shù)器功能描述:計(jì)算一個(gè)二進(jìn)制矢量中‘1’的個(gè)數(shù)din[7:0]one[2:0]5例1“1”計(jì)數(shù)器功能描述:計(jì)算一個(gè)二進(jìn)制矢量中‘1’的個(gè)56實(shí)現(xiàn)代碼:---錯(cuò)誤使用信號(hào)的例子

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.all;ENTITYcount_onesiSPORT(din:INstd_logic_vector(0to7);ones:OUTintegerrange0to8);ENDcount_ones;ARCHITECTUREnot_okOFcount_onesIS

signaltemp:integerrange0to8;BEGINprocess(din)BEGIN

temp<=0;FORiIN0TO7LOOPIF(din(i)=‘1’)thentemp<=temp+1;ENDif;ENDLOOP;

ones<=temp;ENDprocess;ENDnot_ok;進(jìn)程結(jié)束后才更新6實(shí)現(xiàn)代碼:---錯(cuò)誤使用信號(hào)的例子進(jìn)程結(jié)束后才更新67兩種代碼更正方法:1、使用變量來記錄中間值,可以將signaltemp...改為variabletemp...;同時(shí)修改相應(yīng)的賦值語句;2、取消temp,同時(shí)將端口信號(hào)ones重新定義為:

ones:BUFFERintegerrange0to8;使得ones可以被內(nèi)部調(diào)用。在進(jìn)程結(jié)束后,ones值將被更新。(編碼風(fēng)格不好,不提倡此種方式!)7兩種代碼更正方法:78變量(variable)變量代表電路單元內(nèi)部的操作,代表暫存的臨時(shí)數(shù)據(jù)。與信號(hào)和常量相比,變量?jī)H用于局部的電路描述,只能用于進(jìn)程、函數(shù)和過程內(nèi)部。注意:對(duì)變量的賦值是立即生效的,無需等待進(jìn)程結(jié)束。新的值可以在下一行代碼中立即使用。變量的賦值符號(hào)“:=”,語法結(jié)構(gòu):variable

變量名:type[range][:=初始值];注意:對(duì)變量賦初值的操作也是不可綜合的,通常只用于仿真。8變量(variable)變量代表電路單元內(nèi)部的操作,代表89例:“1”計(jì)數(shù)器的實(shí)現(xiàn)代碼:

LIBRARYieee;USEieee.std_logic_1164.all;entitycount_onesisport(din:INstd_logic_vector(0to7);ones:OUTintegerrange0to8);endcount_ones;architectureokofcount_onesisbeginprocess(din)

variabletemp:integerrange0to8;begin

temp:=0;FORiIN0TO7LOOPIF(din(i)=‘1’)thentemp:=temp+1;ENDif;ENDLOOP;

ones<=temp;endprocess;endok;變量的賦值是立即生效9例:“1”計(jì)數(shù)器的實(shí)現(xiàn)代碼:變量的賦值是立即生效9OK!!NotOK?OK!!NotOK?1011信號(hào)和變量的比較賦值方式的不同:

變量:=表達(dá)式;

信號(hào)

<=表達(dá)式;硬件實(shí)現(xiàn)的功能不同:

信號(hào)代表電路單元、功能模塊間的互聯(lián),代表實(shí)際的硬件連線;

變量代表電路單元內(nèi)部的操作,代表暫存的臨時(shí)數(shù)據(jù)。

11信號(hào)和變量的比較賦值方式的不同:1112有效范圍的不同:

信號(hào):程序包、實(shí)體、結(jié)構(gòu)體;全局量。

變量:進(jìn)程、子程序;局部量。

ARCHITECTURE{SIGNALDeclarations}label1:PROCESS{VARIABLEDeclarations}label2:PROCESS{VARIABLEDeclarations}┇12有效范圍的不同:{SIGNALDeclarations1213賦值行為的不同:

信號(hào)賦值延遲更新數(shù)值、時(shí)序電路;

變量賦值立即更新數(shù)值、組合電路。信號(hào)的多次賦值

a.一個(gè)進(jìn)程:最后一次賦值有效b.多個(gè)進(jìn)程:多源驅(qū)動(dòng),線與、線或、三態(tài)

13賦值行為的不同:1314例:信號(hào)的多次賦值

architecturertlofexissignala:std_logic;begin

process(…)begina<=b;…a<=c;endprocess;endrtl;architecturertlofexissignala:std_logic;begin

process(…)begina<=b;…endprocess;

process(…)begina<=c;...endprocess;endex;14例:信號(hào)的多次賦值architectu1415例:信號(hào)賦值與變量賦值的比較

信號(hào)賦值:

architecturertlofsigissignala,b:std_logic;--定義信號(hào)beginprocess(a,b)begina<=b;b<=a;endprocess;endrtl;--結(jié)果是a和b的值互換15例:信號(hào)賦值與變量賦值的比較1516

變量賦值

architecturertlofvarisbeginprocessvariablea,b:std_logic;--定義變量begina:=b;b:=a;endprocess;

endrtl;

--結(jié)果是a和b的值都等于b的初值

16變量賦值1617例:變量賦值實(shí)現(xiàn)循環(huán)語句功能

process(indicator,sig)variabletemp:std_logic;begintemp:=‘0’;foriin0to3looptemp:=tempxor(sig(i)andindicator(i));endloop;output<=temp;endprocess;17例:變量賦值實(shí)現(xiàn)循環(huán)語句功能1718以上語句等效為:process(indicator,sig)variabletemp:std_logic;begintemp:=‘0’;temp:=tempxor(sig(0)andindicator(0));temp:=tempxor(sig(1)andindicator(1));temp:=tempxor(sig(2)andindicator(2));temp:=tempxor(sig(3)andindicator(3));output<=temp;endprocess;18以上語句等效為:1819如改為信號(hào),則無法實(shí)現(xiàn)原功能:

……signaltemp:std_logic;

……process(indicator,sig,temp)begintemp<=‘0’;temp<=tempxor(sig(0)andindicator(0));temp<=tempxor(sig(1)andindicator(1));temp<=tempxor(sig(2)andindicator(2));temp<=tempxor(sig(3)andindicator(3));output<=temp;endprocess;19如改為信號(hào),則無法實(shí)現(xiàn)原功能:1920例3:多路復(fù)用器的對(duì)比設(shè)計(jì)方案一:使用信號(hào)(notOK)

LIBRARYieee;USEieee.std_logic_1164.all;entitymuxisport(a,b,c,d,s0,s1:INstd_logic;y:OUTstd_logic);endmux;architecturenot_okofmuxis

signalsel:integerrange0to3;begin

值不能立即更新,不能在process的其它代碼中繼續(xù)使用不能進(jìn)行同一信號(hào)的多次賦值,要么出錯(cuò),要么“線與”,要么只考慮最后一次賦值,取決于編譯器process(a,b,c,d,s0,s1)begin

sel<=0;if(s0=‘1’)thensel<=sel+1;endif;if(s1=‘1’)thensel<=sel+2;endif;caseseliswhen0=>y<=a;when1=>y<=b;when2=>y<=c;when3=>y<=d;endcase;endprocess;endnot_ok;20例3:多路復(fù)用器的對(duì)比設(shè)計(jì)值不能立即更新,不能在proc2021例3:案二:使用變量(OK)

LIBRARYieee;USEieee.std_logic_1164.all;entitymuxisport(a,b,c,d,s0,s1:INstd_logic;y:OUTstd_logic);endmux;architectureokofmuxisbeginprocess(a,b,c,d,s0,s1)variablesel:integerrange0to3;

值可以立即更新,能夠在process的其它代碼中繼續(xù)使用

begin

sel:=0;if(s0=‘1’)thensel:=sel+1;endif;if(s1=‘1’)thensel:=sel+2;endif;caseseliswhen0=>y<=a;when1=>y<=b;when2=>y<=c;when3=>y<=d;endcase;endprocess;

endok;21例3:案二:使用變量(OK)值可以立即更新,能夠在pro2122例5.1.4帶q和qbar的DFF

DFFqdclkqbar功能描述:D觸發(fā)器

qbar為q的反相輸出端。22例5.1.4帶q和qbar的DFFDFFqdclk2223方案1:not_ok---------------------------------------------------libraryieee;useieee.std_logic_1164.all;--------------------------------------------------entitydffisport(d,clk:INstd_logic;q:BUFFERstd_logic;qbar:OUTstd_logic);enddff;-----------------------------------------------architecturenot_okofdffisbeginprocess(clk)begin

if(clk’eventANDclk=‘1’)then

q<=d;qbar<=NOTq;endif;endprocess;endnot_ok;-------------------------------------方案2:ok------------------------------------------------------libraryieee;useieee.std_logic_1164.all;--------------------------------------------------entitydffisport(d,clk:INstd_logic;q:BUFFERstd_logic;qbar:OUTstd_logic);enddff;-----------------------------------------------architectureokofdffisbeginprocess(clk)beginif(clk’eventANDclk=‘1’)then

q<=d;endif;endprocess;

qbar<=NOTq;endmux2;-----------------------------------q值在process之后更新,引起qbar的同步更新q不能立即更新,導(dǎo)致qbar值將延后一個(gè)時(shí)鐘周期buffer類型輸出信號(hào)可供內(nèi)部電路使用23方案1:not_ok方案2:okq值在process23NotokOKNotokOK2425分頻器功能描述:對(duì)時(shí)鐘進(jìn)行6分頻;設(shè)計(jì)要點(diǎn):兩個(gè)輸出,一個(gè)基于信號(hào),另一個(gè)基于變量。分頻器fclkfclk/625分頻器功能描述:對(duì)時(shí)鐘進(jìn)行6分頻;分頻器fclkfclk2526實(shí)現(xiàn)代碼:

LIBRARYieee;USEieee.std_logic_1164.all;entityfreq_dividerisport(clk:INstd_logic;out1,out2:BUFFER

std_logic);endfreq_divider;architectureexampleoffreq_divideris

SIGNALcount1:integerrange0to7;beginprocess(clk)variablecount2:integerrange0to7;beginif(clk’eventANDclk=‘1’)thencount1<=count1+1;

count2:=count2+1;if(count1=___)then

out1<=NOTout1;

count1<=0;endif;if(count2=___)then

out2<=NOTout2;

count2:=0;endif;endif;endprocess;endexample;未賦初值,但范圍固定buffer類型,可以實(shí)現(xiàn)電平翻轉(zhuǎn);另,將std_logic改為bit類型更好些!計(jì)數(shù)清零信號(hào)延遲更新,變量即時(shí)更新,填空區(qū)別?26實(shí)現(xiàn)代碼:未賦初值,但范圍固定bu26第五講-VHDL數(shù)據(jù)對(duì)象及屬性課件2728寄存器的數(shù)量--對(duì)電路面積的重要影響

不同的編譯器(仿真工具、綜合工具等)對(duì)不同風(fēng)格的代碼進(jìn)行編譯時(shí)產(chǎn)生的寄存器數(shù)量是不同的。本小節(jié)目的:了解可以使用什么方法來減少寄存器數(shù)量;了解代碼是否可以實(shí)現(xiàn)預(yù)期的結(jié)果;28寄存器的數(shù)量--對(duì)電路面積的重要影響不同的編28寄存器生成的條件對(duì)信號(hào)來說:當(dāng)一個(gè)信號(hào)的賦值是以另一個(gè)信號(hào)的邊沿或跳變?yōu)闂l件時(shí)(即發(fā)生同步賦值時(shí)),該信號(hào)經(jīng)編譯后就會(huì)生成寄存器。同步賦值只能在進(jìn)程、函數(shù)或過程等順序代碼中出現(xiàn),一般在語句ifsignal’event....或waituntil之后。對(duì)變量來說:(1)若一個(gè)變量是在一個(gè)信號(hào)跳變時(shí)被賦值,并且該值最終又被賦給了另外的信號(hào)(數(shù)值傳遞作用),則將生成寄存器。(2)一個(gè)變量未進(jìn)行賦值操作時(shí)已經(jīng)被信號(hào)使用,也將產(chǎn)生寄存器(用以存儲(chǔ)process上一次執(zhí)行后c的值)。如果未被進(jìn)程、函數(shù)或過程之外的代碼調(diào)用,則不一定生成寄存器。寄存器生成的條件2930例:output1和output2都被寄存的情況

process(clk)beginif(clk’eventANDclk=‘1’)thenoutput1<=temp;--被存儲(chǔ)或生成寄存器;

output2<=a;--被存儲(chǔ)或生成寄存器;

endif;endprocess;原因:對(duì)信號(hào)來說:當(dāng)一個(gè)信號(hào)的賦值是以另一個(gè)信號(hào)的邊沿或跳變?yōu)闂l件時(shí)(即發(fā)生同步賦值時(shí)),該信號(hào)經(jīng)編譯后就會(huì)生成寄存器。同步賦值只能在進(jìn)程、函數(shù)或過程等順序代碼中出現(xiàn),一般在語句ifsignal’event....或waituntil之后。30例:output1和output2都被寄存的情況原因:對(duì)3031例:output1被寄存、output2未被寄存的情況

process(clk)beginif(clk’eventANDclk=‘1’)thenoutput1<=temp;--被存儲(chǔ)或生成寄存器;

endif;output2<=a;--未以另一個(gè)信號(hào)的邊沿跳變進(jìn)行賦值,--故未被存儲(chǔ);

endif;endprocess;31例:output1被寄存、output2未被寄存的情況3132例:變量被寄存的情況

process(clk)variabletemp:BIT;beginif(clk’eventANDclk=‘1’)thentemp:=a;endif;x<=temp;--temp促使x被存儲(chǔ);

endprocess;原因:對(duì)變量來說:

若一個(gè)變量是在一個(gè)信號(hào)跳變時(shí)被賦值,并且該值最終又被賦給了另外的信號(hào)(數(shù)值傳遞作用),則將生成寄存器。32例:變量被寄存的情況原因:對(duì)變量來說:若一個(gè)變量是在一3233例6:帶q和qbar的DFF

帶q和qbar的

DFFqdclkqbar功能描述:D觸發(fā)器

qbar為q的反相輸出端。兩種實(shí)現(xiàn)方案:方案一生成兩個(gè)寄存器,方案二生成一個(gè)寄存器。33例6:帶q和qbar的DFF帶q和qbar的DF3334方案1:two-dff---------------------------------------------------libraryieee;useieee.std_logic_1164.all;--------------------------------------------------entitydffisport(d,clk:INstd_logic;q:BUFFERstd_logic;qbar:OUTstd_logic);enddff;-----------------------------------------------architecturetwo_dffofdffisbeginprocess(clk)begin

if(clk’eventANDclk=‘1’)then

q<=d;qbar<=NOTq;endif;endprocess;endtwo_dff;-------------------------------------生成兩個(gè)寄存器

DFFqdclk

DFFqbar34方案1:two-dff生成兩個(gè)寄存器DFFqdcl3435方案2:one-dff------------------------------------------------------libraryieee;useieee.std_logic_1164.all;--------------------------------------------------entitydffisport(d,clk:INstd_logic;q:BUFFERstd_logic;qbar:OUTstd_logic);enddff;-----------------------------------------------architectureone_dffofdffisbeginprocess(clk)beginif(clk’eventANDclk=‘1’)then

q<=d;endif;endprocess;

qbar<=NOTq;endone_dff;-----------------------------------

DFFqdclkqbar生成一個(gè)寄存器使用組合邏輯,而不是寄存器35方案2:one-dffDFFqdclkqbar生成3536小結(jié)

如果不對(duì)代碼進(jìn)行有效合理的組織,則會(huì)生成額外的寄存器。

另外,在一些FPGA/CPLD器件中,對(duì)同一個(gè)代碼,綜合工具與布局布線工具的報(bào)告文件顯示寄存器的數(shù)目可能是不一致的。36小結(jié)

如果不對(duì)代碼進(jìn)行有效合理的組織,則會(huì)生成額3637例7模8計(jì)數(shù)器

計(jì)數(shù)器clkcount(2:0)rst功能描述:

模8計(jì)數(shù)器。兩種實(shí)現(xiàn)方案:方案一使用變量進(jìn)行同步賦值,方案二使用信號(hào)進(jìn)行同步賦值。37例7模8計(jì)數(shù)器計(jì)數(shù)器clkcount(2:0)rs3738方案1:變量方式------------------------------------------------entitycounterisport(clk,rst:INBIT;count:OUTintegerrange0to7);endcounter;-----------------------------------------------architecturecounterofcounterisbeginprocess(clk,rst)

variabletemp:integerrange0to7;begin

if(rst=‘1’)thentemp:=0;

elsif(clk’eventANDclk=‘1’)thentemp:=temp+1;

endif;

count<=temp;endprocess;endcounter;方案2:信號(hào)方式--------------------------------------------------entitycounterisport(rst,clk:INBIT;count:BUFFERintegerrange0to7);endcounter;-----------------------------------------------architecturecounterofcounterisbeginprocess(clk,rst)beginif(rst=‘1’)thencount<=0;elsif(clk’eventANDclk=‘1’)then

count<=count+1;endif;endprocess;endcounter;

buffer類型端口不必聲明包集都需要使用寄存器來保存3位的當(dāng)前計(jì)數(shù)值,綜合時(shí)均會(huì)生成3個(gè)寄存器。38方案1:變量方式方案2:信號(hào)方式buffer類型端口3839例8移位寄存器

DFFdoutdinclk

DFF

DFF

DFF三個(gè)設(shè)計(jì)方案:三個(gè)變量順序排列三個(gè)信號(hào)順序排列三個(gè)變量顛倒順序排列39例8移位寄存器DFFdoutdinclkDFF3940方案1:三個(gè)變量順序排列------------------------------------------------entityshiftisport(clk,din:INBIT;dout:OUTBIT);endshift;-----------------------------------------------architectureshiftofshiftisbeginprocess(clk)

variablea,b,c:BIT;begin

if(clk’eventANDclk=‘1’)then

dout<=c;c:=b;b:=a;a:=din;endif;endprocess;endshift;方案2:三個(gè)信號(hào)順序排列--------------------------------------------------entityshiftisport(din,clk:INBIT;dout:OUTBIT);endshift;-----------------------------------------------architectureshiftofshiftissignala,b,c:BIT;beginprocess(clk)beginif(clk’eventANDclk=‘1’)then

a<=din;b<=a;c<=b;dout<=c;endif;endprocess;endshift;

生成4個(gè)寄存器不必聲明包集生成1個(gè)寄存器c、b、a的值被賦給dout、c、b之前沒有被賦過值,綜合時(shí)會(huì)生成3個(gè)寄存器,用以存儲(chǔ)process上一次執(zhí)行后c、b、a的值。方案一、二的波形相同,dout較din延后4個(gè)時(shí)鐘周期40方案1:三個(gè)變量順序排列方案2:三個(gè)信號(hào)順序排列生成4041方案3:三個(gè)變量顛倒順序排列entityshiftisport(clk,din:INBIT;dout:OUTBIT);endshift;---------------------------------------architectureshiftofshiftisbeginprocess(clk)

variablea,b,c:BIT;beginif(clk’eventANDclk=‘1’)then

a:=din;b:=a;c:=b;

dout<=c;

endif;endprocess;endshift;方案1:三個(gè)變量順序排列------------------------------------------------entityshiftisport(clk,din:INBIT;dout:OUTBIT);endshift;-----------------------------------------------architectureshiftofshiftisbeginprocess(clk)

variablea,b,c:BIT;begin

if(clk’eventANDclk=‘1’)then

dout<=c;c:=b;b:=a;a:=din;

endif;endprocess;endshift;賦值順序與方案一相反,因?qū)ψ兞康馁x值是立即生效的,三行代碼可以簡(jiǎn)化為c:=din。整個(gè)四行代碼可以簡(jiǎn)化為dout<=din;方案三中dout較din延后1個(gè)時(shí)鐘周期,未能實(shí)現(xiàn)設(shè)計(jì)初衷41方案3:三個(gè)變量顛倒順序排列方案1:三個(gè)變量順序排列4142例9移位寄存器#2—增加了一個(gè)復(fù)位端兩種設(shè)計(jì)方案:用信號(hào)生成寄存器用變量生成寄存器

DFFdclk

DFF

DFF

DFFrstinternal(3)internal(2)internal(1)internal(0)42例9移位寄存器#2—增加了一個(gè)復(fù)位端兩種設(shè)計(jì)方案:42方案1:內(nèi)部信號(hào)方式libraryieee;useieee.std_logic_1164.all;entityshiftregisport(d,clk,rst:INstd_logic;q:OUTstd_logic);endshiftreg;architecturebehaviorofshiftregis

signalinternal:std_logic_vector(3downto0);beginprocess(clk,rst)begin

if(rst=‘1’)theninternal<=(ohters=>’0’);elsif(clk’eventANDclk=‘1’)then

internal<=d&internal(3donwto1);

endif;endprocess;

q<=internal(0);endbehavior;生成4個(gè)寄存器,輸出比輸入延后四個(gè)時(shí)鐘周期方案2:內(nèi)部變量方式

libraryieee;useieee.std_logic_1164.all;entityshiftregisport(d,clk,rst:INstd_logic;q:OUTstd_logic);endshiftreg;architecturebehaviorofshiftregis

variableinternal:std_logic_vector(3downto0);beginprocess(clk,rst)begin

if(rst=‘1’)theninternal:=(ohters=>’0’);elsif(clk’eventANDclk=‘1’)then

internal:=d&internal(3donwto1);

endif;endprocess;

q<=internal(0);endbehavior;方案1:內(nèi)部信號(hào)方式生成4個(gè)寄存器,輸出比輸入延后四個(gè)時(shí)鐘4344屬性(ATTRIBUTE)屬性是指從指定的客體或?qū)ο螅ㄈ鏴ntity/type/architecture等)中獲取關(guān)心的數(shù)據(jù)或信息。利用屬性可以使VHDL源代碼更加簡(jiǎn)明扼要,易于理解;語法:對(duì)象’屬性預(yù)定義的屬性:數(shù)值類屬性和信號(hào)類屬性44屬性(ATTRIBUTE)屬性是指從指定的客體或?qū)ο螅?445數(shù)值類屬性:獲取數(shù)組、塊或一般數(shù)據(jù)的相關(guān)信息。VHDL預(yù)先定義的、可綜合的數(shù)值類屬性:

left:索引的左邊界值

right:索引的右邊界值

high:索引的上限值

low:索引的上限值

length:索引的長(zhǎng)度值range:索引的位寬范圍

reverse_range:索引的反向位寬范圍45數(shù)值類屬性:獲取數(shù)組、塊或一般數(shù)據(jù)4546例:

variablemy_vector:bit_vector(5downto-5);各屬性如下:

my_vector’left5my_vector’right-5my_vector’high5my_vector’low-5my_vector’length11my_vector’range(5downto-5)my_vector’reverse_range(-5to5)46例:4647枚舉類型數(shù)值的屬性:通常是不可綜合的VAL(pos):指定位置(pos)的值POS(value):給定數(shù)值的位置序號(hào)LEFTOF(value):給定數(shù)值的左側(cè)值VAL(row,column):位于行、列位置的值

47枚舉類型數(shù)值的屬性:通常是不可綜合的4748

信號(hào)類屬性VHDL預(yù)定義的,對(duì)于信號(hào)s:

EVENT:

如果s值發(fā)生了變化,則返回值為true,否則為false,常用于時(shí)鐘信號(hào)的判定。

STABLE如果s值保持不變,則返回值為true,否則為false;

ACTIVE如果s值為‘1’,則返回值為true,否則為false;

QUIET<time>如果在指定的time內(nèi)s值保持不變,則返回值為true,否則為false;48信號(hào)類屬性48LAST_EVENT

返回從上一次事件發(fā)生的時(shí)間到當(dāng)前時(shí)間的時(shí)間差;LAST_ACTIVE

最后一次s=‘1’到當(dāng)前所經(jīng)歷的時(shí)間長(zhǎng)度值;LAST_VALUE

最后一次變化前s的值;除EVENT和STABLE屬性是可以綜合的之外,其它的屬性都不可綜合,僅用于仿真。例:對(duì)信號(hào)clk是否出現(xiàn)上升沿進(jìn)行判斷

IF(clk’EVENTandclk=‘1’)..IF(NOTclk’STABLEandclk=‘1’)..LAST_EVENT例:對(duì)信號(hào)clk是否出現(xiàn)上升沿進(jìn)行判4950用戶自定義的屬性用戶自定義屬性的聲明,語法如:ATTRIBUTEattribute_name:attribute_type;attribute_type可以是任何數(shù)據(jù)類型,包括預(yù)定義的數(shù)據(jù)類型。用戶自定義屬性的描述,語法如:ATTRIBUTEattribute_nameOFtarget_name:classISvalue;

class可以是數(shù)據(jù)類型、信號(hào)、變量、函數(shù)、實(shí)體或構(gòu)造體等。

50用戶自定義的屬性用戶自定義屬性的聲明,語法如:5051例:

attributenumber_of_in:integer;--屬性聲明;

attributenumber_of_inofnand3:signalis3;--屬性描述;inputs<=nand3’number_of_in;--屬性調(diào)用,返回值為3;例:枚舉類型編碼:通常采用順序編碼的方式

TYPEcolorIS(red,green,blue,white);

默認(rèn)的編碼是:

red=“00”;green=“01”;blue=“10”;white=“11”;可對(duì)編碼次序進(jìn)行修改:

attributeenum_codingofcolor:typeis“11001001”;(值可選,如typeis“1000000101000010”)51例:5152設(shè)計(jì)實(shí)例:

例1:通用譯碼器功能描述:m-n譯碼器,m=log2n52設(shè)計(jì)實(shí)例:5253端口描述兩個(gè)輸入端口:ena和sel(m-1:0)一個(gè)輸出端口:x(n-1:0)功能特征分析根據(jù)真值表,確定ena/sel與x的關(guān)系:當(dāng)ena為‘0’時(shí),x為“1111_1111”;當(dāng)ena為‘1’時(shí),8位的二進(jìn)制數(shù)“1111_1111”的某位變?yōu)椤?’,其它位保持‘1’。該位的確定取決于sel的值;確定端口規(guī)格:本例中m為3,n為8;設(shè)計(jì)要點(diǎn)如何根據(jù)sel的值確定需由‘1’變‘0’的位置?分析真值表發(fā)現(xiàn):將sel由二進(jìn)制數(shù)轉(zhuǎn)換成十進(jìn)制數(shù)temp2,則需由‘1’變?yōu)椤?’的位的位置為temp2。如何將二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)?循環(huán)累加!53端口描述5354具體實(shí)現(xiàn):1------------------------------------------------------2libraryieee;3useieee.std_logic_1164.all;4--------------------------------------------------5entitydecoderis6port(ena:INstd_logic;7sel:INstd_logic_vector(2downto0);8x:OUTstd_logic_vector(7downto0));9enddecoder;10-----------------------------------------------54具體實(shí)現(xiàn):545511architecturegeneric_decoderofdecoderis12begin13process(ena,sel)14variabletemp1:std_logic_vector(x’highdownto0);15variabletemp2:integerrange0tox’high;16begin17temp1:=(others=>’1’);18temp2:=0;19if(ena=‘1’)then20FOR

iINsel’range

loop21if(sel(i)=‘1’)then22temp2:=2*temp2+1;23else24temp2:=2*temp2;25endif;26ENDloop;27temp1(temp2):=‘0’;28endif;29x<=temp1;30endprocess;31endgeneric_decoder;32-------------------------------------------指2

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論