EDA技術(shù)和VHDL設(shè)計(jì)第4章VHDL語(yǔ)言要素課件_第1頁(yè)
EDA技術(shù)和VHDL設(shè)計(jì)第4章VHDL語(yǔ)言要素課件_第2頁(yè)
EDA技術(shù)和VHDL設(shè)計(jì)第4章VHDL語(yǔ)言要素課件_第3頁(yè)
EDA技術(shù)和VHDL設(shè)計(jì)第4章VHDL語(yǔ)言要素課件_第4頁(yè)
EDA技術(shù)和VHDL設(shè)計(jì)第4章VHDL語(yǔ)言要素課件_第5頁(yè)
已閱讀5頁(yè),還剩283頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4章VHDL語(yǔ)言要素

4.1VHDL文字規(guī)則4.2數(shù)據(jù)對(duì)象4.3VHDL的數(shù)據(jù)類型4.4VHDL操作符4.5屬性第4章VHDL語(yǔ)言要素

4.1VHDL文字規(guī)則4.1VHDL文字規(guī)則

VHDL文字主要包括數(shù)值型文字和標(biāo)識(shí)符。數(shù)值型文字主要有數(shù)字型、字符串型。

4.1.1數(shù)值型文字

1.?dāng)?shù)字型

數(shù)字型文字有多種表達(dá)方式,列舉如下:

(1)整數(shù)(Integer)。整數(shù)是十進(jìn)制數(shù),與算數(shù)整數(shù)相似,包括正整數(shù)、負(fù)整數(shù)和零,表示范圍是?-(231?-?1)~(231?-?1),即?-2?147?483?647~2?147?483?647。整數(shù)的表達(dá)方式舉例:

1,234,567E2(=?56700),12_345_678(?=?12?345?678)4.1VHDL文字規(guī)則

VHDL文字主要包括其中,數(shù)字間的下劃線僅僅是為了提高文字的可讀性,相當(dāng)于一個(gè)空的間隔符,沒(méi)有其他意義,也不影響文字本身的數(shù)值。

(2)實(shí)數(shù)(Real)。實(shí)數(shù)也是十進(jìn)制的數(shù),但必須帶有小數(shù)點(diǎn)。它類似于數(shù)學(xué)上的實(shí)數(shù),或稱浮點(diǎn)數(shù),表示范圍是?-1.0E38~1.0E38。實(shí)數(shù)的表達(dá)方式舉例:

0.0,123.45,6.0,78.99E?-?2(?=?0.7899),12_345.678_999(=12345.678999)其中,數(shù)字間的下劃線僅僅是為了提高文字的可讀性,相當(dāng)于一個(gè)空(3)以數(shù)制基數(shù)表示的格式。用這種方式表示的數(shù)由五部分組成:第一部分,基數(shù),用十進(jìn)制數(shù)表明所用數(shù)制;第二部分,數(shù)制隔離符號(hào)“#”;第三部分,所要表達(dá)的數(shù);第四部分,指數(shù)隔離符號(hào)“#”;第五部分,用十進(jìn)制數(shù)表示的指數(shù),如果這一部分為0可以省去不寫。以數(shù)制基數(shù)表示的文字表達(dá)方式舉例:

10#235# (十進(jìn)制數(shù)表示,等于235)

2#1110_1011# (二進(jìn)制數(shù)表示,等于235)

8#353# (八進(jìn)制數(shù)表示,等于235)

16#EB# (十六進(jìn)制數(shù)表示,等于235)

16#E#E1 (十六進(jìn)制數(shù)表示,等于16#E0#,等于2#11100000#,等于224)

16#F.01#E2 (十六進(jìn)制數(shù)表示,等于16#F01#,等于3841.00)(3)以數(shù)制基數(shù)表示的格式。用這種方式表示的數(shù)由五部分(4)物理文字量。物理文字量包括時(shí)間、電阻、電流等,但此類文字綜合器不能接受,多用于仿真。物理文字量的表達(dá)方式舉例:

55ns,177A,23m

它一般由整數(shù)和單位兩部分組成,整數(shù)與單位間至少留一個(gè)空格。(4)物理文字量。物理文字量包括時(shí)間、電阻、電流等,但2.字符串型

字符是用單引號(hào)引起來(lái)的ASCII字符,可以是數(shù)值,也可以是符號(hào)或字母,如?‘A’、‘8’、‘a(chǎn)’、‘-’。字符串是字符的一維數(shù)組,必須使用雙引號(hào)引起來(lái)。VHDL中有兩種字符串:文字字符串和數(shù)位字符串。

(1)文字字符串。文字字符串即用雙引號(hào)引起來(lái)的一串文字,舉例:

“STRING”,“BothAandBequalto0“

(2)數(shù)位字符串。數(shù)位字符串即位矢量,用雙引號(hào)引起來(lái)的一維位(BIT,VHDL預(yù)定義數(shù)據(jù)類型)數(shù)據(jù),采用基數(shù)符加字符串的表達(dá)形式,舉例:2.字符串型

字符是用單引號(hào)引起來(lái)的ASCII字符B“1_1101_0010” (二進(jìn)制數(shù)組,位矢量長(zhǎng)度是9)

O“34” (八進(jìn)制數(shù)組,位矢量長(zhǎng)度是6,相當(dāng)于B“011100”)

X“1AB” (十六進(jìn)制數(shù)組,位矢量長(zhǎng)度是12)

其中,B代表二進(jìn)制基數(shù)符號(hào),表示二進(jìn)制數(shù)位0或者1,字符串中的每一位表示一個(gè)BIT;O代表八進(jìn)制基數(shù)符號(hào),字符串中的每一位代表一個(gè)八進(jìn)制數(shù),即3位BIT的二進(jìn)制數(shù);X代表十六進(jìn)制基數(shù)符號(hào),字符串中的每一位代表一個(gè)十六進(jìn)制數(shù),即一個(gè)4位的二進(jìn)制數(shù)。B“1_1101_0010” (二進(jìn)制數(shù)組,位矢量長(zhǎng)度是分析下面表達(dá)方式的正確性:

B“1000_1110”--二進(jìn)制數(shù)組,數(shù)組長(zhǎng)度8,表達(dá)正確

B“10001110” --二進(jìn)制數(shù)組,數(shù)組長(zhǎng)度8,表達(dá)正確

“1000_1110” --表達(dá)錯(cuò)誤,如果省去B,則不能加下劃線

“10001110” --表達(dá)正確

"1AB" --表述錯(cuò)誤,除二進(jìn)制外,八進(jìn)制和十六進(jìn)制不能省去基數(shù)符分析下面表達(dá)方式的正確性:

B“1000_1114.1.2標(biāo)識(shí)符

VHDL中的標(biāo)識(shí)符可以是常量、變量、信號(hào)、端口、子程序或參數(shù)的名稱。使用標(biāo)識(shí)符要遵守一定的法則,這不僅是對(duì)電子系統(tǒng)設(shè)計(jì)工程師的一個(gè)約束,同時(shí)也為各種EDA工具提供標(biāo)準(zhǔn)的書寫規(guī)范,使之在綜合仿真過(guò)程中不產(chǎn)生歧義,易于仿真。VHDL中的標(biāo)識(shí)符分為基本標(biāo)識(shí)符和擴(kuò)展標(biāo)識(shí)符兩種?;緲?biāo)識(shí)符的規(guī)則如下:

(1)標(biāo)識(shí)符由字母(A~Z,a~z)、數(shù)字(0~9)和下劃線(?_?)組成。

(2)任何標(biāo)識(shí)符必須以英文字母開頭。4.1.2標(biāo)識(shí)符

VHDL中的標(biāo)識(shí)符可以是常量、變量(3)不允許出現(xiàn)多個(gè)連續(xù)的下劃線,只能是單一下劃線,且不能以下劃線結(jié)束。

(4)標(biāo)識(shí)符不區(qū)分英文字母大小寫。

(5)?VHDL定義的保留字或關(guān)鍵詞,不能用作標(biāo)識(shí)符。

(6)?VHDL中的注釋文字一律由兩個(gè)連續(xù)的連接線“--”開始,可以出現(xiàn)在任一語(yǔ)句后面,也可以出現(xiàn)在獨(dú)立行。

分析下面標(biāo)識(shí)符的合法性:

_decoder --非法標(biāo)識(shí)符,起始不能是非英文字母

3dop --非法標(biāo)識(shí)符,起始不能是非英文字母

large#number –非法標(biāo)識(shí)符,“?!辈荒艹蔀闃?biāo)識(shí)符的構(gòu)成(3)不允許出現(xiàn)多個(gè)連續(xù)的下劃線,只能是單一下劃線,且sig_N --合法標(biāo)識(shí)符

state0 --合法標(biāo)識(shí)符

NOT-ACK --非法標(biāo)識(shí)符,“-”不能成為標(biāo)識(shí)符的構(gòu)成

Data__bus --非法標(biāo)識(shí)符,不能含有多個(gè)下劃線

Copper__ --非法標(biāo)識(shí)符,不能以下劃線結(jié)束

Return --非法標(biāo)識(shí)符,關(guān)鍵字不能用作標(biāo)識(shí)符

tx_clk --合法標(biāo)識(shí)符sig_N --合法標(biāo)識(shí)符

staVHDL93標(biāo)準(zhǔn)還支持?jǐn)U展標(biāo)識(shí)符,以反斜杠來(lái)界定,免去了87標(biāo)準(zhǔn)中基本標(biāo)識(shí)符的一些限制,如:可以以數(shù)字打頭,允許包含圖形符號(hào),允許使用VHDL保留字,區(qū)分字母大小寫等。擴(kuò)展標(biāo)識(shí)符舉例:\entity\、\2chip\、\EDA\、\eda\、\aa\\bb\。但目前仍有較多VHDL工具不支持?jǐn)U展標(biāo)識(shí)符,所以本書仍以87標(biāo)準(zhǔn)為準(zhǔn)。由于VHDL語(yǔ)言不區(qū)分大小寫,在書寫時(shí)一定要養(yǎng)成良好的書寫習(xí)慣。一般而言,應(yīng)用關(guān)鍵詞時(shí)應(yīng)大寫,自行定義的標(biāo)識(shí)符應(yīng)小寫。VHDL93標(biāo)準(zhǔn)還支持?jǐn)U展標(biāo)識(shí)符,以反斜杠來(lái)界定,免去了4.2數(shù)據(jù)對(duì)象

在VHDL中,凡是可以賦予一個(gè)值的客體稱為數(shù)據(jù)對(duì)象。數(shù)據(jù)對(duì)象是數(shù)據(jù)類型的載體,可以把它看做一個(gè)容器,能夠接收不同數(shù)據(jù)類型的賦值。常用的數(shù)據(jù)對(duì)象有:常量(CONSTANT)、變量(VARIABLE)和信號(hào)(SIGNAL)。4.2數(shù)據(jù)對(duì)象

在VHDL中,凡是4.2.1常量

常量是指在設(shè)計(jì)描述中不會(huì)變化的值。常量的使用主要是為了使代碼更容易閱讀和修改。在VHDL描述中,一般用常量名代替數(shù)值。常量是一個(gè)恒定不變的值,一旦作了數(shù)據(jù)類型和賦值定義后,在代碼中就不能再改變,因而具有全局意義。常量聲明的格式如下:

CONSTANT常量名:數(shù)據(jù)類型:=取值;4.2.1常量

常量是指在設(shè)計(jì)描述中不會(huì)變化的值。常【例4-1】

CONSTANTwidth_s :INTEGER:=8; --聲明常量width_s,數(shù)據(jù)類型為整型,值為8

CONSTANTdelay :TIME:=25ns; --聲明常量dealy作為延時(shí)時(shí)間25ns

CONSTANTfbus :BIT_VECTOR:=“010100”;--聲明常量fbus為位矢量類型

常量的使用注意以下幾個(gè)要點(diǎn):

(1)常量的賦值必須符合聲明的數(shù)據(jù)類型。

(2)常量一旦賦值就不能再改變。若要改變常量值,必須要改變?cè)O(shè)計(jì),改變常量的聲明?!纠?-1】

CONSTANTwidth_s (3)常量聲明所允許的范圍有實(shí)體、結(jié)構(gòu)體、進(jìn)程、子程序、塊和程序包。

(4)常量具有可視性規(guī)則,即常量的聲明位置決定它的使用范圍。如果常量是在程序包中聲明的,則調(diào)用此程序包的所有設(shè)計(jì)實(shí)體都可以使用,此時(shí)具有最大的全局化特征;常量如果聲明在設(shè)計(jì)實(shí)體中,則這個(gè)實(shí)體定義的所有結(jié)構(gòu)體都可以使用;常量如果聲明在結(jié)構(gòu)體內(nèi),則只能用于該結(jié)構(gòu)體;如果聲明在某進(jìn)程中,則只能在該進(jìn)程中使用。(3)常量聲明所允許的范圍有實(shí)體、結(jié)構(gòu)體、進(jìn)程、子程序4.2.2變量

變量用于對(duì)數(shù)據(jù)的暫時(shí)存儲(chǔ)。變量是一個(gè)局部量,只能在進(jìn)程和子程序中使用。變量聲明的格式如下:

VARIABLE變量名:數(shù)據(jù)類型[:=初始值];

【例4-2】

VARIABLEcount:INTEGERRANGE0TO99:=0;--聲明變量count,數(shù)據(jù)類型為整型,初值為0

VARIABLEresult:STD_LOGIC:='1'; --變量result為標(biāo)準(zhǔn)邏輯位數(shù)據(jù)類型,初值為‘1’

VARIABLEx,y,z:STD_LOGIC_VECTOR(7DOWNTO0);--聲明變量x、y、z為標(biāo)準(zhǔn)邏輯矢量數(shù)據(jù)類型,沒(méi)有定義初值4.2.2變量

變量用于對(duì)數(shù)據(jù)的暫時(shí)存儲(chǔ)。變量是一個(gè)雖然變量可以在聲明時(shí)賦予初始值,但綜合器并不支持初始值的設(shè)置,使用時(shí)將忽略。初始值僅對(duì)仿真器有效。當(dāng)變量在聲明語(yǔ)句中沒(méi)有賦予初值時(shí),可以通過(guò)變量賦值語(yǔ)句在使用時(shí)對(duì)其賦值。變量賦值語(yǔ)句的格式如下:

目標(biāo)變量名:=表達(dá)式;雖然變量可以在聲明時(shí)賦予初始值,但綜合器并不支持初始值的【例4-3】

VARIABLEx,y,z:STD_LOGIC_VECTOR(7DOWNTO0);--聲明變量x、y、z

x:=“01001010”;

y:=“00010001”;

z:=x(0TO3)&y(4TO7);

需要注意的是,賦值語(yǔ)句中的表達(dá)式必須與目標(biāo)變量具有相同的數(shù)據(jù)類型。變量在使用時(shí)還需注意以下幾個(gè)要點(diǎn):

(1)變量是一個(gè)局部量,只用于進(jìn)程和子程序。變量不能將信息帶出對(duì)它作定義的設(shè)計(jì)單元。

(2)變量的賦值是立即發(fā)生的,不存在任何延時(shí)的行為?!纠?-3】

VARIABLEx,y,z:ST(3)?VHDL語(yǔ)言規(guī)則不支持變量附加延時(shí)語(yǔ)句。

(4)變量常用在實(shí)現(xiàn)某種運(yùn)算的賦值語(yǔ)句中。變量賦值和初始化賦值都使用符號(hào)“:=”。

(5)變量不能用于硬件連線。

在VHDL93標(biāo)準(zhǔn)中對(duì)變量的類型作了增加,引入了全程變量,可以把值傳送到進(jìn)程外部,參見(jiàn)例4-4。從分析可知,定義了一個(gè)全程變量v,用于在進(jìn)程P0和P1間傳遞信息。需要注意的是,全程變量也不能作為進(jìn)程的敏感參數(shù),并且可能導(dǎo)致一些不確定性,使用全程變量必須小心。(3)?VHDL語(yǔ)言規(guī)則不支持變量附加延時(shí)語(yǔ)句。

【例4-4】【例4-4】4.2.3信號(hào)

信號(hào)是電路內(nèi)部硬件實(shí)體相互連接的抽象表示,可以實(shí)現(xiàn)進(jìn)程之間的通信。信號(hào)聲明的格式如下:

SIGNAL信號(hào)名:數(shù)據(jù)類型[:=初始值];

【例4-5】

SIGNALsys_clk :BIT:=‘0’; --聲明位型的信號(hào)sys_clk,初始值為低電平

SIGNALtemp :STD_LOGIC_VECTOR(7DOWNTO0);--信號(hào)temp,數(shù)據(jù)類型為標(biāo)準(zhǔn)邏輯矢量,沒(méi)有設(shè)置初始值

SIGNALs1,s2 :STD_LOGIC; --聲明了兩個(gè)STD_LOGIC類型的信號(hào)s1和s24.2.3信號(hào)

信號(hào)是電路內(nèi)部硬件實(shí)體相互連接的抽象與變量相同,對(duì)信號(hào)初始值的設(shè)置也不是必須的,并且僅在仿真中有效。一般在設(shè)計(jì)中對(duì)信號(hào)進(jìn)行賦值,信號(hào)賦值語(yǔ)句的格式如下:

目標(biāo)信號(hào)名<=表達(dá)式;

【例4-6】

SIGNALa,b,c,d:STD_LOGIC_VECTOR(7DOWNTO0);

a<=“10101010”; --以二進(jìn)制形式將8個(gè)比特一次賦值完畢

b<=X“AA”; --以十六進(jìn)制形式賦值,在VHDL97標(biāo)準(zhǔn)中定義

c(7DOWNTO4)<=“1100”; --比特分割,信號(hào)c的高4位被賦值“1100”

d(7)<='1'; --單比特賦值與變量相同,對(duì)信號(hào)初始值的設(shè)置也不是必須的,并且僅在仿真信號(hào)的使用需要注意以下幾個(gè)要點(diǎn):

(1)信號(hào)的聲明范圍是程序包、實(shí)體和結(jié)構(gòu)體。信號(hào)不能在進(jìn)程和子程序中聲明,但可以使用。

(2)與常量相似,信號(hào)也具有可視性規(guī)則。在程序包中聲明的信號(hào),對(duì)于所有調(diào)用此程序包的設(shè)計(jì)實(shí)體都可見(jiàn);在實(shí)體中聲明的信號(hào),在其對(duì)應(yīng)的所有結(jié)構(gòu)體中都可見(jiàn);在結(jié)構(gòu)體中聲明的信號(hào),此結(jié)構(gòu)體內(nèi)部都可見(jiàn)。

(3)實(shí)體中定義的輸入、輸出端口也是信號(hào),只是附加了數(shù)據(jù)流動(dòng)的方向。信號(hào)的使用需要注意以下幾個(gè)要點(diǎn):

(1)信號(hào)的聲明(4)符號(hào)“:=”用于對(duì)信號(hào)賦初始值,符號(hào)“<=”用于信號(hào)的代入賦值。代入賦值可以設(shè)置延時(shí),如:a<=“10101010”AFTER5ns。

(5)信號(hào)包括I/O引腳信號(hào)和IC內(nèi)部緩沖信號(hào),有硬件電路與之對(duì)應(yīng),所以即使沒(méi)有設(shè)置延時(shí),信號(hào)之間的傳遞也有實(shí)際的附加延時(shí)。

(6)信號(hào)能夠?qū)崿F(xiàn)進(jìn)程間的通信,即把進(jìn)程外的信息帶入進(jìn)程內(nèi)部,把進(jìn)程內(nèi)部的信息帶出進(jìn)程。所以,信號(hào)能夠列入進(jìn)程的敏感列表,而變量不能列入。(4)符號(hào)“:=”用于對(duì)信號(hào)賦初始值,符號(hào)“<=”用于(7)信號(hào)的賦值可以出現(xiàn)在進(jìn)程中,也可以直接出現(xiàn)在結(jié)構(gòu)體的并行語(yǔ)句中,但它們的運(yùn)行含義不同。前者屬于順序信號(hào)賦值,允許同一信號(hào)有多個(gè)驅(qū)動(dòng)源(賦值源),但只有最后的賦值語(yǔ)句進(jìn)行有效的賦值操作,如例4-7中的y被賦值為c;后者屬于并行信號(hào)賦值,賦值操作是各自獨(dú)立并行發(fā)生的,不允許對(duì)同一信號(hào)多次賦值,如例4-8中的y被賦值為a+b,z被賦值為c,不允許對(duì)y多次賦值。同樣地,也不允許在不同的進(jìn)程中對(duì)同一信號(hào)進(jìn)行賦值操作。(7)信號(hào)的賦值可以出現(xiàn)在進(jìn)程中,也可以直接出現(xiàn)在結(jié)構(gòu)【例4-7】

ARCHITECTUREbhvOFadderIS

SIGNALa,b,c,y,z:INTEGER;

BEGIN

PROCESS(a,b,c)

BEGIN

y<=a+b;

y<=c;

ENDPROCESS;

ENDbhv;【例4-7】【例4-8】

ARCHITECTUREbhvOFadderIS

SIGNALa,b,c,y,z:INTEGER;

BEGIN

y<=a+b;

z<=c;

ENDbhv;【例4-8】

ARCHITECTUREbhvOF(8)在使用信號(hào)賦值語(yǔ)句時(shí),可以一個(gè)信號(hào)定義幾個(gè)值,見(jiàn)例4-9。這些值應(yīng)一一枚舉,中間使用逗號(hào)分開,AFTER后的延時(shí)值必須為升序。但需要特別注意的是,綜合工具不支持這種描述方法,該描述更多地使用在仿真測(cè)試中。更多的例子可以參見(jiàn)第8章。

【例4-9】時(shí)刻輸出信號(hào)c值

c<=‘0’, 0 ‘0’

‘1’AFTER5ns, 5 ‘1’

aAFTER10ns, 10 a

bAFTER15ns; 15b(8)在使用信號(hào)賦值語(yǔ)句時(shí),可以一個(gè)信號(hào)定義幾個(gè)值,見(jiàn)4.2.4變量與信號(hào)的比較

在VHDL語(yǔ)言中,變量和信號(hào)是常用的數(shù)據(jù)對(duì)象,在形式上非常相似,但本質(zhì)上卻有很大的差別。

變量賦值語(yǔ)句用來(lái)給變量賦值或改變變量值,使用賦值符號(hào)“:=”,且只能在VHDL的順序語(yǔ)句部分(進(jìn)程和子程序)聲明和使用。當(dāng)給變量賦值時(shí),賦值操作立即執(zhí)行,該變量一直保留所賦值,直到下次賦值操作發(fā)生為止。變量一般用作局部數(shù)據(jù)的臨時(shí)存儲(chǔ)單元。4.2.4變量與信號(hào)的比較

在VHDL語(yǔ)言中,變量和信號(hào)賦值語(yǔ)句可以改變當(dāng)前進(jìn)程中信號(hào)的驅(qū)動(dòng)值,使用賦值符號(hào)“<=”。信號(hào)只能在VHDL并行語(yǔ)句部分聲明,但既可以用在并行語(yǔ)句部分,也可以用在順序語(yǔ)句部分。當(dāng)給信號(hào)賦值時(shí),賦值操作并沒(méi)有立即生效,必須要等待一個(gè)延時(shí),在每個(gè)進(jìn)程結(jié)束時(shí)才完成賦值。信號(hào)一般用作電路單元的互聯(lián)。

當(dāng)然,變量類型和信號(hào)類型如果完全一致,數(shù)據(jù)類型也完全相同,允許二者相互賦值。

例4-10和例4-11顯示了信號(hào)和變量在進(jìn)程中賦值的區(qū)別。由于實(shí)體定義部分完全與例4-10相同,所以例4-11只顯示了結(jié)構(gòu)體部分。兩個(gè)例子的區(qū)別僅在于例4-10使用的是信號(hào)a和b,而例4-11使用的是變量a和b。信號(hào)賦值語(yǔ)句可以改變當(dāng)前進(jìn)程中信號(hào)的驅(qū)動(dòng)值,使用賦值符號(hào)【例4-10】【例4-10】EDA技術(shù)和VHDL設(shè)計(jì)第4章VHDL語(yǔ)言要素課件【例4-11】【例4-11】圖4-1和圖4-2分別是例4-10和例4-11綜合后的RTL電路圖,可以看出其結(jié)果有了較大的差別,這是由信號(hào)和變量不同的賦值特性所引起的。變量的賦值是立即執(zhí)行沒(méi)有延時(shí)的,所以a:=x和b:=a這兩條語(yǔ)句能夠立即執(zhí)行。圖4-1和圖4-2分別是例4-10和例4-11綜合后的R圖4-1例4-10的RTL電路圖圖4-1例4-10的RTL電路圖圖4-2例4-11的RTL電路圖圖4-2例4-11的RTL電路圖信號(hào)的賦值是有延時(shí)的,當(dāng)進(jìn)程啟動(dòng)后,進(jìn)程有固定的運(yùn)行時(shí)間δ,在進(jìn)程內(nèi)的語(yǔ)句是順序執(zhí)行的。所有進(jìn)程內(nèi)的信號(hào)賦值語(yǔ)句均順序啟動(dòng)各自的延時(shí)δ定時(shí)器(順序啟動(dòng)的間隔幾乎為0),準(zhǔn)備在定時(shí)結(jié)束后執(zhí)行賦值操作??梢园l(fā)現(xiàn),只有執(zhí)行到ENDPROCESS語(yǔ)句時(shí),δ延時(shí)才結(jié)束,模擬器的時(shí)鐘才能向前推進(jìn)。因此,進(jìn)程中所有信號(hào)的賦值操作幾乎是在同時(shí)完成賦值的。所以,對(duì)于例4-9來(lái)說(shuō)(仿真結(jié)果見(jiàn)圖4-3),當(dāng)?shù)?個(gè)時(shí)鐘上升沿到來(lái)后,啟動(dòng)一次進(jìn)程,信號(hào)a能夠在延時(shí)δ后獲得新的輸入信號(hào)x的值1,信號(hào)b也能在延時(shí)δ后完成賦值語(yǔ)句b<=a-1操作,但此時(shí)對(duì)賦值語(yǔ)句b而言,a值仍然是原有的a值0,而不是新的a值1,這是因?yàn)樾碌腶值是基本與b的賦值同時(shí)完成得到的,所以完成賦值操作后b值仍然為-1。同樣地,對(duì)于輸出信號(hào)y,也在延時(shí)δ后完成賦值語(yǔ)句y<=b-2,得到y(tǒng)值為?-3。對(duì)于兩個(gè)例子賦值更新的數(shù)據(jù)可參見(jiàn)圖4-3和圖4-4??梢钥吹?,采用信號(hào)的例4-10比采用變量的例4-11慢了兩個(gè)時(shí)鐘周期,與RTL電路圖的結(jié)構(gòu)相符。信號(hào)的賦值是有延時(shí)的,當(dāng)進(jìn)程啟動(dòng)后,進(jìn)程有固定的運(yùn)行時(shí)間圖4-3例4-10的波形仿真結(jié)果圖4-3例4-10的波形仿真結(jié)果圖4-4例4-11的波形仿真結(jié)果圖4-4例4-11的波形仿真結(jié)果分析例4-12代碼片段,說(shuō)明信號(hào)s_v的最后賦值結(jié)果。

從例4-12的注釋中可以看出,由于變量是立即賦值的,所以s_v(0)和s_v(1)得到了變量x和y第一次賦值,為“1”,隨后變量x和y進(jìn)行了第二次賦值,并將值傳遞給了s_v(4)和s_v(5),使得s_v(4)和s_v(5)為“0”。雖然信號(hào)s1和s2也分別有兩次賦值操作,但按照在同一進(jìn)程中執(zhí)行最后一條賦值語(yǔ)句的規(guī)則,s1和s2的值都是“0”,所以s_v(2)、s_v(3)、s_v(6)、s_v(7)均為“0”。所以完成賦值后,信號(hào)s_v應(yīng)等于“00000011”。分析例4-12代碼片段,說(shuō)明信號(hào)s_v的最后賦值結(jié)果。

【例4-12】【例4-12】EDA技術(shù)和VHDL設(shè)計(jì)第4章VHDL語(yǔ)言要素課件為便于讀者分析,下面再列舉兩個(gè)實(shí)例進(jìn)行比較。

例4-13和例4-14的目的是完成一個(gè)移位寄存器,例4-14的實(shí)體部分與例4-13相同,這里略去。比較兩個(gè)例子,可以發(fā)現(xiàn)信號(hào)和變量的基本區(qū)別:聲明、使用的范圍不同。這也是例4-14中的語(yǔ)句“q<=reg”必須放在進(jìn)程內(nèi)的原因。觀察兩個(gè)例子的仿真結(jié)果,例4-13仿真結(jié)果正確,在第一個(gè)時(shí)鐘上升沿到來(lái)時(shí),置入數(shù)據(jù)“10010010”,然后從第2個(gè)時(shí)鐘上升沿開始,每經(jīng)過(guò)一次時(shí)鐘的上升沿,數(shù)據(jù)從低位向高位移位一次,最低位移入“1”。例4-14的仿真結(jié)果不正確,究其原因是因?yàn)樽兞苛⒓促x值的特性。從例4-14的L10行可知,先進(jìn)行reg(0)的賦值,再進(jìn)行移位操作,這樣就使得移位時(shí)的reg(0)已經(jīng)是得到賦值“1”后的新值了??梢钥闯觯盘?hào)賦值的書寫順序不影響最后的結(jié)果;而變量由于具有立即賦值的特性,賦值的書寫順序就十分重要。當(dāng)然,可以通過(guò)更改兩條賦值語(yǔ)句的前后順序來(lái)更正例4-14。為便于讀者分析,下面再列舉兩個(gè)實(shí)例進(jìn)行比較。

例4-例4-13和例4-14都使用了IF語(yǔ)句的嵌套。IF語(yǔ)句首先判斷是否有時(shí)鐘信號(hào)clk的上升沿到來(lái)(例4-13中的L16),如有,則執(zhí)行嵌套在內(nèi)的IF語(yǔ)句(例4-13中的L17~L19),判斷控制置數(shù)信號(hào)ctl是否為高電平“1”。這意味著,賦值語(yǔ)句“reg<=d”執(zhí)行的條件是時(shí)鐘信號(hào)clk的上升沿到來(lái)和信號(hào)ctl取值為“1”同時(shí)成立;而L18的兩條賦值語(yǔ)句執(zhí)行的條件是clk上升沿到來(lái),但信號(hào)ctl取值為“0”。IF語(yǔ)句的嵌套在使用時(shí)應(yīng)注意ENDIF結(jié)束句要與嵌入的條件句數(shù)量一致;且為方便代碼的閱讀和理解,每一層嵌套的IF語(yǔ)句相比于高一層次,應(yīng)有縮進(jìn)。

例4-13和例4-14的仿真波形圖如圖4-5和圖4-6所示。例4-13和例4-14都使用了IF語(yǔ)句的嵌套。IF語(yǔ)句首【例4-13】【例4-13】EDA技術(shù)和VHDL設(shè)計(jì)第4章VHDL語(yǔ)言要素課件【例4-14】【例4-14】圖4-5例4-13仿真波形結(jié)果圖4-5例4-13仿真波形結(jié)果圖4-6例4-14仿真波形結(jié)果圖4-6例4-14仿真波形結(jié)果

4.3VHDL的數(shù)據(jù)類型

VHDL是硬件設(shè)計(jì)語(yǔ)言,是一種類型概念很強(qiáng)的語(yǔ)言。任何的數(shù)據(jù)對(duì)象、函數(shù)或參數(shù)在聲明時(shí)必須要聲明數(shù)據(jù)類型,并且只能攜帶或返回該類型的值。不同的數(shù)據(jù)類型之間不能相互傳遞和作用。數(shù)據(jù)類型一般可以分為兩大類:可以從現(xiàn)成程序包中隨時(shí)獲得的預(yù)定義數(shù)據(jù)類型和用戶自定義數(shù)據(jù)類型。預(yù)定義數(shù)據(jù)類型在standard、std_logic_1164、std_logic_arith等多個(gè)程序包中定義。用戶自定義數(shù)據(jù)類型,其基本元素一般仍然是VHDL的預(yù)定義數(shù)據(jù)類型。需要注意的是,VHDL的綜合器并不支持所有的預(yù)定義數(shù)據(jù)類型和用戶自定義數(shù)據(jù)類型,如TIME、FILE、REAL等,但仿真器支持所有的數(shù)據(jù)類型。4.3VHDL的數(shù)據(jù)類型

VHDL是4.3.1預(yù)定義數(shù)據(jù)類型

1.VHDL預(yù)定義數(shù)據(jù)類型

VHDL標(biāo)準(zhǔn)程序包standard中定義了VHDL的基本數(shù)據(jù)類型,包括布爾(BOOLEAN)數(shù)據(jù)類型、位(BIT)數(shù)據(jù)類型、位矢量(BIT_VECTOR)數(shù)據(jù)類型、字符(CHARACTER)數(shù)據(jù)類型、字符串(STRING)數(shù)據(jù)類型、整數(shù)(INTEGER)數(shù)據(jù)類型、自然數(shù)(NATURAL)數(shù)據(jù)類型、正整數(shù)(POSITIVE)數(shù)據(jù)類型、實(shí)數(shù)(REAL)數(shù)據(jù)類型和時(shí)間(TIME)數(shù)據(jù)類型等。standard程序包屬于STD庫(kù)中的預(yù)編譯程序包,STD庫(kù)符合VHDL標(biāo)準(zhǔn),在使用時(shí)已自動(dòng)包含VHDL的源文件,因而不需要通過(guò)USE語(yǔ)句顯示調(diào)用。具體程序包定義參見(jiàn)附錄A。也可以通過(guò)打開QuartusⅡ軟件將其調(diào)出,選擇File→Open菜單,在軟件安裝目錄下選擇quartus/libraries/vhdl即可看到不同庫(kù)中的程序包。4.3.1預(yù)定義數(shù)據(jù)類型

1.VHDL預(yù)定義數(shù)據(jù)類(1)?BOOLEAN數(shù)據(jù)類型。布爾數(shù)據(jù)類型是一個(gè)二值枚舉型數(shù)據(jù)類型,它的取值只有TURE和FALSE兩種。綜合器使用一位二進(jìn)制數(shù)表示BOOLEAN型的變量或信號(hào)。一般而言,綜合器將TRUE翻譯為1,F(xiàn)ALSE翻譯為0。布爾型不屬于數(shù)值,不能用于計(jì)算,只能通過(guò)關(guān)系運(yùn)算符獲得。

【例4-15】

IFa>bTHENy<=a;

ELSEy<=b;

ENDIF;

當(dāng)a>b成立時(shí),關(guān)系運(yùn)算表達(dá)式的結(jié)果是布爾量TRUE,執(zhí)行y<=a;反之為FALSE,執(zhí)行y<=b。(1)?BOOLEAN數(shù)據(jù)類型。布爾數(shù)據(jù)類型是一個(gè)二值(2)?BIT數(shù)據(jù)類型。位數(shù)據(jù)類型也是一個(gè)二值的枚舉數(shù)據(jù)類型,取值只能是“1”或者“0”。位數(shù)據(jù)類型的數(shù)據(jù)對(duì)象,可以參與邏輯運(yùn)算,結(jié)果仍然是位數(shù)據(jù)類型。VHDL綜合器使用一位二進(jìn)制數(shù)表示位數(shù)據(jù)類型,如:

SIGNALs1:BIT:=‘1’;

SIGNALs2:BIT:=‘0’;

(3)?BIT_VECTOR數(shù)據(jù)類型。位矢量是基于位數(shù)據(jù)類型的數(shù)組,使用位矢量必須注明位寬,即數(shù)組中的元素個(gè)數(shù)和排列情況,如:(2)?BIT數(shù)據(jù)類型。位數(shù)據(jù)類型也是一個(gè)二值的枚舉數(shù)SIGNALs1:BIT_VECTOR(7DOWNTO0);--信號(hào)s1被定義為一個(gè)8位位寬的位矢量,數(shù)組元素排列

指示關(guān)鍵詞DOWNTO,表示最左位是s1(7),下標(biāo)名按照降序排列,最右位是s1(0)

SIGNALs2:BIT_VECTOR(0TO7);--信號(hào)s2被定義為一個(gè)8位位寬的位矢量,數(shù)組元素排

列指示關(guān)鍵詞TO,表示最左位是s2(0),下標(biāo)名按照升序排列,最右位是s2(7)SIGNALs1:BIT_VECTOR(7DOW一般而言,DOWNTO更適合于硬件設(shè)計(jì)者通常的思維方法,即最左邊是權(quán)值最高的位(MSB,MostSignificantBit)。下面進(jìn)一步理解數(shù)組排列指示關(guān)鍵詞以及數(shù)組的賦值和運(yùn)算。例4-16完成了對(duì)信號(hào)x、y、z的賦值,其中符號(hào)“&”表示串聯(lián),即把操作數(shù)或數(shù)組合并連接起來(lái)組成新的數(shù)組,如“0”&“1”&“0”結(jié)果為“010”,“001”&“100”結(jié)果為“001100”,“100”&“001”結(jié)果為“100001”,“VH”&“DL”結(jié)果為“VHDL”。例4-17顯示的是對(duì)數(shù)組進(jìn)行邏輯運(yùn)算,需要注意的是,如果對(duì)位矢量進(jìn)行邏輯操作,其結(jié)果仍為位操作,如位與。另外,邏輯操作符要求兩個(gè)矢量具有相同的長(zhǎng)度,并要求被賦值的矢量也是相同的長(zhǎng)度。一般而言,DOWNTO更適合于硬件設(shè)計(jì)者通常的思維方法,【例4-16】

SIGNALx:BIT_VECTOR(1DOWNTO0);

SIGNALy:BIT_VECTOR(0TO1);

SIGNALz:BIT_VECTOR(3DOWNTO0);

SIGNALt:BIT_VECTOR(7DOWNTO0);

x<=a&b; --x(1)=a,x(0)=b

y<=a&b; --y(0)=a,y(1)=b

z<=‘1’&x(1)&y(0); --z=“1aa”

t(7DOWNTO4)<="0001"; --對(duì)數(shù)組的片的賦值,注意賦值時(shí)片的下標(biāo)方向要與聲明時(shí)一致【例4-16】

SIGNALx:BIT_VEC【例4-17】

SIGNALa,b,c,d:BIT_VECTOR(0TO3);

a<=“1010”;

b<=“1000”;

c<=aANDb; --c=“1000”

d<=aORb;--d=“1010”

(4)?CHARACTER數(shù)據(jù)類型。字符數(shù)據(jù)類型枚舉了ASCII字符集,用單引號(hào)引起來(lái)。字符類型區(qū)分大小寫,如:“A”、“a”不同。

(5)?STRING數(shù)據(jù)類型。字符串?dāng)?shù)據(jù)類型是字符類型的一個(gè)非限定數(shù)組。字符串類型必須用雙引號(hào)引起來(lái),如:“bule”、“abcd”?!纠?-17】

SIGNALa,b,c,(6)?INTEGER數(shù)據(jù)類型。整數(shù)數(shù)據(jù)類型包括正整數(shù)、負(fù)整數(shù)和零。VHDL語(yǔ)言中,整數(shù)使用32位的有符號(hào)的二進(jìn)制數(shù)表示,即整數(shù)的取值范圍是-231~+231(-2147483647~+2147483647)。在實(shí)際應(yīng)用時(shí),綜合器一般將整型作為無(wú)符號(hào)數(shù)處理,仿真器一般將整型作為有符號(hào)數(shù)處理。使用整數(shù)時(shí),需要利用RANGE子句為所聲明的數(shù)限定范圍,然后根據(jù)所限定的范圍來(lái)決定表示此信號(hào)或變量的二進(jìn)制數(shù)的位數(shù)。如果在聲明時(shí)沒(méi)有限定取值范圍,則綜合器會(huì)自動(dòng)采用32位二進(jìn)制數(shù)來(lái)表示,假設(shè)實(shí)際中的整數(shù)只需4位二進(jìn)制數(shù)即可,就會(huì)造成較大的資源浪費(fèi)。

整數(shù)數(shù)據(jù)類型的聲明如下:

SIGNALs1:INTEGERRANGE0TO15;--聲明信號(hào)s1,數(shù)據(jù)類型是整型,取值范圍0~15共16個(gè)值,可用4位二進(jìn)制數(shù)來(lái)表示(6)?INTEGER數(shù)據(jù)類型。整數(shù)數(shù)據(jù)類型包括正整數(shù)(7)?NATURAL數(shù)據(jù)類型。自然數(shù)數(shù)據(jù)類型是整數(shù)類型的子類型,用來(lái)表示自然數(shù)(即非負(fù)的整數(shù))。

(8)?POSITIVE數(shù)據(jù)類型。正整數(shù)數(shù)據(jù)類型也是整數(shù)類型的子類型,包含整數(shù)中非零和非負(fù)的數(shù)值。

(9)?REAL數(shù)據(jù)類型。實(shí)數(shù)的取值范圍是-1.0E38~+1.0E38。實(shí)數(shù)必須帶有小數(shù)點(diǎn)。通常情況下,實(shí)數(shù)類型僅能在仿真器中使用,綜合器不支持實(shí)數(shù)類型。實(shí)數(shù)的書寫格式可參見(jiàn)4.1.1節(jié)。

(10)?TIME數(shù)據(jù)類型。VHDL中唯一的預(yù)定物理類型是時(shí)間。時(shí)間類型包括整數(shù)和物理量單位兩個(gè)部分,且整數(shù)和單位之間至少留一個(gè)空格,如2ns、10ms。綜合器也不支持時(shí)間類型。(7)?NATURAL數(shù)據(jù)類型。自然數(shù)數(shù)據(jù)類型是整數(shù)類2.IEEE預(yù)定義數(shù)據(jù)類型

IEEE庫(kù)是VHDL設(shè)計(jì)中最為常用的庫(kù),包含IEEE標(biāo)準(zhǔn)的程序包和其他一些支持工業(yè)標(biāo)準(zhǔn)的程序包,如std_logic_1164、numeric_std、numeric_bit、std_logic_arith、std_logic_unsigned、std_logic_signed等。在這些程序包內(nèi)還定義了一些常用的數(shù)據(jù)類型,但由于這些程序包并非符合VHDL標(biāo)準(zhǔn),所以在使用相應(yīng)的數(shù)據(jù)類型前,需要在設(shè)計(jì)的最前面以顯式的形式表達(dá)出來(lái)。2.IEEE預(yù)定義數(shù)據(jù)類型

IEEE庫(kù)是VHDL設(shè)IEEE庫(kù)中的std_logic_1164這個(gè)程序包是IEEE的標(biāo)準(zhǔn)程序包,定義了兩個(gè)重要且常用的數(shù)據(jù)類型:標(biāo)準(zhǔn)邏輯位STD_LOGIC和標(biāo)準(zhǔn)邏輯矢量STD_LOGIC_VECTOR。從前面的內(nèi)容分析可知,如果要使用這兩個(gè)數(shù)據(jù)類型,必須先通過(guò)LIBRARY語(yǔ)句打開IEEE庫(kù),然后通過(guò)USE語(yǔ)句顯式調(diào)用std_logic_1164這個(gè)程序包。

程序包std_logic_arith是由美國(guó)Synopsys公司加入IEEE庫(kù)的,雖然并非IEEE標(biāo)準(zhǔn),但已成為事實(shí)上的工業(yè)標(biāo)準(zhǔn)。該程序包在std_logic_1164程序包的基礎(chǔ)上擴(kuò)展了三個(gè)數(shù)據(jù)類型:無(wú)符號(hào)(UNSIGNED)數(shù)據(jù)類型、有符號(hào)(SIGNED)數(shù)據(jù)類型以及小整型(SMALL_INT)數(shù)據(jù)類型,并定義了相關(guān)的算數(shù)運(yùn)算符和轉(zhuǎn)換函數(shù)。IEEE庫(kù)中的std_logic_1164這個(gè)程序包是I在IEEE庫(kù)中,numeric_std標(biāo)準(zhǔn)程序包和numeric_bit程序包也定義了UNSIGNED型和SIGNED型數(shù)據(jù)類型,其中,numeric_std程序包是針對(duì)STD_LOGIC數(shù)據(jù)類型的無(wú)符號(hào)數(shù)和有符號(hào)數(shù),而numeric_bit程序包是針對(duì)BIT數(shù)據(jù)類型的。當(dāng)綜合器中沒(méi)有附帶std_logic_arith程序包時(shí),可以使用這兩個(gè)程序包。在IEEE庫(kù)中,numeric_std標(biāo)準(zhǔn)程序包和num(1)?STD_LOGIC數(shù)據(jù)類型。STD_LOGIC數(shù)據(jù)類型共定義了九種取值,分別是:“U”——未初始化;“X”——強(qiáng)未知的;“0”——強(qiáng)0;“1”——強(qiáng)1;“Z”——高阻態(tài);“W”——弱未知的;“L”——弱0;“H”——弱1;“-”——忽略。這就意味著STD_LOGIC數(shù)據(jù)類型能夠比BIT數(shù)據(jù)類型描述更多的線路情況,如:“Z”和“-”常用于三態(tài)的描述,“L”和“H”可用于描述下拉和上拉。但就綜合而言,STD_LOGIC數(shù)據(jù)類型在數(shù)字器件中實(shí)現(xiàn)的只有其中的四種取值(“0”、“1”、“-”、“Z”)。當(dāng)然,這九種值對(duì)于仿真都有重要的意義。(1)?STD_LOGIC數(shù)據(jù)類型。STD_LOGIC(2)?STD_LOGIC_VECTOR數(shù)據(jù)類型。STD_LOGIV_VECTOR數(shù)據(jù)類型是基于STD_LOGIC的一維數(shù)組,即數(shù)組中每個(gè)元素的數(shù)據(jù)類型都是STD_LOGIC,采用雙引號(hào)引起來(lái)。需要注意的是,位寬相同、數(shù)據(jù)類型相同才能進(jìn)行賦值或運(yùn)算操作。STD_LOGIC_VECTOR數(shù)據(jù)類型的相關(guān)操作與BIT_VECTOR數(shù)據(jù)類型類似,這里不再

贅述。(2)?STD_LOGIC_VECTOR數(shù)據(jù)類型。ST(3)?STD_ULOGIC和STD_ULOGIC_VECTOR數(shù)據(jù)類型。STD_ULOGIC數(shù)據(jù)類型也是在std_logic_1164程序包中定義的,也定義了九種取值,它與STD_LOGIC數(shù)據(jù)類型的區(qū)別在于:STD_LOGIC數(shù)據(jù)類型是STD_ULOGIC數(shù)據(jù)類型的一個(gè)子集,是一個(gè)決斷類型。所謂決斷是指:如果一個(gè)信號(hào)由多個(gè)驅(qū)動(dòng)源驅(qū)動(dòng),則需要調(diào)用預(yù)先定義的決斷函數(shù)以解決沖突并確定賦予信號(hào)哪個(gè)值。由于STD_ULOGIC不是決斷類型,如果一個(gè)這樣的信號(hào)由兩個(gè)以上的驅(qū)動(dòng)源驅(qū)動(dòng),將導(dǎo)致錯(cuò)誤。由于STD_ULOGIC的限制,使用STD_LGOIC數(shù)據(jù)類型更為方便。具體決斷的相關(guān)知識(shí)請(qǐng)參見(jiàn)7.2.3節(jié)。

同樣地,STD_ULOGIC_VECTOR數(shù)據(jù)類型是基于STD_ULOGIC數(shù)據(jù)類型的一維數(shù)組。(3)?STD_ULOGIC和STD_ULOGIC_V(4)?UNSIGNED數(shù)據(jù)類型。UNSIGNED數(shù)據(jù)類型代表一個(gè)無(wú)符號(hào)的數(shù)。在綜合器中,這個(gè)數(shù)值被解釋為一個(gè)二進(jìn)制數(shù),最左位是最高位。如果聲明一個(gè)變量或信號(hào)為UNSIGNED數(shù)據(jù)類型,則其位矢長(zhǎng)度越長(zhǎng),所能代表的數(shù)值就越大,如:位矢長(zhǎng)度為8位,最大值為255。不能使用UNSIGNED聲明負(fù)數(shù)。例4-18是UNSIGNED數(shù)據(jù)類型的示例。

【例4-18】

VARIABLEv1:UNSIGNED(0TO7); --聲明變量v1,8位二進(jìn)制數(shù),最高位為v1(0)

SIGNAL s1:UNSIGNED(7DOWNTO0); --聲明變量s1,最高位為s1(7)(4)?UNSIGNED數(shù)據(jù)類型。UNSIGNED數(shù)據(jù)(5)?SIGNED數(shù)據(jù)類型。SIGNED數(shù)據(jù)類型表示一個(gè)有符號(hào)的數(shù),最高位是符號(hào)位,一般用“0”表示正,“1”表示負(fù),綜合器將其解釋為補(bǔ)碼。例4-19是SIGNED數(shù)據(jù)類型的示例。

【例4-19】

ARCHITECTUREbhvOFexIS

SIGNALs1 :SIGNED(3TO0); --聲明信號(hào)s1為有符號(hào)數(shù)

BEGIN

PROCESS(c)

VARIABLEv1:SIGNED(0TO3); --聲明變量v1為有符號(hào)數(shù)(5)?SIGNED數(shù)據(jù)類型。SIGNED數(shù)據(jù)類型表示BEGIN

v1:=“0101”; --最高位v1(0)是符號(hào)位,v1=+5

s1<=“1011”; --最高位s1(3)是符號(hào)位,s1=-5

(6)?SMALL_INT數(shù)據(jù)類型。SMALL_INT數(shù)據(jù)類型是INTEGER數(shù)據(jù)類型的子類型,按照在std_logic_arith程序包中定義的源代碼,它將INTEGER約束到只含有2個(gè)值。程序包std_logic_arith中聲明SMALL_INT的源代碼如下:

SUBTYPESMALL_INTISINTEGERRANGE0TO1;BEGIN

v1:=“01014.3.2用戶自定義數(shù)據(jù)類型

除了上述預(yù)定義數(shù)據(jù)類型外,用戶還可以定義自己所需的數(shù)據(jù)類型。一般采用類型定義語(yǔ)句TYPE和子類型定義語(yǔ)句SUBTYPE來(lái)實(shí)現(xiàn)。

1.TYPE語(yǔ)句

TYPE語(yǔ)句能夠定義一種全新的數(shù)據(jù)類型,其語(yǔ)法格式如下:

TYPE數(shù)據(jù)類型名IS數(shù)據(jù)類型定義[OF基本數(shù)據(jù)類型];

其中,數(shù)據(jù)類型名由用戶自行定義,可有多個(gè),采用逗號(hào)分開;數(shù)據(jù)類型定義部分用來(lái)描述所定義的數(shù)據(jù)類型的表達(dá)方式和表達(dá)內(nèi)容;關(guān)鍵詞OF后的基本數(shù)據(jù)類型是指數(shù)據(jù)類型定義中所定義的元素的基本數(shù)據(jù)類型,一般是已有的預(yù)定義數(shù)據(jù)類型,如:BIT、STD_LOGIC等。例4-20是使用TYPE定義新數(shù)據(jù)類型并聲明數(shù)據(jù)對(duì)象的示例。4.3.2用戶自定義數(shù)據(jù)類型

除了上述預(yù)定義數(shù)據(jù)類型【例4-20】

TYPEbtypeISARRAY(7DOWNTO0)OFBIT;

--定義數(shù)據(jù)類型btype,具有8個(gè)元素的數(shù)組型,每一個(gè)元素的數(shù)據(jù)類型都是BIT

TYPEcolorIS(blue,green,red,yellow);--定義數(shù)據(jù)類型color,共有4個(gè)元素,屬于枚舉類型

SIGNAL s1 :btype; --聲明信號(hào)s1為btype型

VARIABLEv1 :color; --聲明變量v1為color型

...

s1<=“10001000”; --對(duì)s1賦值

v1:=green; --對(duì)v1賦值【例4-20】

TYPEbtypeISARRA2.SUBTYPE語(yǔ)句

SUBTYPE語(yǔ)句定義子類型,即已有數(shù)據(jù)類型的子集,它滿足原數(shù)據(jù)類型(稱為基本數(shù)據(jù)類型)的所有約束條件。子類型定義的語(yǔ)法格式如下:

SUBTYPE子類型名IS基本數(shù)據(jù)類型[范圍];

子類型的定義只是在基本數(shù)據(jù)類型的基礎(chǔ)上作一些約束,它并沒(méi)有定義新的數(shù)據(jù)類型。上述的POSITIVE和NATURAL就是INTEGER數(shù)據(jù)類型的子類型。只要值在合適的子類型范圍內(nèi),這些子類型都可以完成相加、乘、比較、賦值等操作。例4-21給出了POSITIVE和NATURAL之間的有效和無(wú)效的賦值示例。例4-22是子類型定義示例。2.SUBTYPE語(yǔ)句

SUBTYPE語(yǔ)句定義子類型【例4-21】

VARIABLEv_n:NATURAL;--聲明變量v_n為NATURAL類型

VARIABLEv_p:POSITIVE;--聲明變量v_p為POSITIVE類型

...

v_n:=0; --對(duì)v_n賦值0

v_p:=v_n; --把v_n賦值給v_p,此處錯(cuò)誤,0超過(guò)了POSITIVE數(shù)據(jù)類型的取值范圍

...

v_p:=5; --對(duì)v_p賦值5

v_n:=v_p+1; --把v_p+1賦值給v_n,賦值有效【例4-21】

VARIABLEv_n:NAT【例4-22】

SUBTYPEmy_intISINTEGERRANGE0TO1023;--定義子類型my_int,取值范圍0~1023

SUBTYPEmy_stdISSTD_LOGIC_VECTOR(15DOWNTO0);--定義子類型my_type,16位數(shù)組

TYPEbtypeISARRAY(NATURALRANGE<>)OFBIT;--定義btype為非限定BIT數(shù)組

SUBTYPEmy_typeISbtype(0TO15); --定義my_type為btype數(shù)據(jù)類型的子類型

下面以一個(gè)實(shí)例進(jìn)一步說(shuō)明TYPE語(yǔ)句和SUBTYPE語(yǔ)句定義的數(shù)據(jù)類型的區(qū)別?!纠?-22】

SUBTYPEmy_intISIN【例4-23】【例4-23】EDA技術(shù)和VHDL設(shè)計(jì)第4章VHDL語(yǔ)言要素課件編譯例4-23,軟件會(huì)報(bào)錯(cuò),具體錯(cuò)誤原因如圖4-7所示,即輸入信號(hào)d并不符合btype數(shù)據(jù)類型。從例4-23的L12行可以看到,定義了一個(gè)數(shù)據(jù)類型btype,是一個(gè)有4個(gè)元素的數(shù)組,每個(gè)元素的數(shù)據(jù)類型都是STD_LOGIC;輸入信號(hào)d的數(shù)據(jù)類型為標(biāo)準(zhǔn)邏輯矢量。雖然從表面來(lái)看,二者的形式完全一致,但它們不是一種數(shù)據(jù)類型,所以不能完成賦值操作。再次強(qiáng)調(diào),使用TYPE語(yǔ)句定義的類型是一個(gè)全新的數(shù)據(jù)類型,VHDL不允許不同的數(shù)據(jù)類型直接進(jìn)行操作運(yùn)算,必須進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換。如果將L12行改為“SUBTYPEbtypeISSTD_LOGIC_VECTOR(3DOWNTO0);”,即使用子類型定義語(yǔ)句,該例將能通過(guò)編譯。子類型與其基本數(shù)據(jù)類型屬于同一種數(shù)據(jù)類型,所以屬于子類型的和屬于基本數(shù)據(jù)類型的數(shù)據(jù)對(duì)象間的相互賦值可以直接進(jìn)行,而不必進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換。編譯例4-23,軟件會(huì)報(bào)錯(cuò),具體錯(cuò)誤原因如圖4-7所示,圖4-7例4-23編譯出錯(cuò)信息圖4-7例4-23編譯出錯(cuò)信息3.常用用戶自定義類型

VHDL常用的用戶自定義數(shù)據(jù)類型有:枚舉類型、整數(shù)類型、數(shù)組類型、記錄類型等。

(1)枚舉類型。顧名思義,枚舉類型即為通過(guò)枚舉該類型的所有可能值來(lái)定義。枚舉類型的示例如例4-24所示。

【例4-24】

TYPEcolorIS(blue,green,red,yellow); --定義數(shù)據(jù)類型color,共有4個(gè)元素

TYPEmy_std_logicIS('0','1','Z','-'); --定義數(shù)據(jù)類型my_std_logic,包含4個(gè)元素3.常用用戶自定義類型

VHDL常用的用戶自定義數(shù)據(jù)在使用狀態(tài)機(jī)進(jìn)行VHDL設(shè)計(jì)時(shí),一般采用枚舉類型來(lái)枚舉所有的狀態(tài)。具體狀態(tài)機(jī)的設(shè)計(jì)方法參見(jiàn)第6章。在綜合時(shí),會(huì)把用文字符號(hào)表示的枚舉值用一組二進(jìn)制數(shù)來(lái)表示,稱為枚舉編碼。編碼比特向量的長(zhǎng)度由枚舉值的個(gè)數(shù)所決定,一般確定為所需表達(dá)的最少比特?cái)?shù)。例4-24中的枚舉類型color,需要2bit的編碼向量就能完成對(duì)所有值的表示。如果一個(gè)枚舉類型有5個(gè)值,則需要3bit的編碼向量。默認(rèn)的編碼方式是順序編碼,如:blue=“00”,green=“01”,red=“10”,yellow=“11”。在使用狀態(tài)機(jī)進(jìn)行VHDL設(shè)計(jì)時(shí),一般采用枚舉類型來(lái)枚舉所當(dāng)然,也可以不采用枚舉默認(rèn)編碼的方式,而利用enum_encoding屬性來(lái)實(shí)現(xiàn)自己的編碼。enum_encoding屬性是由綜合器供應(yīng)商提供的一個(gè)常用的用戶自定義屬性,有關(guān)預(yù)定義屬性和用戶自定義屬性的相關(guān)內(nèi)容請(qǐng)參見(jiàn)4.5節(jié)。例4-25顯示了如何利用enum_encoding屬性更改默認(rèn)編碼。

【例4-25】

ATTRIBUTEenum_encoding:STRING;--屬性聲明

ATTRIBUTEenmu_encodingOFcolor:TYPEIS"11001001";--屬性描述當(dāng)然,也可以不采用枚舉默認(rèn)編碼的方式,而利用enum_e(2)整數(shù)類型。?此處自定義的整數(shù)類型即為使用TYPE語(yǔ)句或SUBTYPE語(yǔ)句根據(jù)實(shí)際需要,利用關(guān)鍵詞RANGE限定整數(shù)的取值范圍,提高芯片資源的利用率。整數(shù)類型的示例如下。

【例4-26】

TYPEint1ISRANGE0TO100; --7bit矢量

TYPEint2ISRANGE-100TO100; --8bit矢量,最高位是符號(hào)位

SUBTYPEint3ISint2RANGE0TO15; --4bit矢量

需要注意的是,VHDL綜合器對(duì)整數(shù)的編碼方式:如果是負(fù)數(shù),則編碼為二進(jìn)制補(bǔ)碼;如果是正數(shù),則編碼為二進(jìn)制原碼。(2)整數(shù)類型。?此處自定義的整數(shù)類型即為使用TYPE(3)數(shù)組類型。數(shù)組是同類型元素的集合,可以是一維數(shù)組、二維數(shù)組或一維×一維數(shù)組,當(dāng)然也可以是更高維數(shù)的數(shù)組,但VHDL綜合器通常不支持更高維數(shù)的數(shù)組。其實(shí)前面講述VHDL預(yù)定義數(shù)據(jù)類型時(shí)已經(jīng)接觸過(guò)一維數(shù)組了,如BIT_VECTOR、STD_LOGIC_VECTOR。圖4-8進(jìn)一步解釋數(shù)組的構(gòu)成,(a)顯示單個(gè)元素;(b)顯示一維數(shù)組;(c)顯示一維?×?一維數(shù)組;(d)顯示二維數(shù)組。(3)數(shù)組類型。數(shù)組是同類型元素的集合,可以是一維數(shù)組圖4-8數(shù)組構(gòu)成示意圖4-8數(shù)組構(gòu)成示意VHDL既允許限定數(shù)組,又允許非限定數(shù)組,二者的區(qū)別在于:限定數(shù)組下標(biāo)的取值范圍在數(shù)組定義時(shí)就被確定了,而非限定數(shù)組下標(biāo)的取值范圍留待具體數(shù)據(jù)對(duì)象使用時(shí)再確定。

限定數(shù)組定義語(yǔ)法的格式如下:

TYPE數(shù)組名ISARRAY(數(shù)組范圍)OF數(shù)據(jù)類型;

其中,數(shù)組名是新定義的限定數(shù)組類型的名稱;數(shù)組范圍明確指出數(shù)組元素的數(shù)量和排列形式,以整數(shù)來(lái)表示數(shù)組下標(biāo);數(shù)據(jù)類型即為數(shù)組內(nèi)各元素的數(shù)據(jù)類型。VHDL既允許限定數(shù)組,又允許非限定數(shù)組,二者的區(qū)別在于非限定數(shù)組定義語(yǔ)法的格式如下:

TYPE數(shù)組名ISARRAY(數(shù)組下標(biāo)名RANGE<>)OF數(shù)據(jù)類型;

其中,數(shù)組名是新定義的非限定數(shù)組類型的名稱;數(shù)組下標(biāo)名是一個(gè)整數(shù)類型或子類型的名稱;符號(hào)?<>?表示下標(biāo)范圍待定,用到該數(shù)組類型時(shí),再填入具體的取值范圍;數(shù)據(jù)類型為數(shù)組中每個(gè)元素的數(shù)據(jù)類型。

限定數(shù)組示例見(jiàn)例4-27,非限定數(shù)組示例見(jiàn)例4-28。非限定數(shù)組定義語(yǔ)法的格式如下:

TYPE數(shù)組名I【例4-27】

TYPEbtypeISARRAY(7DOWNTO0)OFBIT;

--限定數(shù)組類型btype,有8個(gè)元素,下標(biāo)排列是7、6、5、4、3、2、1、0

SIGNALs1:btype;; --聲明信號(hào)s1,數(shù)據(jù)類型為限定數(shù)組btype【例4-27】

TYPEbtypeISARRA【例4-28】

TYPEmy_stdISarray(NATURALRANGE<>)OFSTD_LOGIC;

--非限定數(shù)組類型my_std,下標(biāo)可以取值在自然數(shù)范圍內(nèi)

VARIABLEv1:my_std(1TO8); --聲明變量v1,將數(shù)組的取值范圍確定為1~8

TYPEmy_std1ISarray(INTEGERRANGE<>)OFSTD_LOGIC;

--非限定數(shù)組類型-my_std1,下標(biāo)可以取值在整數(shù)范圍內(nèi)

VARIABLEv2:my_std1(-3TO4); --聲明變量v2,將數(shù)組的取值范圍確定為-3~4【例4-28】

TYPEmy_stdISarr例4-29顯示一維?×?一維數(shù)組的定義。

【例4-29】例4-29顯示一維?×?一維數(shù)組的定義。

【例4-2例4-30顯示一個(gè)二維數(shù)組的定義。

【例4-30】

TYPEmatrix2DISARRAY(0TO3,7DOWNTO0)OFSTD_LOGIC;

需要注意的是,二維數(shù)組的結(jié)構(gòu)是建立在單個(gè)元素上的,而不像一維?×?一維數(shù)組是建立在矢量上的。

對(duì)一維數(shù)組的賦值在4.3.1節(jié)中已經(jīng)講解,這里不再贅述。當(dāng)給一個(gè)一維?×?一維或二維數(shù)組賦值時(shí),可以有多種方法,具體見(jiàn)例4-31。例4-30顯示一個(gè)二維數(shù)組的定義。

【例4-30】

【例4-31】【例4-31】EDA技術(shù)和VHDL設(shè)計(jì)第4章VHDL語(yǔ)言要素課件(4)記錄類型。記錄類型和數(shù)組類型非常相似,所不同的是記錄類型所包含的元素的數(shù)據(jù)類型不相同。記錄類型定義語(yǔ)法的格式如下:

TYPE記錄類型名ISRECORD

元素名:元素?cái)?shù)據(jù)類型;

元素名:元素?cái)?shù)據(jù)類型;

ENDRECORD[記錄類型名];(4)記錄類型。記錄類型和數(shù)組類型非常相似,所不同的是例4-32顯示如何定義一個(gè)記錄類型并對(duì)其賦值。從例4-32中可以看到,對(duì)記錄類型的數(shù)據(jù)對(duì)象賦值,既可以對(duì)其中的單個(gè)元素進(jìn)行賦值,也可以采用整體賦值的形式。對(duì)單個(gè)元素進(jìn)行賦值,在記錄類型對(duì)象名后加點(diǎn)(“.”),再跟賦值元素的元素名。對(duì)整體賦值時(shí),有兩種表達(dá)方式:名稱關(guān)聯(lián)和位置關(guān)聯(lián)。使用名稱關(guān)聯(lián)方式時(shí),賦值項(xiàng)可以以任何順序出現(xiàn),如s2<=(int=>15,btype=>"11110000");?等價(jià)于例4-32中的s2賦值。使用位置關(guān)聯(lián)方式時(shí),元素的賦值順序必須與記錄類型聲明時(shí)的順序相同??梢允褂肙THERS選項(xiàng)對(duì)元素進(jìn)行賦值,但如果有兩個(gè)或更多元素都由OTHERS選項(xiàng)來(lái)賦值,則這些元素必須具有相同的數(shù)據(jù)類型。例4-32顯示如何定義一個(gè)記錄類型并對(duì)其賦值。從例4-3【例4-32】

TYPEmy_recordISRECORD--定義記錄類型my_record

btype :BIT_VECTOR(7DOWNTO0);

int :INTEGERRANGE0TO15;

ENDRECORD;

SIGNALs1,s2,s3,s4:my_record;

...

s1.btype<="00010001"; --單個(gè)元素賦值

<=6; --單個(gè)元素賦值

s2<=(btype=>"11110000",int=>15); --名稱關(guān)聯(lián)方式

s4<=("00000001",OTHERS=>0); 【例4-32】

TYPEmy_recordI4.3.3數(shù)據(jù)類型的轉(zhuǎn)換

VHDL是一種強(qiáng)類型語(yǔ)言,不允許不同的數(shù)據(jù)類型之間直接進(jìn)行操作,如算術(shù)運(yùn)算、邏輯運(yùn)算等。所以,設(shè)計(jì)者常常需要將數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換。設(shè)計(jì)者可以通過(guò)調(diào)用預(yù)先定義在程序包中的函數(shù)來(lái)進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換,也可以自定義轉(zhuǎn)換函數(shù)。

如果兩種數(shù)據(jù)類型是密切相關(guān)的(所有抽象數(shù)字類型,如整數(shù)類型和實(shí)數(shù)類型),則可以采用數(shù)據(jù)類型名稱來(lái)實(shí)現(xiàn)直接轉(zhuǎn)換。?例4-33顯示了整數(shù)類型和實(shí)數(shù)類型間的轉(zhuǎn)換。例4-34再一次體現(xiàn)數(shù)據(jù)類型間的直接轉(zhuǎn)換方式。4.3.3數(shù)據(jù)類型的轉(zhuǎn)換

VHDL是一種強(qiáng)類型語(yǔ)言,【例4-33】

VARIABLEv1,v2:INTEGER;

v1:=INTEGER(25.63*REAL(v2));

【例4-34】

TYPElongISINTEGERRANGE-100TO100;

TYPEshortISINTEGERRANGE-10TO10;

SIGNALs1:long;

SIGNALs2:short;

...

s1<=s2+5; --錯(cuò)誤,數(shù)據(jù)類型不匹配

s1<=long(s2+5); --正確,最后賦值給s1,數(shù)據(jù)類型為long【例4-33】

VARIABLEv1,v2當(dāng)然,在std_logic_1164、std_logic_arith、std_logic_unsigned、std_logic_signed中還提供了很多數(shù)據(jù)類型轉(zhuǎn)換函數(shù),用于不同數(shù)據(jù)類型間的轉(zhuǎn)換,具體轉(zhuǎn)換函數(shù)的定義可參見(jiàn)附錄A。

std_logic_1164程序包所包含的轉(zhuǎn)換函數(shù)如下:當(dāng)然,在std_logic_1164、std_logicstd_logic_arith程序包所包含的轉(zhuǎn)換函數(shù)如下:std_logic_arith程序包所包含的轉(zhuǎn)換函數(shù)如下例4-35調(diào)用了程序包std_logic_1164中的轉(zhuǎn)換函數(shù)to_stdlogicvector和程序包std_logic_arith中的conv_std_logic_vector實(shí)現(xiàn)數(shù)據(jù)類型的轉(zhuǎn)換。

【例4-35】例4-35調(diào)用了程序包std_logic_1164中的轉(zhuǎn)EDA技術(shù)和VHDL設(shè)計(jì)第4章VHDL語(yǔ)言要素課件4.4VHDL操作符

VHDL的各種表達(dá)式是由操作數(shù)和操作符組成的,其中操作數(shù)是各種運(yùn)算的對(duì)象,而操作符是規(guī)定運(yùn)算的方式。VHDL提供了七種類型的預(yù)定義操作符,分別是:分配操作符(AssignmentOperators)、邏輯操作符(LogicOperators)、算術(shù)操作符(ArithmeticOperators)、關(guān)系操作符(RelationalOperators)、移位操作符(ShiftOperators)、串聯(lián)操作符(ConcatenationOperators)和符號(hào)操作符(SignOperators)。使用操作符完成運(yùn)算,需要特別注意兩點(diǎn):第一,操作數(shù)是相同的數(shù)據(jù)類型,如果是矢量則需要有相同的長(zhǎng)度;第二,操作數(shù)的數(shù)據(jù)類型與操作符所要求的數(shù)據(jù)類型一致。4.4VHDL操作符

VHDL的各種表達(dá)以下逐一介紹每一種操作符。

4.4.1分配操作符

分配操作符用于對(duì)信號(hào)、變量、常量分配數(shù)值,其實(shí)在之前的講述中已經(jīng)多次用到,又稱為賦值操作符。分配操作符包含三個(gè):

(1)?<= 用于對(duì)信號(hào)賦值;

(2)?:= 用于對(duì)變量賦值;

(3)?=> 用于對(duì)單個(gè)數(shù)組元素賦值或OTHERS賦值。以下逐一介紹每一種操作符。

4.4.1分配操作符

【例4-36】

SIGNALs1 :STD_LOGIC;

SIGNALs2,s3 :STD_LOGIC_VECTOR(7DOWNTO0);

...

VARIABLEv1 :STD_LOGIC_VECTOR(7DOWNTO0);

...

s1<=‘1’;

s2<=“11000011”;

s3<=(0,2,3=>‘1’,OTHERS=>‘0’); --s3=“00001101”

v1:="00010001";【例4-36】

SIGNALs1 :STD_L4.4.2邏輯操作符

邏輯操作符用于完成邏輯運(yùn)算,包含七個(gè):

(1)?NOT 取反;

(2)?AND 與;

(3)?OR 或;

(4)?NAND 與非;

(5)?NOR 或非;

(6)?XOR 異或;

(7)?XNOR 同或。4.4.2邏輯操作符

邏輯操作符用于完成邏輯運(yùn)算,包邏輯操作符支持對(duì)BOOLEAN、BIT、BIT_VECTOR、STD_LOGIC、STD_LOGIC_VECTOR、STD_ULOGIC以及STD_ULOGIC_VECTOR數(shù)據(jù)類型的運(yùn)算。需要注意的是,在這七種邏輯操作符中,NOT優(yōu)先于其他任意邏輯操作符,剩下的六種邏輯操作符具有相同的優(yōu)先級(jí)。XNOR操作符定義在VHDL93標(biāo)準(zhǔn)中。由于AND、OR、XOR這三個(gè)操作符的運(yùn)算結(jié)果不會(huì)因?yàn)檫\(yùn)算次序的不同而改變。所以,如果在一串運(yùn)算中,只用到這三個(gè)操作符中的一個(gè),可以不使用括號(hào);如果一串運(yùn)算中的操作符不同或有連續(xù)多個(gè)除上述三個(gè)操作符外的操作符,則必須使用括號(hào)。另外,邏輯操作符是按位操作。例4-37顯示了一些正確和錯(cuò)誤的邏輯操作符的使用示例。邏輯操作符支持對(duì)BOOLEAN、BIT、BIT_VECT【例4-37】

SIGNALa,b,c,d :STD_LOGIC_VECTOR(3DOWNTO0);

SIGNAL e,f,g,h :BIT_VECTOR(1DOWNTO0);

SIGNALi,j,k,l :STD_LOGIC;

...

c<=NOTaANDb; --正確,NOT優(yōu)先級(jí)最高,相當(dāng)于(NOTa)ANDb

d<=aANDbANDc; --正確,兩個(gè)操作符都是AND,可以不加括號(hào)

g<=NOT(dANDe); --錯(cuò)誤,矢量長(zhǎng)度不匹配

h<=eNANDfNANDg; --錯(cuò)誤,兩個(gè)或以上的NAND符號(hào)必須加括號(hào)

k<=iNANDj; --正確

l<=iORjXORk; --錯(cuò)誤,多個(gè)操作符必須加括號(hào)【例4-37】

SIGNALa,b,c,d 4.4.3算術(shù)操作符

算術(shù)操作符用于完成算術(shù)運(yùn)算,可支持的數(shù)據(jù)類型包括:INTEGER、SIGNED、UNSIGNED以及REAL(REAL數(shù)據(jù)類型不能被綜合)。算術(shù)操作符包含以下八個(gè):

(1)?+ 加;

(2)?- 減;

(3)?* 乘;

(4)?/ 除;

(5)?** 乘方;

(6)?MOD 取模;

(7)?REM 取余;

(8)?ABS 取絕對(duì)值。4.4.3算術(shù)操作符

算術(shù)操作符用于完成算術(shù)運(yùn)算,可八個(gè)算術(shù)操作符可分為三類,分別是:加減操作符、乘除操作符和混合操作符。

1.加減操作符

“+”、“-”操作符的運(yùn)算規(guī)則與常規(guī)的加減法是一致的。加減操作符示例見(jiàn)例4-38。

【例4-38】

SIGNALs1,s2,s3,s4:INTEGERRANGE0TO255;

...

s3<=s1+s2;

s4<=s1-s2;八個(gè)算術(shù)操作符可分為三類,分別是:加減操作符、乘除操作符【例4-39】【例4-39】例4-39的目的是完成一個(gè)4位的二進(jìn)制加法器,在時(shí)鐘上升沿到來(lái)時(shí)進(jìn)行加1計(jì)數(shù)。但是在編譯時(shí)卻出現(xiàn)了如圖4-9所示錯(cuò)誤:不能確定“+”的定義。觀察L15可以發(fā)現(xiàn),信號(hào)reg的數(shù)據(jù)類型是STD_LOGIC_VECTOR,而1是整型。按照前面對(duì)算術(shù)操作符的講述可知,其支持的數(shù)據(jù)類型并不包括STD_LOGIC_VECTOR,所以不能完成數(shù)據(jù)類型STD_LOGIC_VECTOR和INTEGER的相加操作。其實(shí),在IEEE庫(kù)中的std_logic_unsigned或者std_logic_signed程序包中,重新定義了加、減算術(shù)操作符,使其可以在STD_LOGIC_VECTOR與STD_LOGIC_VECTOR數(shù)據(jù)類型以及STD_LOGIC_VECTOR與INTEGER數(shù)據(jù)類型間進(jìn)行加法和減法運(yùn)算,具體函數(shù)定義參見(jiàn)附錄A。這類函數(shù)名稱相同,但所定義的操作數(shù)的數(shù)據(jù)類型不同的函數(shù),被稱為重載函數(shù)。所以,例4-39只需要在L3行后加上語(yǔ)句USEieee.std_logic_unsigned.all表示允許使用該程序包內(nèi)的預(yù)定義函數(shù),就能實(shí)現(xiàn)reg和1的無(wú)符號(hào)相加。如果調(diào)用的是程序包std_logic_signed,則能夠?qū)崿F(xiàn)有符號(hào)相加。例4-39的目的是完成一個(gè)4位的二進(jìn)制加法器,在時(shí)鐘上升圖4-9例4-39錯(cuò)誤信息圖4-9例4-39錯(cuò)誤信息2.乘除操作符

VHDL的乘除操作符包含4個(gè):“?*?”、“?/?”、“MOD”和“REM”,其中“MOD”和“REM”的本質(zhì)與除法操作是一致的。需要注意的是,從優(yōu)化的角度出發(fā),最好不要輕易使用乘除操作符,因?yàn)楫?dāng)位數(shù)較多時(shí),將會(huì)占用非常多的硬件資源,如16位的“?*?”運(yùn)算將耗費(fèi)幾百個(gè)邏輯單元才能實(shí)現(xiàn)。乘除運(yùn)算可以通過(guò)其他變通的方法來(lái)實(shí)現(xiàn),如:移位相加、LPM模塊、DSP模塊等。

“MOD”和“REM”的操作數(shù)類型只能是整數(shù),且運(yùn)算結(jié)果也是整數(shù)。如果操作數(shù)都是正整數(shù),則“MOD”和“REM”運(yùn)算結(jié)果相同,都可以看做普通取余運(yùn)算。但如果操作數(shù)出現(xiàn)負(fù)整數(shù)的情況,二者運(yùn)算結(jié)果不同。例4-40顯示了“MOD”與“REM”運(yùn)算結(jié)果的差別。2.乘除操作符

VHDL的乘除操作符包含4個(gè):“?*【例4-40】【例4-40】例4-40的仿真結(jié)果見(jiàn)圖4-10??梢钥吹疆?dāng)操作數(shù)都是正整數(shù)時(shí),二者結(jié)果完全一致。還可以得到如下結(jié)論:

(1)?“MOD”運(yùn)算結(jié)果的正負(fù)與操作數(shù)b的正負(fù)相同,如:5MOD3?=?2,5MOD(-3)=?-1。

(2)?“REM”運(yùn)算結(jié)果的正負(fù)與操作數(shù)a的正負(fù)相同,如:5REM3?=?2,(-5)REM3?=?-2。

具體來(lái)說(shuō),二者的運(yùn)算都可以套用公式a?-?b?×?N來(lái)計(jì)算,只是N的取值不同。當(dāng)進(jìn)行“MOD”運(yùn)算時(shí),N為除法結(jié)果向負(fù)無(wú)窮取整;而進(jìn)行“REM”運(yùn)算時(shí),N為除法結(jié)果向零取整。如:5/-3的除法結(jié)果向負(fù)無(wú)窮取整是?-2,而向零取整是?-1,所以“MOD”運(yùn)算的結(jié)果等于5?-?(-3)?×?(-2)=-1,而“REM”運(yùn)算的結(jié)果等于5?-?(-3)?×?(-1)=2。例4-40的仿真結(jié)果見(jiàn)圖4-10??梢钥吹疆?dāng)操作數(shù)都是正圖4-10例4-40仿真結(jié)果圖4-10例4-40仿真結(jié)果3.混合操作符

混合操作符包含“**”和ABS操作符,示例如下。

【例4-41】

SIGNALa :INTEGERRANGE0TO7:=3;

SIGNALb :INTEGERRANGE0TO7:=2;

SIGNALc :INTEGERRANGE-7TO7:=-5;

y<=a**b;

z<=abs(c);3.混合操作符

混合操作符包含“**”和ABS操作符4.4.4關(guān)系操作符

關(guān)系操作符的作用是將相同數(shù)據(jù)類型的數(shù)據(jù)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論