VHDL的主要描述語句課件_第1頁
VHDL的主要描述語句課件_第2頁
VHDL的主要描述語句課件_第3頁
VHDL的主要描述語句課件_第4頁
VHDL的主要描述語句課件_第5頁
已閱讀5頁,還剩136頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

VHDL的主要描述語句

VHDL的主要描述語句1INDEX順序語句數(shù)據(jù)類型及運(yùn)算符并行語句其它語句INDEX順序語句數(shù)據(jù)類型及運(yùn)算符并行語句其它語句2VHDL語言客體及分類信號

Signal信號名:數(shù)據(jù)類型約束條件:=表達(dá)式變量variable變量名:數(shù)據(jù)類型約束條件:=表達(dá)式常數(shù)constant常數(shù)名:數(shù)據(jù)類型約束條件:=表達(dá)式VHDL語言客體及分類信號3VHDL語言客體及分類客體類別含義說明場合信號信號說明全局量ARCHITECTURE;PACKAGE;ENTITY變量變量說明局部量PROCESS;FUNCTION;PROCEDURE常數(shù)常數(shù)說明全局量上面兩種場合均可存在VHDL語言客體及分類客體類別含義說明場合信號信號說明全局量4VHDL語言標(biāo)準(zhǔn)數(shù)據(jù)類型數(shù)據(jù)類型含義描述方式整數(shù)整數(shù)32位integer實(shí)數(shù)浮點(diǎn)數(shù)real位邏輯“0”或“1”bit位矢量位矢量bit_vector布爾量邏輯假或真boolean字符ASCII字符character時間時間單位fs,ps,ns等time錯誤等級note,warning,error,failureseveritylevel自然數(shù)、正整數(shù)整數(shù)的子集Natural,Positive字符串字符矢量String說明:描述方式為在寫數(shù)據(jù)類型時出現(xiàn)的形式VHDL語言標(biāo)準(zhǔn)數(shù)據(jù)類型數(shù)據(jù)類型含義描述方式整數(shù)整數(shù)32位i5VHDL語言運(yùn)算符號(一)優(yōu)先級順序操作符類型操作符功能

邏輯運(yùn)算符號AND邏輯與OR邏輯或NAND邏輯與非NOR邏輯或非XOR邏輯異或關(guān)系運(yùn)算符=等號/=不等號<小于>大于<=小于等于>=大于等于算術(shù)運(yùn)算符號+加-減&并置VHDL語言運(yùn)算符號(一)優(yōu)先級順序操作符類型操作符功能邏6優(yōu)先級順序操作符類型操作符功能

正負(fù)運(yùn)算符+正-負(fù)乘法運(yùn)算符*乘法/除法

MOD求模REM取余**指數(shù)ABS取絕對值NOT取反VHDL語言運(yùn)算符號(二)優(yōu)先級順序操作符類型操作符功能正負(fù)運(yùn)算符+正-負(fù)乘法運(yùn)算符7INDEX順序語句數(shù)據(jù)類型及運(yùn)算符并行語句其它語句INDEX順序語句數(shù)據(jù)類型及運(yùn)算符并行語句其它語句8

順序語句是指完全按照程序中書寫的順序執(zhí)行各語句,并且在結(jié)構(gòu)層次中前面的語句執(zhí)行結(jié)果會直接影響后面各語句的執(zhí)行結(jié)果。順序描述語句只能出現(xiàn)在進(jìn)程或子程序中,用來定義進(jìn)程或子程序的算法。順序語句可以用來進(jìn)行算術(shù)運(yùn)算、邏輯運(yùn)算、信號和變量的賦值、子程序調(diào)用等,還可以進(jìn)行條件控制和迭代。注意,這里的順序是從仿真軟件的運(yùn)行和順應(yīng)VHDL語法的編程邏輯思路而言的,其相應(yīng)的硬件邏輯工作方式未必如此。應(yīng)該注意區(qū)分VHDL語言的軟件行為與描述綜合后的硬件行為的差異。

VHDL順序語句VHDL順序語句9VHDL順序語句主要包括·變量賦值語句(VariableEvaluate)·信號賦值語句(SignalEvaluate)·WAIT語句·IF語句·CASE語句·LOOP語句·NEXT語句·EXIT語句·RETURN語句·NULL語句·過程調(diào)用語句(ProcedureCall)·斷言語句(Assert)·REPORT語句VHDL順序語句VHDL順序語句主要包括VHDL順序語句101.變量賦值語句變量賦值語句語法格式為:

變量賦值目標(biāo)

:=

賦值表達(dá)式

例:VARIABLEs:BIT:=‘0’;PROCESS(s)VARIABLEcount:INTEGER:=‘0’--變量說明BEGINcount:=s+1--變量賦值ENDPROCESS;

1.變量賦值語句例:112.信號賦值語句在VHDL語言中,用符號“<=”為信號賦值。信號賦值語句的規(guī)范書寫格式如下:目的信號量<=[TRANSPORT][INERTIAL]信號變量表達(dá)式;其中[TRANSPORT]表示傳輸延遲,[INERTIAL]表示慣性延遲。要求“<=”兩邊的信號變量類型和位長度應(yīng)該一致。例1:s

<=TRANSPORT

tAFTER10ns;

d<=

INERTIAL

2

AFTER3ns,

1AFTER8ns;例2:s<=aNOR(bANDc);3個敏感量a,b,c中任何一個發(fā)生變化,該語句都將被執(zhí)行。2.信號賦值語句12WAIT語句在進(jìn)程中起到與敏感信號一樣重要的作用,敏感信號觸發(fā)進(jìn)程的執(zhí)行,WAIT語句同步進(jìn)程的執(zhí)行,同步條件由WAIT語句指明。進(jìn)程在仿真運(yùn)行中處于執(zhí)行或掛起兩種狀態(tài)之一。當(dāng)進(jìn)程執(zhí)行到等待語句時,就將被掛起并設(shè)置好再次執(zhí)行的條件。WAIT語句可以設(shè)置4種不同的條件:無限等待、時間到、條件滿足以及敏感信號量變化。這幾類WAIT語句可以混合使用?,F(xiàn)分別介紹如下:

3.WAIT語句WAIT語句在進(jìn)程中起到與敏感信號一樣重要的作用,敏感13①.WAIT

--無限等待語句這種形式的WAIT語句在關(guān)鍵字“WAIT”后面不帶任何信息,是無限等待的情況。②.WAITON信號表

--敏感信號等待語句這種形式的WAIT語句使進(jìn)程暫停,直到敏感信號表中某個信號值發(fā)生變化。WAITON語句后面跟著的信號表,在敏感信號表中列出等待語句的敏感信號。當(dāng)進(jìn)程處于等待狀態(tài)時,其中敏感信號發(fā)生任何變化都將結(jié)束掛起,再次啟動進(jìn)程。①.WAIT--無限等待語句②.14例[A]PROCESSBEGINy<=aANDb;WAITONa,b;ENDPROCESS;例[B]PROCESS(a,b)BEGINy<=aANDb;ENDPROCESS;

在例[A]中執(zhí)行所有語句后,進(jìn)程將在WAIT語句處被掛起,直到a或b中任何一個信號發(fā)生變化,進(jìn)程才重新開始。例[A]與例[B]是等價的。例[A]在例[A]中執(zhí)行所有語句后,進(jìn)程將在WAIT語句處被15需要注意的是,在使用WAITON語句的進(jìn)程中,敏感信號量應(yīng)寫在進(jìn)程中的WAITON語句后面;而在不使用WAITON語句的進(jìn)程中,敏感信號量應(yīng)在開頭的關(guān)鍵詞PROCESS后面的敏感信號表中列出。VHDL規(guī)定,已列出敏感信號表的進(jìn)程不能使用任何形式的WAIT語句。

需要注意的是,在使用WAITON語句的進(jìn)程中,16③.

WAITUNTIL條件

--條件等待語句這種形式的WAIT語句使進(jìn)程暫停,直到預(yù)期的條件為真。WAITUNTIL后面跟的是布爾表達(dá)式,在布爾表達(dá)式中隱式地建立一個敏感信號量表,當(dāng)表中任何一個信號量發(fā)生變化時,就立即對表達(dá)式進(jìn)行一次測評。如果其結(jié)果使表達(dá)式返回一個“真”值,則進(jìn)程脫離掛起狀態(tài),繼續(xù)執(zhí)行下面的語句。即WAITUNTIL語句需滿足以下條件:·在條件表達(dá)式中所含的信號發(fā)生了變化;·此信號改變后,且滿足WAITUNTIL語句中表達(dá)式的條件。這兩個條件缺一不可,且必須按照上述順序來完成。

③.WAITUNTIL條件--條件17WAITUNTIL語句有以下三種表達(dá)方式:WAITUNTIL信號=VALUE;WAITUNTIL信號’EVENTAND信號=VALUE;WAITUNTIL信號’STABLEAND信號=VALUE;例如:

WAITUNTILclock=“1”;WAITUNTILrising_edge(clk);WAITUNTILclk=‘1’ANDclk’EVENT;WAITUNTILNOTclk’STABLEANDclk=“1”;

一般的,在一個進(jìn)程中使用了WAIT語句后,綜合器會綜合產(chǎn)生時序邏輯電路。時序邏輯電路的運(yùn)行依賴WAITUNTIL表達(dá)式的條件,同時還具有數(shù)據(jù)存儲的功能。

WAITUNTIL語句有以下三種表達(dá)方式:一般的,在一個進(jìn)18例如:WAITFOR40ns;在該語句中,時間表達(dá)式為常數(shù)40ns,當(dāng)進(jìn)程執(zhí)行到該語句時,將等待40ns,經(jīng)過40ns之后,進(jìn)程執(zhí)行WAITFOR的后繼語句。例如:WAITFOR(a*(b+c));在此語句中,(a*(b+c))為時間表達(dá)式,WAITFOR語句在執(zhí)行時,首先計算表達(dá)式的值,然后將計算結(jié)果返回作為該語句的等待時間。

④.WAITFOR時間表達(dá)式--超時等待語句④.WAITFOR時間表達(dá)式--超時等待語句194.IF語句

在VHDL語言中,IF語句的作用是根據(jù)指定的條件來確定語句的執(zhí)行順序。IF語句可用于選擇器、比較器、編碼器、譯碼器、狀態(tài)機(jī)等的設(shè)計,是VHDL語言中最常用的語句之一。IF語句按其書寫格式可分為以下3種。

①.IF-THEN控制語句這類語句書寫格式為:

IF條件THEN

順序語句ENDIF;

當(dāng)程序執(zhí)行到這種控制型IF語句時,首先判斷語句中所指定的條件是否成立。如果條件成立,則程序繼續(xù)執(zhí)行IF語句中所含的順序處理語句;如果條件不成立,程序?qū)⑻^IF語句所包含的順序處理語句,而向下執(zhí)行IF的后繼語句。

4.IF語句①.IF-THEN控制語句當(dāng)20LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdffISPORT(clk,d:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDdff;ARCHITECTURErtlOFdffISBEGINPROCESS(clk)BEGINIF(clk’EVENTANDclk=’1’)THEN

q<=d;ENDIF;ENDPROCESS;ENDrtl;例:利用IF語句引入D觸發(fā)器例:利用IF語句引入D觸發(fā)器21

這種語句的書寫格式為:

TF條件THEN

順序語句ELSE

順序語句ENDIF;

當(dāng)IF條件成立時,程序執(zhí)行THEN和ELSE之間的順序語句部分;當(dāng)IF語句的條件得不到滿足時,程序執(zhí)行ELSE和ENDIF之間的順序處理語句。即依據(jù)IF所指定的條件是否滿足,程序可以進(jìn)行兩條不同的執(zhí)行路徑。

②.二選一控制語句當(dāng)IF條件成立時,程序執(zhí)行TH22ARCHITECTURErtlOFmux2ISBEGINPROCESS(a,b,s)BEGINIF(s=’1’)THEN

c<=a;ELSE

c<=b;ENDIF;ENDPROCESS;ENDrtl;

例:二選一電路結(jié)構(gòu)體的描述例:二選一電路結(jié)構(gòu)體的描述23這種語句的書寫格式為:IF條件THEN順序語句ELSEIF順序語句ELSEIF順序語句┇ELSE順序語句ENDIF;

③.多選擇控制語句這種語句的書寫格式為:③.多選擇控制語句24

這種多選擇控制的IF語句,實(shí)際上就是條件嵌套。它設(shè)置了多個條件,當(dāng)滿足所設(shè)置的多個條件之一時,就執(zhí)行該條件后的順序處理語句。當(dāng)所有設(shè)置的條件都不滿足時,程序執(zhí)行ELSE和ENDIF之間的順序處理語句。

例:利用多選控制語句設(shè)計的四選一多路選擇器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux4ISPORT(input:INSTD_LOGIC_VECTOR(3DOWNTO0);sel:INSTD_LOGIC_VECTOR(1DOWNTO0);y:OUTSTD_LOGIC);ENDmux4;這種多選擇控制的IF語句,實(shí)際上就是條件嵌套。25ARCHITECTURErtlOFmux4ISBEGIN

PROCESS(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;ARCHITECTURErtlOFmux4IS26CASE語句根據(jù)滿足的條件直接選擇多項(xiàng)順序語句中的一項(xiàng)執(zhí)行,它常用來描述總線行為、編碼器、譯碼器等的結(jié)構(gòu)。CASE語句的結(jié)構(gòu)為:CASE表達(dá)式ISWHEN條件選擇值=>順序語句,┇WHEN條件選擇值=>順序語句,ENDCASE;其中WHEN條件選擇值可以有四種表達(dá)方式;(1)單個普通數(shù)值,形如WHEN選擇值=>順序語句;(2)并列數(shù)值,形如WHEN值/值/值=>順序語句;(3)數(shù)值選擇范圍,形如WHEN值TO值=>順序語句;(4)WHENOTHERS=>順序語句;5.CASE語句5.CASE語句27當(dāng)執(zhí)行到CASE語句時,首先計算CASE和IS之間的表達(dá)式的值,然后根據(jù)條件語句中與之相同的選擇值,執(zhí)行對應(yīng)的順序語句,最后結(jié)束CASE語句。使用CASE語句需注意以下幾點(diǎn):·CASE語句中每一條語句的選擇值只能出現(xiàn)一次,即不能有相同選擇值的條件語句出現(xiàn)。·CASE語句執(zhí)行中必須選中,且只能選中所列條件語句中的一條,即CASE語句至少包含一個條件語句?!こ撬袟l件語句中的選擇值能完全覆蓋CASE語句中表達(dá)式的取值,否則最末一個條件語句中的選擇必須用“OTHERS”表示,它代表已給出的所有條件語句中未能列出的其他可能的取值。關(guān)鍵詞OTHERS只能出現(xiàn)一次,且只能作為最后一種條件取值。使用OTHERS是為了使條件語句中的所有選擇值能覆蓋表達(dá)式的所有取值,以免綜合過程中插入不必要的鎖存器。這一點(diǎn)對于定義為STD_LOGIC和STD_LOGIC_VECTOR數(shù)據(jù)類型的值尤為重要,因?yàn)檫@些數(shù)據(jù)對象的取值除了1、0之外,還可能出現(xiàn)輸入高阻態(tài)Z,不定態(tài)X等取值。當(dāng)執(zhí)行到CASE語句時,首先計算CASE和IS之間的表達(dá)式的28例[1]CASE語句使用CASEcommandISWHEN“00”=>c<=a;WHEN“01”=>c<=b;WHEN“10”=>c<=e;WHEN“11”=>c<=f;WHENOTHERS=>NULL;

--無效ENDCASE;例[2]CASE語句使用CASEselISWHEN1TO9=>c<=1;WHEN11/12=>c<=2;WHENOTHERS=>c<=3;ENDCASE;在例[2]中,第一個WHEN語句的意思是當(dāng)sel的值是從1到9中任意一個數(shù)值時,信號c的值取1;第二個WHEN語句的意思是當(dāng)sel的值為11或12兩者之一時,信號c的取值為2;第三個WHEN語句的意思是當(dāng)sel的值不為前面兩種情況時,信號c的取值為3。

--適合4選1數(shù)據(jù)選擇器例[1]CASE語句使用--適合4選1數(shù)據(jù)選擇器29LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdecoder3_8ISPORT(a,b,c,g1,g2a,g2b:INSTD_LOGIC;y:OUTSTD_LOGIC_VECTOR(7DOWNTO0);ENDdecoder3_8;ARCHITECTURErtlOFdecoder3_8ISSIGNALindata:STD_LOGIC_VECTOR(2DOWNTO0);BEGIN

indata<=c&b&a;

PROCESS(indata,g1,g2a,g2b)BEGIN

例[3]3-8譯碼器例[3]3-8譯碼器30IF(g1=‘1’ANDg2a=‘0’ANDg2b=‘0’)THEN

CASE

indataISWHEN“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”;WHEN“111”=>y<=“01111111”;WHENOTHERS=>y<=“XXXXXXXX”;ENDCASE;

--X:不定IF(g1=‘1’ANDg2a=‘0’ANDg2b=‘31ELSE--指不滿足g1=‘1’ANDg2a=‘0’ANDg2b=‘0’情況y<=“11111111”;ENDIF;ENDPROCESS;ENDrtl;與IF語句相比,CASE語句組的程序語句是沒有先后順序的,所有表達(dá)式的值都并行處理。IF語句是有序的,先處理最起始、最優(yōu)先的條件,后處理次優(yōu)先的條件。ELSE--指不滿足g1=‘1’ANDg2a32LOOP語句就是循環(huán)語句,它可以使包含的一組順序語句被循環(huán)執(zhí)行,其執(zhí)行的次數(shù)受迭代算法控制。在VHDL中常用來描述迭代電路的行為。①.單個LOOP語句單個LOOP語句的書寫格式如下:

[標(biāo)號:]LOOP順序語句ENDLOOP[標(biāo)號];這種循環(huán)語句需引入其他控制語句(如EXIT)后才能確定,否則為無限循環(huán)。其中的標(biāo)號是可選的。6.LOOP語句6.LOOP語句33例如:loop1:LOOPWAITUNTILclk=‘1’;q<=dAFTER2ns;ENDLOOPloop1;該語句語法格式為:

[標(biāo)號:]FOR循環(huán)變量IN離散范圍LOOP順序處理語句ENDLOOP[標(biāo)號];

②.FOR_LOOP語句例如:②.FOR_LOOP語句34例:8位奇偶校驗(yàn)電路LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYparity_checkISPORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);

y:OUTSTD_LOGIC);ENDparity_check;ARCHITECTURErtlOFparity_checkISBEGINPROCESS(a)VARIABLEtmp:STD_LOGIC

例:8位奇偶校驗(yàn)電路35BEGIN

tmp:=‘0’;FORiIN0TO7LOOP

tmp:=tmpXORa(i);ENDLOOP;y<=tmp;--y=1,a為奇數(shù)個‘1’。y=0,a為偶數(shù)個‘1’。ENDPROCESS;ENDrtl;BEGIN36這種語句的書寫格式為:[標(biāo)號:]WHILE條件LOOP順序處理語句ENDLOOP[標(biāo)號];在該LOOP語句中,沒有給出循環(huán)次數(shù)的范圍,而是給出了循環(huán)執(zhí)行順序語句的條件;沒有自動遞增循環(huán)變量的功能,而是在順序處理語句中增加了一條循環(huán)次數(shù)計算語句,用于循環(huán)語句的控制。循環(huán)控制條件為布爾表達(dá)式,當(dāng)條件為“真”時,則進(jìn)行循環(huán),如果條件為“假”,則結(jié)束循環(huán)。

③.WHILE_LOOP語句③.WHILE_LOOP語句37LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYparity_checkISPORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);

y:OUTSTD_LOGIC);ENDparity_check;ARCHITECTUREbehavOFparity_checkISBEGINPROCESS(a)VARIABLEtmp:STD_LOGIC

例:8位奇偶校驗(yàn)電路的WHILE_LOOP設(shè)計形式LIBRARYIEEE;例:8位奇偶校驗(yàn)電路的WHILE_38BEGIN

tmp:=‘0’;

i:=0;WHILE(i

<8)LOOP

tmp

:=

tmpXORa(i);

i:=i+1;ENDLOOP;y<=

tmp;ENDPROCESS;ENDbehav;BEGIN39NEXT語句的書寫格式為:

NEXT[標(biāo)號][WHEN條件]該語句主要用于LOOP語句內(nèi)部的循環(huán)控制。當(dāng)NEXT語句后不跟[標(biāo)號],NEXT語句作用于當(dāng)前最內(nèi)層循環(huán),即從LOOP語句的起始位置進(jìn)入下一個循環(huán)。若NEXT語句不跟[WHEN條件],NEXT語句立即無條件跳出循環(huán)。例:NEXT語句應(yīng)用舉例┇WHILEdata>1LOOPdata:=data+1;NEXTWHENdata=3--條件成立而無標(biāo)號,跳出循環(huán)data:=data*data;ENDLOOP;7.NEXT語句例:NEXT語句應(yīng)用舉例7.NEXT語句40N1:FORiIN10DOWNTO1LOOPN2:FORjIN0TOiLOOPNEXTN1WHENi=j;--條件成立,跳到N1處matrix(i,j):=

j*i+1;--條件不成立,繼續(xù)內(nèi)層循環(huán)N2ENDLOOPN2;ENDLOOPN1;N1:FORiIN10DOWNTO1LOOP41EXIT語句的書寫格式為:

EXIT[LOOP標(biāo)號][WHEN條件];EXIT語句也是用來控制LOOP的內(nèi)部循環(huán),與NEXT語句不同的是EXIT語句跳向LOOP終點(diǎn),結(jié)束LOOP語句;而NEXT語句是跳向LOOP語句的起始點(diǎn),結(jié)束本次循環(huán),開始下一次循環(huán)。當(dāng)EXIT語句中含有標(biāo)號時,表明跳到標(biāo)號處繼續(xù)執(zhí)行。含[WHEN條件]時,如果條件為“真”,跳出LOOP語句;如果條件為“假”,則繼續(xù)執(zhí)行LOOP循環(huán)。

EXIT語句不含標(biāo)號和條件時,表明無條件結(jié)束LOOP語句的執(zhí)行,因此,它為程序需要處理保護(hù)、出錯和警告狀態(tài),提供了一種快捷、簡便的調(diào)試方法。8.EXIT語句8.EXIT語句42SIGNALa,b:STD_LOGIC_VECTOR(0TO1);SIGNALa_less_than_b:BOOLEAN;┇a_less_than_b<=FALSE;FORiIN1TO0LOOPIF(a(i)=‘1’ANDb(i)=‘0’)THEN

a_less_than_b<=FALSE;EXIT;ELSEIF(a(i)=‘0’ANDb(i)=‘1’)THEN

a_less_than_b<=TRUE;EXIT;

ELSENULLENDIF;ENDLOOP;

--a1a0與b1b0比較大小

例:兩個元素位矢量a、b進(jìn)行比較,當(dāng)發(fā)現(xiàn)a與b不同時,跳出循環(huán)比較程序并報告比較結(jié)果。--a1a0與b1b0比較大小例:兩個元素位矢量a43RETURN語句是一段子程序結(jié)束后,返回主程序的控制語句。它只能用于函數(shù)與過程體內(nèi),并用來結(jié)束當(dāng)前最內(nèi)層函數(shù)或過程體的執(zhí)行。RETURN語句的書寫格式為:RETURN;RETURN表達(dá)式;

9.返回語句RETURNRETURN語句是一段子程序結(jié)束后,返回主程序的控制語句。它44LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYexampleISPORT(a,b:ININTEGER;

y:OUTINTEGER);ENDexample;ARCHITECTURErtlOFexampleISBEGINPROCESS(a,b)FUNCTIONmaximum(a,b:INTEGER)RETURNINTEGERISVARIABLEtmp:INTEGER;例:在函數(shù)體中使用RETURN語句LIBRARYIEEE;例:在函數(shù)體中使用RETURN語句45BEGINIF(a>b)THEN

tmp:=a;ELSEtmp:=b;ENDIF;ENDmaximum;BEGINy<=maximum(a,b);ENDPROCESS;ENDrtl;上例是一個對兩個輸入整數(shù)取最大值的功能描述,在結(jié)構(gòu)體的進(jìn)程中定義了一個取最大值的函數(shù)。在函數(shù)體中正是通過RETURN語句將比較得到的最大值返回的,并結(jié)束該函數(shù)體的執(zhí)行。BEGIN上例是一個對兩個輸入整數(shù)取最大值的功能描述,在結(jié)構(gòu)46NULL語句是空操作語句,不完成任何操作,執(zhí)行NULL語句只是讓程序運(yùn)行流程走到下一個語句。NULL語句的書寫格式為:NULL;NULL語句常用于CASE語句中,利用NULL來表示所余的不用的條件下的操作行為,以滿足CASE語句對條件值全部列舉的要求。10.NULL語句10.NULL語句47LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux4ISPORT(d0:INSTD_LOGIC_VECTOR(7DOWNTO1);

d1:INSTD_LOGIC_VECTOR(7DOWNTO1);

d2:INSTD_LOGIC_VECTOR(7DOWNTO1);

d3:INSTD_LOGIC_VECTOR(7DOWNTO1);

s0:INSTD_LOGIC;

s1:INSTD_LOGIC;

y:OUTSTD_LOGIC_VECTOR(7DOWNTO1));ENDmux4;ARCHITECTUREbehaveOFmux4IS例:采用NULL語句的四選一數(shù)據(jù)選擇器。例:采用NULL語句的四選一數(shù)據(jù)選擇器。48BEGINlable:PROCESS(d0,d1,d2,d3,s0,s1)VARIABLEtmp:INTEGER;BEGIN

tmp:=0;IF(s0=‘1’)THEN

tmp:=tmp+1;ENDIF;IF(s1=‘1’)THEN

tmp:=tmp+2;ENDIF;

BEGIN49CASEtmpISWHEN0=>y<=d0;WHEN1=>y<=d1;WHEN2=>y<=d2;WHEN3=>y<=d3;WHENOTHERS=>NULL;ENDCASE;ENDPROCESS;ENDbehave;上例是通過對用于選通8位總線的四選一多路選擇器進(jìn)行功能描述,具體說明NULL語句的使用。CASEtmpIS5011.過程調(diào)用語句(ProcedureCall)與其他高級程序設(shè)計語言相似,VHDL提供了子程序的概念。其中在進(jìn)程、函數(shù)和過程中,可以使用過程調(diào)用語句,此時它是一種順序語句。一個過程被調(diào)用時將去執(zhí)行它的過程體。過程調(diào)用語句的書寫格式為:

例:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYmaxISPORT(in1:INSTD_LOGIC_VECTOR(7DOWNTO0);

in2:INSTD_LOGIC_VECTOR(7DOWNTO0);

in3:INSTD_LOGIC_VECTOR(7DOWNTO0);q:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDmax;過程名(實(shí)參表);11.過程調(diào)用語句(ProcedureCall)例:過程51

ARCHITECTURErtlOFmaxIS

PROCEDUREmaximum(a,b:INSTD_LOGIC_VECTOR;c:OUTSTD_LOGIC_VECTOR)ISVARIABLEtemp:STD_LOGIC_VECTOR(a’RANGE);BEGINIF(a>b)THEN

temp:=a;ELSE

temp:=b;ENDIF;c:=temp;ENDmaximum;ARCHITECTURErtlOFmax52

BEGINPROCESS(in1,in2,tmp1)VARIABLEtmp1,tmp2:STD_LOGIC_VECTOR(7DOWNTO0);BEGIN

maximum(in1,in2,tmp1);--過程調(diào)用

maximum(tmp1,in3,tmp2);

q<=tmp2;ENDPROCESS;ENDrtl;上例是一個取三個輸入位矢量最大值的功能描述,它在結(jié)構(gòu)體中的進(jìn)程語句中使用了兩個過程調(diào)用語句。BEGIN53

斷言語句分為順序斷言語句和并行斷言語句,順序斷言語句主要用于進(jìn)程、函數(shù)和過程仿真、調(diào)試中的人機(jī)對話,它可以給出一個文字串作為警告和錯誤信息。斷言語句的書寫格式如下:ASSERT條件[REPORT報告信息][SEVERITY出錯級別];在執(zhí)行過程中,斷言語句對條件(布爾表達(dá)式)的真假進(jìn)行判斷,如果條件為“TURE”,則向下執(zhí)行另外一條語句;如果條件為“FALSE”,則輸出錯誤信息和錯誤嚴(yán)重程度的級別。在REPORT后面跟著的是設(shè)計者寫的字符串,通常是說明錯誤的原因,字符串要用雙引號括起來。SEVERITY后面跟著的是錯誤嚴(yán)重程度的級別,他們分別是:·NOTE(注意)·WARNING(警告)·ERROR(錯誤)·FAILURE(失?。┤鬜EPORT子句缺省,則默認(rèn)消息為“Assertionviolation”;若SEVERITY子句缺省,則出錯級別的默認(rèn)值為“ERROR”。12.斷言語句(Assert)12.斷言語句(Assert)54

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYrsffISPORT(s:INBIT;

r:INBIT;

q:OUTBIT;

qb:OUTBIT);ENDrsff;ARCHITECTURErtlOFrsffISBEGINPROCESS(s,r)VARIABLElast_state:BIT;例:RS觸發(fā)器的VHDL描述中斷言語句的使用例:RS觸發(fā)器的VHDL描述中斷言語句的使用55

BEGINASSERT(NOT(s=‘1’ANDr=‘1’))REPORT“Bothsandrequalto‘1’.”SEVERITYERROR;IF(s=‘0’ANDr=‘0’)THENlast_state:=last_state;ELSIF(s=‘0’ANDr=‘1’)THENlast_state:=0;ELSElast_state:=1;ENDIF;

q<=last_state;

qb<=not(last_state);ENDPROCESS;ENDrtl;BEGIN56

上例中,如果r和s都為‘1’時,表示一種不定狀態(tài)。在進(jìn)程中先是設(shè)定了一條斷言語句,目的是:當(dāng)判斷r和s都為‘1’時,輸出終端將顯示字符串“Bothsandrequalto‘1’.”,同時可能終止模擬過程,并顯示錯誤的嚴(yán)重程度。接下來用IF語句判別觸發(fā)器的其他三種情況,最后將值送到觸發(fā)器的兩個輸出端口上。上例中,如果r和s都為‘1’57

REPORT語句不增加硬件任何功能,但提供順序斷言語句的短格式,在仿真時使用REPORT語句可以提高程序的可讀性。REPORT語句的書寫格式為:REPORT輸出信息[SEVERITY出錯級別];例:RS觸發(fā)器的VHDL描述中REPORT語句的使用

(本例中,用REPORT語句代替上例進(jìn)程中的斷言語句。)13.REPORT語句13.REPORT語句58LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYrsffISPORT(s:INBIT;r:INBIT;q:OUTBIT;qb:OUTBIT);ENDrsff;ARCHITECTURErtlOFrsffISBEGINPROCESS(s,r)VARIABLElast_state:BIT;LIBRARYIEEE;59BEGINIF(s=‘1’ANDr=‘1’)THENREPORT“Bothsandrequalto‘1’.”;ELSIF(s=‘0’ANDr=‘0’)THENlast_state:=last_state;ELSIF(s=‘0’ANDr=‘1’)THENlast_state:=0;ELSElast_state:=1;ENDIF;q<=last_state;qb<=not(last_state);ENDPROCESS;ENDrtl;BEGIN60INDEX順序語句數(shù)據(jù)類型及運(yùn)算符并行語句其它語句INDEX順序語句數(shù)據(jù)類型及運(yùn)算符并行語句其它語句61在VHDL中,并行語句在結(jié)構(gòu)體中的執(zhí)行是同時并發(fā)執(zhí)行的,其書寫次序與其執(zhí)行順序并無關(guān)聯(lián),并行語句的執(zhí)行順序是由他們的觸發(fā)事件來決定的。我們知道,實(shí)際的硬件系統(tǒng)中很多操作都是并發(fā)的,因此在對系統(tǒng)進(jìn)行模擬時就要把這些并發(fā)性體現(xiàn)出來,并行語句正是用來表示這種并發(fā)行為的。在結(jié)構(gòu)體語句中,并行語句的位置是:ARCHITECTURE結(jié)構(gòu)體名OF實(shí)體名IS說明語句BEGIN

并行語句END結(jié)構(gòu)體名;VHDL并行語句

在VHDL中,并行語句在結(jié)構(gòu)體中的執(zhí)行是同時并發(fā)執(zhí)行的,其書62其中并行語句主要有以下幾種:·PROCESS--進(jìn)程語句·BLOCK--塊語句·CONCURRENTSIGNALASSIGNMENT--并行信號代入語句·CONDITIONALSIGNALASSIGNMENT--條件信號代入語句·SELECTIVESIGNALASSIGNMENT--選擇信號代入語句·CONCURRENTPROCEDURECALL--并行過程調(diào)用語句·ASSERT--并行斷言語句·GENERIC--參數(shù)傳遞語句·COMPONENT_INSTANT--元件例化語句·GENERATE--生成語句并行描述語句語句可以是結(jié)構(gòu)性的,也可以是行為性的。下面對這些語句的應(yīng)用加以介紹。其中并行語句主要有以下幾種:63進(jìn)程語句是最主要的并行語句,它在VHDL程序設(shè)計中使用頻率最高,也是最能體現(xiàn)硬件描述語言特點(diǎn)的一條語句。進(jìn)程語句的內(nèi)部是是順序語句,而進(jìn)程語句本身是一種并行語句。進(jìn)程語句的綜合是比較復(fù)雜的,主要涉及這樣一些問題:綜合后的進(jìn)程是用組合邏輯電路還是用時序邏輯電路來實(shí)現(xiàn)?進(jìn)程中的對象是否有必要用寄存器、觸發(fā)器、鎖存器或是RAM等存儲器件來實(shí)現(xiàn)。進(jìn)程語句結(jié)構(gòu)中至少需要一個敏感信號量,否則除了初始化階段,進(jìn)程永遠(yuǎn)不會被再次激活。這個敏感量一般是一個同步控制信號,同步控制信號用在同步語句中,同步語句可以是敏感信號表、WAITUNTIL語句或是WAITON語句。一般來說,只有一個同步點(diǎn)或者是具有多個同步點(diǎn)但都使用完全相同的同步控制信號的進(jìn)程不需要“記憶”在哪一個同步點(diǎn)上被掛起時,不會形成存儲器。如下例所示:

1.進(jìn)程語句(PROCESS)1.進(jìn)程語句(PROCESS)64--綜合后不需要存儲器的VHDL進(jìn)程label1:PROCESS(a,b,c)┇BEGIN┇

--其中沒有其他同步描述ANDPROCESSlabel1;--綜合后需要存儲器的VHDL進(jìn)程label2:PROCESS┇BEGINWAITUNTILclk’EVENTANDclk=‘1’;s<=‘0’;WAITUNTILclk’EVENTANDclk=‘1’;s<=‘1’;ANDPROCESSlabel2;

--綜合后不需要存儲器的VHDL進(jìn)程65

--不會形成存儲器的變量label3:PROCESS(a,b,c)VARIABLEvar:BIT;BEGIN

var

:=

aXORb;

s<=

varANDc;ANDPROCESSlabel3;--需要存儲器的變量label4:PROCESSTYPEstate_tableIS(stop,go);VARIABLEstate:table_state;BEGINWAITUNTILclk’EVENTANDclk=‘1’;--不會形成存儲器的變量66

CASEstateIS--state在賦值之前先被讀訪問WHENstop=>state:=go;WHENgo=>state:=stop;--這兩個語句是并發(fā)關(guān)系ENDCASE;ANDPROCESSlabel4;--綜合為觸發(fā)器的進(jìn)程label5:PROCESSBEGINWAITUNTILclk’EVENTANDclk=‘1’;q<=d;ENDPROCESSlabel5;CASEstateIS672.塊語句(BLOCK)塊(BLOCK)語句可以看作是結(jié)構(gòu)體中的子模塊,塊語句把許多并行語句組合在一起形成一個子模塊,而它本身也是一個并行語句。塊語句的基本結(jié)構(gòu)如下:[塊標(biāo)號:]BLOCK[保護(hù)表達(dá)式][類屬子句[類屬接口表;]];[端口子句[端口接口表;]];[塊說明部分]BEGIN<并行語句1><并行語句2>┇ENDBLOCK[塊標(biāo)號];

2.塊語句(BLOCK)68

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYaddISPORT(A:INSTD_LOGIC;B:INSTD_LOGIC;Cin:INSTD_LOGIC;Co:OUTSTD_LOGIC;S:OUTSTD_LOGIC);ENDadd;ARCHITECTUREdataflowOFaddISBEGIN例:利用塊語句描述的全加器LIBRARYIEEE;例:利用塊語69

ex:BLOCKPORT(a_A:INSTD_LOGIC;a_B:INSTD_LOGIC;a_Cin:INSTD_LOGIC;a_Co:OUTSTD_LOGIC;a_S:OUTSTD_LOGIC);PORTMAP(a_A=>A,a_B=>B,a_Cin=>Cin,a_Co=>Co,a_S=>S);SIGNALtmp1,tmp2:STD_LOGIC;BEGIN

label1:PROCESS(a_A,a_B)BEGINtmp1<=a_AXORa_B;ENDPROCESSlabel1;ex:BLOCK70

label2:PROCESS(tmp1,a_Cin)BEGINtmp2<=tmp1ANDa_Cin;ENDPROCESSlabel2;label3:PROCESS(tmp1,a_Cin)BEGINa_S<=tmp1XORa_Cin;ENDPROCESSlabel3;label4:PROCESS(a_A,a_B,tmp2)BEGINa_Co<=tmp2OR(a_AANDa_B);ENDPROCESSlabel4;ENDBLOCK

ex;ENDdataflow;label2:PROCESS(tmp1,71

在上面的例子中,結(jié)構(gòu)體內(nèi)含有4個進(jìn)程語句,這4個進(jìn)程語句是并行關(guān)系,共同形成了一個塊語句。在實(shí)際應(yīng)用中,一個塊語句中又可以包含多個子塊語句,這樣循環(huán)嵌套以形成一個大規(guī)模的硬件電路。

在上面的例子中,結(jié)構(gòu)體內(nèi)含有4個進(jìn)程語句,這472信號代入語句有兩種:一種是在結(jié)構(gòu)體中的進(jìn)程內(nèi)使用,此時它作為一種順序語句出現(xiàn);另一種是在結(jié)構(gòu)體的進(jìn)程之外使用,此時它是一種并行語句,因此稱之為并行信號代入語句。并行信號代入語句的語法格式為:

信號量<=敏感信號量表達(dá)式;需要注意的是,一條信號代入語句與一個信號代入的進(jìn)程語句是等價的,我們可以把一條信號代入語句改寫成一個信號代入的進(jìn)程語句。3.并行信號代入語句3.并行信號代入語句73例:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYand_gatISPORT(a:INSTD_LOGIC;b:INSTD_LOGIC;y:OUTSTD_LOGIC);ENDand_gat;ARCHITECTUREbehaveOFand_gatISBEGINy<=aANDb;--并行信號代入語句(在結(jié)構(gòu)體進(jìn)程之外)ANDbehave;本例是一個2輸入與門的VHDL描述,在結(jié)構(gòu)體中使用了并行信號代入語句。下面是2輸入與門的另一種VHDL描述,在描述的結(jié)構(gòu)體中采用了與上述并行信號代入語句等價的進(jìn)程語句。

例:74例:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYand_gatISPORT(a:INSTD_LOGIC;b:INSTD_LOGIC;y:OUTSTD_LOGIC);ENDand_gat;ARCHITECTUREbehaveOFand_gatISBEGIN

PROCESS(a,b)BEGINy<=aANDb;--進(jìn)程語句(順序語句)ANDPROCESS;ANDbehave;例:75

通過對上述兩個例子的分析可見:從并行信號代入語句描述來看,當(dāng)代入符號“<=”右邊的值發(fā)生任何變化時,信號代入語句的操作立即執(zhí)行,將信號代入符號“<=”右邊的表達(dá)式代入給左邊的信號量;從進(jìn)程語句的描述來看,當(dāng)進(jìn)程敏感信號表中的敏感信號量發(fā)生變化時,進(jìn)程將被啟動,順序信號代入語句將被執(zhí)行以完成信號的代入操作。在VHDL中提供了三種并行信號代入語句:·并發(fā)信號代入語句·條件信號代入語句·選擇信號代入語句

通過對上述兩個例子的分析可見:從并行信號代入語句描述76信號代入語句在進(jìn)程內(nèi)部執(zhí)行時,它是一種順序語句;信號代入語句在結(jié)構(gòu)體的進(jìn)程之外出現(xiàn)時,它作為并發(fā)語句的形式出現(xiàn)。作為并發(fā)信號代入語句,在結(jié)構(gòu)體中他們是并行執(zhí)行的,他們的執(zhí)行順序與書寫無關(guān)。并發(fā)信號代入語句是靠事件驅(qū)動的。對于并發(fā)信號代入語句來說,只有代入符號“<=”右邊的對象有事件發(fā)生時才會執(zhí)行該語句。在實(shí)際設(shè)計中,并發(fā)信號代入語句常用來進(jìn)行加法器、乘法器、除法器和比較器等多種邏輯電路的描述。下面是一個用VHDL并發(fā)語句描述的全加器的例子。①.并發(fā)信號代入語句①.并發(fā)信號代入語句77例:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYaddISPORT(A:INSTD_LOGIC;B:INSTD_LOGIC;Cin:INSTD_LOGIC;Co:OUTSTD_LOGIC;S:OUTSTD_LOGIC);ENDadd;ARCHITECTUREdataflowOFaddISSIGNALtmp1,tmp2:STD_LOGIC;例:78BEGINtmp1<=AXORB;tmp2<=tmp1ANDCin;--4條并發(fā)信號代入語句S<=tmp1XORCin;Co<=tmp2OR(AANDB);ANDdataflow;在上例的結(jié)構(gòu)體中有4條并發(fā)信號代入語句,他們的執(zhí)行順序與書寫順序是無關(guān)的,因此上面的4條并發(fā)信號代入語句可以任意顛倒書寫順序,不會對執(zhí)行結(jié)果產(chǎn)生任何影響。上面提到的并發(fā)信號代入語句是事件驅(qū)動的,例如:

tmp2<=tmp1ANDCin;S<=tmp1XORCin;兩條語句,只要tmp1和Cin中的值有一個發(fā)生變化,即有事件發(fā)生,那么這兩條語句就會立即并發(fā)執(zhí)行。

BEGIN在上例的結(jié)構(gòu)體中有4條并發(fā)信號代入語句,他們的執(zhí)行79②.條件信號代入語句條件信號代入語句也是一種并發(fā)描述語句,它是一種根據(jù)不同條件將不同的表達(dá)式代入目的信號的語句。條件信號代入語句的書寫格式為:目的信號<=表達(dá)式1WHEN條件1ELSE表達(dá)式2WHEN條件2ELSE┇表達(dá)式n-1WHEN條件ELSE表達(dá)式;條件信號代入語句執(zhí)行時要先進(jìn)行條件判斷,如果條件滿足,就將條件前面的那個表達(dá)式的值代入目的信號;如果不滿足條件,就去判斷下一個條件;最后一個表達(dá)式?jīng)]有條件,也就是說在前面的條件都不滿足時,就將該表達(dá)式的值代入目的信號。②.條件信號代入語句80下面的例子是用條件信號代入語句來描述的七段顯示譯碼器例:采用條件代入語句描述的七段顯示譯碼器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYse7ISPORT(input:INSTD_LOGIC_VECTOR(3DOWNTO0);output:OUTSTD_LOGIC_VECTOR(6DOWNTO0));ENDse7;ARCHITECTURErtlOFse7ISBEGINoutput<=(‘0’,‘1’,‘1’,‘1’,‘1’,‘1’,‘1’)WHENinput=“0000”ELSE(‘0’,‘0’,‘0’,‘0’,‘1’,‘1’,‘0’)WHENinput=“0001”ELSE(‘1’,‘0’,‘1’,‘1’,‘0’,‘1’,‘1’)WHENinput=“0010”ELSE下面的例子是用條件信號代入語句來描述的七段顯示譯碼器81

(‘1’,‘0’,‘0’,‘1’,‘1’,‘1’,‘1’)WHENinput=“0011”ELSE(‘1’,‘1’,‘0’,‘0’,‘1’,‘1’,‘0’)WHENinput=“0100”ELSE(‘1’,‘1’,‘0’,‘1’,‘1’,‘0’,‘1’)WHENinput=“0101”ELSE(‘1’,‘1’,‘1’,‘1’,‘1’,‘0’,‘1’)WHENinput=“0110”ELSE(‘0’,‘0’,‘0’,‘0’,‘1’,‘1’,‘1’)WHENinput=“0111”ELSE(‘1’,‘1’,‘1’,‘1’,‘1’,‘1’,‘1’)WHENinput=“1000”ELSE(‘1’,‘1’,‘0’,‘1’,‘1’,‘1’,‘1’)WHENinput=“1001”ELSE(‘1’,‘1’,‘1’,‘0’,‘1’,‘1’,‘1’)WHENinput=“1010”ELSE(‘1’,‘1’,‘1’,‘1’,‘1’,‘0’,‘0’)WHENinput=“1011”ELSE(‘0’,‘1’,‘1’,‘1’,‘0’,‘0’,‘1’)WHENinput=“1100”ELSE(‘1’,‘0’,‘1’,‘1’,‘1’,‘1’,‘0’)WHENinput=“1101”ELSE(‘1’,‘1’,‘1’,‘1’,‘0’,‘0’,‘1’)WHENinput=“1110”ELSE(‘1’,‘1’,‘1’,‘0’,‘0’,‘0’,‘1’)WHENinput=“1111”ELSE(‘0’,‘0’,‘0’,‘0’,‘0’,‘0’,‘0’);--滅燈ENDrtl;(‘1’,‘0’,‘0’,‘1’,‘1’,‘182

在上例中,七段顯示譯碼器有一個輸入端口input和一個輸出端口output。輸入端口input是一個四位總線,表示3到0的四位邏輯向量,表示輸入是一個四位二進(jìn)制數(shù)。輸出端口output也以總線形式表示,它表示6到0的7位邏輯向量,表示輸出是一個七位二進(jìn)制數(shù),以驅(qū)動共陰極顯示七段數(shù)碼管。在上例的結(jié)構(gòu)體中,用一個條件代入語句來完成所有狀態(tài)的顯示譯碼。在保留字WHEN的前面是驅(qū)動顯示數(shù)碼管的七位位矢量,WHEN的后面是譯碼的條件。需要說明的是條件信號代入語句中的書寫順序不是固定的,位置是可以任意顛倒的,他們并不表示執(zhí)行的先后順序,實(shí)際上他們是并發(fā)執(zhí)行的。

在上例中,七段顯示譯碼器有一個輸入端口input和83③.選擇信號代入語句選擇信號代入語句的書寫格式為:WITH表達(dá)式SELECT目的信號<=表達(dá)式1WHEN條件1;表達(dá)式2WHEN條件2;表達(dá)式3WHEN條件3;┇表達(dá)式nWHEN條件n;VHDL在執(zhí)行選擇信號代入語句時,目的信號是根據(jù)表達(dá)式的當(dāng)前值來進(jìn)行表達(dá)式代入的。當(dāng)表達(dá)式的值符合某個條件時,就把該條件前的表達(dá)式代入目的信號;當(dāng)表達(dá)式的值不符合條件時,語句就繼續(xù)向下判斷,直到找到滿足的條件為止。選擇信號代入語句與case語句相類似,都是對表達(dá)式進(jìn)行測試,當(dāng)表達(dá)式的值不同時,將把不同的表達(dá)式代入目的信號。需要注意的是,選擇信號代入語句與case語句一樣,必須把表達(dá)式的值在條件中都列出來,否則編譯將會出錯。

③.選擇信號代入語句84下面的例子是一個采用選擇信號代入語句描述的選通8位總線的四選一多路選擇器。例:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux4ISPORT(d0:INSTD_LOGIC_VECTOR(7DOWNTO0);d1:INSTD_LOGIC_VECTOR(7DOWNTO0);d2:INSTD_LOGIC_VECTOR(7DOWNTO0);d3:INSTD_LOGIC_VECTOR(7DOWNTO0);s0:INSTD_LOGIC;s1:INSTD_LOGIC;q:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDmux4;下面的例子是一個采用選擇信號代入語句描述的選通8位總線的四選85ARCHITECTURErtlOFmux4ISSIGNALcomb:STD_LOGIC_VECTOR(1DOWNTO0);;BEGIN

comb

<=

s1&s0;WITHcomb

SELECT--用comb進(jìn)行選擇q<=d0WHEN“00”;d1WHEN“01”;d2WHEN“10”d3WHENOTHERS;--上面4條語句是并行執(zhí)行的ENDrtl;ARCHITECTURErtlOFmux4IS86

過程調(diào)用語句在進(jìn)程內(nèi)部執(zhí)行時,它是一種順序語句;過程調(diào)用語句在結(jié)構(gòu)體的進(jìn)程之外出現(xiàn)時,它作為并發(fā)語句的形式出現(xiàn)。作為并行過程調(diào)用語句,在結(jié)構(gòu)體中他們是并行執(zhí)行的,其執(zhí)行順序與書寫順序無關(guān)。并行過程調(diào)用語句的一般書寫格式如下:

PROCEDURE過程名(參數(shù)1;參數(shù)2;┄)IS[定義語句];--變量定義BEGIN[順序處理語句]END過程名;

4.并行過程調(diào)用語句4.并行過程調(diào)用語句87下例是一個取三個輸入位矢量最大值的功能描述,在它的結(jié)構(gòu)體中使用了兩個并行過程調(diào)用語句。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYmaxISPORT(in1:INSTD_LOGIC_VECTOR(7DOWNTO0);in2:INSTD_LOGIC_VECTOR(7DOWNTO0);in3:INSTD_LOGIC_VECTOR(7DOWNTO0);q:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDmax;ARCHITECTURErtlOFmaxIS

下例是一個取三個輸入位矢量最大值的功能描述,在它的結(jié)構(gòu)體中使88PROCEDUREmaximun(a,b:INSTD_LOGIC_VECTOR;SIGNALc:OUTST

溫馨提示

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

最新文檔

評論

0/150

提交評論