VHDL基本描述語句_第1頁
VHDL基本描述語句_第2頁
VHDL基本描述語句_第3頁
VHDL基本描述語句_第4頁
VHDL基本描述語句_第5頁
已閱讀5頁,還剩88頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第3章VHDL基本描述語句主要內容:1、順序語句

2、并行語句

重點內容:順序語句和并行語句1第3章VHDL基本描述語句順序語句就是在語句的執行過程中,語句的執行順序是按照語句的書寫順序一個語句一個語句地執行的。順序語句只能出現在進程、過程和函數中,用以定義在進程、過程和函數中所執行的算法。并發語句是并行執行的。例如進程語句,在一個結構體中的各進程語句是并發執行的。23.1VHDL中的順序描述語句賦值語句Wait語句If語句Case語句Loop語句Next語句Null語句斷言語句過程調用語句33.1.1信號代入語句和變量賦值語句信號代入語句的書寫格式:

目標信號<=表達式;該語句表示將代入符號“<=”右邊表達式的值賦給左的目標信號,注意代入符號兩邊的信號和表達式的數據型和長度必須保持一致。變量只能在VHDL源代碼的順序部分進行說明和使用,只能出現在進程、過程和函數內。變量賦值語句的書寫格式:

目標變量:=表達式;

43.1.2Wait語句在VHDL源代碼中的進程總是處于兩種狀態:執行和掛起。Wait語句可以控制進程的執行或掛起。當進程執行到wait語句時將被掛起,并等待wait語句條件滿足時進程再次被執行。有4種不同的方法來描述一個wait語句。

wait——無限等待

waiton——敏感信號量變化

waituntil——條件滿足

waitfor——時間到51.WAIT(無限等待語句)

這種形式的WAIT語句在關鍵字“WAIT”后面不帶任何信息,是無限等待的情況。2.WAITON信號表(敏感信號等待語句)第3章VHDL基本描述語句waiton語句的完整書寫格式:

waiton敏感信號[,敏感信號];

waiton語句使進程掛起,直到敏感信號表中的某個信號發生了變化才能夠把進程激活。6例[A]PROCESSBEGINy<=aANDb;WAITONa,b;ENDPROCESS;例[B]PROCESS(a,b)BEGINy<=aANDb;

ENDPROCESS;

①在使用WAITON語句的進程中,敏感信號量應寫在進程中的WAITON語句后面;②在不使用WAITON語句的進程中,敏感信號量應在開頭的關鍵詞PROCESS后面的敏感信號表中列出。

③VHDL規定,已列出敏感信號表的進程不能使用任何形式的WAIT語句。

第3章VHDL基本描述語句3.1.2Wait語句7例:異步復位的D觸發器Libraryieee;Useieee.std_logic_1164.all;Entityreset_dff1isport(clk,reset:instd_logic;d:instd_logic;q:outstd_logic);Endentityreset_dff1;Architecturertlofreset_dff1isBegin

ProcessBeginif(reset=‘1’)thenq<=‘0’;elsif(clk’eventandclk=‘1’)thenq<=d;endif;

waitonclk,reset;

endprocess;Endrtl;3.1.2Wait語句process(reset,clk)Beginif(reset=‘1’)thenq<=‘0’;elsif(clk’eventandclk=‘1’)thenq<=d;endif;83.WAITUNTIL條件(條件等待語句)WAITUNTIL語句需滿足以下條件:①在條件表達式中所含的信號發生了變化;②此信號改變后,且滿足WAITUNTIL語句中表達式的條件。這兩個條件缺一不可,且必須按照上述順序來完成。第3章VHDL基本描述語句3.1.2Wait語句waituntil語句的完整書寫格式:

waituntil條件表達式;waituntil語句將使進程掛起,直到該條件表達式返回一個為“true”的值,進程才能夠再次被啟動。當表達式中任何一個信號有事件發生時,就會立即對該表達式進行計算。9WAITUNTIL語句有以下三種表達方式:

WAITUNTIL信號=VALUE;

WAITUNTIL信號’EVENTAND信號=VALUE;

WAITUNTIL信號’STABLEAND信號=VALUE;例如:

WAITUNTILclock=“1”;

WAITUNTILrising_edge(clk);

WAITUNTILclk=‘1’ANDclk’EVENT;

WAITUNTILNOTclk’STABLEANDclk=“1”;

一般的,在一個進程中使用了WAIT語句后,綜合器會綜合產生時序邏輯電路。時序邏輯電路的運行依賴WAITUNTIL表達式的條件,同時還具有數據存儲的功能。第3章VHDL基本描述語句10例:同步復位的D觸發器Libraryieee;Useieee.std_logic_1164.all;Entityreset_dff3isport(clk,reset:instd_logic;d:instd_logic;q:outstd_logic);Endentityreset_dff3;Architecturertlofreset_dff3isBegin

Process

Beginwaituntilclk’eventandclk=‘1’;if(reset=‘1’)thenq<=‘0’;elsethenq<=d;endif;

endprocess;Endrtl;3.1.2Wait語句114.WAITFOR時間表達式(超時等待語句)例[A]:WAITFOR40ns;

在該語句中,時間表達式為常數40ns,當進程執行到該語句時,將等待40ns,經過40ns之后,進程執行WAITFOR的后繼語句。例[B]:WAITFOR(a*(b+c));

在此語句中,(a*(b+c))為時間表達式,WAITFOR語句在執行時,首先計算表達式的值,然后將計算結果返回作為該語句的等待時間。

第3章VHDL基本描述語句125.多條件等待語句

Wait語句可以同時使用多個等待條件。在多條件等待語句的表達式中,至少應該有一個值包含信號。例:waitonabuntil(c’eventandc=‘1’)for10ns;第3章VHDL基本描述語句13If語句是在VHDL描述硬件電路的過程中使用最頻繁的語句。If語句的完整書寫格式:

if<條件>then<順序語句>;

[elsif<條件>then<順序語句>;][elsif<條件>then<順序語句>;]……[else<順序語句>;]endif;從if開始到endif結束,endif要分開寫條件是一個布爾表達式,返回值為布爾類型。當條件滿足時執行接下來的順序語句;當條件不滿足時就去執行接下來的順序語句elsif子句或else子句或結束if語句。根據if語句的完整書寫格式,If語句的三種常用形式。3.1.3IF語句143.1.3IF語句1、門閂控制語句IF<條件>THEN

<順序語句>;

ENDIF;

第3章VHDL基本描述語句15

當程序執行到這種門閂控制型IF語句時,首先判斷語句中所指定的條件是否成立。如果條件成立,則程序繼續執行IF語句中所含的順序處理語句;如果條件不成立,程序將跳過IF語句所包含的順序處理語句,而向下執行IF的后繼語句。

例:利用IF語句引入D觸發器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdffISPORT(clk,d:INSTD_LOGIC;

q:OUTSTD_LOGIC);ENDdff;ARCHITECTURErtlOFdffISBEGIN

PROCESS(clk)

BEGIN

IF(clk’EVENTANDclk=’1’)

THEN

q<=d;

ENDIF;

ENDPROCESS;END

rtl;第3章VHDL基本描述語句162、二選一控制語句

IF<條件>THEN

<順序語句>;

ELSE

<

順序語句>;

ENDIF;

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

第3章VHDL基本描述語句17例:二選一電路結構體的描述ARCHITECTURErtlOFmux2ISBEGINPROCESS(a,b,s)BEGIN

IF(s=’1’)THEN

c<=a;

ELSE

c<=b;

ENDIF;ENDPROCESS;END

rtl;

第3章VHDL基本描述語句183、多選擇控制語句IF<條件>THEN

<順序語句>;

ELSEIF

<順序語句>;ELSEIF

<順序語句>;ELSE

<順序語句>;ENDIF;

這種多選擇控制的IF語句,實際上就是條件嵌套。它設置了多個條件,當滿足所設置的多個條件之一時,就執行該條件后的順序處理語句。當所有設置的條件都不滿足時,程序執行ELSE和ENDIF之間的順序處理語句。第3章VHDL基本描述語句19例:利用多選控制語句設計的四選一多路選擇器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux4ISPORT(input:INSTD_LOGIC_VECTOR(3DOWNTO0);

sel:INSTD_LOGIC_VECTOR(1DOWNTO0);

y:OUTSTD_LOGIC);ENDmux4;第3章VHDL基本描述語句20ARCHITECTURErtlOFmux4ISBEGINPROCESS(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;第3章VHDL基本描述語句213.1.4CASE語句第3章VHDL基本描述語句Case語句完整書寫形式:

case<表達式>iswhen<選擇>=><順序語句>;

when<選擇>=><順序語句>;

……

whenothers=><順序語句>;

endcase;Case語句中如果表達式的值與某一個when語句的選擇值或與others值相匹配,則執行它們后面所跟的順序執行語句,執行完順序語句后將結束該case語句。Case語句中的所有條件必須被枚舉,不允許when語句后的選擇有相同的。When語句后面的選擇值必須是表達式的所有取值,不能遺漏。可以利用others來表示所有具有相同操作的選擇。Case語句中的when語句可以顛倒次序而不影響操作,但保留字others必須放在作后面。22當執行到CASE語句時,首先計算CASE和IS之間的表達式的值,然后根據條件語句中與之相同的選擇值,執行對應的順序語句,最后結束CASE語句。第3章VHDL基本描述語句在case語句中的“when<選擇>=><順序語句>;”有四種表示形式:

When值=><順序語句>;When值|值|…|值=><順序語句>;--表示并行關系

When值to值=><順序語句>;--表示范圍

Whenothers=><順序語句>;23CASE語句需要注意的幾點(1)CASE語句中每一條語句的選擇值只能出現一次,即不能有相同選擇值的條件語句出現。(2)CASE語句執行中必須選中,且只能選中所列條件語句中的一條,即CASE語句至少包含一個條件語句。(3)除非所有條件語句中的選擇值能完全覆蓋CASE語句中表達式的取值,否則最末一個條件語句中的選擇必須用“OTHERS”表示,它代表已給出的所有條件語句中未能列出的其他可能的取值。關鍵詞OTHERS只能出現一次,且只能作為最后一種條件取值。第3章VHDL基本描述語句24例:七段顯示譯碼器Libraryieee;Useieee.std_logic_1164.all;Entityse7isport(input:instd_logic_vector(3downto0);output:outstd_logic_vector(6downto0));Endse7;Architecturese7_arcofse7isBeginprocess(input)3.1.4CASE語句25

Begincaseinputiswhen“0000”=>output<=“0111111”;when“0001”=>output<=“0000110”;when“0010”=>output<=“1011011”;when“0011”=>output<=“1001111”;when“0100”=>output<=“1100110”;when“0101”=>output<=“1101101”;when“0110”=>output<=“1111101”;when“0111”=>output<=“0000111”;when“1000”=>output<=“1111111”;when“1001”=>output<=“1101111”;when“1010”=>output<=“1110111”;when“1011”=>output<=“1111100”;when“1100”=>output<=“0111001”;when“1101”=>output<=“1011110”;when“1110”=>output<=“1111001”;when“1111”=>output<=“1110001”;whenothers=>output<=“0000000”;endcase;endprocess;endse7_arc;3.1.4CASE語句例:七段顯示譯碼器Libraryieee;Useieee.std_logic_1164.all;Entityse7isport(input:instd_logic_vector(3downto0);output:outstd_logic_vector(6downto0));Endse7;Architecturese7_arcofse7isBeginprocess(input)26例3-8譯碼器

LIBRARYIEEE;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章VHDL基本描述語句27IF(g1=‘1’ANDg2a=‘0’ANDg2b=‘0’)THEN

CASEindataISWHEN“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;

ELSEy<=“11111111”;

ENDIF;

ENDPROCESS;

ENDrtl;第3章VHDL基本描述語句283.1.5LOOP語句

LOOP語句就是循環語句,它可以使包含的一組順序語句被循環執行,其執行的次數受迭代算法控制。在VHDL中常用來描述迭代電路的行為。第3章VHDL基本描述語句VHDL提供了兩種循環控制語句:

Forloop循環

Whileloop循環Forloop循環主要用于在規定重復數目的重復情況;whileloop循環將連續執行操作直到控制條件被判斷為“false”。29第3章VHDL基本描述語句1.forloop循環

Forloop循環的完整書寫格式為:

[循環標號:]for循環變量

in

離散范圍loop<順序處理語句>;

Endloop[循環標號];循環標號作為該forloop循環的標志符;循環變量的值在每次的循環中都將發生變化;循環變量每取一個值,就要執行一次循環體中的順序處理語句。離散范圍用來指定循環變量的取值范圍,循環變量的取值將從取值范圍最左邊的值開始并且遞增到取值范圍最右邊的值,實際上也是限定了循環的次數。離散范圍的值不一定指定為整數值,也可以是其他類型的。只是要保證數值是離散的就可以。30例:8位奇偶校驗電路LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYparity_checkISPORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);y:OUTSTD_LOGIC);ENDparity_check;第3章VHDL基本描述語句31BEGIN

tmp:=‘0’;

FORiIN0TO7LOOP

tmp:=tmpXORa(i);

ENDLOOP;

y<=tmp;

ENDPROCESS;ENDrtl;第3章VHDL基本描述語句ARCHITECTURErtlOFparity_checkISBEGIN

PROCESS(a)

VARIABLEtmp:STD_LOGIC

322.whileloop循環whileloop循環的完整書寫格式為:

[循環標號:]while<條件>loop<順序處理語句>;

endloop[循環標號];MAX+PlusII不支持whileloop語句。循環標號用來作為該whileloop循環語句的標志符;Whileloop循環語句當檢測到保留字while后面的條件滿足時才去執行順序處理語句。Whileloop循環語句在每次執行前都要先檢查條件,如檢查出條件為“true”就去執行循環體中的順序處理語句,執行完后返回該循環的開始,將再次檢查條件;如果條件為“false”將結束循環,去執行whileloop循環語句后面的其他語句。3.1.5LOOP語句33例:8位奇偶校驗電路的WHILE_LOOP設計形式

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYparity_checkISPORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);

y:OUTSTD_LOGIC);ENDparity_check;ARCHITECTUREbehavOFparity_checkISBEGINPROCESS(a)

VARIABLEtmp:STD_LOGIC第3章VHDL基本描述語句34BEGIN

tmp:=‘0’;

i:=0;

WHILE(i<8)LOOP

tmp:=tmpXORa(i);

i:=i+1;

ENDLOOP;

y<=tmp;

ENDPROCESS;ENDbehav;第3章VHDL基本描述語句在該LOOP語句中,沒有給出循環次數的范圍,而是給出了循環執行順序語句的條件;沒有自動遞增循環變量的功能,而是在順序處理語句中增加了一條循環次數計算語句,用于循環語句的控制。

循環控制條件為布爾表達式,當條件為“真”時,則進行循環,如果條件為“假”,則結束循環。ARCHITECTUREbehavOFparity_checkISBEGIN

PROCESS(a)

VARIABLEtmp:STD_LOGIC353.1.6next語句VHDL提供了兩種跳出循環的操作,一種是跳出本次循環的next語句,另一種是跳出整個循環的exit語句。Next語句用在loop循環語句的內部,它可以有條件或者是無條件地結束當前此次循環并開始下一次的循環。next語句的完整書寫格式為:

next[循環標號][when條件];“循環標號”表明了結束本次循環后下一次循環的起始位置。“when條件”則表明了跳出本次循環的條件。當“循環標號”和“when條件”省略后則表明只要執行到該next語句就立即無條件地跳出本次循環,回到本loop循環語句地起始位置進行下一次循環。36例:NEXT語句應用舉例┇WHILEdata>1LOOPdata:=data+1;NEXTWHENdata=3data:=data*data;ENDLOOP;N1:FORiIN10DOWNTO1LOOPN2:FORjIN0TOiLOOPNEXTN1WHENi=j;

matrix(i,j):=j*i+1;

ENDLOOPN2;ENDLOOPN1;第3章VHDL基本描述語句37第3章VHDL基本描述語句VHDL提供了exit語句,允許設計人員從目前正在執行的循環中跳出。Exit語句的完整書寫格式:

exit[循環標號][when條件];“循環標號”表明了要終止的loop循環標號。“when條件”則表明了終止本循環的條件。當“循環標號”和“when條件”省略后則表明只要執行到該exit語句就立即無條件地跳出本循環,繼續執行loop循環語句后面的其他語句。3.1.7exit語句38Exit語句有三種基本的書寫格式:一種是沒有“循環標志”或“when條件”的書寫格式。執行該語句時只從當前所屬的loop循環語句中跳出。一種是帶有“循環標號”的書寫格式。當執行該語句時,將終止循環標號所指示的循環的執行。一種是帶有“when條件”的書寫格式。當執行到該語句時,只有當條件為真時才會終止循環標號所指示的循環的執行或跳出當前所屬的loop循環。第3章VHDL基本描述語句3.1.7exit語句39例:兩個元素位矢量a、b進行比較,當發現a與b不同時,跳出循環比較程序并報告比較結果。SIGNALa,b:STD_LOGIC_VECTOR(0TO1);SIGNALa_less_than_b:BOOLEAN;┇a_less_than_b<=FALSE;FORiIN1TO0LOOPIF(a(i)=‘1’ANDb(i)=‘0’)THENa_less_than_b<=FALSE;EXIT;ELSEIF(a(i)=‘0’ANDb(i)=‘1’)THENa_less_than_b<=TRUE;EXIT;ELSENULLENDIF;ENDLOOP;第3章VHDL基本描述語句403.1.8斷言語句斷言語句可以對VHDL描述中的模型添加限制條件,為設計人員報告一條文本的字符串。斷言語句的書寫格式:

assert<條件>report<輸出信息>severity<出錯級別>;在執行過程中,斷言語句首先檢查條件的布爾表達式的真假。如果布爾表達式為“true”,則向下執行另外一條語句。如果布爾表達式為“false”,斷言語句將輸出一條設計人員規定的字符串到標準輸出終端,并給出輸出字符串的出錯級別。第3章VHDL基本描述語句41

3.1.9、REPORT語句

REPORT語句不增加硬件任何功能,但提供順序斷言語句的短格式,在仿真時使用REPORT語句可以提高程序的可讀性。REPORT語句的書寫格式為:REPORT輸出信息[SEVERITY出錯級別];第3章VHDL基本描述語句42return語句Return語句只能用在函數和過程體中,主要用來結束當前的最內層的函數或者是過程體的執行。在過程體中return語句不能有表達式;而函數體中的return語句必須有一個表達式,它也是結束函數體執行的唯一條件。Return語句的書寫格式如下:

return[表達式];null語句Null語句表示一種只占位置的空操作,它不進行任何動作,執行該語句只是使源代碼去執行下一個語句。Null語句的書寫格式如下:

null;例:casetmpiswhen0=>q<=d0;when1=>q<=d1;when2=>q<=d2;when3=>q<=d3;whenothers=>null;第3章VHDL基本描述語句433.2并行語句

在VHDL中,并行語句在結構體中的執行是同時并發執行的,其書寫次序與其執行順序并無關聯,并行語句的執行順序是由他們的觸發事件來決定的。第3章VHDL基本描述語句進程語句塊語句并行信號代入并行斷言語句并行過程調用語句參數傳遞語句元件例化語句生成語句并行語句的種類:44第3章VHDL基本描述語句3.2.1并行信號代入語句信號代入語句有兩種:在結構體中的進程內使用,作為一種順序語句;在結構體中的進程之外使用,是一種并行語句,稱之為并行信號代入語句。注意:一條信號代入語句和一個信號代入的進程語句是等價的。45第3章VHDL基本描述語句3.2.1并行信號代入語句例:2輸入與門Libraryieee;Useieee.std_logic_1164.all;entityand_gateisport(a:instd_logic;b:instd_logic;y:outstd_logic);endand_gate;architecturebehaveofand_gateisbegin

y<=aandb;endbehave;Begin

process(a,b)beginy<=aandb;endprocess;Endbehave;等價于并行信號代入語句46第3章VHDL基本描述語句3.2.1并行信號代入語句信號代入語句有兩種:在結構體中的進程內使用,作為一種順序語句;在結構體中的進程之外使用,是一種并行語句,稱之為并行信號代入語句。注意:一條信號代入語句和一個信號代入的進程語句是等價的。47第3章VHDL基本描述語句3.2.1并行信號代入語句在VHDL中提供了三種并行信號代入語句:

?并發信號代入語句

?條件信號代入語句

?選擇信號代入語句481.并發信號代入語句信號代入語句在結構體的進程外出現時,它作為并發語句的形式出現。并發信號代入語句在結構體中是并行執行的,它們的執行順序與書寫順序無關。并發信號代入語句是靠時間驅動的,只有代入符號“<=”右邊的對象有事件發生時才會執行該語句。常用來進行加法器、乘法器、除法器和比較器等許多邏輯電路的描述。3.2.1并行信號代入語句第3章VHDL基本描述語句49Libraryieee;Useieee.std_logic_1164.all;

entityadd_1isport(A:instd_logic;B:instd_logic;Cin:instd_logic;Co:outstd_logic;S:outstd_logic);endadd_1;architecturedataflowofadd_1issignaltmp1,tmp2:std_logic;Begin

tmp1<=AxorB;tmp2<=tmp1andCin;S<=tmp1xorCin;Co<=tmp2or(AandB);enddataflow;并發信號代入語句3.2.1并行信號代入語句50條件信號代入語句也是一種并發描述語句,是根據不同的表達式代入目的信號的語句書寫格式:

<目的信號><=<表達式1>when<條件1>else<表達式2>when<條件2>else<表達式3>when<條件3>else……<表達式n-1>when<條件>else<表達式n>;功能說明:當VHDL源代碼執行到該語句時要先進行條件判斷,如果條件滿足,就將條件前面的那個表達式的值代入目的信號;如果條件不滿足,就去判斷下一個條件;最后一個表達式沒有條件,也就是說在前面條件都不滿足時,就將該表達式的值代入目的信號。3.2.1并行信號代入語句

2.條件信號代入語句51例:采用條件代入語句描述的七段顯示譯碼器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYse7ISPORT(input:INSTD_LOGIC_VECTOR(3DOWNTO0);output:OUTSTD_LOGIC_VECTOR(6DOWNTO0));ENDse7;第3章VHDL基本描述語句52第3章VHDL基本描述語句Architecturertlofse7isBegin

output<="0111111"wheninput="0000"else"0000110"wheninput="0001"else"1011011"wheninput="0010"else"1001111"wheninput="0011"else

"1100110"wheninput="0100"else

"1101101"wheninput="0101"else

"1111101"wheninput="0110"else"0000111"wheninput="0111"else"1111111"wheninput="1000"else

"1101111"wheninput="1001"else"1110111"wheninput="1010"else"1111100"wheninput="1011"else

"1011110"wheninput="1101"else

"1111001"wheninput="1110"else"1110001"wheninput="1111"else

"0111001"wheninput="1100"else"0000000";Endrtl;在七段數碼管結構體中,用一個條件代入語句來完成所有狀態的顯示譯碼。在保留字WHEN的前面是驅動顯示數碼管的七位位矢量;在保留字WHEN的后面是譯碼的條件。53第3章VHDL基本描述語句條件信號代入語句與if語句的區別:(1)If語句是順序語句,只能在進程中使用;條件信號代入語句是并行語句,必須用在進程之外。(2)If語句中else是可有可無的;條件信號代入語句中的else語句是必須有的。(3)If語句能嵌套使用;條件信號代入語句不能嵌套,不能生成鎖存器。(4)使用if語句來描述不需要太多硬件知識;使用條件信號代入語句則要求設計人員具有較多的硬件電路的知識。2.條件信號代入語句543.選擇信號代入語句第3章VHDL基本描述語句選擇信號代入語句的書寫格式:With<表達式>select<目的信號><=<表達式1>when<條件1>,

<表達式2>when<條件2>,

<表達式3>when<條件3>,

……<表達式n>when<條件n>;功能說明:當VHDL源代碼執行到該語句時,目的信號根據表達式的當前值來進行表達式代入。當表達式的值符合某個條件時,就將條件前的信號代入目的信號;如果條件不符合,語句繼續向下判斷,直到找到滿足的條件為止。選擇信號代入語句與case語句一樣,必須把表達式的值在條件中都列出來。55LIBRARYIEEE;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;第3章VHDL基本描述語句例:四選一8位總線選擇器56ARCHITECTURErtlOFmux4ISSIGNALcomb:STD_LOGIC_VECTOR(1DOWNTO0);;BEGIN

comb<=s1&s0;

WITH

combSELECT

q<=d0WHEN“00”;

d1WHEN“01”;

d2WHEN“10”d3WHENOTHERS;ENDrtl;第3章VHDL基本描述語句例:四選一8位總線選擇器573.2.2并行斷言語句并行斷言語句和順序斷言語句書寫格式一致、功能一致。并行斷言語句用在結構體中,順序斷言語句只能用在進程、函數和過程中。任何并行斷言語句都對應著一個等價的被動進程語句,被動進程語句沒有輸出,并行斷言語句的執行將不會引起任何事件的發生,只是在斷言條件為“false”時給出一條信息報告。58例: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:instd_logic_vector(7downto0));Endmax;Architecturebehaveofexampleissignalcomb:std_logic_vector(1downto0);Beginassertfalse;report“Thisentityisaexampletodescriptassertstatement”severitynote;Endbehave;

3.2.2并行斷言語句593.2.4并行過程調用語句過程調用語句在進程內執行時,它是一種順序語句;過程調用語句在結構體中的進程之外執行時,它作為并發語句的形式出現。作為并行過程調用語句,在結構體中它們是并行執行的,執行順序與書寫順序無關。60例:求最大值libraryieee;useieee.std_logic_1164.all;entitymaxisport(in1:instd_logic_vector(7downto0);in2:instd_logic_vector(7downto0);in3:instd_logic_vector(7downto0);q:outstd_logic_vector(7downto0));endmax;architecturertlofmaxis3.2.4并行過程調用語句61ARCHITECTURErtlOFmaxIS

PROCEDURE

maximun(a,b:INSTD_LOGIC_VECTOR;

SIGNALc:OUTSTD_LOGIC_VECTOR)IS

VARIABLEtemp:STD_LOGIC_VECTOR(a’RANGE);

BEGIN

IF(a>b)THENtemp:=a;

ELSE

temp

:=b;

ENDIF;

c<=temp;

END

maximun;

SIGNALtmp1,tmp2:STD_LOGIC_VECTOR(7DOWNTO0);

BEGINmaximun(in1,in2,tmp1);

maximun(tmp1,in3,tmp2);

q<=tmp2;ENDrtl;3.2.4并行過程調用語句62

塊(BLOCK)語句可以看作是結構體中的子模塊,塊語句把許多并行語句組合在一起形成一個子模塊,而它本身也是一個并行語句。1、基本結構

[塊標號:]BLOCK[保護表達式][類屬子句[類屬接口表;]];

[端口子句[端口接口表;]];

[塊說明部分]BEGIN<并行語句1><并行語句2>┇ENDBLOCK[塊標號];第3章VHDL基本描述語句

3.2.5塊語句63例:利用塊語句描述的全加器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYaddISPORT(A:INSTD_LOGIC;

B:INSTD_LOGIC;

Cin:INSTD_LOGIC;

Co:OUTSTD_LOGIC;

S:OUTSTD_LOGIC);ENDadd;第3章VHDL基本描述語句64ARCHITECTUREdataflowOFaddISBEGINex: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;第3章VHDL基本描述語句65BEGINlabel1:PROCESS(a_A,a_B)BEGINtmp1<=a_AXORa_B;ENDPROCESSlabel1;

label2:PROCESS(tmp1,a_Cin)

BEGINtmp2<=tmp1ANDa_Cin

ENDPROCESSlabel2;

label3:PROCESS(tmp1,a_Cin)

BEGINa_S<=tmp1XORa_Cin

ENDPROCESSlabel3;第3章VHDL基本描述語句66

label4:PROCESS(a_A,a_B,tmp2)BEGINa_Co<=tmp2OR(a_AANDa_B);ENDPROCESSlabel4;ENDBLOCKex;ENDdataflow;

在上面的例子中,結構體內含有4個進程語句,這4個進程語句是并行關系,共同形成了一個塊語句。第3章VHDL基本描述語句672、模塊間的信號傳遞和端口映射在編寫VHDL程序時,會遇到塊內的信號或參數要傳遞到塊外去,塊外的信號或參數要傳遞到塊內去的情況。解決以上問題的辦法是合理使用PORT和PORTMAP語句。

PORT和PORTMAP語句可以作為塊頭的定義語句,可以用來擴展或增加塊的功能。例:LIBRARYieee;USEieee.std_logic_1164.all;PACKAGEmathISTYPEtw32ISARRAY(31DOWNTO0)OFstd_logicFUNCTIONtw_add(a,b:tw32)RETURNtw32;FUNCTIONtw_sub(a,b:tw32)RETURNtw32;

第3章VHDL基本描述語句68ENDmath;USEwork.math.all;ENTITYcpuIS

PORT(clk,interrupt:INstd_logic;add:OUTtw32;

comt:ININTEGER;data:INOUTtw32);ENDcpu;ARCHITECTUREcpu_blkOFcpuISSIGNALaddr_bus,data_bus:tw32;BEGINALU:BLOCK

PORT(a_bus,b_bus:INtw32;

c_bus:ININTEGER;

第3章VHDL基本描述語句69

d_out:OUTtw32);PORTMAP(a_bus=>addr_bus;

b_bus=>data_bus;

c_bus=>comt;

d_out=>data)BEGIN

d_out<=tw_add(a_bus,b_bus)WHEN

c_bus=0ELSE

tw_sub(a_bus,b_bus)WHENc_bus=1ELSE

a_bus;ENDBLOCKALU;ENDcpu_blk;

第3章VHDL基本描述語句703、模塊并發性及執行條件語句的并發執行分為兩類:一類是無條件并發執行,另一類是有條件并發執行。有條件并發執行的BLOCK稱為GUARDEDBLOCK。

例:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdffbISPORT(d,clk:INbit;

g,gb:OUTbit);ENDdffb;ARCHITECHTUREexampleOFdffbISBEGIN

第3章VHDL基本描述語句71

B1:BLOCK(clk=‘1’)BEGINg<=GUARDEDd;

gb<=GUARDEDNOT(d);ENDBOLOCKB1;ENDexample;第3章VHDL基本描述語句723.2.6參數傳遞語句參數傳遞語句(generic)主要用來傳遞信息給設計實體的某個具體元件,如用來定義端口寬度、器件延遲時間等參數后并將這些參數傳遞給設計實體。這些參數是待定的,在模擬時,只要generic語句將待定參數初始化即可。73例:兩輸入與門Libraryieee;useieee.std_logic_1164.all;Entityand2is

generic(delay:time:=10ns);Port(a,b:INSTD_LOGIC;c:OUTSTD_LOGIC);ENDand2;ARCHITECTUREbehaveOFand2ISBEGINc<=aandbafter(delay);ENDbehave;3.2.6參數傳遞語句74例:例化元件來改變參數值libraryieee;useieee.std_logic_1164.all;entityexampleISport(a1,b1,a2,b2:instd_logic;out1,out2:outstd_logic);endexample;architecturebehaveofexampleis

componentand2

generic(delay:time);port(a,b:instd_logic;c:outstd_logic);endcomponent;Beginu1:and2genericmap(6ns)

portmap(a1,b1,out1);u2:and2genericmap(8ns)portmap(a2,b2,out2);Endbehave;3.2.6參數傳遞語句參數匹配命令genericmap將二輸入與門中的延遲時間參數分別映射為6ns和8ns,以滿足不同工藝、不同材料器件的要求。元件例化語句:將端口a映射到信號a1,端口b映射到b1,端口c映射到out1。753.2.7元件例化語句結構體描述方式就是在多層次的設計中,通過調用庫中的元件或是已經設計好的模塊來完成設計實體功能的描述。在結構體中,描述只表示元件(或模塊)和元件(或模塊)之間的互連關系,就像網表一樣。描述元件間的互連關系就是用元件例化語句實現的。在進行元件例化時,首先要進行例化元件的說明,元件說明部分使用component語句,說明在結構體中所調用的模塊。如果所調用的模塊在元件庫中并不存在時,必須要首先進行元件的創建,然后將其放在工作庫中,通過調用工作庫來引用該元件。元件例化語句是一種應用十分廣泛的語句,主要用于模塊化的設計。76component語句的書寫格式為:component<引用元件名>[generic<參數說明>;]port<端口說明>;endcomponent;其中:“引用元件名”用來指定結構體中的例化元件,該元件必須已經存在于調用的工作庫中;generic語句表示需要參數傳遞說明。component語句對要引用的元件說明以后,就可以在結構體中進行元件例化以使用該元件,元件例化語句的書寫格式為:<標號名:><元件名>[genericmap(參數映射)]portmap(端口映射);其中:標號名是元件例化的唯一標志。映射語句把元件的參數和端口與實際連接的信號對應起來,以進行元件的應用。3.2.7元件例化語句771.位置映射:portmap語句中實際信號的書寫順序與component語句中端口說明中的書寫順序保持一致。3.2.7元件例化語句映射方法:位置映射

溫馨提示

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

評論

0/150

提交評論