




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第四章VHDL典型語句4.1VHDL順序語句4.2VHDL并行語句4.3子程序4.4程序包、配置第四章VHDL典型語句4.1VHDL順序語句1 進程語句內部稱為順序部分,用順序語句進行描述;
進程語句外的語句就是并行部分。并行語句又稱并發語句,各種并行語句的執行與語句書寫順序無關,當某一信號變化時,由此信號觸發的所有語句將同時被執行。 進程語句內部稱為順序部分,用順序語句進行描述;24.1VHDL順序語句
4.1.1賦值語句
賦值語句的功能就是將一個值或一個表達式的運算結果傳遞給某一數據對象,如信號、變量、或由此組成的數組。 (1) 信號代入語句
信號代入語句的語法結構為:(2) 變量賦值語句變量賦值語句的語法結構為:4.1VHDL順序語句 4.1.1賦值語句信號代入語句的31.由于高阻‘Z’狀態作為電路的輸入時,等效于輸入為開路狀態,所以常量高阻‘Z’任何時候都不能出現在表達式中。2.在VHDL語言中,信號只能在結構體中說明,但可以在并行語句和順序語句中使用;在進程、過程、函數中使用的信號代入語句就是順序語句,在結構體中則為并行語句。二者在語法上是一樣的。3. 信號代入語句作為順序語句使用時,表達式的運算結果并不是在語句運行后立即代入到信號中,而是只有在進程(函數、過程)的最后一條結束后(如進程即將掛起前),進程中的所有的信號代入語句結果同時賦值。所以在同一個進程中如果一個信號被代入多次,編譯器有可能會給出錯誤警告并退出綜合過程或只給出最后的執行語句有效。 例如:--該例子在編譯的時候,出現了錯誤警告。s<=aORb; s<=aANDb;1.由于高阻‘Z’狀態作為電路的輸入時,等效于輸入為開路狀態4第四章VHDL典型語句課件5 【例4-2】試比較N1、N2兩個進程的執行結果 【例4-2】試比較N1、N2兩個進程的執行結果6 4.1.2條件控制語句1.IF語句IF語句的語法結構為: 4.1.2條件控制語句1.IF語句IF語句的語法結構為7使用IF語句需要注意的事項: (1)IF語句是一種條件語句,語句中至少應有一個條件句,條件結果必須是BOOLEAN類型值。 (2)IF語句根據條件句產生的判斷結果TRUE或FALSE,有條件地選擇執行其后的順序語句。如果某個條件句的布爾值為真(TRUE),則執行該條件句后的關鍵詞THEN后面的順序語句,否則結束該條件的執行,或執行ELSIF或ELSE后面的順序語句后結束該條件句的執行……直到執行到最外層的ENDIF語句,才完成全部IF語句的執行。 (3)IF語句可嵌套使用,即在一個IF語句中可再調用另一個“IF”語句。
使用IF語句需要注意的事項:8
(4)可以有多個elsif部分,但只能有一個else。 (5)IF語句不僅能實現條件分支處理,而且在條件判斷上有優先級,因此特別適合描述含有優先級的電路。 (6)從設計人員的思維習慣出發,他們會更傾向于使用IF語句。但是,使用IF語句也會對電路帶來負面影響,因為IF語句在綜合時可能會產生不必要的優先級解碼電路。目前的一些綜合工具在處理這類語句時會對其結構進行優化,以避免占用過多的硬件資源。(4)可以有多個elsif部分,但只能有一個els9【例4-3】IF語句舉例【例4-3】IF語句舉例10注意:使用不帶ELSE子句的IF語句時,電路可能會引入鎖存器。但是,對于是否產生鎖存器這個問題,我們也不應該孤立地理解一條順序語句,還是應該結合上下文背景,從總體上把握。如【例4-4】所示。注意:使用不帶ELSE子句的IF語句時,電路可能會引入鎖存器11說明:本例中沒有ELSE子句,但可以從上下文含義中知道該電路和例4-3一樣并沒有引入寄存器。說明:本例中沒有ELSE子句,但可以從上下文含義中知道該電路12
ifthenelse語句綜合i/.引入寄存器entitydff1isport(d:instd_logic;clk:instd_logic;q:outstd_logic);Enddff1;architecturertlofdff1isbegininfer_reg:process(d,clk)beginif(clk’eventandclk=‘1’)thenq<=d;endif;endprocessinfer;endrtl;ifthenelse語句綜合i/.引入13ii/.引入鎖存器Infer_latch:process(A,B)beginif(A=‘1’)thenx<=B;endif;endprocessinfer_infer_latch;Infer_latch:process(A,B)Beginx<=‘0’;if(A=‘1’)thenx<=B;endif;endprocessinfer_infer_latch;隱含了A=‘0’時x<=x;不完全的elseii/.引入鎖存器Infer_latch:proce14iii/.組合電路entitycombisport(a,b:inbit;select:inbit;y:outbit);endcomb;architecturearchofcombisbeginprocess(a,b,select)beginif(select=‘1’)theny<=b;elsey<=a;endif;endprocess;endarch;bayselect10iii/.組合電路entitycombisarchi152.4.3ifthenelse語句綜合(Cont.)iv/.異步復位process(reset,clk,d)Beginif(reset=‘0’)thenq<=‘0’;elsif(clk’eventandclk=‘1’)thenq<=d;endif;endprocess;dclkresetq2.4.3ifthenelse語句綜合(Cont.162.4.3ifthenelse語句綜合(Cont.)v/.三態邏輯signals,sel,data:std_logic;process(sel,data)Beginif(sel=‘1’)thens<=data;elses<=‘Z’;endif;endprocess;12.4.3ifthenelse語句綜合(Cont.17v/.三態邏輯architecturebehoftribufissignalasel,bsel,a,b,s:std_logic;beginpa:process(asel,a)begins<=‘Z’;if(asel=‘1’)thens<=a;endif;endprocesspa;2pb:process(bsel,b)begins<=‘Z’;if(bsel=‘1’)thens<=b;endif;endprocesspb;endbeh;Multidriver!!v/.三態邏輯architecturebehoft182.4.3ifthenelse語句綜合(Cont.)vii/.‘Z’值使用規則如:dout<=‘Z’anddin;如:if(sel=‘Z’)then相當于
iffalsethen
某個信號被賦值‘Z’值時,將會引入三態驅動,但‘Z’值不能用于復雜的表達式中(邏輯/算術表達式)1當信號與‘Z’值比較時,結果總為false,引用這樣的關系表達式將導致模擬與綜合結果不匹配22.4.3ifthenelse語句綜合(Cont.192.4.3ifthenelse語句綜合(Cont.)vii/.ifthenelse語句小結可以描述順序行為1可以生成三態邏輯4生成組合邏輯2如果缺少else語句,可能生成latch3可以引入時序元件5一般用于process和subprogram中62.4.3ifthenelse語句綜合(Cont.202.CASE語句CASE語句的語法結構為:2.CASE語句CASE語句的語法結構為:21 WHEN后面的選擇值可以有四種表達方式; 單個普通數值,如6,’1’等; 并列數值,如3|5,表示取值為3或5; 數值選擇范圍,如(4DOWNTO2)表示取值為4、3、2; WHENOTHERS=>順序語句。 WHEN后面的選擇值可以有四種表達方式;221、CASE語句的功能是根據表達式滿足的條件直接選擇多項順序語句中的一項執行,類似于IF語句,但是可讀性比IF語句好。
2、當執行到CASE語句時,首先計算CASE和IS之間的表達式的值,然后根據條件語句中與之相同的選擇值,執行對應的順序語句,最后結束CASE語句。3、CASE語句中的“=>”不是操作符,它只相當于“THEN”的作用。
4、CASE語句中每一條語句的選擇值只能出現一次,即不能有相同選擇值的條件語句出現。
1、CASE語句的功能是根據表達式滿足的條件直接選擇23
4、CASE語句執行中必須選中,且只能選中所列條件語句中的一條,即CASE語句至少包含一個條件語句。
5、除非所有條件語句中的選擇值能完全覆蓋CASE語句中表達式的取值,否則“OTHERS”子句不應該省略。并且關鍵詞OTHERS只能出現一次,且只能作為最后一種條件取值。
6、使用OTHERS是為了使條件語句中的所有選擇值能覆蓋表達式的所有取值,以免綜合過程中插入不必要的鎖存器。這一點對于定義為STD_LOGIC和STD_LOGIC_VECTOR數據類型的值尤為重要,因為這些數據對象的取值除了1、0之外,還可能出現輸入高阻態Z,不定態X等取值,難以列舉表達式的全部可能取值。4、CASE語句執行中必須選中,且只能選中所列條24
IF語句和CASE語句都是條件語句,但是兩者也有很大的區別,主要體現在以下幾點:(1)IF語句描述功能更強,有些CASE語句無法描述的內容(如描述含有優先級的內容時)IF語句可以描述。(2)CASE語句描述比IF語句更直觀,這是因為CASE語句把條件中所有可能出現的情況全部列出來了,可執行條件一目了然。(3)與IF語句相比,CASE語句組的程序語句是沒有先后順序的,所有表達式的值都并行處理。而IF語句是有序的,先處理最起始、最優先的條件,后處理次優先的條件。具體應用請看【例4-6】。 IF語句和CASE語句都是條件語句,但是兩者也有很大的區別25【例4-6】用CASE語句實現7段顯示譯碼器【例4-6】用CASE語句實現7段顯示譯碼器264.1.3循環語句1.FOR…LOOP語句FOR…LOOP循環語句主要用于循環次數已知的循環程序設計,可以使其所包含的順序語句被循環執行,它類似于并行語句中FOR…GENERATE生成語句。FOR…LOOP語句的語法結構為:循環變量在使用前不需聲明4.1.3循環語句1.FOR…LOOP語句FOR…LOO27(1)FOR
循環變量
IN初值TO終值
LOOP
順序語句;
ENDLOOP;(2)FOR循環變量
IN初值DOWNTO終值
LOOP
順序語句; ENDLOOP;(3)FOR循環變量INx’RANGELOOP
順序語句; ENDLOOP;(1)FOR循環變量IN初值TO終值L28注意:一般的綜合工具可以對FOR…LOOP循環語句進行綜合;而對WHILE…LOOP循環語句來說,只有一些高級的綜合工具才能對它進行綜合,所以,一般使用FOR…LOOP循環語句,而很少使用WHILE…LOOP循環語句。注意:一般的綜合工具可以對FOR…LOOP循環語句進行29【例4-7】用FOR…LOOP語句來實現的數碼中‘1’的個數的檢測器。【例4-7】用FOR…LOOP語句來實現的數碼中‘1’的個302.WHILE…LOOP語句WHILE…LOOP語句的語法結構為:例如:WHILEi<10LOOP
--這里利用了i≥10的條件使程序結束循環
sum:=i+sum;--sum初始值為0
i:=i+1;
--循環控制變量i的遞增是通過算式i:=i+1來實現
ENDLOOP;2.WHILE…LOOP語句WHILE…LOOP語句的語法311、 和FOR…LOOP語句不同的是,該語句條件中如果用到了變量,這個變量一定要事先聲明。2、WHILE…LOOP語句沒有自動遞增循環變量的功能,而是在順序處理語句中增加了一條循環次數計算語句,用于循環語句的控制。1、 和FOR…LOOP語句不同的是,該語句條件中如果用到了32【例4-8】用WHILE…LOOP語句來實現的連續0檢測器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYzero_ceshi1IS PORT(data:INSTD_LOGIC_VECTOR(7DOWNTO0);
--輸入的數據 y:OUTINTEGERRANGE8DOWNTO0);
--輸出0的個數ENDzero_ceshi1;ARCHITECTUREbehOFzero_ceshi1ISBEGIN PROCESS(data) VARIABLEcount:INTEGERRANGE8DOWNTO0;
--定義一個中間變量 VARIABLEi:INTEGERRANGE7DOWNTO-1;
--變量i在使用前必須聲明
【例4-8】用WHILE…LOOP語句來實現的連續0檢測33
BEGIN count:=0; i:=7; WHILE(i<8ANDi>-1)LOOP
--‘RANGE不能用在一個表達式中 CASEdata(i)IS--所以必須用數值表示 WHEN'0'=>count:=count+1; WHENOTHERS=>EXIT; ENDCASE; i:=i-1;--實現循環控制變量i的遞增 ENDLOOP;
y<=count; ENDPROCESS;ENDbeh;BEGIN34
3.單個LOOP語句 1)單個LOOP語句的語法結構為:
[標號:]LOOP
順序語句;
ENDLOOP[標號]; 這種循環語句需引入其他控制語句(如EXIT、NEXT)后才能確定,否則為無限循環。其中的標號是可選的。 2)EXIT語句的作用是結束整個循環操作 EXIT語句的語法結構為:
[標號:]EXIT[標號][WHEN條件表達式]; 注意:EXIT語句如果不跟[WHEN條件],EXIT語句立即無條件跳出整個循環。 3)NEXT語句的作用是跳出本次循環 NEXT語句的語法結構為:
[標號:]NEXT[標號][WHEN條件表達式]; 注意:NEXT語句不跟有WHEN條件時,NEXT語句將立即無條件跳出本次循環。NEXT語句與EXIT語句的區別是:NEXT語句轉向LOOP語句的起點,而EXIT語句轉向LOOP語句的終點。 3.單個LOOP語句35 PROCESS(a,b) CONSTANTmax_limit:INTEGER:=255 BEGIN FORiIN0TOmax_limitLOOP IF(done(i)=TRUE)THEN
NEXT;--跳出本次循環 ELSE
done(i):=TRUE; ENDIF;
q(i)<=a(i)ANDb(i); ENDLOOP;ENDPROCESS; PROCESS(a,b)36 4.1.4其他順序語句1.等待語句WAIT語句的語法結構為:當進程執行到WAIT語句,就被掛起,直到滿足此語句設置的結束掛起條件后,將重新開始執行進程或過程中的程序。有以下幾種格式:(1)WAIT;此語句為永久等待語句,在語句中未設置停止掛起條件的表達式,表示程序永遠掛起。(2)WAITON敏感信號表;此語句為敏感信號等待語句,語句中設置了敏感信號表。當執行到WAIT語句后,程序進入等待狀態,直至敏感信號表中的任一信號發生變化時,結束等待重新執行后面的操作。 4.1.4其他順序語句1.等待語句WAIT語句的語法37如:WAITONa,b;
表示當a或b中任一信號發生改變時,就恢復執行WAIT語句之后的語句。參見進程的概念及執行機制一節。(3)WAITFOR時間表達式 此語句為時間等待語句,語句中列出了時間表達式。當進程執行到該語句時,被掛起;等待一定的時間后,才開始進行后面的操作。 例:WAITFOR20ns;--等待20ns后執行后面的操作 例如下面的例子: PROCESS BEGIN
a<=’1’;
Waitfor20ns;
a<=’0’;
Waitfor20ns; EndPROCESS;
如:WAITONa,b;38上面例子的執行過程為:執行信號賦值:a為1,等待20ns后,執行信號賦值:a為0,等待20ns后,結束進程。(4)WAITUNTIL條件表達式 此語句為條件等待語句,語句中給出了條件表達式。當進程執行到該語句時,程序進入等待狀態,若滿足條件表達式,則開始進行后面的操作。 例:WAITUNTILclk’EVENTANDclk=’1’;
目前,現有的EDA工具只支持對WAITUNTIL語句,其他語句在綜合的時候會出錯,所以讀者重點掌握該語句。由于在使用WAITUNTIL語句時,PROCESS沒有敏感信號列表,所以它必須是PROCESS中的第一條語句。當WAITUNTIL語句的條件滿足時,PROCESS內部的代碼就執行一遍。WAITUNTIL語句后面只有一個條件表達式,因此更適合于實現同步電路。上面例子的執行過程為:執行信號賦值:a為1,等待20ns后,39wait語句waituntil,wait,waiton,waitforwait語句表明了信號激活process的條件在process中,如有wait語句,敏感表必須取消在process中,如既無wait語句,也無敏感表,則不能正確模擬
綜合工具僅支持waituntil語句(引入寄存器)!!!wait語句waituntil,wait,wait40第四章VHDL典型語句課件412.空操作語句
空操作語句的語法結構為:
NULL;
空操作(NULL)語句類似于計算機匯編語言中的NOP指令,執行該語句時不進行任何操作,只是使程序去執行下一個語句。2.空操作語句42另外,在VHDL語言中經常在CASE語句中用到NULL語句,它用來表示CASE語句中所剩余的條件選擇值下的操作行為,從而能夠滿足CASE語句對條件選擇值全部列舉的要求。另外,在VHDL語言中經常在CASE語句中用到NULL語句,434.2VHDL并行語句 在VHDL程序中,結構體中的并行語句的執行與書寫順序沒有關系,其中每個并行語句用來表示一個功能模塊,各個功能模塊組織在一起便組成了一個結構體。并行語句主要有:進程語句、并行信號賦值語句、塊語句、元件例化語句、生成語句和并行過程調用語句。4.2VHDL并行語句 在VHDL程序中,結構體中的并行語44 4.2.1進程語句PROCESS語句的語法結構為:進程使用的要點:(1)進程由敏感信號的變化來啟動。
(2)一個進程中只允許描述對應于一個時鐘信號的同步時序邏輯。(3)同步電路可由結構體中的多個進程描述, 4.2.1進程語句PROCESS語句的語法結構為:進程使45
每個進程語句都可以有一個進程標號,作為進程的名稱,但進程標號是可選項;
敏感信號表是進程要讀取的所有信號(包括端口信號)的列表;
進程說明部分僅用于定義該進程內部所需的數據類型,如定義進程內部使用的變量,則必須在關鍵字BEGIN之前的進程說明部分對其進行定義,但需注意進程說明部分不允許定義信號和共享變量;
BEGIN和ENDPROCESS之間的順序語句用于描述一個電路功能或行為,是一段順序執行的語句,并且可以反復執行。 每個進程語句都可以有一個進程標號,作為進程的名稱,但進程標461)進程由敏感信號的變化來啟動。
只有當敏感信號表中的信號發生變化時,進程語句才能夠被啟動,進程內部的順序語句才能夠被執行,否則進程就處于等待狀態。
敏感信號是指那些值發生變化后能夠引起進程執行的信號。敏感信號表中可以使用一個或多個信號,每當其中的一個或多個信號值改變時,就在進程內部引起語句執行。注意:所有被讀信號均應包含在敏感表中。進程使用的要點:1)進程由敏感信號的變化來啟動。進程使用的要點:47第四章VHDL典型語句課件48 (2)一個進程中只允許描述對應于一個時鐘信號的同步時序邏輯,異步時序邏輯必須由多個進程來表達。(3)同步電路可由結構體中的多個進程描述,這是因為進程之間的通信可以通過傳遞信號和共享變量值來實現。 (2)一個進程中只允許描述對應于一個時鐘信號的同步時序邏49【例4-11】多進程語句實現16進制加法計數器的舉例【例4-11】多進程語句實現16進制加法計數器的舉例50IF(clk'EVENTANDclk='1')THENIFqn="1111"THENqn<=”0000”;ELSEqn<=qn+1;ENDIF;ENDIF;q<=qn;ENDPROCESSP1;P2:PROCESS(clk)BEGINIF(clk'EVENTANDclk='1')THENIFqn="1111"THENco<='1';ELSEco<='0';ENDIF;ENDIF;ENDPROCESSP2;ENDbeh;IF(clk'EVENTANDclk='1')TH51
進程P1和進程P2通過信號qn在兩個進程之間進行通信,進程P2每次啟動,需要對信號qn進行判斷,從而決定是否對co進行置1操作。同時,兩個進程中的啟動條件是一樣的,都是clk上升沿時啟動進程,這樣可以保證兩個進程同步并發執行。 進程P1和進程P2通過信號qn在兩個進程之間進行通信,進程52(4)進程內部是順序語句,但進程語句本身是并行語句
同一結構體中的不同進程是并行運行的,不同進程根據各自的敏感信號獨立運行。如【例4-12】中有兩個進程:u1和u2,它們的敏感信號分別為a、b、s1和a、c、s2。兩個進程完全獨立運行,但當兩組敏感信號表中的信號a發生變化時,兩個進程被同時啟動。
(4)進程內部是順序語句,但進程語句本身是并行語句53【例4-12】兩個二選一數據選擇器【例4-12】兩個二選一數據選擇器54
communicationamongprocessAssignmentIf,case,loopetcSignal_NSignal_3Signal_1Signal_2ProcessAProcessBarchitectureexample
一個結構體中含有多個進程存在,而且各個進程一邊進行通信,一邊并行地同步執行。communicationamongprocessAsva:process(a,to_a)beginif(a'eventanda='1')thento_b<=a;elseto_b<='0'after10ns;;endif;endprocessva;vb:process(to_b)beginif(to_b'eventandto_b='1')thento_a<='1'after10ns;elseto_a<='0'after10ns;endif;endprocessvb;va:process(a,to_a)習題
圖所示的是雙2選1多路選擇器構成的電路MUXK,對于其中MUX21A,當s='0'和'1'時,分別有y<='a'和y<='b'。試在一個結構體中用兩個進程來表達此電路,每個進程中用CASE語句描述一個2選1多路選擇器MUX21A。
雙2選1多路選擇器
習題圖所示的是雙2選1多路選擇器構成的電路MU
并行信號賦值語句有3種形式:簡單信號賦值語句、條件信號賦值語句和選擇信號賦值語句。
賦值語句的共同點:賦值目標必須都是信號。
每一個信號賦值語句都相當于一條縮寫的進程語句,任何信號的變化都將啟動相關并行語句的賦值操作,而這種啟動完全是獨立于其他語句的,它們都可以直接出現在結構體中。4.2.2并行信號賦值語句并行信號賦值語句有3種形式:簡單信號賦值語句、條件信58
1.簡單信號賦值語句 1.簡單信號賦值語句592.條件信號賦值語句2.條件信號賦值語句60條件信號賦值語句1、最后一個表達式有分號,其他的表達式后面沒有標點符號2、每個賦值條件按書寫的先后順序逐項檢測,如果條件滿足,就將該表達式的值代入目的信號量;如果條件不滿足,則再判斷下一個表達式所指定的條件。如果前面條件都不滿足時,就將最后一個表達式的值代入到目的信號量中。3、條件信號賦值語句和IF語句的區別:(1)IF語句是順序語句,而條件信號賦值語句是并行語句;(2)對于IF語句來說,ELSE語句是可有可無的,而條件賦值信號語句中的ELSE是必須的。(3)IF語句可以是程序段,而條件信號賦值語句只能對信號賦值。條件信號賦值語句1、最后一個表達式有分號,其他的表達式后面沒613.選擇信號賦值語句3.選擇信號賦值語句621、關鍵字WITH旁的選擇條件表達式的值是一個敏感量,每當選擇表達式的值發生變化時,就將啟動此語句對各子句中的選擇值進行測試對比。2、選擇信號賦值語句對于子句條件選擇值的測試是同期進行的,不像條件信號賦值語句那樣是按照子句的書寫順序自上而下逐條測試。因此,選擇信號賦值語句不允許有條件重疊的現象,也不允許存在條件涵蓋不全的情況,為了防止這種情況出現,可以在語句的最后加上“表達式nWHENOTHERS”子句。3、選擇信號賦值語句前面的每個子句的結尾都有逗號,只有最后一句是分號;而條件信號賦值語句前面每一子句的結尾沒有任何標點符號,只有最后一句是分號。1、關鍵字WITH旁的選擇條件表達式的值是一個敏感量,每當選63【例4.2.4】用賦值語句來實現數據選擇器的舉例【例4.2.4】用賦值語句來實現數據選擇器的舉例64省略賦值操作符是為了簡化表達才使用的短語,它可以在較多位的位矢量賦值中作省略化的賦值,如:dout<=(OTHERS=>'Z');該語句等價于dout<=”ZZZZZZZZ”;利用省略賦值操作符還可以給位矢量的某一部分位賦值以后再給剩下的位賦值,如:d2<=(1=>’1’,4=>’1’,OTHERS=>’0’);上面語句的作用就是給位矢量d2的第一位和第四位賦值為‘1’,而其余位賦值為‘0’。使用省略賦值操作符的優點是給位矢量賦值時,與位矢量的長度無關,因而經常應用在總線寬度不確定的場合,另外也經常和類屬參數說明語句一起應用,來實現總線的傳輸或改變電路的規模。4.省略賦值操作符省略賦值操作符是為了簡化表達才使用的短語,它可以在較多位的位65 4.2.3元件說明與元件例化語句 1.系統的層次結構化
系統學的一個重要的觀點是:系統是分層次的,是復雜研究對象的總稱,系統是具有若干互相依賴、相互作用、完成特定功能的有機整體。因此,可以認為數字系統設計也是一種層次結構,其設計過程是:以用戶對系統性能的要求所定義的系統功能說明為出發點,根據系統結構的觀點確定系統內包含的數據流和控制流,自上而下將系統逐級分解為若干個子系統,每個子系統再分解成模塊,再將模塊分成若干個更小的子模塊,如此繼續分解下去,直至該子模塊易于實現為止,從而形成多層次設計。 4.2.3元件說明與元件例化語句 1.系統的層次結構化66一個四選一數據選擇器電路的層次結構圖如圖4-2所示,其中頂層設計調用底層實體,底層實體是二選一數據選擇器。實現時利用信號把底層的三個二選一數據選擇器連接起來。在層次設計中,我們把用在底層的電路模塊(它本身也是一個實體)稱為元件。一個四選一數據選擇器電路的層次結構圖如圖4-2所示,其中頂層672.元件例化語句元件例化語句由兩部分組成,前一部分是元件說明語句,第二部分是元件例化語句。元件說明語句的功能是將一個現成的設計實體定義或聲明為一個元件;1、元件名”用來指定要在結構體中引用(或稱例化)的元件。2、如果在結構體中要進行參數傳遞,在元件定義語句中,就要有傳遞參數的說明,傳遞參數的說明語句以關鍵字GENERIC開始;。3、元件定義語句一般放在結構體的說明部分,用來說明結構體中所要用到的元件或者模塊。
元件說明語句的語法結構為:2.元件例化語句元件例化語句由兩部分組成,前一部分是元件說68(2)元件例化語句的語法結構為:元件例化語句的功能是將調用的元件或模塊的端口信號與結構體中的相應端口信號進行正確的連接,從而達到引用元件的目的。(2)元件例化語句的語法結構為:元件例化語句的功能是將調用69
設計人員經常采用兩種基本映射方法:第一種是名稱映射,第二種是位置映射。
其中名稱映射是指用“=>”將所調用的元件端口名和結構體中需要連接的信號名直接對應起來;
位置映射是指POTRMAP語句中的實際信號的書寫順序及位置與所調用元件的端口信號的書寫順序及位置保持一致。也可以將兩種方法混合起來用,就有了第三種映射方法,即混合映射方法。設計人員經常采用兩種基本映射方法:第一種是名稱映射,第70
“u1:mux21PORTMAP(d0,d1,s0,a);”就是采用位置映射的方法來實現的元件調用;上面的語句也可以用名稱映射來實現同樣的功能,即: u1:mux21PORTMAP(a=>d0,b=>d1,sel=>s0,y=>a); 而采用混合映射方法實現該功能的語句為: u1:mux21PORTMAP(d0,d1,sel,s0,y=>a); “u1:mux21PORTMAP(d0,d1,s0,71【例4.2.5】用元件例化語句來實現數據選擇器【例4.2.5】用元件例化語句來實現數據選擇器72習題
要求用例化語句來完成此項設計雙2選1多路選擇器
習題要求用例化語句來完成此項設計雙2選1多路選習題
圖是一個含有上升沿觸發的D觸發器的時序電路,試寫出此電路的VHDL設計文件。
時序電路圖
ab習題圖是一個含有上升沿觸發的D觸發器的時序電路LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdff1isPORT(d,cp:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDdff1;ARCHITECTURErtlOFdff1ISBEGINPROCESS(d,cp)BEGINIF(cp'EVENTANDcp='1')THENq<=d;ENDIF;ENDPROCESS;ENDrtl;LIBRARYIEEE;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdff_35isPORT(cl,clk0:INSTD_LOGIC;out1:OUTSTD_LOGIC);ENDdff_35;ARCHITECTURErtlOFdff_35ISCOMPONENTdff1PORT(d,cp:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALa,b:STD_LOGIC;BEGINU1:dff1PORTMAP(a,clk0,b);a<=not(bORCL);out1<=notb;ENDrtl;LIBRARYIEEE;習題根據圖,寫出頂層文件MX3256.VHD的VHDL設計文件。習題根據圖,寫出頂層文件MX3256.VHD的V其它(Cont.)元件例化端口映射問題inst1:comp1portmap(din_1=>‘0’;din_2=>con_A;dout=>con_out);signalgnd:std_logic;……gnd<=‘0’;inst1:comp1portmap(din_1=>gnd;din_2=>con_A;dout=>con_out);當某一輸入端口接固定電平時,必須引入中間信號,且中間信號不能在說明時賦初值!1其它(Cont.)元件例化端口映射問題signalgnd2.6其它(Cont.)iv/.元件例化端口映射問題componentdffport(reset,clk:instd_logic;d:instd_logic;q,qn:outstd_logic);enddff;當某一輸出端懸空時,應連接open關鍵字!u1:dffportmap(reset=>reset,clk=>clk;q=>dout,qn=>open);22.6其它(Cont.)iv/.元件例化端口映射問題當4.2.4生成語句將已經設計好的某一元件或設計單元進行復制,從而生成一組結構上完全相同的并行元件或設計單元的電路結構。FOR…GENERATE的語法結構為:4.2.4生成語句將已經設計好的某一元件或設計單元進行復制80FOR…GENERATE語句主要用來描述設計中的一些有規律的單元,其循環變量、循環次數范圍的含義及運行方式與FOR…LOOP語句十分相似。同FOR…LOOP語句一樣,循環變量是一個局部變量,在使用時不需要預先聲明,它會根據取值范圍自動遞增或遞減。如:FORiIN1
TO5GENERATE --遞增方式FORiIN5
DOWNTO1GENERATE--遞減方式需要注意的是,從軟件運行的角度看,FOR…GENERATE語句的循環變量雖然有順序性,但最終結果是完全并行的。FOR…GENERATE語句主要用來描述設計中的一些有規律的81IF…GENERATE的語法結構為:IF…GENERATE語句主要用于描述含有例外情況的相同結構,比如某些寄存器中邊界寄存器的描述。它的執行情況是:在條件為“真”時,才執行結構內部的并行語句,功能與IF語句類似。不同的是:在這里不允許使用ELSE。IF…GENERATE的語法結構為:IF…GENERATE語82【例4.2.6】用D觸發器組成的4位移位寄存器【例4.2.6】用D觸發器組成的4位移位寄存器83圖4-3用元件例化語句實現4位移位寄存器的RTL圖圖4-4用生成語句實現4位移位寄存器的RTL圖圖4-3用元件例化語句實現4位移位寄存器的RTL圖圖4-84
塊語句是由一系列并行執行語句構成的組合體,它的功能是將結構體中的并行語句組成一個或多個模塊。
這種方式可以把只用于該電路模塊的信號、元件、進程、常量等封裝起來形成只屬于該模塊特有的局部元素。
因為在不同的塊中定義的信號互不干擾,使得整個設計工作更加容易實現,同時程序代碼的維護性、可讀性都能得到提高。
在小型電路設計時,一般不需要采用塊語句。
從綜合的角度看,BLOCK語句的存在毫無意義,因為將設計實體劃分成多個塊,只是形式上的改變并非功能上的改變。確切地說,BLOCK語句不屬于功能描述語句,無論是否存在BLOCK語句,設計實體的邏輯功能不會有任何變化。但衛式塊語句用于同步時序電路時更直觀些。4.2.5塊語句 塊語句是由一系列并行執行語句構成的組合體,它的功能是將結85簡單塊語句的語法結構為:衛式塊語句的語法結構為:所謂衛式語句指的是前面有關鍵字GUARDED的并行語句,如【例4-17】中“q<=GUARDEDd;”。簡單塊語句的語法結構為:衛式塊語句的語法結構為:所謂衛式語句86【例4-16】用塊語句來實現加減法運算電路【例4-16】用塊語句來實現加減法運算電路87第四章VHDL典型語句課件884.4程序包、配置4.4.1程序包一個完整的程序包一般由程序包首和程序包體兩部分組成。程序包的一般語法結構為:注意:我們先講程序包4.4程序包、配置4.4.1程序包程序包的一般語法結構為定義程序包的一般語句格式:PACKAGE程序包名ISTypeDeclarationSubtypeDeclarationConstantDeclarationComponentDeclarationSubprogramDeclarationEND程序包名;PACKAGEBODY程序包名ISTypeDeclarationSubtypeDeclarationConstantDeclarationFunctionDeclarationProcedureDeclarationFunctionBodyProcedureBodyComponentDeclarationSubprogramDeclarationEND程序包名;定義程序包的一般語句格式:PACKAGE程序包名IS
程序包首說明部分完成的功能是為程序包定義接口,可以完成對程序包中的數據類型進行說明、元件說明、子程序、常量和信號說明等。另外,程序包首中的說明語句是對外可見的,這一點與實體說明語句的功能十分類似。不同的是程序包首說明部分用來指定那些數據類型、子程序、常量和信號等對外可見;而實體說明部分則只用來指定哪些信號對外可見。 程序包體說明部分完成程序包的實際功能,即具體地描述實現在程序包首說明部分定義的函數、過程功能和數據的賦值,其方式與結構體描述方法相同。 如果僅僅是定義數據類型或定義數據對象等內容,程序包體是不必要的,程序包首可以獨立使用。但是在程序包中若有子程序說明,則必須有對應的子程序包體,這時子程序內容必須放在程序包體中。 程序包首說明部分完成的功能是為程序包定義接口,可以完成對程【例4-23】程序包說明語句的舉例【例4-23】程序包說明語句的舉例
(1)程序包也是VHDL語言編寫的,因而可以保存為.vhd的文件類型(也可以不保存,放在程序前面),在本例中被保存為add_pack.vhd。 (2)本例中程序包首說明部分只包含元件說明,實際上還可以包括數據類型說明、信號說明、子程序說明等。 (3)add_pack程序包是用戶自定義的,如果沒有指定給特定的庫,編譯以后就會自動地加到WORK庫的目錄中,注意:如果add_pack不在當前的工程中,則必須加入到當前工程中,才能用WORK庫打開。WORK庫并不是這個目錄的目錄名,而是一個邏輯名,是指當前的工作目錄,綜合器將指示器指向該目錄的路徑。
并且WORK庫是自動打開的,如要使用該程序包,則用如下格式調用:USEwork.add_pack.all; (1)程序包也是VHDL語言編寫的,因而可以保存為.vh
在設計實體前定義并立即使用的程序包示例。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;PACKAGEseg7IS
TYPEbcdISINTEGERRANGE0TO9;
SUBTYPEsegmentsISSTD_LOGIC_VECTOR(0TO6);ENDseg7;USEWORK.seg7.ALL;
ENTITYbcd_to_segmentsIS
PORT( input:INbcd; drive:OUTsegments );ENDbcd_to_segments;
在設計實體前定義并立即使用的程序包示例。LIBRARYIARCHITECTUREbevOFbcd_to_segmentsISBEGIN
WITHinputSELECT drive<=b"0000001"WHEN0,
b"1001111"WHEN1,
b"0010010"WHEN2,
b"0000110"WHEN3,
b"1001100"WHEN4,
b"0010010"WHEN5,
b"0010000"WHEN6,
b"0001111"WHEN7,
b"0000000"WHEN8,
b"0001100"WHEN9,
b"1111111"WHEN
OTHERS;ENDbev;ARCHITECTUREbevOFbcd_to_seg第四章VHDL典型語句課件
LIBRARYIEEE;
--程序包首
USEIEEE.std_logic_1164.all;USEIEEE.std_logic_arith.all;PACKAGESTD_LOGIC_UNSIGNEDisfunction"+"(L:STD_LOGIC_VECTOR;R:INTEGER)returnSTD_LOGIC_VECTOR;function"+"(L:INTEGER;R:STD_LOGIC_VECTOR)returnSTD_LOGIC_VECTOR;function"+"(L:STD_LOGIC_VECTOR;R:STD_LOGIC
)returnSTD_LOGIC_VECTOR;functionSHR(ARG:STD_LOGIC_VECTOR;COUNT:STD_LOGIC_VECTOR)returnSTD_LOGIC_VECTOR;...endSTD_LOGIC_UNSIGNED;
LIBRARYIEEE;--程序包首
LIBRARYIEEE;--程序包體useIEEE.std_logic_1164.all;useIEEE.std_logic_arith.all;packagebodySTD_LOGIC_UNSIGNEDisfunction"+"(L:STD_LOGIC_VECTOR;R:INTEGER)
returnSTD_LOGIC_VECTORisVariableresult:STD_LOGIC_VECTOR(L’range);Beginresult:=UNSIGNED(L)+R;returnstd_logic_vector(result);end;...endSTD_LOGIC_UNSIGNED;LIBRARYIEEE;--程序包體
VHDL語言中,過程(Procedure)和函數(Function)統稱為子程序。
結構上,它們和介紹過的進程十分相似,內部都是包含順序語句的VHDL代碼,但在函數中禁止進行信號聲明和使用元件例化語句。
然而從應用的角度來看,PROCESS與FUCTION或PROCEDURE之間有著本質的區別。
PROCESS是直接在主代碼段中使用的,而后者主要是為了建庫而使用的,目的是存儲常用的VHDL代碼,以達到代碼重用和共享的目的。
當然,如果需要,過程(Procedure)和函數(Function)也可以在主代碼中直接建立并使用。
函數和進程很相似,相同的順序語句既可以在進程中,也可以在函數中(除WAIT語句除外)。4.3子程序VHDL語言中,過程(Procedure)和函數99
1.函數語句的語法結構
(1)函數首和函數體函數首的語法結構為:函數體的語法結構為: 函數首的語法結構為:函數體的語法結構為:100 參數的數據類型可以是常量、信號這兩類數據對象,變量不能作為參數,同時參數不能指定取值范圍;另外,函數只有一個返回值,格式中的數據類型用來定義返回值的數據類型。 FUNCTIONf1(a,b:INTEGER;SIGNAL
c:STD_LOGIC_VECTOR)RETURNBOOLEAN; 一個名為“f1”的函數,該函數接收3個參數(a、b和c)。
a和b是常量(注意關鍵字CONSTANT可以省略),c是信號。a和b都是INTEGER類型的,這里不能使用RANGE和DOWNTO等來約束輸入參數的取值范圍;輸出參數只有一個(而且只能是一個)是BOOLEAN類型的。 參數的數據類型可以是常量、信號這兩類數據對象,變量不能作為101 函數首是函數的索引,由函數名、參數表和返回值的數據類型三部分組成。 函數體包含一個對數據類型、常量、變量等的局部說明,以及用于完成規定算法或轉換的順序語句部分。一旦函數被調用,就執行這部分語句。 函數首是函數的索引,由函數名、參數表和返回值的數據類型三部1021、為了進行有效的代碼分割、代碼重用和代碼共享,函數存放在程序包中。2、在程序包首的說明部分定義函數首,在包體中存放函數體。3、當函數在程序包中定義時,函數首、函數體都是必須的,同時程序包首和程序包體也都是必須的。1、為了進行有效的代碼分割、代碼重用和代碼共享,函數存1032.函數調用函數調用語句在程序中通常是作為表達式或語句的一部分,其調用格式如下:【例4.3.1】函數在程序包中定義并被結構體調用的舉例2.函數調用函數調用語句在程序中通常是作為表達式或語句的一104ENDFUNCTIONmin_1;--函數體定義結束ENDpackmin;--包體定義結束----------------------------------------------------------------------------------------------------------------------LIBRARYIEEE;--文件名為expmin.vhdUSEIEEE.STD_LOGIC_1164.ALL;USEWORK.packmin.ALL;--調用包packminENTITYexpminISPORT(a1,b1:INstd_logic_vector(3downto0);
y1:OUTstd_logic_vector(3downto0));endexpmin;architecturestrofexpminisbeginy1<=min_1(a1,b1);--調用包中函數min_1endstr;ENDFUNCTIONmin_1;105
函數也可以存放在主代碼中(即可以存放在實體中,也可以存放在結構體中)。
當函數定義在結構體中,應把函數定義在結構體的說明部分。當函數放在主代碼中,函數首是可以省略的,函數體是必須的。函數也可以存放在主代碼中(即可以存放在實體中,也可以存106函數在結構體中定義并調用的舉例LIBRARYIEEE;--文件名為min-fun-1.vhdUSEIEEE.STD_LOGIC_1164.ALL;ENTITYmin_fun_1isPORT(a,b:INSTD_LOGIC_VECTOR(7DOWNTO0); y:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDmin_fun_1;ARCHITECTUREstrOFmin_fun_1ISFUNCTIONmin(c,d:STD_LOGIC_VECTOR(7DOWNTO0))
--函數體min的定義RETURNSTD_LOGIC_VECTORIS--函數首省略 BEGIN--函數完成的功能是求兩個數中的最小值 IF(c<d)THENRETURNc; ELSE RETURNd; ENDIF;ENDmin;--函數體定義結束BEGIN y<=min(a,b);--調用函數minENDstr;函數在結構體中定義并調用的舉例LIBRARYIEEE;107 注意:VHDL語言中的函數調用不同于計算機語言中的函數調用,計算機語言中的函數調用,僅是一種軟件行為,多次調用不會產生附加的電路,而VHDL語言中的函數調用則不同,因為綜合后的函數將映射成目標芯片中的一個相應的電路模塊,而且調用多少次就映射成多少個同一結構的模塊,隨著函數調用次數的增加,綜合結果所占用資源將不斷增加。因此,在VHDL程序設計中,要盡量控制子程序的調用次數,最大程度節省資源。 注意:VHDL語言中的函數調用不同于計算機語言中的函數調用108 3.函數的重載
VHDL中,可以對已經使用過的函數(表現形式當然是函數名),進行多次重新定義,這樣的函數被稱之為重載函數(OverloadedFunction)。
新定義的同名函數中所定義的操作數的數據類型是各不相同的,函數調用時系統會根據調用要求的操作數的數據類型,自動分辨不同功能的同名函數。 3.函數的重載VHDL中,可以對已經使用過的函數109LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;PACKAGESTD_LOGIC_UNSIGNEDIS--定義包首
FUNCTION“+”(L,R:STD_LOGIC_VECTOR)--定義函數首
RETURNSTD_LOGIC_VECTOR;FUNCTION“+”(L:STD_LOGIC_VECTOR;R:INTEGER)--定義函數首
RETURNSTD_LOGIC_VECTOR; …ENDpackmin;--包首定義結束PACKAGEBODYpackminis--定義包體FUNCTION“+”(L,R:STD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTORIS … END;FUNCTION“+”(L:STD_LOGIC_VECTOR;R:INTEGER)RETURN
STD_LOGIC_VECTORIS … END;…ENDpackmin;--包體定義結束LIBRARYIEEE;110【例4-20】重載函數min_1在程序包中的定義及調用的示例LIBRARYIEEE;--文件名為packmin.vhdUSEIEEE.STD_LOGIC_1164.ALL;PACKAGEpackminIS--定義包首FUNCTIONmin_1(a,b:INSTD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTOR;
--定義函數首FUNCTIONmin_1(a,b:ININTEGER)RETURNINTEGER;
--定義函數首ENDpackmin;--包首定義結束PACKAGEBODYpackminis--定義包體FUNCTIONmin_1(a,b:INSTD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTORIS BEGIN--定義函數體 IFa<bthenRETURNa; ELSERETURNb; ENDIF; ENDFUNCTIONmin_1;--函數體定義結束【例4-20】重載函數min_1在程序包中的定義及調用的示111FUNCTIONmin_1(a,b:ININTEGER)RETURNINTEGERIS--定義函數體
begin IFa<bthenRETURNa; ELSERETURNb; ENDIF; ENDFUNCTIONmin_1;--函數體定義結束ENDpackmin;--包體定義結束LIBRARYIEEE;
--文件名為expmin.vhdUSEIEEE.STD_LOGIC_1164.ALL;USEWORK.packmin.ALL;--調用包packminENTITYexpminIS PORT(a1,b1:INstd_logic_vector(3downto0); y1:OUTstd_logic_vector(3downto0)); a2,b2:ININTEGERRANGE13downto0; y2:OUTINTEGERRANGE13downto0);endexpmin;architecturestrofexpminis begin y1<=min_1(a1,b1);--調用包中函數min_1y2<=min_1(a2,b2);endstr;FUNCTIONmin_1(a,b:ININTEGE1124.3.2過程
過程與函數一樣,都是VHDL中的子程序,也分為過程首和過程體,分別放置在程序包首和程序包體中供VHDL程序共享。過程是一種語句結構而函數是表達式的一部分;過程可以單獨存在,而函數只是作為語句的一部分;過程有輸入參數、輸出參數和雙向參數,而函數入口處的所有參數都是輸入參數;過程通過調用可以從其端口界面獲得多個返回值,而函數調用后只能返回一個值。4.3.2過程過程與函數一樣,都是VHDL中的子程序,1131.過程語句的語法結構(1)過程首過程體過程首由過程名和參數表組成。過程首的語法結構為:過程體由說明部分、順序語句組成。過程體的語法結構為:1.過程語句的語法結構(1)過程首過程體過程首
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 山東工程職業技術大學《中外兒童文學名著鑒賞》2023-2024學年第一學期期末試卷
- 山東商業職業技術學院《高級劍橋商務英語》2023-2024學年第二學期期末試卷
- 濟南護理職業學院《電工電子技能訓練》2023-2024學年第二學期期末試卷
- 山東省濰坊市教科所2025屆高考原創信息試卷歷史試題(七)含解析
- 江蘇省南通市通州、海安2025屆高三下學期第十二周周測(2)數學試題含解析
- 九江市德安縣2025年三年級數學第二學期期末達標檢測模擬試題含解析
- 晉中市重點中學2024-2025學年高考最后沖刺模擬(一)語文試題含解析
- 深圳職業技術大學《工程結構荷載與可靠度》2023-2024學年第一學期期末試卷
- 西寧第十四中學2024-2025學年高三生物試題三模卷含解析
- 上海市楊浦區2025年初三下學期第一次聯合考試語文試題含解析
- 藥品經營使用和質量監督管理辦法2024年宣貫培訓課件
- DL∕T 1094-2018 電力變壓器用絕緣油選用導則
- DZ∕T 0173-2022 大地電磁測深法技術規程(正式版)
- 國家開放大學《合同法》章節測試參考答案
- 工廠5S檢查評分評價基準表(全)
- 以“政府績效與公眾信任”為主題撰寫一篇小論文6篇
- CSD恒速傳動裝置
- 美的空調制造工藝手冊(共220頁)
- 天醫門符法修煉與祝由移病法
- 皮膚營養美容
- 干部個人廉潔檔案樣表.doc
評論
0/150
提交評論