




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
VHDL語(yǔ)言的描述語(yǔ)句集錦
——vermouthysVHDL語(yǔ)言描述系統(tǒng)硬件行為時(shí),按語(yǔ)句執(zhí)行順序可以分為順序(Sequential)描述語(yǔ)句和并發(fā)(Concurrent)描述語(yǔ)句。靈活運(yùn)用這兩類(lèi)語(yǔ)句就可以正確地描述系統(tǒng)的并發(fā)行為和順序行為。例如,進(jìn)程語(yǔ)句(ProcessStatement)是一個(gè)并發(fā)語(yǔ)句。在一個(gè)構(gòu)造體內(nèi)可以有幾個(gè)進(jìn)程語(yǔ)句同時(shí)存在,各進(jìn)程語(yǔ)句是并發(fā)執(zhí)行的。但是,在進(jìn)程內(nèi)部所有語(yǔ)句應(yīng)是順序描述語(yǔ)句,也就是說(shuō),是按書(shū)寫(xiě)的順序自上至下,一個(gè)語(yǔ)句一個(gè)語(yǔ)句地執(zhí)行的。例如,IF語(yǔ)句、LOOP語(yǔ)句等都屬于此類(lèi)順序描述語(yǔ)句。5.1順序描述語(yǔ)句執(zhí)行順序與書(shū)寫(xiě)順序一致,與傳統(tǒng)軟件設(shè)計(jì)語(yǔ)言的特點(diǎn)相似。順序語(yǔ)句只能用在進(jìn)程與子程序中。語(yǔ)句中所涉及到的系統(tǒng)行為有時(shí)序流、控制、條件和迭代等;語(yǔ)句的功能操作有算術(shù)、邏輯運(yùn)算,信號(hào)和變量的賦值,子程序調(diào)用等。在VHDL語(yǔ)言中順序描述語(yǔ)句有以下幾種:*WAIT語(yǔ)句;*斷言語(yǔ)句;*信號(hào)代入語(yǔ)句;*變量賦值語(yǔ)句;*IF語(yǔ)句;*CASE語(yǔ)句;*LOOP語(yǔ)句;*NEXT語(yǔ)句;*EXIT語(yǔ)句;*過(guò)程調(diào)用語(yǔ)句;*NULL語(yǔ)句5.1.1WAIT語(yǔ)句進(jìn)程在仿真時(shí)的兩個(gè)狀態(tài):執(zhí)行或掛起。進(jìn)程狀態(tài)的變化受WAIT語(yǔ)句的控制。當(dāng)進(jìn)程執(zhí)行到WAIT語(yǔ)句時(shí),就將被掛起,并設(shè)置好再次執(zhí)行的條件。WAIT語(yǔ)句可以設(shè)置4種不同的條件:無(wú)限等待、時(shí)間到、條件滿(mǎn)足以及敏感信號(hào)量變化。這幾類(lèi)條件可以混用,其書(shū)寫(xiě)格式為:
WAIT:無(wú)限等待
WAITON:敏感信號(hào)量變化
WAITUNTIL:條件滿(mǎn)足
WAITFOR:時(shí)間到1、WAITON
WAITON語(yǔ)句的完整書(shū)寫(xiě)格式為:
WAITON
信號(hào)[,信號(hào)];WAITON后面跟著的是一個(gè)或多個(gè)信號(hào)量,例如:
WAITONa,b;該語(yǔ)句表明,等待信號(hào)量a或b中只要有一個(gè)發(fā)生變化,進(jìn)程將結(jié)束掛起狀態(tài),而繼續(xù)執(zhí)行WAITON語(yǔ)句的后繼語(yǔ)句,從而再次啟動(dòng)進(jìn)程的執(zhí)行。從這一點(diǎn)來(lái)看,與進(jìn)程指定的敏感信號(hào)量有新的變化時(shí),也會(huì)啟動(dòng)進(jìn)程的情況相類(lèi)似。舉例1PROCESS(a,b)BEGINy<=aANDb;ENDPROCESS;PROCESSBEGINy<=aANDb;WAITONa,b;ENDPROCESS;
上面兩個(gè)進(jìn)程的描述是完全等價(jià)的,只是WAITON和PROCESS中所使用的敏感信號(hào)量的書(shū)寫(xiě)方法有區(qū)別。在使用WAITON語(yǔ)句的進(jìn)程中,敏感信號(hào)量應(yīng)寫(xiě)在進(jìn)程中的WAITON語(yǔ)句后面;而在不使用WAITON語(yǔ)句的進(jìn)程中,敏感信號(hào)量只應(yīng)在進(jìn)程開(kāi)頭的PROCESS后跟的括號(hào)中說(shuō)明。敏感信號(hào)量列表和waiton語(yǔ)句只能選其一,兩者不能同時(shí)使用。注意舉例2
如果PROCESS語(yǔ)句已有敏感信號(hào)量說(shuō)明,那么在進(jìn)程中再不能使用WAITON語(yǔ)句。例如,下面的描述是非法的。PROCESS(a,b)BEGINy<=aANDb;WAITONa,b;錯(cuò)誤語(yǔ)句ENDPROCESS;2、WAITUNTIL
WAITUNTIL語(yǔ)句的完整書(shū)寫(xiě)格式為:
WAITUNTIL
表達(dá)式;當(dāng)表達(dá)式的值為“真”時(shí),進(jìn)程被啟動(dòng),否則進(jìn)程被掛起。
該語(yǔ)句在表達(dá)式中將建立一個(gè)隱式的敏感信號(hào)量表,當(dāng)表中的任何一個(gè)信號(hào)量發(fā)生變化時(shí),就立即對(duì)表達(dá)式進(jìn)行一次評(píng)估。如果評(píng)估結(jié)果使表達(dá)式返回一個(gè)“真”值,則進(jìn)程脫離等待狀態(tài),繼續(xù)執(zhí)行下一個(gè)語(yǔ)句。例如:
WAITUNTIL((X*10)<100);在這個(gè)例子中,當(dāng)信號(hào)量X的值大于或等于10時(shí),進(jìn)程執(zhí)行到該語(yǔ)句將被掛起;當(dāng)X的值小于10時(shí)進(jìn)程再次被啟動(dòng),繼續(xù)執(zhí)行WAIT語(yǔ)句的后繼語(yǔ)句。例:用waituntil語(yǔ)句描述時(shí)鐘沿,實(shí)現(xiàn)D觸發(fā)器
architecturertlofdisbeginprocessbeginwaituntilclk'eventandclk='1';q<=d;endprocess;endrtl;舉例3、WAITFOR
WAITFOR語(yǔ)句的完整書(shū)寫(xiě)格式為:
WAITFOR
時(shí)間表達(dá)式;WAITFOR語(yǔ)句后面跟著的是時(shí)間表達(dá)式,當(dāng)進(jìn)程執(zhí)行到該語(yǔ)句時(shí)將被掛起,直到指定的等待時(shí)間到時(shí),進(jìn)程再開(kāi)始執(zhí)行WAITFOR語(yǔ)句后繼的語(yǔ)句。例如:
WAITFOR20ns;這個(gè)語(yǔ)句中時(shí)間表達(dá)式是一個(gè)常數(shù)值20ns,當(dāng)進(jìn)程執(zhí)行到該語(yǔ)句時(shí)將等待20ns。一旦20ns時(shí)間到,進(jìn)程將執(zhí)行WAITFOR語(yǔ)句的后繼語(yǔ)句。
例如:
WAITFOR(a*(b+c));此語(yǔ)句中,F(xiàn)OR后面是一個(gè)時(shí)間表達(dá)式,a*(b+c)是時(shí)間量。WAITFOR語(yǔ)句在等待過(guò)程中,要對(duì)表達(dá)式進(jìn)行一次計(jì)算,計(jì)算結(jié)果返回的值就作為該語(yǔ)句的等待時(shí)間。例如,a=2,b=50ns,c=70ns。那么WAITFOR(a*(b+c))這個(gè)語(yǔ)句將等待240ns,也就是說(shuō)該語(yǔ)句和WAITFOR240ns是等價(jià)的。4、多條件WAIT語(yǔ)句
在前面已敘述的3個(gè)WAIT語(yǔ)句中,等待的條件都是單一的,要么是信號(hào)量,要么是布爾量,要么是時(shí)間量。實(shí)際上WAIT語(yǔ)句還可以同時(shí)使用多個(gè)等待條件。例如:
WAITONnmi,interruptUNTIL((nmi=TRUE)OR(interrupt=TRUE))FOR5us;上述語(yǔ)句等待的是3個(gè)條件:
第一,信號(hào)量nmi和interrupt任何一個(gè)有一次新的變化;第二,信號(hào)量nmi或interrupt任何一個(gè)取值為“真”;第三,該語(yǔ)句已等待5us。只要上述3個(gè)條件中一個(gè)或多個(gè)條件滿(mǎn)足,進(jìn)程將再次啟動(dòng),繼續(xù)執(zhí)行WAIT語(yǔ)句的后繼語(yǔ)句。
應(yīng)該注意的是,在多條件等待時(shí),表達(dá)式的值至少應(yīng)包含一個(gè)信號(hào)量的值,例如:
WAITUNTIL(interrupt=TRUE)OR(old_clk=‘1’);如果該語(yǔ)句的interrupt和old_clk兩個(gè)都是變量,而不是信號(hào)量,那么,即使兩個(gè)變量的值有新的改變,該語(yǔ)句也不會(huì)對(duì)表達(dá)式進(jìn)行評(píng)估和計(jì)算(事實(shí)上,在掛起的進(jìn)程中變量的值是不可能改變的)。這樣,該等待語(yǔ)句將變成無(wú)限的等待語(yǔ)句,包含該等待語(yǔ)句的進(jìn)程就不能再啟動(dòng)。在多種等待條件中,只有信號(hào)量變化才能引起等待語(yǔ)句表達(dá)式的一次新的評(píng)價(jià)和計(jì)算。5、超時(shí)等待
往往在所設(shè)計(jì)的程序模塊中,等待語(yǔ)句所等待的條件,在實(shí)際執(zhí)行時(shí)不一定會(huì)碰到。這時(shí),等待語(yǔ)句通常要加一項(xiàng)超時(shí)等待項(xiàng),以防止該等待語(yǔ)句進(jìn)入無(wú)限期的等待狀態(tài)。但是,如果采用這種方法,應(yīng)作適當(dāng)?shù)奶幚恚駝t就會(huì)產(chǎn)生錯(cuò)誤的行為。超時(shí)等待舉例ARCHITECTUREwait_exampleOFwait_exampleISSINGALsendB,sendA:STD_LOGIC;BEGIN
sendA<='0';A:PROCESSBEGIN
WAITUNTILsendB='1';sendA<='1'AFTER10ns;WAITUNTILsendB='0';sendA<='0'AFTER10ns;ENDPTROCESSA;B:PROCESSBEGINWAITUNTILsendA='0';sendB<='0'AFTER10ns;
WAITUNTILsendA='1';sendB<='1'AFTER10ns;ENDPTROCESSB;ENDwait_example;
進(jìn)程A執(zhí)行到第一條wait語(yǔ)句時(shí)處于無(wú)限期等待狀態(tài),進(jìn)程B執(zhí)行到第二條wait語(yǔ)句時(shí)處于無(wú)限期等待狀態(tài)。兩個(gè)進(jìn)程處于相互等待狀態(tài),每個(gè)進(jìn)程的等待條件都需要對(duì)方繼續(xù)執(zhí)行。這種情況我們稱(chēng)為“死鎖”狀態(tài)。為了能夠避免這種無(wú)限等待狀態(tài),我們可以加入超時(shí)等待語(yǔ)句,同時(shí)用ASSERT語(yǔ)句進(jìn)行提示。加入超時(shí)等待的語(yǔ)句ARCHITECTUREwait_exampleOFwait_exampleISSINGALsendB,sendA:STD_LOGIC;BEGINsendA<='0';A:PROCESSBEGIN
WAITUNTIL(sendB='1‘)FOR1us;
ASSERT(sendB=‘1‘)REPORT”sendBtimedoutat‘1’
“SEVERITYERROR;sendA<='1'AFTER10ns;
WAITUNTIL(sendB='0‘)FOR1us;ASSERT(sendB=‘0‘)REPORT”sendBtimedoutat‘0’
“SEVERITYERRORsendA<='0'AFTER10ns;ENDPTROCESSA;
B:PROCESSBEGINWAITUNTIL(sendA='0‘)FOR1us;ASSERT(sendA=‘0‘)REPORT”sendAtimedoutat‘1’
“SEVERITYERROR;sendB<='0'AFTER10ns;
WAITUNTIL(sendA='1‘)FOR1us;ASSERT(sendA=‘0‘)REPORT”sendAtimedoutat‘0’
“SEVERITYERRORsendB<='1'AFTER10ns;ENDPTROCESSB;ENDwait_example;
如果條件不滿(mǎn)足則等待1us之后執(zhí)行后續(xù)的程序,而不會(huì)無(wú)限期等待。5.1.2斷言語(yǔ)句(ASSERT)ASSERT語(yǔ)句主要用于程序仿真、調(diào)試中的人機(jī)對(duì)話(huà),它可以給出一個(gè)文字串作為警告和錯(cuò)誤信息。ASSERT語(yǔ)句的書(shū)寫(xiě)格式為:
ASSERT條件[REPORT輸出信息][SEVERITY級(jí)別];
如果條件為真則向下執(zhí)行另一個(gè)語(yǔ)句,如果條件為假,則輸出錯(cuò)誤信息和錯(cuò)誤級(jí)別。REPORT后面的錯(cuò)誤信息應(yīng)用雙引號(hào)括起來(lái)。
ASSERT語(yǔ)句給程序的調(diào)試和仿真帶來(lái)極大的方便,這樣的語(yǔ)句一般只用于行為級(jí)仿真中,而不能進(jìn)行邏輯綜合。例:
ASSERT(sendB=‘1‘)REPORT“sendBtimedoutat‘1’
”SEVERITYERROR;
該斷言語(yǔ)句的條件信號(hào)量是sendB=‘1’。如果執(zhí)行到該語(yǔ)句時(shí),信號(hào)量sendB=‘0’,說(shuō)明條件不滿(mǎn)足,就會(huì)輸出REPORT后跟的文字串。該文字串說(shuō)明,出現(xiàn)了超時(shí)等待錯(cuò)誤。SEVERITY后跟的錯(cuò)誤等級(jí)告訴操作人員,其出錯(cuò)等級(jí)為ERROR。5.1.3信號(hào)代入語(yǔ)句書(shū)寫(xiě)格式:目的信號(hào)量<=信號(hào)量表達(dá)式;意義:將右邊信號(hào)量表達(dá)式的值賦給左邊的目的信號(hào)量。
1)代入符號(hào)與小于等于的區(qū)別;
2)代入符號(hào)兩邊信號(hào)量的類(lèi)型和長(zhǎng)度應(yīng)一致;
3)信號(hào)一般使用的場(chǎng)合及與變量的區(qū)別。注意5.1.4變量賦值語(yǔ)句書(shū)寫(xiě)格式:目的變量:=表達(dá)式;意義:表達(dá)式的值替代目的變量的值,立即有效。1)兩邊的數(shù)據(jù)類(lèi)型必須相同;2)目的變量的類(lèi)型和范圍及初值應(yīng)事先給出;3)右邊的表達(dá)式可以是變量,信號(hào)或字符;4)變量只在進(jìn)程或子程序中使用,它無(wú)法傳遞到進(jìn)程之外。注意1)賦值方式的不同:變量:=表達(dá)式;信號(hào)<=表達(dá)式;2)硬件實(shí)現(xiàn)的功能不同:信號(hào)代表電路單元、功能模塊間的互聯(lián),代表實(shí)際的硬件連線(xiàn);變量代表電路單元內(nèi)部的操作,代表暫存的臨時(shí)數(shù)據(jù)。3)有效范圍的不同:信號(hào):程序包、實(shí)體、結(jié)構(gòu)體;全局量。變量:進(jìn)程、子程序;局部量。4)賦值行為的不同:信號(hào)賦值延遲更新數(shù)值;變量賦值立即更新數(shù)值;
補(bǔ)充:變量與信號(hào)的差異
信號(hào)賦值:
architecturertlofsigissignala,b:std_logic;--定義信號(hào)
beginprocess(a,b)begina<=b;b<=a;endprocess;endrtl;--結(jié)果是
a和b的值互換補(bǔ)充舉例:信號(hào)賦值與變量賦值的比較
在進(jìn)程內(nèi)部信號(hào)是延時(shí)更新,信號(hào)只有在整個(gè)過(guò)程執(zhí)行完畢后(endprocess)才更新完成。此例中,a<=b先是b的初值賦給a,但a的值并不是立即更新;所以在執(zhí)行b<=a時(shí),a是先前的a,即是要將a的初始值賦給b;當(dāng)程序執(zhí)行到endprocess時(shí),a和b才更新完成,最終a和b值互換。--
變量賦值:
architecturertlofvarisbeginprocessvariablea,b:std_logic;--定義變量
begina:=b;b:=a;endprocess;endrtl;--結(jié)果是a和b的值都等于b的初值
補(bǔ)充舉例:信號(hào)賦值與變量賦值的比較變量的賦值立即生效,a的值立即更新為b的初始值此時(shí)的a已經(jīng)變?yōu)閎的初值,于是就是將b的初值代入ba.一個(gè)進(jìn)程:最后一次賦值有效
補(bǔ)充:信號(hào)的多次賦值architecturertlofexissignala:std_logic;beginprocess(…)begina<=b;…a<=c;endprocess;endrtl;--結(jié)果是a=cb.多個(gè)進(jìn)程:多源驅(qū)動(dòng)線(xiàn)與、線(xiàn)或、三態(tài)
補(bǔ)充:信號(hào)的多次賦值--結(jié)果是信號(hào)a將由多個(gè)驅(qū)動(dòng)源驅(qū)動(dòng)architecturertlofexissignala:std_logic;beginprocess(…)begina<=b;…endprocess;process(…)begina<=c;...endprocess;endex;進(jìn)程語(yǔ)句(ProcessStatement)是一個(gè)并發(fā)語(yǔ)句。在一個(gè)構(gòu)造體內(nèi)可以有幾個(gè)進(jìn)程語(yǔ)句同時(shí)存在,各進(jìn)程語(yǔ)句是并發(fā)執(zhí)行的。但是,在進(jìn)程內(nèi)部所有語(yǔ)句應(yīng)是順序描述語(yǔ)句注意5.1.5IF語(yǔ)句IF語(yǔ)句可用于選擇器、比較器、編碼器、譯碼器狀態(tài)機(jī)的設(shè)計(jì),是VHDL語(yǔ)言中最基礎(chǔ)、最常用的語(yǔ)句。
IF語(yǔ)句根據(jù)制定的條件來(lái)確定語(yǔ)句執(zhí)行順序,共有三種類(lèi)型。1、IF語(yǔ)句的門(mén)閂控制格式:
IF
條件
THEN
順序處理語(yǔ)句;
ENDIF;當(dāng)程序執(zhí)行到該IF語(yǔ)句時(shí),就要判斷IF語(yǔ)句所指定的條件是否成立。如果條件成立,則執(zhí)行順序處理語(yǔ)句;不成立則跳過(guò)IF語(yǔ)句所包含的順序處理語(yǔ)句,而向下執(zhí)行IF語(yǔ)句的后續(xù)語(yǔ)句。這里的條件起到門(mén)閂的控制作用。D觸發(fā)器的描述舉例LIBRARYIEEE;USEIEEE.STD.LOGIC.1164.ALL;ENTITYdffISPORT(clk,d:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDdff;ARCHITECTURErtlOFdffISBEGINPROCESS(clk)BEGIN
IF(clk’EVENTANDclk=‘1‘)THENq<=d;ENDIF;ENDPROCESS;ENDtrl;注此例中,IF語(yǔ)句的條件是時(shí)鐘信號(hào)clk事件發(fā)生,且時(shí)鐘clk=‘1’(時(shí)鐘脈沖上升沿到來(lái))。只有在這個(gè)時(shí)候d端信號(hào)值才賦值給q端。當(dāng)該條件不滿(mǎn)足時(shí),q端維持原來(lái)的輸出值。2、IF語(yǔ)句的二選擇控制格式:
IF
條件
THEN
順序處理語(yǔ)句;
ELSE
順序處理語(yǔ)句;
ENDIF;當(dāng)條件滿(mǎn)足時(shí),則執(zhí)行THEN和ELSE之間的順序處理語(yǔ)句;如不滿(mǎn)足則執(zhí)行ELSE和ENDIF之間的順序處理語(yǔ)句。IF二選擇控制舉例二選一電路ARCHITECTURErtlOFmux2ISBEGINPROCESS(a,b,sel)BEGIN
IF(sel=‘1‘)THENc<=a;
ELSEc<=b;ENDIF;ENDPROCESS;ENDrtl;此例中,二選一電路的輸入端為a和b,選擇控制端為sel,輸出端為c。注3、IF語(yǔ)句的多條件控制格式:
IF
條件
THEN
順序處理語(yǔ)句;
ELSIF
條件
THEN
順序處理語(yǔ)句;
┄
ELSIF
條件
THEN
順序處理語(yǔ)句;
ELSE
順序處理語(yǔ)句;
END
IF;
在多選擇控制的IF語(yǔ)句中,設(shè)置了多個(gè)條件。當(dāng)某個(gè)條件滿(mǎn)足時(shí)就執(zhí)行跟在該條件這后的順序處理語(yǔ)句,如果條件都不滿(mǎn)足則執(zhí)行ELSE和ENDIF之間的語(yǔ)句。
IF語(yǔ)句的多選擇控制又稱(chēng)為IF語(yǔ)句的嵌套。注IF語(yǔ)句多條件控制語(yǔ)句舉例四選一電路:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux4ISPORT(input:INSTD_LOGIC_VECTOR(3DOWNTO0);sel:INSTD_LOGIC_VECTOR(1DOWNTO0);y:OUTSTD_LOGIC);ENDmux4;ARCHITECTURErtlOFmux4ISBEGINPROCESS(input,sel)BEGIN
IF(sel=“00”)THENy<=input(0);
ELSIF(sel=“01”)THENy<=input(1);
ELSIF(sel=“10”)THENy<=input(2);
ELSEy<=input(3);
ENDIF;ENDPROCESS;ENDrtl;注
if_then_elsif語(yǔ)句中隱含了優(yōu)先級(jí)別的判斷,最先出現(xiàn)的條件優(yōu)先級(jí)最高,可用于設(shè)計(jì)具有優(yōu)先級(jí)的電路。如8-3優(yōu)先級(jí)編碼器。3、IF語(yǔ)句小結(jié)
(1)IF語(yǔ)句可以用于凡是可以進(jìn)行條件控制的邏輯電路設(shè)計(jì)。(2)IF語(yǔ)句的條件判斷的輸出是布爾量,即是“真”(true)或“假”(FALSE)。因此在IF語(yǔ)句的條件表達(dá)式中只能使用關(guān)系運(yùn)算操作符(=,/=,<,>,<=,>=)及邏輯運(yùn)算操作符的組合表達(dá)式。5.1.6CASE語(yǔ)句
case語(yǔ)句常用來(lái)描述總線(xiàn)或編碼、譯碼行為??勺x性比if語(yǔ)句強(qiáng)。格式:
CASE
表達(dá)式
IS
WHEN
條件表達(dá)式=>順序處理語(yǔ)句;
ENDCASE;當(dāng)CASE和IS之間的表達(dá)式的取值滿(mǎn)足指定的條件表達(dá)式的值時(shí),程序?qū)?zhí)行后跟的,由符號(hào)=>所指的順序處理語(yǔ)句。條件表達(dá)式的形式可以是:
1)一個(gè)值;2)多個(gè)值的“或”關(guān)系;3)一個(gè)取值范圍;4)表示其它所有的缺省值。CASE語(yǔ)句中條件表達(dá)式四種不同的表達(dá)形式:
WHEN
值=>順序處理語(yǔ)句;------單個(gè)值
WHEN
值|值|值|…|值|=>順序處理語(yǔ)句;-----多個(gè)值的“或”
WHEN
值TO值=>順序處理語(yǔ)句;-------一個(gè)取值范圍
WHENOTHERS=>順序處理語(yǔ)句;-------其它所有缺省值CASE語(yǔ)句使用舉例LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux4ISPORT(a,b,i0,i1,i2,i3:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDmux4;ARCHITECTUREmux4_behaveOFmux4ISSIGNALsel:STD_LOGIC_VECTOR(1DOWNTO0);BEGIN
sel<=b&a;PROCESS(sel,i0,i1,i2,i3)BEGIN
CASEselISWHEN“00”=>q<=i0;WHEN“01”=>q<=i1;WHEN“10”=>q<=i2;WHEN“11”=>q<=i3;
ENDCASE;ENDPROCESS;ENDmux4_behave;1)前面例子中使用多選擇控制的IF語(yǔ)句來(lái)描述四選一選擇器時(shí),發(fā)現(xiàn)if_then_elsif語(yǔ)句中隱含了優(yōu)先級(jí)別的判斷,最先出現(xiàn)的條件優(yōu)先級(jí)最高。1)而在使用CASE語(yǔ)句描述選擇器行為時(shí),CASE語(yǔ)句沒(méi)有值的優(yōu)先級(jí),所有值是并行處理的;2)WHEN后面的值應(yīng)全部列出來(lái);3)WHEN后面的值不能重復(fù)使用。注并置運(yùn)算符用于位的連接而構(gòu)成位矢量帶有WHENOTHERS項(xiàng)舉例(3-8譯碼器)LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdecode3to8ISPORT(a,b,c,G1,G2A,G2B:INSTD_LOGIC;y:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDdecode3to8;ARCHITECTURErtlOFdecode3to8ISSIGNALindata:STD_LOGIC_VECTOR(2DOWNTO0);BEGINindata<=c&b&a;PROCESS(indata,G1,G2A,G2B)BEGINIF(G1=‘1’ANDG2A=‘0’ANDG2B=‘0’)THENCASEindataISWHEN“000”=>y<=“11111110”;WHEN“001”=>y<=“11111101”;WHEN“010”=>y<=“11111011”;WHEN“011”=>y<=“11110111”;WHEN“100”=>y<=“11101111”;WHEN“101”=>y<=“11011111”;WHEN“110”=>y<=“10111111”;WHENOTHERS=>y<=“XXXXXXXX”;ENDCASE;ELSEY<=“11111111”;ENDIF;ENDPROCESS;ENDrtl;注Indata是矢量數(shù)據(jù),除了取“0”和“1”之外,還有可能取值為“X”“Z”和“U”等。盡管這些取值在邏輯電路綜合時(shí)沒(méi)有用,但在CASE語(yǔ)句中必須將有可能的值都描述出來(lái),所以本例應(yīng)加一相WHENOTHERS項(xiàng)。使它包含所有缺省項(xiàng)。1)分支條件的值必須在表達(dá)式的取值范圍內(nèi)。2)兩個(gè)分支條件不能重疊。3)CASE語(yǔ)句執(zhí)行時(shí)必須選中,且只能選中一個(gè)分支條件。4)如果沒(méi)有others分支條件存在,則分支條件必須覆蓋表達(dá)式所有可能的值。
對(duì)std_logc,std_logic_vector數(shù)據(jù)類(lèi)型要特別注意使用others分支條件。Case語(yǔ)句使用注意事項(xiàng)CASE
表達(dá)式
IS
WHEN
分支條件=>順序處理語(yǔ)句;
WHEN
分支條件=>順序處理語(yǔ)句;
WHEN
分支條件=>順序處理語(yǔ)句;
ENDCASE;┇5.1.7LOOP語(yǔ)句LOOP語(yǔ)句與其它高級(jí)語(yǔ)句中的循環(huán)語(yǔ)句一樣,使程序能進(jìn)行有規(guī)則的循環(huán),循環(huán)次數(shù)受迭代算法控制。
VHDL語(yǔ)言中常用來(lái)描述位片邏輯及迭代電路的行為。
LOOP語(yǔ)句書(shū)寫(xiě)格式一般有兩種:1)FOR循環(huán)變量;2)WHILE條件。1、FOR循環(huán)變量書(shū)寫(xiě)格式如下[標(biāo)號(hào)]:FOR
循環(huán)變量
IN
離散范圍
LOOP
順序處理語(yǔ)句;
ENDLOOP
[標(biāo)號(hào)];循環(huán)變量的值在每次循環(huán)中都將發(fā)生變化;離散范圍則表示循環(huán)變量在循環(huán)過(guò)程中依次取值的范圍。例如:
sum:=0;ASUM:FORiIN1TO9LOOPsum=i+sum;----sum初始值為0ENDLOOPASUM;該例中i是循環(huán)變量,它可取1,2,….,9共9個(gè)值,也就是sum=i+sum的算式應(yīng)循環(huán)計(jì)算9次。該程序的功能是對(duì)1~9的數(shù)進(jìn)行累加計(jì)算。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYparity_checkISPORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);y:OUTSTD_LOGIC);ENDparity_check;ARCHITECTURErtlOFparity_checkISBEGINPROCESS(a)VARIABLEtmp:STD_LOGIC;BEGINtep:=‘0’;
FORiIN0TO7LOOPtmp:=tmpXORa(i);ENDLOOP;y<=tep;ENDPROCESS;ENDrtl;1)本例實(shí)際是8位偶校驗(yàn)電路2)i是一個(gè)循環(huán)變量,使用時(shí)無(wú)需先聲明,也不能代入信號(hào)量和變量。3)進(jìn)程內(nèi)tmp是變量,tmp的值通過(guò)賦給信號(hào)y而帶出進(jìn)程。FOR循環(huán)舉例對(duì)送進(jìn)來(lái)的8位數(shù)每一位都與中間變量相異或輸入8位2進(jìn)制代碼輸出校驗(yàn)碼奇偶校驗(yàn)位注什么是奇偶校驗(yàn)電路?
利用奇(偶)校驗(yàn)方法進(jìn)行檢錯(cuò)的組合邏輯電路稱(chēng)為奇偶校驗(yàn)器。奇偶校驗(yàn)的原理:
根據(jù)代碼中全部位數(shù)相加的“和”來(lái)進(jìn)行奇校驗(yàn)或偶校驗(yàn)?!昂汀辈僮鞯奶攸c(diǎn):偶數(shù)個(gè)1,它的和總是0;奇數(shù)個(gè)1,它的和總是1。奇校驗(yàn)就是看2進(jìn)制數(shù)的1的個(gè)數(shù)為奇數(shù);偶校驗(yàn)相反,就是看2進(jìn)制數(shù)中1的個(gè)數(shù)為偶數(shù)。
補(bǔ)充:奇偶校驗(yàn)基礎(chǔ)知識(shí)2、WHILE條件書(shū)寫(xiě)格式如下:
[標(biāo)號(hào)]:
WHILE
條件
LOOP
順序處理語(yǔ)句;
ENDLOOP
[標(biāo)號(hào)];如果條件為“真”,則進(jìn)行循環(huán);如果條件為“假”,則結(jié)束循環(huán)。如:
i:=1;sum:=0;sbcd:WHILE(i<10)LOOPsum:=i+sum;i:=i+1;ENDLOOPsbcd;--對(duì)1~9的數(shù)進(jìn)行累加計(jì)算,利用i<10的條件使程序結(jié)束循環(huán),通過(guò)i:=i+1實(shí)現(xiàn)循環(huán)變量的遞增。--循環(huán)變量i需事先定義、賦初值,并指定其變化方式。例:用WHILE語(yǔ)句來(lái)描述奇偶校驗(yàn)電路LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYparity_checkISPORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);y:OUTSTD_LOGIC);ENDparity_check;ARCHITECTUREbehaveOFparity_checkISBEGINPROCESS(a)VARIABLEtemp:STD_LOGIC;
VARIABLEi:INTEGER;BEGINtemp:=‘0’;i:=0;
WHILE(I<8)LOOPtemp:=tempXORa(I);
i:=i+1;ENDLOOP;y<=temp;ENDPROCESS;ENDbehave;在WHILE-LOOP語(yǔ)句中的變量i要首先聲明才能使用,這一點(diǎn)和FOR-LOOP語(yǔ)句中不一樣。循環(huán)變量i需事先定義、賦初值,并指定其變化方式。一般使用FOR-LOOP語(yǔ)句比WHILE-LOOP語(yǔ)句更多。5.1.8NEXT語(yǔ)句在LOOP語(yǔ)句中用NEXT語(yǔ)句來(lái)跳出本次循環(huán),格式為:
NEXT
[標(biāo)號(hào)][WHEN條件];
NEXT語(yǔ)句執(zhí)行時(shí)將停止本次迭代,而轉(zhuǎn)入下一次新的迭代。“標(biāo)號(hào)”為下次迭代的起始位置,而條件為NEXT語(yǔ)句執(zhí)行的條件。如果無(wú)“標(biāo)號(hào)”也無(wú)條件,則只要執(zhí)行到該語(yǔ)句就無(wú)條件跳出本次循環(huán),從LOOP語(yǔ)句的起始位置進(jìn)入下一次循環(huán)。
NEXT語(yǔ)句實(shí)際上是用于LOOP語(yǔ)句的內(nèi)部循環(huán)控制。NEXT語(yǔ)句舉例PROCESS(a,b)CONSTANTmax_limit:INTEGER:=255;BEGINFORiIN0TOmax_limitLOOPIF(done(i)=TRUE)THENNEXT;ELSEdone(i):=TRUE;ENDIF;q(i)<=a(i)ANDb(i);ENDLOOP;ENDPROCESS;無(wú)“標(biāo)號(hào)”也無(wú)條件,則只要執(zhí)行到該語(yǔ)句就無(wú)條件跳出本次循環(huán)5.1.9EXIT語(yǔ)句
EXIT語(yǔ)句用于結(jié)束循環(huán)狀態(tài),從LOOP語(yǔ)句中跳出,結(jié)束LOOP語(yǔ)句的正常執(zhí)行。格式:
EXIT
[標(biāo)號(hào)][WNEN條件];
如果EXIT后面沒(méi)有跟“標(biāo)號(hào)”和“WHEN條件”,則程序執(zhí)行到該語(yǔ)句時(shí)就無(wú)條件地從LOOP語(yǔ)句中跳出,結(jié)束循環(huán)狀態(tài),繼續(xù)執(zhí)行LOOP語(yǔ)句后繼的語(yǔ)句。EXIT語(yǔ)句舉例PROCESS(a)VARIABLEint_a:INTEGER;BEGINint_a:=a;FORiIN0TOmax_limitLOOPIF(int_a<=0)THEN
EXIT;ELSEint_a:=int_a–1;q(i)<=3.1416/REAL’(a*i);ENDIF;y<=q;ENDPROCESS;
本例中,如果int_a小于或等于0時(shí)就執(zhí)行EXIT語(yǔ)句,LOOP語(yǔ)句執(zhí)行結(jié)束。EXIT語(yǔ)句的三種書(shū)寫(xiě)格式1.EXIT語(yǔ)句后面沒(méi)有“循環(huán)標(biāo)號(hào)”或“WHEN條件”,當(dāng)執(zhí)行到該語(yǔ)句時(shí)就跳出包含該EXIT語(yǔ)句的循環(huán)。
2.EXIT語(yǔ)句后跟“LOOP語(yǔ)句的標(biāo)號(hào)”,執(zhí)行EXIT語(yǔ)句時(shí)將跳到標(biāo)號(hào)所說(shuō)明的標(biāo)號(hào)。
3.EXIT語(yǔ)句后跟“WHEN條件”語(yǔ)句,只有當(dāng)條件為真時(shí)才跳出循環(huán),如果條件不為真則執(zhí)行下一條語(yǔ)句。next語(yǔ)句與exit語(yǔ)句的格式與操作功能非常相似;區(qū)別是:next語(yǔ)句是跳向loop語(yǔ)句的起始點(diǎn),而exit語(yǔ)句則是跳向loop語(yǔ)句的終點(diǎn)。補(bǔ)充:EXIT語(yǔ)句與NEXT語(yǔ)句比較5.2并發(fā)描述語(yǔ)句VHDL的并發(fā)語(yǔ)句用來(lái)描述一組并發(fā)行為,它是并發(fā)執(zhí)行的,與程序的書(shū)寫(xiě)順序無(wú)關(guān)。*進(jìn)程語(yǔ)句(PROCESS);*并發(fā)(CONCURRENT)信號(hào)代入語(yǔ)句;*條件(CONDITIONAL)信號(hào)代入語(yǔ)句;*選擇(SELECTIVE)信號(hào)代入語(yǔ)句;*并發(fā)(CONCURRENTPROCEDURE)過(guò)程調(diào)用語(yǔ)句;*塊(BLOCK)語(yǔ)句。5.2.1進(jìn)程(PROCESS)語(yǔ)句
各個(gè)進(jìn)程之間是并發(fā)處理的,而在進(jìn)程內(nèi)部則是按順序處理的。在一個(gè)構(gòu)造體內(nèi)部可以有多個(gè)PROCESS語(yǔ)句同時(shí)并發(fā)執(zhí)行。PROCESS語(yǔ)句是VHDL語(yǔ)句中是基本的語(yǔ)句。特點(diǎn):
1、進(jìn)程與進(jìn)程,或其它并發(fā)語(yǔ)句之間的并發(fā)性;
2、進(jìn)程內(nèi)部的順序性;
3、進(jìn)程的啟動(dòng)與掛起,必須要有一個(gè)顯式的敏感信號(hào)量表或者包含一個(gè)WAIT語(yǔ)句;
4、進(jìn)程與進(jìn)程,或其它并發(fā)語(yǔ)句之間的通信。5.2.2并發(fā)信號(hào)代入語(yǔ)句
代入語(yǔ)句(用符號(hào)“<=”)可以在進(jìn)程內(nèi)部使用,是按順序執(zhí)行的;代入語(yǔ)句也可以在構(gòu)造體內(nèi)部的進(jìn)程外使用,那么這些代入語(yǔ)句之間是并發(fā)執(zhí)行的。因此,一個(gè)并發(fā)信號(hào)代入語(yǔ)句實(shí)際上是一個(gè)進(jìn)程的縮寫(xiě)。并發(fā)代入語(yǔ)句在仿真時(shí)刻同時(shí)運(yùn)行,它表征了各個(gè)獨(dú)立器件的各自的獨(dú)立操作。如:
a<=b+c;
d<=e*f;
代入符號(hào)“<=”的右邊可以用算術(shù)表達(dá)式,也可以用邏輯運(yùn)算表達(dá)式,還可以用關(guān)系操作表達(dá)式。---分別描述加法器和乘法器行為。在實(shí)際系統(tǒng)中加法器和乘法器是同時(shí)并發(fā)執(zhí)行的。PROCESS和并發(fā)代入語(yǔ)句ARCHITECTUREbehaveOFa_varISBEGIN
output<=a(i);ENDbehave;可以等效于:ARCHITECTUREbehaveOFa_varISBEGIN
PROCESS(a,i)BEGINoutput<=a(i);ENDPROCESS;ENDbehave;一個(gè)簡(jiǎn)單并行信號(hào)賦值語(yǔ)句是一個(gè)進(jìn)程的縮寫(xiě)。5.2.3條件信號(hào)代入語(yǔ)句格式:目的信號(hào)量<=表達(dá)式1WHEN
條件1ELSE
表達(dá)式2WHEN
條件2ELSE
表達(dá)式3WHEN
條件3ELSE┆
表達(dá)式n;┆ELSE在每個(gè)表達(dá)式后面都跟有用“WHEN”所指定的條件,如果滿(mǎn)足該條件,則該表達(dá)式值代入目的信號(hào)量;如果條件不滿(mǎn)足,則再判斷下一個(gè)表達(dá)式所指定的條件。最后一個(gè)表達(dá)式可以不跟條件,即所有條件都不滿(mǎn)足時(shí)(具有優(yōu)先級(jí))條件信號(hào)代入語(yǔ)句舉例利用條件信號(hào)代入語(yǔ)句實(shí)現(xiàn)四選一邏輯電路。ENTITYmux4ISPORT(i0,i1,i2,i3,a,b:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDmux4;ARCHITECTURErtlOFmux4ISSIGNALsel:STD_LOGIC_VECTOR(1DOWNTO0);BEGINsel<=b&a;q<=i0WHENsel=“00”ELSEq<=i1WHENsel=“01”ELSEq<=i2WHENsel=“10”ELSEq<=i3WHENsel=“11”ELSE‘X’;ENDrtl;條件信號(hào)代入語(yǔ)句與IF語(yǔ)句的區(qū)別*IF語(yǔ)句只能在進(jìn)程內(nèi)部使用,而條件信號(hào)代入語(yǔ)句則可以在進(jìn)程內(nèi)部也可以在進(jìn)程之外。*條件信號(hào)代入語(yǔ)句中的ELSE是必須的,而IF語(yǔ)句中的ELSE可有可無(wú);*條件信號(hào)代入語(yǔ)句不能進(jìn)行嵌套,受制于沒(méi)有自身值代入的描述,不能生成鎖存電路。*條件信號(hào)代入語(yǔ)句所描述的電路與邏輯電路實(shí)際工作比較相近,故一般設(shè)計(jì)都難以掌握。只有當(dāng)進(jìn)程語(yǔ)句、IF語(yǔ)句和CASE語(yǔ)句難于描述時(shí),才用條件信號(hào)代入語(yǔ)句。條件信號(hào)賦值語(yǔ)句與進(jìn)程中的多選擇if語(yǔ)句等價(jià):q<=aWHENsela=‘1’ELSEbWHENselb=‘1’ELSEc;PROCESS(sela,selb,a,b,c)BEGIN
IFsela=‘1’THENq<=a;ELSIFselb=‘1’THENq<=b;ELSEq<=c;ENDIF;ENDPROCESS;
格式:WITH
表達(dá)式SELECT
目的信號(hào)量
<=表達(dá)式1WHEN
條件1,表達(dá)式2WHEN
條件2,┆表達(dá)式nWHEN
條件n;1)不能有重疊的條件分支。
2)最后條件可為others。否則,其它條件
必須能包含表達(dá)式的所有可能值。
3)選擇信號(hào)賦值語(yǔ)句與進(jìn)程中的case語(yǔ)句等價(jià)。5.2.4選擇信號(hào)代入語(yǔ)句注用選擇信號(hào)代入語(yǔ)句實(shí)現(xiàn)四選一電路LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmuxISPORT(i0,i1,i2,i3,a,b:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDmux;ARCHITECTUREbehaveOFmuxISSIGNALsel:INTEGER;BEGINWITHselSELECTq<=i0WHEN0,i1WHEN1,i2WHEN2,i3WHEN3,‘X’WHENOTHERS;sel<=0WHENa=‘0’ANDb=‘0’ELSE1WHENa=‘0’ANDb=‘1’ELSE2WHENa=‘1’ANDb=‘0’ELSE3WHENa=‘1’ANDb=‘1’ELSE4;ENDbehave;選擇信號(hào)代入語(yǔ)句,根據(jù)sel的不同值來(lái)完成選擇功能條件信號(hào)代入語(yǔ)句,根據(jù)a和b不同取值,對(duì)信號(hào)sel代入值選擇信號(hào)賦值語(yǔ)句與進(jìn)程中的case語(yǔ)句等價(jià):PROCESS(sel,a,b,c,d)BEGIN
CASEselISWHEN“00”=>q<=a;WHEN“01”=>q<=b;WHEN“10”=>q<=c;WHENOTHERS=>q<=d;ENDCASE;ENDPROCESS;WITHselSELECTq<=aWHEN“00”,bWHEN“01”,cWHEN“10”,dWHENOTHERS;5.2.5并發(fā)過(guò)程調(diào)用語(yǔ)句
并發(fā)過(guò)程調(diào)用(ConcurrentProcedureCall)語(yǔ)句可以出現(xiàn)在構(gòu)造體中,而且是一種可以在進(jìn)程之外執(zhí)行的過(guò)程調(diào)用語(yǔ)句。有關(guān)過(guò)程的結(jié)構(gòu)及書(shū)寫(xiě)方法在前面已講過(guò),我們回顧一下。格式:
PROCEDURE
過(guò)程名(參數(shù)1,參數(shù)2,…)
IS
[定義語(yǔ)句];
BEGIN
[順序處理語(yǔ)句];
END
過(guò)程名;關(guān)于過(guò)程調(diào)用應(yīng)注意的問(wèn)題①并發(fā)過(guò)程調(diào)用語(yǔ)句是一個(gè)完整的語(yǔ)句,在它的前面可以加標(biāo)號(hào);②并發(fā)過(guò)程調(diào)用語(yǔ)句是應(yīng)帶有IN,OUT或者INOUT的參數(shù),它們應(yīng)列于過(guò)程名后跟的括號(hào)內(nèi);③并發(fā)過(guò)程調(diào)用可以有多個(gè)返回值,但這些返回值必須通過(guò)過(guò)程中所定義的輸出參數(shù)帶回。④并發(fā)過(guò)程調(diào)用語(yǔ)句實(shí)際上是一個(gè)過(guò)程調(diào)用進(jìn)程的簡(jiǎn)寫(xiě)。⑤在過(guò)程中盡量不要出現(xiàn)自變量表中沒(méi)有出現(xiàn)過(guò)的信號(hào)量,如果出現(xiàn)將會(huì)帶來(lái)問(wèn)題。并發(fā)過(guò)程調(diào)用舉例ARCHITECTURE…BEGINvector_to_int(z,x_flag,q)…END;ARCHITECTURE…BEGINPROCESS(z,q)BEGINvector_to_int(z,x_flag,q)…ENDPROCESS;END;
并發(fā)過(guò)程調(diào)用是對(duì)位矢量Z進(jìn)行數(shù)值轉(zhuǎn)化,使之成為十進(jìn)制數(shù)整數(shù)q。x_flag是標(biāo)志位,為“真”表明轉(zhuǎn)換失敗,為“假”表明轉(zhuǎn)換成功。左例中并發(fā)過(guò)程調(diào)用語(yǔ)句和右例的過(guò)程調(diào)用進(jìn)程完全等效5.2.6塊(BLOCK)語(yǔ)句標(biāo)號(hào):BLOCK
塊頭
{說(shuō)明語(yǔ)句};
BEGIN{并發(fā)處理語(yǔ)句};
ENDBLOCK標(biāo)號(hào)名;BLOCK是一個(gè)并發(fā)執(zhí)行語(yǔ)句,通常用于構(gòu)造體的結(jié)構(gòu)化描述,其格式為:說(shuō)明語(yǔ)句通常包括:*USE子句;*子程序說(shuō)明及子程序體;*類(lèi)型說(shuō)明;*常數(shù)說(shuō)明;*信號(hào)說(shuō)明;*元件說(shuō)明。BLOCK語(yǔ)句的模塊化設(shè)計(jì)舉例
設(shè)計(jì)一個(gè)CPU,為簡(jiǎn)化起見(jiàn),假設(shè)這個(gè)CPU只由ALU(算術(shù)邏輯單元)模塊和REG8(寄存器)模塊組成。其中ALU模塊和REG8模塊的行為分別由兩個(gè)BLOCK語(yǔ)句來(lái)描述。每個(gè)模塊相當(dāng)于CPU電原理圖中的子原理圖(REG8模塊中又由8個(gè)REG1,REG2,…,REG8子模塊組成)。在每個(gè)塊內(nèi)能夠有局部信號(hào)、數(shù)據(jù)類(lèi)型、常數(shù)等說(shuō)明。任何一個(gè)客體可以在構(gòu)造體中說(shuō)明,也可以在塊中說(shuō)明。ARCHITECTUREcpu_blkOFISSIGNALibus,dbus:tw32;BEGIN
ALU:BLOCKSIGNALqbus:tw32;BEGIN---ALU行為描述語(yǔ)句
ENDBLOCKALU;
REG8:BLOCKSIGNALzbus:tw32;BEGIN
REG1:BLOCK----REG1行為描述語(yǔ)句
ENDBLOCKREG1;----其它REG8行為描述語(yǔ)句
ENDBLOCKREG8;ENDcpu_blk;ALU模塊REG模塊子模塊11)由于BLOCK可以嵌套,內(nèi)層BLOCK塊能夠使用外層BLOCK塊所說(shuō)明的信號(hào),而外層BLOCK塊卻不能夠使用內(nèi)層BLOCK塊中所說(shuō)明的信號(hào)。2)BLOCK是一個(gè)獨(dú)立的子結(jié)構(gòu),它可以包含PORT和GENERIC語(yǔ)句。3)不同的模塊中使用相同的信號(hào)名,在語(yǔ)法上是合法的,而且這兩個(gè)信號(hào)分別在各自的說(shuō)明區(qū)域有效。因此可以這樣認(rèn)為,它們是具有相同信號(hào)名各自獨(dú)立的信號(hào)。但是,為了能正確區(qū)分,我們通常取不同的名字,不至發(fā)生混淆。如:BLK1:BLOCKSIGNALqbus:tw32;BEGINBLK2:BLOCKSIGNALqbus:tw32;BEGIN-----BLK2語(yǔ)句
ENDBLOCKBLK2;-----BLK1語(yǔ)句
ENDBLOCKBLK1;應(yīng)用BLOCK語(yǔ)句應(yīng)注意的問(wèn)題改為BLK2_qbus5.3其它語(yǔ)句和有關(guān)規(guī)定的說(shuō)明5.3.1命名規(guī)則和注解的標(biāo)記
在VHDL語(yǔ)句中大小寫(xiě)是沒(méi)有區(qū)別的,所有語(yǔ)句中用大寫(xiě)字母或小寫(xiě)字母都可以,也可有大小寫(xiě)混合使用。但有兩種情況例外,這就是用單引號(hào)括起來(lái)的字符和用雙引號(hào)括起來(lái)的字符串,這時(shí)大寫(xiě)字母和小寫(xiě)字母是有區(qū)別的。
在VHDL語(yǔ)言中所使用的名字(名稱(chēng)),如信號(hào)名、實(shí)體名,構(gòu)造體名、變量名等,在命名時(shí)應(yīng)遵守如下規(guī)則:
1)名字的最前面應(yīng)該是英文字母;
2)能使用的字符只有英文字母、數(shù)字和下劃線(xiàn)“_”
;
3)不能連續(xù)使用“_”符號(hào),在名字的最后也不能使用“_”
。
4)其注釋從兩個(gè)短劃線(xiàn)“--”符號(hào)開(kāi)始到該項(xiàng)末尾(回車(chē)、換行符)結(jié)束。命名舉例SIGNALa_bus:STD_LOGIC_VECTOR(7DOWNTO0);SIGNAL302_bus:…--不能以數(shù)字開(kāi)頭SIGNALb_@bus:…--@不能作為名稱(chēng)的字母SIGNALa__bus:…--’_’不能連著使用SIGNALa_bus_:…--’-’不能放在名稱(chēng)的最后。5.3.2ATTRIBUTE(屬性)描述與定義語(yǔ)句
VHDL語(yǔ)句中有屬性預(yù)定義功能,該功能有許多重要的應(yīng)用,例如檢出時(shí)鐘邊沿,完成定時(shí)檢查,獲得未約束的數(shù)據(jù)類(lèi)型的范圍等。ATTRIBUTE語(yǔ)句可以從所指定的客體中獲得關(guān)心的數(shù)據(jù)或信息。如:
TYPEnumberISINTEGERRANGE9DOWNTO0;若想得到number的最大值,則可用下面的語(yǔ)句:
i:=number’HIGH;--i=9而要得到最小值則可用:
i:=number’LOW;--i=0
通過(guò)預(yù)定義屬性描述語(yǔ)句,可以得到客體的有關(guān)值、功能、類(lèi)型和范圍。自定義一個(gè)叫“number”的數(shù)據(jù)類(lèi)型,它取值9~0的整數(shù)1、數(shù)值類(lèi)屬性數(shù)值類(lèi)屬性用來(lái)得到數(shù)組、塊或者一般數(shù)據(jù)的有關(guān)值。數(shù)值類(lèi)屬性又分為3個(gè)子類(lèi):*一般數(shù)據(jù)的數(shù)值屬性;*數(shù)組的數(shù)值屬性;*塊的數(shù)值屬性。1)一般數(shù)據(jù)的數(shù)值屬性一般數(shù)據(jù)的數(shù)值屬性的書(shū)寫(xiě)格式為:
客體’屬性名一般數(shù)據(jù)的數(shù)值屬性有以下4種:?T’LEFT------得到數(shù)據(jù)類(lèi)或子類(lèi)區(qū)間的最左端的值;?T’RIGHT------得到數(shù)據(jù)類(lèi)或子類(lèi)區(qū)間的最右端的值;?T’HIGH------得到數(shù)據(jù)類(lèi)或子類(lèi)區(qū)間的最高端的值;?T’LOW------得到數(shù)據(jù)類(lèi)或子類(lèi)區(qū)間的最低端的值;T為客體,代表一般數(shù)據(jù)類(lèi)和子類(lèi)的名稱(chēng),符號(hào)“’”緊跟客體后面,符號(hào)“’”后面是屬性名。例:
TYPEnumberIS0TO9;i:=number’LEFT;--i=0i:=number’RIGHT;--i=9i:=number’HIGHT;--i=9i:=number’LOW;--i=0改為9DOWNTO0,則會(huì)怎樣?
數(shù)值類(lèi)屬性不光適用于數(shù)字類(lèi)型,而且該屬性還可以適用于任何標(biāo)量類(lèi)型。如:
TYPEtimIS(sec,min,hours,day,month,year);SUBTYPEreverse_timIStimRANGEmonthDOWNTOmin;tim1<=tim’LEFT;--得到sectim2<=tim’RIGHT;--得到y(tǒng)eartim3<=tim’HIGH;--得到y(tǒng)eartim4<=tim’LOW;--得到sectim5<=reverse_tim’LEFT;--得到monthtim6<=reverse_tim’RIGHT;--得到mintim7<=reverse_tim’HIGH;--得到monthtim8<=reverse_tim’LOW;--得到min
在使用時(shí),應(yīng)注意方向,即是用DOWNTO還是TO,LEFT和LOW,RIGHT和HIGHT是不一樣的。枚舉類(lèi)型數(shù)據(jù)定義,數(shù)據(jù)的序號(hào)值從左到右遞增子類(lèi)型的定義,注意數(shù)據(jù)的區(qū)間用的是DOWNTO枚舉類(lèi)型數(shù)據(jù)的數(shù)值屬性2)數(shù)組的數(shù)值屬性
數(shù)組的類(lèi)屬性只有一個(gè)即:T’LENGTH,得到給定數(shù)組的長(zhǎng)度。例:PROCESS(a)TYPEbit4ISARRAY(0TO3)ofBIT;TYPEbit_strangeISARRAY(10TO20)OFBIT;VARIABLElen1,len2:INTEGER;BEGINlen1:=bit4’LENGTH;--len1=4len2:=bit_strange’LENGTH;--len2=11ENDPROCESS;
該屬性可用于任何標(biāo)量類(lèi)數(shù)組(如枚舉類(lèi)型)和多維的標(biāo)量類(lèi)區(qū)間的數(shù)組。具體請(qǐng)同學(xué)們看書(shū)。一個(gè)包含4個(gè)元素?cái)?shù)組的定義一個(gè)包含11個(gè)元素?cái)?shù)組的定義,其起始位10和終值位20.3)塊的數(shù)值屬性塊的數(shù)據(jù)屬性有兩種:’STRUCTURE和’BEHAVIOR。這兩種屬性用于塊和構(gòu)造體,通過(guò)它們可以驗(yàn)證所說(shuō)明的塊或構(gòu)造體是用結(jié)構(gòu)描述方式還是用行為方式來(lái)描述模塊的。這對(duì)設(shè)計(jì)人員檢查程序是非常有用的。
如果塊有標(biāo)號(hào)說(shuō)明,或者構(gòu)造體有構(gòu)造體名說(shuō)明,而且在塊和構(gòu)造體中不存在COMPNENT語(yǔ)句,那么用屬性’BEHAVIOR將得到“TRUE”的信息;如果在塊和構(gòu)造體中只有COMPONET語(yǔ)句或被動(dòng)進(jìn)程,那么用屬性’STRUCTURE將得到“TRUE”的信息。2.函數(shù)類(lèi)屬性
函數(shù)類(lèi)屬性是指屬性以函數(shù)的形式,讓設(shè)計(jì)人員得到有關(guān)數(shù)據(jù)類(lèi)型、數(shù)組、信號(hào)的某些信息。函數(shù)類(lèi)屬性3種:①數(shù)據(jù)類(lèi)型屬性函數(shù);②數(shù)組屬性函數(shù);③信號(hào)屬性函數(shù)。1)數(shù)據(jù)類(lèi)型屬性函數(shù)用數(shù)據(jù)類(lèi)型屬性函數(shù)可以得到有關(guān)數(shù)據(jù)類(lèi)型的各種信息。例如,給出某類(lèi)數(shù)據(jù)值的位置,那么利用位置函數(shù)屬性就可以得到該位置的數(shù)值。另外,利用其它相應(yīng)屬性還可以得到某些值的左鄰值各右鄰值等等。數(shù)據(jù)類(lèi)型屬性函數(shù)的6種屬性函數(shù)’POS(x)
--得到輸入x值的位序號(hào);’VAL(x)
--得到輸入位置序號(hào)x的值;’SUCC(x)
--得到輸入x值的下一個(gè)值;’PRED(x)
--得到輸入x值前一
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年春季學(xué)期主題班會(huì)教案:探索人工智能的未來(lái)
- 2025年新學(xué)期攻略:《囊螢夜讀》教學(xué)課件更新
- 2024年關(guān)于高二迎接高三演講稿范文(17篇)
- 水果的創(chuàng)業(yè)計(jì)劃書(shū)(4篇)
- 電力修理知識(shí)培訓(xùn)課件
- 路政業(yè)務(wù)知識(shí)培訓(xùn)課件
- DB31∕601-2012 地理標(biāo)志產(chǎn)品 金山蟠桃
- 關(guān)于中國(guó)建筑與防震減災(zāi)的研究論文匯報(bào)
- 物流系統(tǒng)分析 課件 項(xiàng)目九-任務(wù)三 (三)多式聯(lián)運(yùn)優(yōu)化模型
- 砌體結(jié)構(gòu)工程事故分析與處理
- 《臨床疾病概論》課件
- 安全生產(chǎn)費(fèi)用使用臺(tái)賬
- 鋅精礦價(jià)格計(jì)算公式
- 舞臺(tái)設(shè)計(jì)課件
- 高中英語(yǔ) 高中閱讀高頻單詞
- TRD工法施工方案(長(zhǎng)業(yè)范本)
- 模板安裝三檢記錄表
- 安全費(fèi)用提取、使用臺(tái)賬
- 部編版六年級(jí)語(yǔ)文下冊(cè)全冊(cè)課件PPT
- 北京市歷年中考語(yǔ)文現(xiàn)代文之記敘文閱讀25篇(2003-2021)
- 新教科版六年級(jí)下冊(cè)科學(xué)全冊(cè)重點(diǎn)題型練習(xí)課件(含答案)
評(píng)論
0/150
提交評(píng)論