EDA第五章 VHDL設計進階2節(jié)-順序語句-定稿_第1頁
EDA第五章 VHDL設計進階2節(jié)-順序語句-定稿_第2頁
EDA第五章 VHDL設計進階2節(jié)-順序語句-定稿_第3頁
EDA第五章 VHDL設計進階2節(jié)-順序語句-定稿_第4頁
EDA第五章 VHDL設計進階2節(jié)-順序語句-定稿_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第五章VHDL設計進階本章對VHDL的語言規(guī)則和語句類型做系統(tǒng)的論述。一、VHDL語言要素二、VHDL順序語句※三、VHDL并行語句四、子程序五、庫、程序包及其配置六、VHDL描述風格七、常用元件設計舉例八、VHDL與原理圖混合設計方式一、VHDL順序語句VHDL中有兩類基本的描述語句—順序語句和并行語句。順序語句具有:執(zhí)行順序與書寫順序一致,順序語句只能出現(xiàn)在進程和子程序中,子程序又分為函數(shù)和過程。進程是由順序語句構成的,但是進程本身屬于并行語句。同一時間每個進程只能執(zhí)行一條順序語句;子程序本身沒有順序和并行之分。VHDL有如下六類基本的順序語句:賦值語句、轉向控制語句、等待語句、子程序調(diào)用語句,返回語句和空操作語句1、賦值語句√2、轉向控制語句3、WAIT語句4、子程序調(diào)用語句5、返回語句6、Null語句和其他語句1、賦值語句賦值語句功能是將一個值或者表達式的運算結果傳遞給某一個數(shù)據(jù)對象,如信號或者變量,或者數(shù)組。(1)、信號或者變量的賦值語法: 變量賦值目標:=賦值源;--立即執(zhí)行無延時 信號賦值目標<=賦值源;--有延時,或者進程結束時賦值目標和賦值源之間的數(shù)據(jù)類型必須一致。信號和變量賦值有區(qū)別:SIGNALs1,s2:STD_LOGIC;SIGNALsvec:STD_LOGIC_VECTOR(0TO3);PROCESS(S1,S2)VARIABLEv1,v2:STD_LOGIC;BEGINv1:=‘1’;--變量賦值s1<=‘1’;--信號賦值svec(0)<=v1;v1:=‘0’;--本進程中變量v1兩次賦值都會發(fā)生變化s1<=‘0’;本進程中信號s1兩次賦值,最后一次有效ENDPROCESS;--進程中的信號賦值都是在進程結束之后生效的1、賦值語句從例子中可以看出,賦值語句可以放到進程中,也可以放到結構體中,因此賦值語句即可以做順序語句也可以作為并行語句使用。變量賦值立即生效,信號賦值生效是有延時的,在進程中的信號賦值是在進程結束時候一起生效的。進程內(nèi)部信號可以多驅(qū)動源,但是最后一次生效,進程中信號賦值是在進程結束時候進行的,但是還是有先后順序的,比如y的賦值過程,當從y和y1來看多信號賦值又無先后順序。1、賦值語句(2)、賦值目標I、標識符賦值目標和數(shù)組單元素賦值目標標識符賦值目標可以理解為單獨的信號或者變量作為賦值目標的情況,數(shù)組單元素賦值目標是以通過數(shù)組下標名稱選擇數(shù)組的某一元素作為賦值目標。賦值形式為:數(shù)組類信號或者變量名(下標名),要求下標是一個具體的數(shù)值或者一個可計算的表達式。x:=3;a(3):=12;a(x+2):=3;II、段下標元素賦值目標及集合塊賦值目標是以下標連續(xù)的多個元素作為賦值目標的情況。a(1TO2)<=“10”;a(3DOWNTO0)<=“1011”;集合塊賦值目標,是以一個集合的方式來賦值的有位置關聯(lián)和名字關聯(lián)。s<=“1011”(a,b,c,d)<=s;--a<=‘1’;b<=0;c<=1;d<=1;位置關聯(lián)(2=>e,3=>f,1=>g(0),0=>g(1):=s);--e<=s(2);f<=s(3);g(0)<=s(1);g(1)<=s(0);名字關聯(lián),可理解為下標名稱關聯(lián)方式分為有IF語句、CASE語句、LOOP語句、NEXT語句和EXIT語句。(1)、IF語句I、IF條件THEN 語句;

ENDIF;II、IF條件THEN

語句1;

ELSE

語句2;

ENDIF;III、IF條件1THEN--有優(yōu)先級語句1;

ELSIF條件2THEN

語句2;

ELSE

語句3;

ENDIF;2、轉向控制語句例5-74位等值比較器描述方式1LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYeqcomp4ISPORT( a,b:INSTD_LOGIC_VECTOR(3DOWNTO0);

equals:OUTSTD_LOGIC);ENDeqcomp4;ARCHITECTUREbehaveOFeqcomp4ISBEGINcomp:PROCESS(a,b)BEGINequals<=‘0’;IFa=bTHEN--常稱為門閂控制語句equals<=‘1’;ENDIF;ENDPROCESScomp--進程結束后信號equals賦值才生效ENDbehave;例5-84位等值比較器描述方式2LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYeqcomp4ISPORT( a,b:INSTD_LOGIC_VECTOR(3DOWNTO0);

equals:OUTSTD_LOGIC);ENDeqcomp4;ARCHITECTUREbehaveOFeqcomp4ISBEGINcomp:PROCESS(a,b)BEGIN IFa=bTHENequals<=‘1’; ELSE equals<=‘0’; ENDIF;ENDPROCESScomp;ENDbehave;例5-94路多選一多路選擇器描述方式1LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux4ISPORT( a,b,c,d:INSTD_LOGIC_VECTOR(3DOWNTO0); s:INSTD_LOGIC_VECTOR(1DOWNTO0);

x:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDmux4;ARCHITECTUREbehaveOFmux4ISBEGINmux4:PROCESS(a,b,c,d)BEGIN IFs=“00”THENx<=a; ELSIFs=“01”THEN x<=b; ELSIFs=“10”THEN x<=c; ELSE--s=“11”或者其它值,STD_LOGIC還有其他邏輯值 x<=d;ENDIF;ENDPROCESSmux4;ENDbehave;數(shù)據(jù)選擇器a

s(1)xbcd

s(0)(2)、CASE語句—無優(yōu)先級CASE表達式IS

WHEN值1=>語句A;

WHEN值2=>語句B; :

WHENOTHERS=>語句C;ENDCASE;注意:=>類似IF語句中的THEN

如果分支包含了所有的情況,那么OTHERS可以省略。每個選擇值只能出現(xiàn)一次,不允許有相同選擇值的條件出現(xiàn)

CASE語句必須選中,且只能選中所列條件中的一條。

執(zhí)行語句中不可以出現(xiàn)時鐘邊沿判斷語句

2、轉向控制語句例5-104路多選一多路選擇器描述方式2LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYtest_caseISPORT( s1,s2:INSTD_LOGIC; a,b,c,d:INSTD_LOGIC; z:OUTSTD_LOGIC;)ENDtest_case;ARCHITECTUREbehaveOFtest_caseISSIGNALs:STD_LOGIC_VECTOR(1DOWNTO0);BEGIN s<=s1&s2;PROCESS(a,b,c,d,s1,s2)BEGIN CASEsIS WHEN“00”=>z<=a;WHEN“01”=>z<=b; WHEN“10”=>z<=c; WHEN“11”=>z<=d;WHENOTHERS=>z<=‘x’;--由于STD_LOGIC類型中還有其他的邏輯值

ENDCASE; ENDPROCESS;ENDbehave;

數(shù)據(jù)選擇器a

s(2)zbcd

s(1)(3)、LOOP語句LOOP語句就是循環(huán)語句,分為FOR循環(huán)和WHILE循環(huán)。LOOP是一個循環(huán)語句,就是每次執(zhí)行到ENDLOOP時候會自動的跳轉到LOOP處,如果FOR語句或者WHILE的條件滿足,那么就執(zhí)行循環(huán)體,否則跳出循環(huán)。沒有FOR和WHILE語句時候,就稱為死循環(huán)。I、FOR循環(huán)

[循環(huán)標號:]FOR循環(huán)變量IN循環(huán)次數(shù)范圍LOOP

順序處理語句;

ENDLOOP[循環(huán)標號];FOR循環(huán)語句中的循環(huán)變量每次循環(huán)中都會發(fā)生變化,而IN后面的循環(huán)次數(shù)范圍則表示循環(huán)變量在循環(huán)過程中依次取值的范圍。循環(huán)變量必須取整數(shù)。例如:

FORnIN0TO7LOOP tmp:=tmpXORa(n); ENDLOOP;2、轉向控制語句例5-118位奇偶校驗電路LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYp_checkISPORT( a:INSTD_LOGIC_VECTOR(7DOWNTO0); y:OUTSTD_LOGIC);ENDp_check;ARCHITECTUREbehaveOFp_checkISBEGIN PROCESS(a) VARIABLEtmp:STD_LOGIC;BEGIN tmp:=‘0’; FORnIN0TO7LOOP--8次循環(huán) tmp:=tmpXORa(n); ENDLOOP; y<=tmp; ENDPROCESS;ENDbehave;8位奇偶校驗器A(0)yA(1)A(2)A(3)A(4)A(5)A(6)A(7)II、WHILE循環(huán)

[循環(huán)標號:]WHILE條件LOOP

順序處理語句;

ENDLOOP[循環(huán)標號];執(zhí)行循環(huán),直到條件為假退出循環(huán)。例如:

WHILEi<8LOOP tmp:=tmpXORa(i); i:=i+1; ENDLOOP;2、轉向控制語句例5-128位奇偶校驗電路2LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYp_check2ISPORT( a:INSTD_LOGIC_VECTOR(7DOWNTO0); y:OUTSTD_LOGIC);ENDp_check2;ARCHITECTUREbehaveOFp_check2ISBEGIN PROCESS(a)VARIABLEi:INTEGER:=0; VARIABLEtmp:STD_LOGIC;BEGIN tmp:=‘0’; WHILEi<8LOOP tmp:=tmpXORa(i); i:=i+1; ENDLOOP; y<=tmp; ENDPROCESS;ENDbehave;8位奇偶校驗器A(0)yA(1)A(2)A(3)A(4)A(5)A(6)A(7)(4)、NEXT語句NEXT和EXIT是專用退出循環(huán)的兩種語句,NEXT相當高級語言中的跳轉語句,共有三種形式:I、NEXT;

--跳轉到本循環(huán)的LOOP處;II、NEXTLOOP標號;--跳轉到指定的LOOP標語句開頭,繼續(xù)執(zhí)行循環(huán);III、NEXTLOOP標號WHEN條件表達式;

--條件表達式為真時跳轉例5-13兩個矢量按位清零程序,目的就是熟悉NEXT的用法L1:FORcnt_valueIN1TO8LOOP S1:a(cnt_value):=‘0’; IF(c(cnt_value)=a(cnt_value))THENNEXT; ENDIF; S2:c(cnt_value):=‘0’;ENDLOOPL1;2、轉向控制語句(5)、EXIT語句EXIT也是專用的循環(huán)退出語句,共有三種形式:I、EXIT;

--跳到ENDLOOP處;II、EXITLOOP標號;--跳到LOOP標號的循環(huán)結束ENDLOOP位置;III、EXITLOOP標號WHEN條件表達式;

EXIT用于跳轉到循環(huán)的結束處;例5-15比較兩個矢量大小FORiIN1DOWNTO0LOOP IF(a(i)=‘1’ANDb(i)=‘0’)THENa_less_then_b<=FALSE;EXIT;--比較結束,跳出循環(huán)ELSIF(a(i)=‘0’ANDb(i)=‘1’)THEN a_less_then_b<=TRUE; EXIT;--比較結束,跳出循環(huán)ELSENULL;--如果相等就執(zhí)行此空操作ENDIF;ENDLOOP;2、轉向控制語句在進程(或過程)中,當程序執(zhí)行到WAIT語句時候,程序會掛起,直到條件滿足時候,才重新開始執(zhí)行進程或者過程中的程序。注意:列出敏感變量的進程不能使用WAIT語句;I、WAIT;--沒有設置停止掛起的條件,表示永遠掛起;II、WAITON信號表;--等待列出的敏感信號變化,才能結束掛起;

III、WAITUNTIL條件表達式;--當表達式為真時候才結束掛起;IV、WAITFOR時間表達式;--直到指定時間時才結束掛起;V、WAIT[ON信號表][UNTIL條件表達式][FOR時間表達式];

--多條件的WAIT語句,只要有一個條件滿足,就結束程序掛起;只有WAITUNITIL可以綜合,其它都只在仿真時使用。例如:WAITONa,b;--等待直到a或者b有變化WAITUNTIL((x*10)<100);--等待到條件滿足時候退出WAITFOR20nS;--等待20nS

3、WAIT語句-略講例5-16WAIT應用舉例,下面兩個進程等效

PROCESS(a,b)–進程1有敏感信號列表BEGINY<=aANDb;ENDPROCESS;PROCESS–進程2沒有敏感信號列表BEGINY<=aANDb;WAITONa,b;--等待a或b發(fā)生變化,才執(zhí)行本進程中信號Y的賦值ENDPROCESS;

注意:列出敏感變量的進程中不能使用WAIT語句例5-17WAIT應用舉例2

PROCESS–有WAIT語句的進程不能有敏感信號列表BEGINrst_loop:LOOP--死循環(huán)WAITUNTILclock=‘1’ANDclock’EVENT;NEXTrst_loopWHEN(rst=‘1’);x<=a;WAITUNTILclock=‘1’ANDclock’EVENT;NEXTrst_loopWHEN(rst=‘1’);y<=b; ENDLOOPrst_loop;--死循環(huán)

ENDPROCESS;程序功能是,每次時鐘上升沿時候如果復位信號rst不等于1,則交替執(zhí)行x<=a;和y<=b;如果rst等于1時候,就返回到程序開始,當rst不等于1時候,下次時鐘上升沿時候,一定執(zhí)行x<=a;操作;子程序包括過程和函數(shù),可以在VHDL結構體或程序包中的任何位置對子程序進行調(diào)用;從硬件角度看子程序調(diào)用類似元件例化,每次調(diào)用子程序都會生成一個電路邏輯塊(與傳統(tǒng)編程的宏類似)。與例化不同在于子程序調(diào)用和當前是同一層次的(元件例化類似protel中的子圖紙)。I、過程調(diào)用

就是執(zhí)行一個給定名字和參數(shù)的過程。調(diào)用過程的語句格式如下:過程名[([形參名=>]實參表達式

{[形參名=>]實參表達式})];形參是被調(diào)用過程中已說明的參數(shù)名;實參當前調(diào)用程序中過程形參的接受體;形參和實參的對應可以采用位置關聯(lián)法和名字關聯(lián)法。過程調(diào)用分為3個步驟:將IN和INOUT模式的實參賦給相應的形參執(zhí)行這個過程將過程中OUT和INOUT模式的形參值返回給對應的實參。II、函數(shù)調(diào)用

函數(shù)調(diào)用和過程調(diào)用相似,只是函數(shù)調(diào)用有返回值。過程調(diào)用結束后把形參值再傳給實參。4、子程序調(diào)用語句例5-18過程的調(diào)用舉例PACKAGEdata_typesIS–定義程序包SUBTYPEdata_elementISINTEGERRANGE0TO3;--定義數(shù)據(jù)類型TYPEdata_arrayISARRAY(1TO3)OFdata_element;ENDdata_types;在程序包中定義了一個新數(shù)據(jù)類型的數(shù)組--以上為程序包的內(nèi)容,下面為程序USEWORK.data_types.ALL;--打開當前工作庫的程序包data_typesENTITYsortISPORT(in_array:INdata_array;out_array:OUTdata_array);ENDsort;ARCITECTUREbehaveOFsortISBEGIN PROCESS(in_array)–進程開始

PROCEDUREswap(data:INOUTdata_array;--形參新類型low,high:ININTEGER)IS–定義過程

參數(shù)為默認是常量類型的,可省略不寫,其它對象類型需要聲明

PROCESS(in_array)–進程開始

PROCEDUREswap(VARIABLEdata:INOUTdata_array;--形參low,high:ININTEGER)IS–定義過程

VARIABLEtemp:data_element;

BEGINIF(data(low)>data(high))THEN–兩整數(shù)從小到大排序temp:=data(low);data(low):=data(high);data(high):=temp;ENDIF;ENDswap; VIRIABLEmy_array:data_array;--定義進程中使用的變量

BEGINmy_array:=in_array;--讀入變量

swap(my_array,1,2);--位置關聯(lián)調(diào)用,

swap(my_array,2,3);--起泡排序法swap(my_array,1,2);out_array<=my_array;ENDPROCESS;ENDbehave返回語句只能用于子程序中,并用來結束當前子程序的執(zhí)行。格式有兩種:RETURN;過程返回RETURN表達式;函數(shù)返回表達式的值;函數(shù)必須有返回,可以有多個返回,但是只能有一個有返回值。例5-19過程返回RS觸發(fā)器在RS輸入都是1時候,執(zhí)行了返回操作;PROCEDURErsff(SIGNALs,r:INSTD_LOGIC;SIGNALq,nq:INOUTSTD_LOGIC)ISBEGINIF(s=‘1’ANDr=‘1’)THEN--要有一端輸出變成0才能穩(wěn)定REPORT“Forbiddenstate:sandrequalto‘1’; RETURN; --輸入’0’,’0’為不允許狀態(tài),因為同時變0會出不定態(tài)

ELSESRQNQ

q<=sNANDnqAFTER5ns;0101

nq<=rNANDqAFTER5ns;1010

ENDIF;11維持

ENDPROCEDURErsff;0011不定

指同時變1不定5、返回語句-略講LIBRARYIEEE;例5-20函數(shù)返回;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmax21ISPORT(a,b:ININTEGER;q:OUTINTEGER);ENDmax21;ARCHITECTUREbehaveOFmax21ISBEGINPROCESS(a,b)FUNCTIONmax(a,b:INTEGER)RETURNINTEGERIS定義函數(shù)

VARIABLEtemp:INTEGER;BEGINIF(a>b)THENtemp:=a;ELSEtemp:=b;ENDIF;RETURN(temp);--返回最大值

ENDmax;BEGINq<=max(a,b);ENDPROCESS;ENDbehave;順序語句中的空操作語句,讓程序順序向后執(zhí)行;常用在case語句中。另如果將NULL賦給一個信號或者變量,該信號或者變量的值不變。比如:

temp<=NULL;NULL語句舉例5-21:CASEopcodeISWHEN“001”=>tmp:=regaANDregb;

溫馨提示

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

評論

0/150

提交評論