版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
4.1VHDL語言概述
4.2VHDL語言的特點(diǎn)
4.3VHDL語言的數(shù)據(jù)類型
4.4VHDL的數(shù)據(jù)對(duì)象
4.5運(yùn)算操作符
4.6實(shí)訓(xùn):設(shè)計(jì)2選1數(shù)據(jù)選擇器
習(xí)題4.1VHDL語言概述
VHDL(Very-high-speedIntegratedCircuitHardwareDescriptionLanguage)誕生于1982年,是美國國防部委托IBM和TexasInstruments聯(lián)合開發(fā)的。該語言的設(shè)計(jì)目標(biāo)有兩個(gè):一是使設(shè)計(jì)者可以用一種語言來描述他們希望描述的復(fù)雜電路;二是希望這種語言成為一種標(biāo)準(zhǔn),使VHSIC計(jì)劃中的每一個(gè)成員都能夠按照標(biāo)準(zhǔn)格式向別的成員提供設(shè)計(jì)。
1986年,VHDL被建議作為IEEE標(biāo)準(zhǔn),經(jīng)過了多次修改后,到1987年12月,它被接納為IEEE的標(biāo)準(zhǔn)。自IEEE公布了VHDL的標(biāo)準(zhǔn)版本——IEEE1076(簡(jiǎn)稱87版)之后,各EDA公司相繼推出了自己的VHDL設(shè)計(jì)環(huán)境,或宣布自己的設(shè)計(jì)工具可以和VHDL接口。此后,VHDL在電子設(shè)計(jì)領(lǐng)域得到了廣泛應(yīng)用,并逐步取代了原有的非標(biāo)準(zhǔn)硬件描述語言。1993年,IEEE對(duì)VHDL進(jìn)行了修訂,增加了文件類型與說明語句,增加了文件操作的功能,增加了操作符,并定義了共享變量,端口映射中可以采用常量等,從更高的抽象層次和系統(tǒng)描述能力上擴(kuò)展了VHDL的內(nèi)容。?新版本的VHDL即IEEE-1076-1993版本(簡(jiǎn)稱93版),讀者可參閱相應(yīng)的手冊(cè)?,F(xiàn)在,VHDL和VerilogHDL作為IEEE的工業(yè)標(biāo)準(zhǔn)硬件描述語言,在電子工程領(lǐng)域已成為事實(shí)上的通用硬件描述語言。有專家認(rèn)為,在新的世紀(jì)中,VHDL與VerilogHDL將承擔(dān)起大部分的數(shù)字系統(tǒng)設(shè)計(jì)任務(wù)。本書主要是以87版為基礎(chǔ)編寫的,在用一些EDA工具軟件進(jìn)行編譯時(shí),要事先指定版本號(hào),這一點(diǎn)請(qǐng)注意。
VHDL主要用于描述數(shù)字系統(tǒng)的結(jié)構(gòu)、行為、功能和接口。除了含有許多具有硬件特征的語句外,VHDL的語言形式、描述風(fēng)格與句法與一般的計(jì)算機(jī)高級(jí)語言基本相同。4.2VHDL語言的特點(diǎn)如今,大多數(shù)EDA工具軟件都采用VHDL語言作為主要的硬件描述語言,這主要源于VHDL強(qiáng)大的自身功能與特點(diǎn)。VHDL語言有如下特點(diǎn):
(1)?VHDL是工業(yè)標(biāo)準(zhǔn)的文本格式語言。VHDL已成為一種工業(yè)標(biāo)準(zhǔn),設(shè)計(jì)者、EDA工具供應(yīng)商以及芯片生產(chǎn)廠家都要遵循這一標(biāo)準(zhǔn)。該語言是一種文本格式的語言,ASIC的設(shè)計(jì)者在設(shè)計(jì)電路時(shí),就像編寫其他高級(jí)語言一樣,用文本來表達(dá)所要設(shè)計(jì)的電路,這樣能比較直觀地表達(dá)設(shè)計(jì)者的設(shè)計(jì)思想,并且易于修改。
(2)?VHDL具有強(qiáng)大的描述能力。VHDL語言既可以描述系統(tǒng)級(jí)電路,也可以描述門級(jí)電路;既可以采用行為級(jí)描述、數(shù)據(jù)流描述或結(jié)構(gòu)化描述,也可以采用三者混合的描述方式。VHDL還支持慣性延遲和傳輸延遲,可以方便地建立電子系統(tǒng)的模型,其強(qiáng)大的描述功能主要來自于強(qiáng)大的語法結(jié)構(gòu)和豐富的數(shù)據(jù)類型。
(3)?VHDL能同時(shí)支持仿真與綜合。VHDL語言是一種能夠支持系統(tǒng)仿真的語言。事實(shí)上,ASIC成功的關(guān)鍵在于生產(chǎn)前的設(shè)計(jì),而保證設(shè)計(jì)正確性的主要手段就是系統(tǒng)仿真。目前大部分的EDA工具支持VHDL語言級(jí)仿真。這樣,設(shè)計(jì)者在ASIC生產(chǎn)前就能夠知道設(shè)計(jì)的正確與否、系統(tǒng)的性能如何等關(guān)鍵問題。
VHDL不僅僅是一種仿真語言,它的大部分語句是可綜合的,但也有一部分不支持綜合,但其中的可綜合語句足以描述一個(gè)大而完整的系統(tǒng)。目前所有的高層綜合工具所支持的綜合語句都是IEEE標(biāo)準(zhǔn)的一個(gè)子集。因此,VHDL語言可以有兩種完全不同的描述:一種是基于仿真的描述,它可以使用VHDL定義的各種語句,這類程序主要供編寫測(cè)試基準(zhǔn)程序和各種仿真模型的工程師使用;另外一種是用于生成具體電路的可綜合描述,它只能使用VHDL中的可綜合子集,這類程序主要供從事電路設(shè)計(jì)的工程師使用,本書中主要偏重于這種類型的VHDL描述。
(4)?VHDL是一種并發(fā)執(zhí)行的語句。幾乎所有高級(jí)語言程序的執(zhí)行都是順序的,而VHDL語言執(zhí)行在總體上是并行的,這種特性符合實(shí)際邏輯電路的工作過程。
(5)?VHDL支持結(jié)構(gòu)化設(shè)計(jì)與top-down設(shè)計(jì)方法。VHDL語言是一種結(jié)構(gòu)化的語言,它提供的語句可以完成多層結(jié)構(gòu)的描述,因此VHDL語言支持結(jié)構(gòu)化設(shè)計(jì)。結(jié)構(gòu)化設(shè)計(jì)就是將一個(gè)系統(tǒng)劃分為多個(gè)模塊,而每個(gè)模塊又可以繼續(xù)劃分為更多的子模塊。EDA設(shè)計(jì)是自頂向下的,由于VHDL語言支持結(jié)構(gòu)化設(shè)計(jì),因而就可以采用top-down設(shè)計(jì)方法,從系統(tǒng)整體要求出發(fā),自上而下地逐步將系統(tǒng)內(nèi)容細(xì)化,最后完成系統(tǒng)設(shè)計(jì)。
(6)?VHDL的描述與工藝無關(guān)。設(shè)計(jì)者在利用VHDL描述電路時(shí)并不需要關(guān)心電路最終將采用哪種工藝實(shí)現(xiàn),EDA工具可以將VHDL源代碼映射到不同的工藝庫上,提高了設(shè)計(jì)的可重用性。
VHDL語言還有共享與調(diào)用功能。利用VHDL設(shè)計(jì)的電路是文本格式的程序,易于保存與管理。4.3VHDL語言的數(shù)據(jù)類型作為一種硬件描述語言,VHDL與其它高級(jí)語言一樣,其信號(hào)、變量、常量都要指定數(shù)據(jù)類型。VHDL提供了多種標(biāo)準(zhǔn)的數(shù)據(jù)類型,還可以由用戶自定義數(shù)據(jù)類型。VHDL數(shù)據(jù)類型的定義相當(dāng)嚴(yán)格,不同類型之間的數(shù)據(jù)不能直接代入,即使數(shù)據(jù)類型相同、長度不同也不能直接代入。4.3.1預(yù)定義(標(biāo)準(zhǔn))數(shù)據(jù)類型
VHDL的預(yù)定義數(shù)據(jù)類型都是在VHDL標(biāo)準(zhǔn)的程序包STANDARD中定義的,在實(shí)際使用時(shí),會(huì)自動(dòng)包含到VHDL的源程序中,因此不必通過USE語句進(jìn)行調(diào)用。
1.位(BIT)與位矢量(BIT_VECTOR)數(shù)據(jù)類型
在數(shù)字系統(tǒng)中,信號(hào)通常用一個(gè)位來表示,取值只能是“1”或“0”。如果一個(gè)量一次可取多個(gè)位值,則在VHDL語言中把它定義為位矢量。位矢量其實(shí)是基于BIT數(shù)據(jù)類型的數(shù)組。使用位矢量必須注明位長,即數(shù)組中元素的個(gè)數(shù)和排列情況。
【例4-1】SIGNAL
a:BIT_VECTOR(7DOWNTO0);
說明:信號(hào)a被定義為一個(gè)8位位長的矢量,其最左邊是a(7),最右邊是a(0)。
【例4-2】SIGNAL
a:BIT_VECTOR(0TO7);
說明:信號(hào)a被定義為一個(gè)8位位長的矢量,其最左邊是a(0),最右邊是a(7)。
位與位矢量可以按位進(jìn)行訪問,也可以進(jìn)行邏輯運(yùn)算。
2.整數(shù)(INTEGER)數(shù)據(jù)類型
整數(shù)數(shù)據(jù)類型與算術(shù)中的整數(shù)定義相同,其取值范圍為
-(231-1)~+(231-1),可以進(jìn)行加、減、乘、除等算術(shù)運(yùn)算。整數(shù)的取值范圍比較大,而VHDL語言是硬件描述語言,為了確定整數(shù)的存儲(chǔ)空間,VHDL綜合器要求用RANGE為所定義的整數(shù)限定范圍,然后根據(jù)所限定的范圍來決定表示此信號(hào)或變量的二進(jìn)制數(shù)的位數(shù)。
【例4-3】SIGNAL
abus:INTEGERRANGE0TO15;
說明:abus是一個(gè)整數(shù),其取值為0~15。
在應(yīng)用時(shí)整數(shù)不能按位訪問,并且對(duì)整數(shù)也不能用邏輯操作符。如果需要進(jìn)行邏輯操作或按位訪問操作,則可以運(yùn)用類型轉(zhuǎn)換函數(shù)將整數(shù)轉(zhuǎn)換成BIT_VECTOR類型的數(shù)后再進(jìn)行操作。綜合器對(duì)abus綜合時(shí)可用4位二進(jìn)制數(shù)來表示,因此,abus將被綜合成由4條信號(hào)線構(gòu)成的信號(hào)。
整數(shù)常量的書寫方式見例4-4。
【例4-4】?3(十進(jìn)制整數(shù)),10E4(十進(jìn)制整數(shù)),16#D2#(十六進(jìn)制整數(shù)),2#11011010#(二進(jìn)制整數(shù))。
3.布爾(BOOLEAN)數(shù)據(jù)類型
布爾數(shù)據(jù)類型只有“真”和“假”兩個(gè)狀態(tài)。布爾數(shù)據(jù)類型沒有數(shù)值含義,不能進(jìn)行算術(shù)運(yùn)算,但可以進(jìn)行關(guān)系運(yùn)算,可以在IF語句中被測(cè)試,產(chǎn)生一個(gè)布爾量。如果有一個(gè)布爾類型的信號(hào)名為BE,對(duì)其進(jìn)行賦值:BE<=(5>2)(“<=”為信號(hào)賦值語句),則BE的值為TRUE;如果為BE<=(5<2),則值為FALSE。綜合器對(duì)布爾類型的數(shù)值進(jìn)行綜合時(shí),將其變?yōu)?或0信號(hào)值,對(duì)應(yīng)于硬件系統(tǒng)中的一根連線。
4.字符(CHARACTER)與字符串(STRING)數(shù)據(jù)類型
字符類型通常用單引號(hào)引起來,如'A'。一般情況下,VHDL語言對(duì)于字母的大小寫不敏感,但是對(duì)于字符量中的大小寫字符卻認(rèn)為是不一樣的。字符串?dāng)?shù)據(jù)類型是字符數(shù)據(jù)類型的一個(gè)非約束型數(shù)組,或稱為字符串?dāng)?shù)組。字符串必須用雙引號(hào)標(biāo)明。
【例4-5】
SINGAL
STRING_VAR:STRING(1TO7);
…
STRING<="abcd";?_?_空格也作為一個(gè)字符
5.實(shí)數(shù)(REAL)數(shù)據(jù)類型
在進(jìn)行算法研究或?qū)嶒?yàn)時(shí),作為對(duì)硬件方案的抽象手段,常常用到實(shí)數(shù)的四則運(yùn)算。通常情況下,實(shí)數(shù)僅能在VHDL仿真中使用,實(shí)數(shù)的取值范圍為-1.0E38~+1.0E38。
實(shí)數(shù)常量的書寫方式見例4-6。
【例4-6】65971.333333(十進(jìn)制浮點(diǎn)數(shù)),8#43.6#E+4(八進(jìn)制浮點(diǎn)數(shù)),43.6E-4(十進(jìn)制浮點(diǎn)數(shù))。
6.時(shí)間(TIME)數(shù)據(jù)類型
VHDL中唯一預(yù)定義的物理類型是時(shí)間。完整的時(shí)間類型包括整數(shù)和物理量單位兩部分,整數(shù)和單位之間至少留一個(gè)空格,如50ms、30ns。時(shí)間類型僅在仿真中使用,使模型系統(tǒng)更逼近實(shí)際系統(tǒng)的運(yùn)行情況。
STANDARD程序包中也定義了時(shí)間,參見例4-7。
【例4-7】
TYPETIMEISRANGE-2147483647TO2147483647;
UNITS
fs: --飛秒,VHDL中最小的時(shí)間單位
ps=1000fs; --皮秒
ns=1000ps; --納秒
us=1000ns; --微秒
ms=1000us; --毫秒
sec=1000ms; --秒
min=60sec; --分
hr=60min; --時(shí)
ENDUNTIS;
7.自然數(shù)(NATURAL)和正整數(shù)(POSITIVE)數(shù)據(jù)類型
自然數(shù)是整數(shù)的一個(gè)子類型,是非負(fù)的整數(shù),包括零和正整數(shù)。正整數(shù)也是一個(gè)子類型,它包括整數(shù)中非零和非負(fù)的數(shù)值。自然數(shù)和正整數(shù)在STANDARD程序包中定義的源代碼見例4-8。
【例4-8】
SUBTYPENATURALISINTEGERRANGE0TOINTEGER‘HIGH;
SUBTYPEPOSITIVEISINTEGERRANGE1TOINTEGER'HIGH;
8.錯(cuò)誤等級(jí)(SEVERITY
LEVEL)
在VHDL仿真器中,錯(cuò)誤等級(jí)用來指示設(shè)計(jì)系統(tǒng)的工作狀態(tài),共有4種可能的狀態(tài)值:NOTE(注意)、WARNING(警告)、ERROR(錯(cuò)誤)、FAILURE(失敗)。在仿真過程中,可輸出這4種值來提示被仿真系統(tǒng)當(dāng)前的工作情況。4.3.2IEEE預(yù)定義標(biāo)準(zhǔn)邏輯位與矢量
1.標(biāo)準(zhǔn)邏輯位STD_LOGIC數(shù)據(jù)類型
在數(shù)字系統(tǒng)設(shè)計(jì)中,信號(hào)值通常用一個(gè)位(BIT)來表示,事實(shí)上用BIT數(shù)據(jù)類型去描述信號(hào)狀態(tài)是不夠的,數(shù)字系統(tǒng)中狀態(tài)的取值還有高阻、不定值等。為了更好地描述數(shù)字系統(tǒng),在IEEE庫的包集合STD_LOGIC和STD_LOGIC_1164中有如下的定義:
TYPE
std_logicIS(‘U’,‘X’,‘1’,‘0’,‘Z’,‘W’,‘L’,‘H’,‘-’);
表示std_logic數(shù)值類型具有9種不同的值:U(未初始化的)、X(強(qiáng)未知的)、0(強(qiáng)0)、1(強(qiáng)1)、Z(高阻態(tài))、W(弱未知的)、L(弱0)、H(弱1)、-(忽略)。把STD_LOGIC稱為標(biāo)準(zhǔn)的邏輯位,其對(duì)應(yīng)的矢量稱為標(biāo)準(zhǔn)邏輯位矢量。在IEEE庫的程序包STD_LOGIC_1164中,定義了兩個(gè)非常重要的數(shù)據(jù)類型,即標(biāo)準(zhǔn)邏輯位STD_LOGIC和標(biāo)準(zhǔn)邏輯矢量STD_LOGIC_?VECTOR。在仿真和綜合中,STD_LOGIC值是非常重要的,它可以使設(shè)計(jì)者精確模擬一些未知和高阻態(tài)的線路情況。對(duì)于綜合器,高阻態(tài)和忽略態(tài)可用于三態(tài)的描述。但就綜合而言,STD_LOGIC型數(shù)據(jù)能夠在數(shù)字器件中實(shí)現(xiàn)的只有其中4種值,即“-”、“0”、“1”和“Z”。當(dāng)然,這并不表明其余的5種值不存在。這9種值對(duì)于VHDL的行為仿真都有重要意義。
2.標(biāo)準(zhǔn)邏輯矢量(STD_LOGIC_VECTOR)數(shù)據(jù)類型
STD_LOGIC_VECTOR類型定義如下:
TPYESTD_LOGIC_VECTORISARRAY(NATURALRANGE<>)OFSTD_LOGIC;
顯然,STD_LOGIC_VECTOR是定義在STD_LOGIC_1164程序包中的標(biāo)準(zhǔn)一維數(shù)組,數(shù)組中的每一個(gè)元素的數(shù)據(jù)都是以上定義的標(biāo)準(zhǔn)邏輯位STD_LOGIC。
STD_LOGIC_VECTOR數(shù)據(jù)類型的數(shù)據(jù)對(duì)象賦值的原則是:同位寬、同數(shù)據(jù)類型的矢量間才能進(jìn)行賦值。例4-9描述的是CPU中數(shù)據(jù)總線上位矢量賦值的操作,注意例中信號(hào)數(shù)據(jù)類型定義和賦值操作中信號(hào)的數(shù)組位寬。描述總線信號(hào),使用STD_LOGIC_VECTOR是方便的,但需注意的是總線中的每一個(gè)信號(hào)都必須定義為同一種STD_LOGIC數(shù)據(jù)類型。
3.其它預(yù)定義標(biāo)準(zhǔn)數(shù)據(jù)類型
VHDL綜合工具配備的擴(kuò)展程序包中,還定義了一些有用的數(shù)據(jù)類型,如Synopsys公司在IEEE庫中加入的程序包STD_LOGIC_ARITH中定義了無符號(hào)型(UNSIGNED)、有符號(hào)型(SIGNED)、小整型(SMALL_INT)數(shù)據(jù):
TYPE
UNSIGNED
IS
ARRAY(NATURAL
RANGE<>)OF
STD_LOGIC;
TYPE
SIGNED
IS
ARRAY(NATURAL
RANGE<>)OF
STD_LOGIC;
SUBTYPE
SMAIL_INT
IS
INTEGER
RANGE
0TO1;如果將信號(hào)或變量定義為這三種數(shù)據(jù)類型,就可以使用程序包STD_LOGIC_ARITH中定義的運(yùn)算符。在使用之前,請(qǐng)注意必須加入下面的語句:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_ARITH.ALL;
UNSIGNED類型和SIGNED類型是用來設(shè)計(jì)可綜合的數(shù)學(xué)運(yùn)算程序的重要類型,UNSIGNED用于無符號(hào)數(shù)的運(yùn)算。在實(shí)際運(yùn)用中,多數(shù)運(yùn)算都需要用到它們。在IEEE程序包中,NUMERIC_STD和NUMERIC_BIT程序包中也定義了UNSIGNED及SIGNED數(shù)據(jù)類型,NUMERIC_STD是針對(duì)于STD_LOGIC型定義的,而NUMERIC_BIT是針對(duì)于BIT型定義的。此外,程序包中還定義了相應(yīng)的運(yùn)算符重載函數(shù)。有些綜合器沒有附帶STD_LOGIC_ARITH程序包,此時(shí)只能使用NUMERIC_STD和NUMERIC_BIT程序包。
在STANDARD程序包中沒有定義STD_LOGIC_VECTOR的運(yùn)算符,而整數(shù)類型一般只在仿真的時(shí)候用來描述算法,因此UNSIGNED和SIGNED的使用率是很高的。
(1)無符號(hào)數(shù)據(jù)類型(UNSIGNEDTYPE)。UNSIGNED數(shù)據(jù)類型代表一個(gè)無符號(hào)的數(shù)值,在綜合器中,這個(gè)數(shù)值被解釋為一個(gè)二進(jìn)制數(shù),這個(gè)二進(jìn)制數(shù)最左邊是其最高位。例如,十進(jìn)制的8可以表示如下:
UNSIGNED(“1000”)
如果要定義一個(gè)變量或信號(hào)的數(shù)據(jù)類型為UNSIGNED,則其位矢量長度越長,所能代表的數(shù)值就越大。不能用UNSIGNED定義負(fù)數(shù)。以下是兩則無符號(hào)數(shù)據(jù)定義的示例:
【例4-10】
VARIABLEVAR:UNSIGNED(0TO10);
SIGNALSIG:UNSIGNED(5DOWNTO0);
其中,變量VAR有11位數(shù)值,最高位是VAR(0),而非VAR(10);信號(hào)SIG有6位數(shù)值,最高位是SIG(5)。
(2)有符號(hào)數(shù)據(jù)類型(SIGNEDTYPE)。SIGNED數(shù)據(jù)類型代表一個(gè)無符號(hào)的數(shù)值,綜合器將其解釋為補(bǔ)碼,此數(shù)的最高位是符號(hào)位。例如:SIGNED(“1011”)代表+5,SIGNED(“1101”)代表-5。
若將例4-10中的VAR定義為SIGNED數(shù)據(jù)類型,則數(shù)值意義就不同了。如:
VARIABLE
VAR:SIGNED(0
TO10):
其中,變量VAR有11位,最左位VAR(0)是符號(hào)位。4.3.3用戶定義的數(shù)據(jù)類型
VHDL允許用戶自定義新的數(shù)據(jù)類型,如枚舉類型(ENUMERATIONTYPE)、整數(shù)類型(INTEGERTYPE)、數(shù)組類型(ARRAYTYPE)、記錄類型(RECORDTYPE)、時(shí)間類型(TIMETYPE)、實(shí)數(shù)類型(REALTYPE)等。用戶自定義數(shù)據(jù)是用類型定義語句TYPE和子類型定義語句SUBTYPE實(shí)現(xiàn)的,以下將介紹這兩種語句的使用方法。
1.TYPE語句
TYPE語句的語法結(jié)構(gòu)如下:
TYPE數(shù)據(jù)類型名IS數(shù)據(jù)類型定義[OF基本數(shù)據(jù)類型];
其中,數(shù)據(jù)類型名由設(shè)計(jì)者自定;數(shù)據(jù)類型定義部分用來描述定義數(shù)據(jù)類型的表達(dá)方式和表達(dá)內(nèi)容;關(guān)鍵詞OF后的基本數(shù)據(jù)類型是指數(shù)據(jù)類型定義的元素的基本數(shù)據(jù)類型,一般都是取已有的預(yù)定義數(shù)據(jù)類型,如BIT、STD_LOGIC或INTEGER等。例如:
TYPE
ST1
IS
ARRAY(0TO15)OF
STD_LOGIC;
該句定義的數(shù)據(jù)ST1是一個(gè)具有16個(gè)元素的數(shù)組型數(shù)據(jù),數(shù)組中的每一個(gè)元素的數(shù)據(jù)類型都是STD_LOGIC型。在VHDL中,任一數(shù)據(jù)對(duì)象(SIGNAL、VARIABLE、CONSTANT)都必須歸屬某一數(shù)據(jù)類型,只有同數(shù)據(jù)類型的數(shù)據(jù)對(duì)象才能進(jìn)行相互作用。利用TYPE語句可以完成各種形式的自定義數(shù)據(jù)類型以供不同類型的數(shù)據(jù)對(duì)象間的相互作用和計(jì)算。
2.SUBTYPE語句
子類型SUBTYPE只是由TYPE所定義的原數(shù)據(jù)類型的一個(gè)子集,它滿足原始數(shù)據(jù)類型的所有約束條件,原數(shù)據(jù)類型稱為基本數(shù)據(jù)類型。子類型SUPTYPE的語句格式如下:
SUBTYPE子類型名IS基本數(shù)據(jù)類型RANGE約束范圍;
子類型的定義只在基本數(shù)據(jù)類型上作一些約束,并沒有定義新的數(shù)據(jù)類型。子類型定義中的基本數(shù)據(jù)類型必須是已經(jīng)存在的數(shù)據(jù)類型。
【例4-11】SUBTYPE
DIGITS
ISINTEGER
RANGE
0TO9;
其中,INTEGER是標(biāo)準(zhǔn)程序包中已定義過的數(shù)據(jù)類型,子類型DIGITS只是把INTEGER約束為只含10個(gè)值。
由于子類型與其基本數(shù)據(jù)類型屬同一數(shù)據(jù)類型,因此屬于子類型的和屬于基本數(shù)據(jù)類型的數(shù)據(jù)對(duì)象間的賦值和被賦值可以直接進(jìn)行,不必進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換。
利用子類型定義數(shù)據(jù)對(duì)象,可以提高程序的可讀性和易處理性,還有利于提高綜合的優(yōu)化效率,這是因?yàn)榫C合器可以根據(jù)子類型所設(shè)的約束范圍,有效地推知參與綜合的寄存器最合適的數(shù)目。
3.枚舉類型
枚舉類型是TYPE的特殊用法,VHDL中的枚舉數(shù)據(jù)類型用文字符號(hào)來表示一組實(shí)際的二進(jìn)制的類型(若直接用數(shù)值來定義,則必須使用單引號(hào))。例如狀態(tài)機(jī)的每一狀態(tài)在實(shí)際電路中雖然是以一組觸發(fā)器的當(dāng)前二進(jìn)制數(shù)位的組合來表示的,但設(shè)計(jì)者在狀態(tài)機(jī)的設(shè)計(jì)中,為了便于閱讀和編譯,往往將表征每一狀態(tài)的二進(jìn)制數(shù)組用文字符號(hào)來表示。
【例4-12】
TYPE
M_STATE
IS(STATE1,STATE2,STATE3,STATE4,STATE5);
SIGNAL
CURRENT_STATE,NEXT_STATE:M_STATE;
TYPEWEEKIS(SUN,MON,TUE,WED,THU,FRI,SAT);
在這里,信號(hào)CURRENT_STATE和NEXT_STATE的數(shù)據(jù)類型定義為M_STATE,它們的取值范圍是可枚舉的,即從STATE1~STATE5共5種,代表5組惟一的二進(jìn)制數(shù)值?!癢EEK”也是一個(gè)枚舉類型,定義了7種取值,表示周日至周六。在綜合過程中,枚舉類型文字元素的編碼通常是自動(dòng)的,編碼順序是默認(rèn)的,一般將第一個(gè)枚舉量(最左邊的量)編碼為0,以后的依次加1。綜合器在編碼過程中自動(dòng)將第一枚舉元素轉(zhuǎn)變成位矢量,位矢量的長度取所需表達(dá)的所有枚舉元素的最小值。如例4-12中設(shè)用于表達(dá)5個(gè)狀態(tài)的矢位長度為3,編碼默認(rèn)值如下:
STATE1=‘000’;STATE2=‘001’;STATE3=‘010’;STATE4=‘011’;STATE5=‘100’它們的數(shù)值順序?yàn)镾TATE1<STATE2<STATE3<STATE4<STATE5。一般而言,編碼方法因綜合器不同而不同。
為了某些特殊的需要,編碼順序也可以人為設(shè)置。
4.整數(shù)自定義類型和實(shí)數(shù)自定義類型
整數(shù)和實(shí)數(shù)的數(shù)據(jù)類型在標(biāo)準(zhǔn)的程序包中已作定義,但在實(shí)際應(yīng)用中,特別在綜合中,由于這兩種非枚舉數(shù)據(jù)類型的取值定義范圍太大,綜合器無法進(jìn)行綜合,因而定義為整數(shù)或?qū)崝?shù)的數(shù)據(jù)對(duì)象的具體數(shù)據(jù)類型必須由用戶根據(jù)實(shí)際需要重新定義,并限定其取值范圍,以便能為綜合器所接受,從而提高芯片資源的利用率。這種定義其實(shí)也是SUBTYPE的特殊用法。實(shí)際應(yīng)用中,VHDL仿真器通常將整數(shù)或?qū)崝?shù)類型的數(shù)據(jù)作為有用符號(hào)數(shù)處理。VHDL綜合器對(duì)整數(shù)或?qū)崝?shù)的編碼方法是:
(1)對(duì)用戶已定義的數(shù)據(jù)和子類型中的負(fù)數(shù),編碼為二進(jìn)制補(bǔ)碼;
(2)對(duì)用戶已定義的數(shù)據(jù)和子類型中的正數(shù),編碼為二進(jìn)制原碼。
編碼的位數(shù)即綜合后信號(hào)線的數(shù)目只取決于用戶定義的數(shù)值的最大值。在綜合中,以浮點(diǎn)數(shù)表示的實(shí)數(shù)將首先轉(zhuǎn)換成相應(yīng)數(shù)值大小的整數(shù)。因此在使用整數(shù)時(shí),VHDL綜合器要求使用數(shù)值限定關(guān)鍵詞RANGE,對(duì)整數(shù)的使用范圍作明確的限制。
5.?dāng)?shù)組類型
數(shù)組類型屬復(fù)合型數(shù)據(jù)類型,是指將一組具有相同數(shù)據(jù)類型的元素集合在一起,作為一個(gè)數(shù)據(jù)對(duì)象來處理。數(shù)組可以是一維(每個(gè)元素只有一個(gè)下標(biāo))數(shù)組或多維數(shù)組(每個(gè)元素有多個(gè)下標(biāo))。VHDL仿真器支持多維數(shù)組,但綜合器只支持一維數(shù)組。
數(shù)組的元素可以是任何一種數(shù)據(jù)類型,用以定義數(shù)組元素下標(biāo)范圍的子句決定了數(shù)組中元素的個(gè)數(shù)以及元素的排序方向,如子句“0TO7”是由低到高排序的8個(gè)元素,“15DOWNTO0”是由高到低排序的16個(gè)元素。
VHDL允許定義兩種不同類型的數(shù)組,即限定性數(shù)組和非限定性數(shù)組。它們的區(qū)別是,限定性數(shù)組下標(biāo)的取值范圍在數(shù)組定義時(shí)就被確認(rèn)了,而非限定性數(shù)組下標(biāo)的取值范圍需留待隨后根據(jù)具體數(shù)據(jù)對(duì)象再確定。
(1)限定性數(shù)組的定義語句格式如下:
TYPE數(shù)組名ISARRAY(數(shù)組范圍)OF數(shù)據(jù)類型;
其中,數(shù)組名是新定義的限定性數(shù)組類型的名稱,可以是任何標(biāo)識(shí)符,其類型與數(shù)組元素相同;數(shù)組范圍明確指出數(shù)組元素的數(shù)量和排序方式,以整數(shù)來表示其下標(biāo);數(shù)據(jù)類型即指數(shù)組各元素的數(shù)據(jù)類型。
【例4-14】?TYPE
STB
IS
ARRAY(7DOWNTO0)?OF
STD_LOGIC;
這個(gè)數(shù)組類型的名稱是STB,它有8個(gè)元素,其下標(biāo)排序?yàn)?~0,各元素的排序是STB(7)~STB(0)。
(2)非限定性數(shù)組的定義語句格式如下:
TYPE數(shù)組名ISARRAY(數(shù)組下標(biāo)名RANCE<>)OF數(shù)據(jù)類型;
其中,數(shù)組名是定義的非限定性數(shù)組類型的名稱;數(shù)組下標(biāo)名是以整數(shù)類型設(shè)定的一個(gè)數(shù)組下標(biāo)名稱;符號(hào)“<>”是下標(biāo)范圍待定符號(hào),用到該數(shù)組類型時(shí),再填入具體的數(shù)值范圍;數(shù)據(jù)類型是數(shù)組中每一元素的數(shù)據(jù)類型。比如STD_LOGIC_VECTOR的定義語句為“TPYESTD_LOGIC_VECTORISARRAY(NATURALRANGE<>)OFSTD_LOGIC”,這其實(shí)也是非限定性數(shù)組的定義語句。
6.記錄類型
由已定義的、數(shù)據(jù)類型不同的對(duì)象元素構(gòu)成的數(shù)組稱為記錄類型的對(duì)象。定義記錄類型的語句格式如下:
TYPE記錄類型名ISRECORD
元素名:元素?cái)?shù)據(jù)類型;
元素名:元素?cái)?shù)據(jù)類型;
…
END
RECORD[記錄類型名];對(duì)記錄類型的數(shù)據(jù)對(duì)象進(jìn)行賦值,可以整體賦值,也可以對(duì)其中的單個(gè)元素進(jìn)行賦值。在使用整體賦值方式時(shí),有位置關(guān)聯(lián)方式和名字關(guān)聯(lián)方式兩種表達(dá)方式。如果使用位置關(guān)聯(lián)方式,則默認(rèn)為元素賦值的順序與記錄類型聲明的順序相同。如果使用了OTHERS選項(xiàng),則至少應(yīng)有一個(gè)元素被賦值;如果有兩個(gè)或更多的元素由OTHERS選項(xiàng)來賦值,則這些元素必須具有相同的類型。此外,如果有兩個(gè)或兩個(gè)以上的元素具有相同的元素和相同的子類型,就可以將其以記錄類型的方式放在一起定義。本例中定義的記錄OPERATION共有五個(gè)元素:一個(gè)是加法指令碼的字符串OPSTR,一個(gè)是4位操作碼OPCODE,另三個(gè)是枚舉型數(shù)據(jù)OP1、OP2、RES(其中OP1和OP2是操作數(shù),RES是目標(biāo)碼)。例中定義的變量INSTR1的數(shù)據(jù)類型是記錄型OPERATION,它的第一個(gè)元素是加法指令字符串“ADD,AXBX”;第二個(gè)元素是此指令的4位命令代碼“0001”;第三、第四個(gè)元素為AX和BX;AX和BX相加后的結(jié)果送入第五個(gè)元素AX,因此這里的AX是目標(biāo)碼。語句“INSTR3,OPSTR?:?=”MULAX,BX“;”賦給INSTR3中的元素OPSTR。一般來說,對(duì)于記錄類型的數(shù)據(jù)對(duì)象進(jìn)行賦值時(shí),就在記錄類型對(duì)象名后加“.”,再加賦值元素的名稱。
若記錄類型中的每一個(gè)元素僅為標(biāo)量型數(shù)據(jù)類型,則稱為線性記錄類型,否則為非線性記錄類型。只有線性記錄類型的數(shù)據(jù)對(duì)象都是可綜合的。
7.?dāng)?shù)據(jù)類型轉(zhuǎn)換
VHDL是一種強(qiáng)類型語言,因此不同數(shù)據(jù)類型的數(shù)據(jù)對(duì)象在相互操作時(shí),需要進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換。
(1)類型轉(zhuǎn)換函數(shù)方式。類型轉(zhuǎn)換函數(shù)的作用就是將一種屬于某種數(shù)據(jù)類型的數(shù)據(jù)對(duì)象轉(zhuǎn)換成屬于另一種數(shù)據(jù)類型的數(shù)據(jù)對(duì)象。此例中利用了DATAIO庫中的程序包STD_LOGIC_OPS中的兩個(gè)數(shù)據(jù)類型轉(zhuǎn)換函數(shù):TO_VECTOR(將INTEGER轉(zhuǎn)換成STD_LOGIC_VECTOR)和TO_INTEGER(將STD_LOGIC_VECTOR轉(zhuǎn)換成INTEGER)。通過這兩個(gè)轉(zhuǎn)換函數(shù),就可以使用“+”運(yùn)算符進(jìn)行直接加1操作了,同時(shí)又能保證最后的加法結(jié)果是STD_LOGIC_VECTOR數(shù)據(jù)類型。
利用類型轉(zhuǎn)換函數(shù)來進(jìn)行類型轉(zhuǎn)換需定義一個(gè)函數(shù),使其參數(shù)類型為被轉(zhuǎn)換的類型,返回值為轉(zhuǎn)換后的類型。在實(shí)際運(yùn)用中經(jīng)常使用類型轉(zhuǎn)換函數(shù),VHDL的標(biāo)準(zhǔn)程序包中提供了一些常用的轉(zhuǎn)換函數(shù),見表4-1。
(2)直接類型轉(zhuǎn)換方式。直接類型轉(zhuǎn)換的一般語句格式是:
數(shù)據(jù)類型標(biāo)識(shí)符(表達(dá)式)
一般情況下,直接類型轉(zhuǎn)換僅限于非常關(guān)聯(lián)(數(shù)據(jù)類型相互間的關(guān)聯(lián)性非常大)的數(shù)據(jù)類型之間,且必須遵守以下規(guī)則:
①所有的抽象數(shù)字類型是非常關(guān)聯(lián)的類型(如整型、浮點(diǎn)型),如果浮點(diǎn)數(shù)轉(zhuǎn)換為整數(shù),則轉(zhuǎn)換結(jié)果是最近的一個(gè)整型數(shù)。
②如果兩個(gè)數(shù)組有相同的維數(shù),兩個(gè)數(shù)組的元素是同一類型,并且在各處的下標(biāo)范圍內(nèi)索引是同一類型或非常接近的類型,那么這兩個(gè)數(shù)組是非常關(guān)聯(lián)類型。③枚舉型不能被轉(zhuǎn)換。
如果類型標(biāo)識(shí)符所指的是非限定數(shù)組,則結(jié)果會(huì)將被轉(zhuǎn)換的數(shù)組的下標(biāo)范圍去掉,即成為非限定數(shù)組。如果類型標(biāo)識(shí)符所指的是限定性數(shù)組,則轉(zhuǎn)換后的數(shù)組的下標(biāo)范圍與類型標(biāo)識(shí)符所指的下標(biāo)范圍相同。轉(zhuǎn)換結(jié)束后,數(shù)組中元素的值等價(jià)于原數(shù)組中的元素值。
【例4-18】
VARIABLEDATAC,PARAMC:INTEGERRANGE0TO255
…
DATAC:=INTEGER(74.94*REAL(PARAMC));4.4VHDL的數(shù)據(jù)對(duì)象在VHDL語言中,數(shù)據(jù)對(duì)象(DataObjects)也叫做VHDL語言的客體,它類似于一種容器,接收不同數(shù)據(jù)類型的賦值。VHDL語言是一種硬件描述語言,它描述硬件電路的工作情況。硬件電路的工作過程實(shí)際上是信號(hào)變化及傳輸?shù)倪^程,所以VHDL語言的基本數(shù)據(jù)對(duì)象就是信號(hào)(SIGNAL)。除了信號(hào)外,VHDL語言還有三種數(shù)據(jù)對(duì)象,分別為常量(CONSTANT)、變量(VARIABLE)和文件(FILE)。在電子電路中,這四類數(shù)據(jù)對(duì)象都具有一定的含義。信號(hào)對(duì)應(yīng)地代表物理設(shè)計(jì)中的一條硬件連線;常量代表數(shù)字電路中的電源和地等;變量一般用來表示進(jìn)行數(shù)據(jù)暫時(shí)存儲(chǔ)的載體;文件是傳輸大量數(shù)據(jù)的一種特殊的數(shù)據(jù)對(duì)象,這是在VHDL93標(biāo)準(zhǔn)中新通過的,它在TEXTIO描述語句中詳細(xì)說明。4.4.1常量
常量是指在VHDL程序中一經(jīng)定義后就不再發(fā)生變化的值,它可以在很多區(qū)域中進(jìn)行說明。在編寫VHDL程序的過程中,設(shè)計(jì)人員經(jīng)常把在VHDL程序中多處使用的數(shù)值設(shè)計(jì)為一個(gè)常量,以后如果需要修改這個(gè)數(shù)值,僅修改這個(gè)常量就可以了。常量在使用之前必須進(jìn)行說明,其描述格式如下:
CONSTANT常量名[,常量名,…]:數(shù)據(jù)類型[約束條件][:=初始值];
其中,[]表示可選項(xiàng)。
【例4-19】
CONSTANT
fbus:BIT_VECTOR:=“010115”; --位矢量數(shù)據(jù)類型
CONSTANT
vcc:REAL:=5.0;
--實(shí)數(shù)數(shù)據(jù)類型
CONSTANT
delay:TIME:=15ns;
--時(shí)間數(shù)據(jù)類型常量定義說明語句所允許的設(shè)計(jì)單元有實(shí)體、結(jié)構(gòu)體、程序包、塊、進(jìn)程和子程序等。常量在程序包中進(jìn)行定義后,所有調(diào)用該程序包的VHDL程序都可以使用該常量,常量具有最大的全局化特征。在程序包中進(jìn)行定義時(shí),常量的數(shù)值在包首中可以先不進(jìn)行定義,而把該數(shù)值在包體中進(jìn)行定義,也可以在包首中定義完整的常量語句,具體應(yīng)用請(qǐng)參考程序包的章節(jié)。如果在實(shí)體中進(jìn)行定義,則常量在該實(shí)體所對(duì)應(yīng)的所有結(jié)構(gòu)體中都有效;如果在結(jié)構(gòu)體中定義,則常量?jī)H在該結(jié)構(gòu)體中有效;如果在進(jìn)程與子程序中定義常量,則其僅在該進(jìn)程與子程序中有效。4.4.2信號(hào)
信號(hào)是描述硬件系統(tǒng)的基本數(shù)據(jù)對(duì)象,它類似于硬件的連接線。信號(hào)可以作為設(shè)計(jì)實(shí)體中并行語句模塊間的信息交流通道。在多個(gè)進(jìn)程、多個(gè)子程序之間及進(jìn)程、子程序與外部設(shè)備間進(jìn)行通信時(shí)要進(jìn)行信號(hào)傳遞。信號(hào)通常在結(jié)構(gòu)體、程序包和實(shí)體中進(jìn)行定義。信號(hào)具有全局量的性質(zhì)。信號(hào)定義的格式如下:
SIGNAL信號(hào)名[,信號(hào)名,…]:數(shù)據(jù)類型[約束條件][:=初始值];
【例4-20】
SIGNALa:INTEGERRANGE0TO15;
SIGNALflaga,flagb:BIT;
SIGNALdata:STD_LOGIC_VECTOR(7DOWNTO0):=“11000110”;
在程序中給信號(hào)賦的初始值僅在仿真時(shí)有效,不能用于綜合,因?yàn)殡娐吩谏想姾蟛⒉荒鼙WC它的初始狀態(tài)是什么。信號(hào)值的代入使用符號(hào)“<=”,信號(hào)代入時(shí)可以產(chǎn)生附加延時(shí)。
【例4-21】
a<=10;
flag<=‘1’;
data<=“10110110”AFTER10ns;
事實(shí)上,除了沒有方向說明以外,信號(hào)與實(shí)體的端口(PORT)概念是一致的。信號(hào)可以看成是實(shí)體內(nèi)部的端口,用于描述一部分電路與另一部分電路的信號(hào)連接情況。在VHDL程序中,實(shí)體中所定義的端口都可以作為信號(hào)來處理,但要注意它的方向。
信號(hào)的使用和定義范圍包括實(shí)體、結(jié)構(gòu)體和程序包。在進(jìn)程和子程序中不允許定義信號(hào)。信號(hào)可以有多個(gè)驅(qū)動(dòng)源,或者說賦值信號(hào)源。在進(jìn)程中,只能將信號(hào)列入敏感表,而不能將變量列入敏感表,可見進(jìn)程只對(duì)信號(hào)敏感,而對(duì)變量不敏感。
當(dāng)信號(hào)定義了數(shù)據(jù)類型和表達(dá)方式后,在VHDL設(shè)計(jì)中就能對(duì)信號(hào)進(jìn)行賦值了。信號(hào)的賦值語句表達(dá)式如下:
目標(biāo)信號(hào)名<=表達(dá)式;
賦值語句的詳細(xì)用法見后續(xù)章節(jié)。4.4.3變量
變量(VARIABLE)是一個(gè)局部量,只能在進(jìn)程、子程序中進(jìn)行定義和使用,可以進(jìn)行多次賦值。在仿真過程中,變量不像信號(hào)那樣到了規(guī)定的時(shí)間才能賦值,變量的賦值是立即生效的,所以變量賦值時(shí)不能附加延時(shí)語句。變量定義的格式如下:
VARIABLE變量名[,變量名,…]:數(shù)據(jù)類型[約束條件][:=初始值];
【例4-22】
VARIABLE
x,y:STD_LOGIC_VECTOR(7DOWNTO0);
VARIABLEcount:INTEGERRANGE0TO255:=10;
變量作為局部量,其適用范圍僅限于定義了變量的進(jìn)程或子程序中。在仿真過程中變量的初始值僅在仿真時(shí)有效,綜合時(shí)將略去所有的初始值。變量賦值格式如下:
目標(biāo)變量名:=表達(dá)式;變量數(shù)值的改變是通過變量賦值來實(shí)現(xiàn)的,賦值語句右方的表達(dá)式必須是一個(gè)與目標(biāo)具有相同數(shù)據(jù)類型的數(shù)值,這個(gè)表達(dá)式可以是一個(gè)運(yùn)算表達(dá)式,也可以是一個(gè)數(shù)值。通過賦值操作,變量的值立即改變。變量賦值語句左邊的目標(biāo)變量可以是單值變量,也可以是一個(gè)變量的集合,即數(shù)組型變量。下面是一個(gè)變量賦值的例子,請(qǐng)注意變量賦值時(shí)數(shù)據(jù)類型的一致性。4.4.4信號(hào)與變量的區(qū)別
信號(hào)與變量是經(jīng)常使用的兩種數(shù)據(jù)對(duì)象,兩者有很大的區(qū)別,歸納起來主要有:
(1)賦值語句不同,信號(hào)賦值的符號(hào)為“<=”,而變量為“:=”。
(2)通常變量的值可以給信號(hào)賦值,但信號(hào)的值卻不能給變量賦值。
(3)信號(hào)是全局量,是一個(gè)實(shí)體內(nèi)各部分之間以及實(shí)體之間進(jìn)行通信的載體;而變量是一個(gè)局部量,只允許定義并作用在進(jìn)程和子程序中,如果要把變量的值從它定義的區(qū)間傳輸出去,必須先把該變量賦值給一個(gè)信號(hào),通過信號(hào)把值傳輸出去。
(4)信號(hào)可以作為進(jìn)程的敏感信號(hào),但是變量卻不可以作為進(jìn)程的敏感信號(hào),讓進(jìn)程啟動(dòng),至少要有一個(gè)敏感信號(hào)發(fā)生變化。
(5)操作過程不相同。在變量的賦值語句中,該語句一旦執(zhí)行,變量立刻被賦予新值,在執(zhí)行下一條語句時(shí),該變量的值就用新賦的值參與運(yùn)算;而在信號(hào)賦值語句中,該語句雖然已經(jīng)被執(zhí)行,但信號(hào)值并沒有立即改變,因此下一條語句執(zhí)行時(shí),仍然使用原來的信號(hào)值。在結(jié)構(gòu)體的并行語句中,不允許信號(hào)被賦值一次以上。在進(jìn)程中,若對(duì)同一個(gè)信號(hào)賦值超過兩次,則編譯將會(huì)給出警告,指出只有最后一次賦值有效。圖4-1例4-24仿真的波形圖4-2例4-24信號(hào)改為變量后仿真的波形4.5運(yùn)?算?操?作?符在VHDL中共有4類運(yùn)算操作符,即邏輯操作符(LogicalOperator)、關(guān)系操作符(RelationalOperator)、算術(shù)操作符(ArithmeticOperator)和并置操作符(ConcatenationOperator),如表4-2所示。在VHDL語言中,操作數(shù)的類型應(yīng)該和操作符所要求的類型相一致,并且基本操作符間的操作數(shù)必須是同類型的。表4-2右欄已大致列出了各種操作符所要求的數(shù)據(jù)類型。操作符是有優(yōu)先級(jí)的,其優(yōu)先級(jí)如表4-3所示,在編程時(shí)要注意各操作符的優(yōu)先級(jí),為了保險(xiǎn)起見可多用括號(hào)。4.5.1邏輯操作符
由表4-3知,邏輯操作符可以對(duì)位、標(biāo)準(zhǔn)邏輯位和布爾類型的數(shù)據(jù)進(jìn)行操作,要求運(yùn)算符左右的數(shù)據(jù)類型必須相同。當(dāng)一個(gè)語句中存在兩個(gè)以上的邏輯表達(dá)式時(shí),在一般的高級(jí)語言中運(yùn)算按自左至右的順序進(jìn)行,而在VHDL語言中,如果邏輯關(guān)系不能確定,必須要加上括號(hào)確定各運(yùn)算的優(yōu)先順序。
【例4-25】
x<=(aANDb)OR(NOTcANDd);
--NOT優(yōu)先級(jí)最高,所以在NOTc處可以不加括號(hào)
x<=bANDaANDdANDe;
--不會(huì)引起邏輯關(guān)系變化,可以不加括號(hào)
x<=bORcORdORe;
--不會(huì)引起邏輯關(guān)系變化,可以不加括號(hào)
x<=aXORdXORe;
--不會(huì)引起邏輯關(guān)系變化,可以不加括號(hào)
a<=(x1ANDx2)OR(y1ANDy2);
--不加括號(hào)會(huì)引起邏輯關(guān)系變化,一定要加括號(hào)4.5.2關(guān)系操作符
應(yīng)該注意小于等于(<=)和代入運(yùn)算符(<=)的不同(從上下文區(qū)別)。兩個(gè)對(duì)象進(jìn)行比較時(shí),數(shù)據(jù)類型一定要相同。=(等于)和/=(不等于)適用于所有數(shù)據(jù)類型對(duì)象之間的比較;大于、小于、大于等于、小于等于適用于整數(shù)、實(shí)數(shù)、位矢量及數(shù)組類型的比較;兩個(gè)位矢量對(duì)象比較時(shí),類型一定要一致,但長度可以不相同,在比較時(shí),某些低版本的EDA工具的編譯器從最左的位開始,自左至右按位進(jìn)行比較從而得出最終比較結(jié)果。上例中,a值為10,而b值為7,a應(yīng)該比b大,但是因?yàn)槟承┑桶姹镜腅DA工具的編譯器比較是自左至右進(jìn)行的,最左邊的位都是'1',所以比較次左邊的值時(shí)發(fā)現(xiàn)b對(duì)應(yīng)的位為'1',而a對(duì)應(yīng)的位為'0',所以最終得出a<b的結(jié)論。目前,大多數(shù)EDA工具的編譯器在比較不同長度的位矢量時(shí),會(huì)自動(dòng)在位數(shù)少的數(shù)據(jù)左邊補(bǔ)上零,從而使長度一致,得出正確的結(jié)果。4.5.3算術(shù)操作符
在算術(shù)運(yùn)算符中,賦值語句兩邊的數(shù)據(jù)位長應(yīng)一致,否則編譯時(shí)將會(huì)出錯(cuò)。比如在對(duì)STD_LOGIC_VECTOR進(jìn)行加、減運(yùn)算時(shí),要求操作數(shù)兩邊的操作數(shù)和運(yùn)算結(jié)果的位長相同,否則編譯時(shí)將會(huì)給出語法出錯(cuò)信息。正常情況下,標(biāo)準(zhǔn)邏輯位是不允許進(jìn)行算術(shù)運(yùn)算的,但是在設(shè)計(jì)電路時(shí)經(jīng)常會(huì)對(duì)標(biāo)準(zhǔn)邏輯位矢量進(jìn)行加、減運(yùn)算,為了使設(shè)計(jì)變得方便快捷,為了方便各種不同數(shù)據(jù)類型間的運(yùn)算,VHDL還允許用戶對(duì)原有的基本操作符重新定義,賦予新的含義和功能,從而建立一種新的操作符,即重載操作符(OverloadingOperator)。定義這種重載操作符的函數(shù)稱為重載函數(shù)。事實(shí)上,在程序包STD_LOGIC_UNSIGNED中已定義了多種可供不同數(shù)據(jù)類型間操作的算符重載函數(shù),其中STD_LOGIC_SIGNED包集合定義了有符號(hào)數(shù)的操作符,而程序包STD_LOGIC_UNSIGNED包集合定義了無符號(hào)數(shù)的操作符。
Synopsys的程序包STD_LOGIC_ARITH、STD_LOGIC_UNSIGNED和STD_LOGIC_SIGNED中已經(jīng)為許多類型的運(yùn)算重載了算術(shù)操作符和關(guān)系操作符,只要引用這些程序包,即可在SIGNED、UNSIGNED、STA_LOGIC和INTEGER之間進(jìn)行混合運(yùn)算,在INTEGER、STD_LOGIC和STD_LOGIC_VECTOR之間也可以進(jìn)行混合運(yùn)算。在算術(shù)操作符中,乘與除的數(shù)據(jù)類型是整數(shù)和實(shí)數(shù)(包括浮點(diǎn)數(shù))。在一定條件下還可對(duì)物理類型的數(shù)據(jù)對(duì)象進(jìn)行運(yùn)算操作。
雖然在一定條件下,乘法和除法運(yùn)算是可以綜合的,但從優(yōu)化綜合、節(jié)省芯片資源的角度出發(fā),最好不要輕易使用乘、除操作符,可以用其它變通的方法來實(shí)現(xiàn)乘、除運(yùn)算。
操作符MOD和REM的本質(zhì)與除法操作符是一樣的,可綜合的取模和取余的操作數(shù)必須是以2為底數(shù)的冪。MOD和REM的操作數(shù)數(shù)據(jù)類型只能是整數(shù),運(yùn)算結(jié)果也是整數(shù)。符號(hào)操作符“+”和“-”的操作數(shù)只有一個(gè),操作數(shù)的數(shù)據(jù)類型是整數(shù)。操作符“+”對(duì)操作數(shù)不作任何改變;操作符“-”作用于操作數(shù)的返回值是對(duì)原操作數(shù)取負(fù)。在實(shí)際使用中,取負(fù)操作數(shù)需加括號(hào),如Z=X*(-Y)。
VHDL規(guī)定,乘方操作符“**”和取絕對(duì)值操作符“ABS”的操作數(shù)數(shù)據(jù)類型一般為整數(shù)類型。乘方(**)運(yùn)算的左邊可以是整數(shù)或浮點(diǎn)數(shù),但右邊必須為整數(shù),而且只有在左邊為浮點(diǎn)時(shí)其右邊才可以為負(fù)數(shù)。一般地,VHDL綜合器要求乘方操作符作用的操作數(shù)的底數(shù)必須是2。六種移位操作符號(hào)SLL、SRL、SLA、SRA、ROL和ROR都是VHDL93標(biāo)準(zhǔn)新增的運(yùn)算符。VHDL93標(biāo)準(zhǔn)規(guī)定移位操作符作用的操作數(shù)的數(shù)據(jù)類型應(yīng)是一組數(shù)組,并要求數(shù)組中的元素必須是BIT或BOOLEAN數(shù)據(jù)類型,移位的位數(shù)為整數(shù)。在EDA工具所附的程序包中重載了移位操作符以支持
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院《與實(shí)踐》2023-2024學(xué)年第一學(xué)期期末試卷
- 中國民航大學(xué)《建筑概論B》2023-2024學(xué)年第一學(xué)期期末試卷
- 小學(xué)學(xué)校微信公眾號(hào)管理細(xì)則
- 浙江財(cái)經(jīng)大學(xué)《現(xiàn)代商務(wù)管理學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 缺陷管理與環(huán)境影響評(píng)估報(bào)告
- 新蘇教版一年級(jí)數(shù)學(xué)下冊(cè)第六單元《簡(jiǎn)單的數(shù)量關(guān)系(一)》教案(共2課時(shí))
- 大學(xué)生學(xué)生會(huì)主席離職工作總結(jié)報(bào)告演講稿王召鵬的
- 二零二五版建筑工程防水工程質(zhì)量檢測(cè)協(xié)議2篇
- 重慶市西南大學(xué)附屬中學(xué)2024-2025學(xué)年高一上學(xué)期定時(shí)檢測(cè)(二)物理試題(含答案)
- 2025屆湖南省衡陽縣第四中學(xué)高三上學(xué)期期末考試歷史試題(含答案)
- 園林景觀工程施工組織設(shè)計(jì)-投標(biāo)書范本
- 護(hù)理倫理學(xué)(第二版)高職PPT完整全套教學(xué)課件
- GB/T 25919.1-2010Modbus測(cè)試規(guī)范第1部分:Modbus串行鏈路一致性測(cè)試規(guī)范
- GB/T 22484-2008城市公共汽電車客運(yùn)服務(wù)
- GB/T 14040-2007預(yù)應(yīng)力混凝土空心板
- 帶狀皰疹護(hù)理查房課件整理
- 奧氏體型不銹鋼-敏化處理
- 交通信號(hào)控制系統(tǒng)檢驗(yàn)批質(zhì)量驗(yàn)收記錄表
- 弱電施工驗(yàn)收表模板
- 探究基坑PC工法組合鋼管樁關(guān)鍵施工技術(shù)
- 國名、語言、人民、首都英文-及各地區(qū)國家英文名
評(píng)論
0/150
提交評(píng)論