第17講 VHDL主要描述語句_case語句_第1頁
第17講 VHDL主要描述語句_case語句_第2頁
第17講 VHDL主要描述語句_case語句_第3頁
第17講 VHDL主要描述語句_case語句_第4頁
第17講 VHDL主要描述語句_case語句_第5頁
已閱讀5頁,還剩113頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第16講 VHDL的主要描述語句 VHDL順序語句 VHDL并行語句 本講知識點:VHDL順序描述語句變量賦值語句Variable Evaluate信號賦值語句Signal EvaluateWAIT語句IF 語句VHDL順序語句 順序語句是指完全按照程序中書寫的順序執(zhí)行各語句。 順序描述語句只能出現(xiàn)在進程或子程序中,用來定義進程或子程序的算法。順序語句可以用來進行算術(shù)運算、邏輯運算、信號和變量的賦值、子程序調(diào)用等,還可以進行條件控制和迭代。VHDL順序語句主要包括:變量賦值語句Variable Evaluate信號賦值語句Signal EvaluateWAIT語句IF 語句CASE 語句LOO

2、P 語句NEXT 語句EXIT 語句RETURN 語句過程調(diào)用語句Procedure Call斷言語句AssertREPORT 語句 NULL 語句變量賦值語句變量賦值語句語法格式為: 變量賦值目標(biāo) := 賦值表達(dá)式 例:PROCESSsVARIABLE count:INTEGER := 0 -變量說明 BEGIN count := s+1 -變量賦值 END PROCESS; 對于數(shù)組賦值,可采用以下格式: VARIABLE x,y: STD_LOGIC_VECTOR ( 0 TO 3 ); x := “1011; y ( 0 TO 1 ) := “01; y ( 2 TO 3 ) := x

3、 ( 1 TO 2 ); -整體賦值,數(shù)組“1011賦值x -局部賦值,“01賦值y的局部位 -位置關(guān)聯(lián)賦值,x的局部位賦值y的局部位 信號賦值具有延時性、全局性,賦值符用“=表示。信號賦值語句 格式: 目標(biāo)信號名:= 賦值源; 該語句是將賦值源的當(dāng)前值賦給目標(biāo)信號。要求賦值號兩邊信號量的類型和長度應(yīng)該一致。 例如: Y =1; X = Y; A = B AND C;- 字符賦值,信號Y被賦值為1- 信號賦值,將信號Y的當(dāng)前值賦給目標(biāo)信號X- 表達(dá)式賦值,將B和C的與邏輯賦給目標(biāo)信號A 對于數(shù)組賦值,可采用以下格式: SIGNAL x,y: STD_LOGIC_VECTOR ( 0 TO 3

4、); x = “1011; y ( 0 TO 1 ) = “01; y ( 2 TO 3 ) = x ( 1 TO 2 ); 當(dāng)在同一進程中,同一信號賦值目標(biāo)有多個賦值源時,信號賦值目標(biāo)獲得的是最后一個賦值源的賦值,其前面相同的賦值目標(biāo)不作任何變化-整體賦值,數(shù)組“1011賦值x -局部賦值,“01賦值y的局部位 -位置關(guān)聯(lián)賦值,x的局部位賦值y的局部位 SIGNAL A,B, C, D :STD_LOGIC:SIGNAL S: STD_LOGIC_VECTOR( 1 TO 4)VARIABLE E, F :STD_LOGIC;VARIABLE G :STD_LOGIC_VECTOR(1 TO

5、 2 );VARIABLE H :STD_LOGIC_VECTOR(1 TO 4 );S = (0,1,0,0) ;(A, B, C, D) = S ; -位置關(guān)聯(lián)方式賦值 位置關(guān)聯(lián)賦值和名字關(guān)聯(lián)賦值A(chǔ) =0;B =1;C =0 ;D E, 4=F, 2 =G(1),1=G(2) ):= H;G(2) := H(1) ;G(1) := H(2) ; E := H(3) ;F := H(4) ;WAIT語句等待WAIT語句在進程或過程中使用,用于程序的暫停和等待 。當(dāng)進程執(zhí)行到等待語句時,就將被掛起并設(shè)置好再次執(zhí)行的條件。WAIT語句可以設(shè)置4種不同的條件:無限等待、時間到、條件滿足以及敏感信號

6、量變化。1WAIT -無限等待語句這種形式的WAIT語句在關(guān)鍵字“WAIT后面不帶任何信息,是無限等待的情況。2WAIT ON 信號表 -敏感信號等待語句 這種形式的WAIT語句使進程暫停,直到敏感信號表中某個信號值發(fā)生變化。WAIT ON語句后面跟著的信號表,在敏感信號表中列出等待語句的敏感信號。當(dāng)進程處于等待狀態(tài)時,其中敏感信號發(fā)生任何變化都將結(jié)束掛起,再次啟動進程。 例A PROCESS BEGINy = a AND b;WAIT ON a,b;END PROCESS;例BPROCESSa,bBEGINy = a AND b; END PROCESS; 在例A中執(zhí)行所有語句后,進程將在W

7、AIT語句處被掛起,直到a或b中任何一個信號發(fā)生變化,進程才重新開始。例A與例B是等價的。 需要注意的是,在使用WAIT ON語句的進程中,敏感信號量應(yīng)寫在進程中的WAIT ON語句后面;而在不使用WAIT ON語句的進程中,敏感信號量應(yīng)在開頭的關(guān)鍵詞PROCESS后面的敏感信號表中列出。VHDL規(guī)定,已列出敏感信號表的進程不能使用任何形式的WAIT語句。 3WAIT UNTIL 條件 -條件等待語句 這種形式的WAIT語句使進程暫停,直到預(yù)期的條件為真。WAIT UNTIL后面跟的是布爾表達(dá)式,在布爾表達(dá)式中隱式地建立一個敏感信號量表,當(dāng)表中任何一個信號量發(fā)生變化時,就立即對表達(dá)式進行一次測

8、評。如果其結(jié)果使表達(dá)式返回一個“真值,那么進程脫離掛起狀態(tài),繼續(xù)執(zhí)行下面的語句。即WAIT UNTIL語句需滿足以下條件:在條件表達(dá)式中所含的信號發(fā)生了變化;此信號改變后,且滿足WAIT UNTIL語句中表達(dá)式的條件。這兩個條件缺一不可,且必須按照上述順序來完成。 WAIT UNTIL語句有以下三種表達(dá)方式: WAIT UNTIL 信號 = VALUE; WAIT UNTIL 信號EVENT AND信號 = VALUE; WAIT UNTIL 信號STABLE AND信號 = VALUE;例如: WAIT UNTIL clock = 1; WAIT UNTIL rising_edgeclk;

9、WAIT UNTIL clk =1AND clk EVENT; WAIT UNTIL NOT clk STABLE AND clk= 1; 4WAIT FOR 時間表達(dá)式 -超時等待語句 例如:WAIT FOR 40 ns; 在該語句中,時間表達(dá)式為常數(shù)40ns,當(dāng)進程執(zhí)行到該語句時,將等待40ns,經(jīng)過40ns之后,進程執(zhí)行WAIT FOR的后繼語句。例如:WAIT FORa*b+c; 在此語句中,a*b+c為時間表達(dá)式,WAIT FOR語句在執(zhí)行時,首先計算表達(dá)式的值,然后將計算結(jié)果返回作為該語句的等待時間。 IF語句 在VHDL語言中,IF語句的作用是根據(jù)指定的條件來確定語句的執(zhí)行順序。

10、IF語句可用于選擇器、比較器、編碼器、譯碼器、狀態(tài)機等的設(shè)計,是VHDL語言中最常用的語句之一。IF語句按其書寫格式可分為以下3種。 1.單項選擇擇控制語句這類語句書寫格式為: IF 條件 THEN 順序語句 END IF; 例: 利用IF語句引入D觸發(fā)器LIBRARY IEEE;USE IEEE. STD_LOGIC_1164.ALL;ENTITY dff IS PORTclk,d:IN STD_LOGIC; q:OUT STD_LOGIC);END dff;ARCHITECTURE rtl OF dff IS BEGIN PROCESS (clk) BEGIN IF (clkEVENT A

11、ND clk=1) THEN q = d; END IF; END PROCESS; END rtl; 練習(xí):用單項選擇擇實現(xiàn)求兩數(shù)中的較大數(shù)。 輸入:整數(shù)a,b; 輸出:較大數(shù)C 2.二選一控制語句這種語句的書寫格式為: TF 條件 THEN 順序語句 ELSE 順序語句 END IF; 假設(shè)條件句的邏輯值為真,那么執(zhí)行THEN后面的順序語句,否那么執(zhí)行ELSE后面的順序語句。例:二選一電路結(jié)構(gòu)體的描述P100 例4-15ARCHITECTURE rtl OF mux2 ISBEGIN PROCESS (a,b,s) BEGIN IF (s =1) THEN c = a; ELSE c =

12、b; END IF; END PROCESS; END rtl; 練習(xí):用二選一結(jié)構(gòu)實現(xiàn)求兩數(shù)中的較大數(shù)。 輸入:整數(shù)a,b; 輸出:較大數(shù)C3.多項選擇擇控制語句這種語句的書寫格式為:IF 條件 THEN 順序語句 ELSIF 順序語句 ELSIF 順序語句 ELSE 順序語句 END IF; 這種多項選擇擇控制的IF語句,它設(shè)置了多個條件,當(dāng)滿足所設(shè)置的多個條件之一時,就執(zhí)行該條件后的順序處理語句。當(dāng)所有設(shè)置的條件都不滿足時,程序執(zhí)行ELSE和END IF之間的順序處理語句。 例: 利用多項選擇控制語句設(shè)計的四選一多路選擇器例4-16LIBRARY IEEE;USE IEEE. STD_L

13、OGIC_1164.ALL;ENTITY mux4 IS PORTinput:IN STD_LOGIC_VECTOR (3 DOWNTO 0); sel:IN STD_LOGIC_VECTOR (1 DOWNTO 0); y:OUT STD_LOGIC);END mux4;ARCHITECTURE rtl OF mux4 ISBEGIN PROCESS (input,sel) BEGIN IF (sel=“00) THEN y= input0; ELSIFsel=“01THEN y= input1; ELSIFsel=“10THEN y= input2; ELSE y0) 0 (X=0) -1

14、 (X 順序語句, WHEN 條件選擇值 = 順序語句,END CASE; 注意:條件句中的“=不是操作符,它相當(dāng)于THEN作用。 功能:先計算表達(dá)式的值,然后根據(jù)條件句中的選擇值執(zhí)行相對應(yīng)的順序語句。其中WHEN條件選擇值可以有四種表達(dá)方式; 單個普通數(shù)值,如:5; 數(shù)值選擇范圍,如:1 TO 3); 并列值,如:4 | 6,表示取值為4或6; WHEN OTHERS = 順序語句使用CASE語句需注意以下幾點: 選擇值必須在表達(dá)式的取值范圍內(nèi); CASE語句中至少要包含一個WHEN語句; 每個選擇值只能出現(xiàn)一次,不能在其他WHEN語句中重復(fù)出現(xiàn); 除非所有選擇值能完全覆蓋CASE語句中的表

15、達(dá)式的取值,否那么最后一個條件句的選擇值必須用“OTHERS表示。 選擇值可以顛倒次序,但OTHERS必須放在最后; “=不是操作符,相當(dāng)于THEN語句的作用。 例1 CASE語句使用CASE command IS WHEN “00= c c c c NULL; -無效END CASE;例2 CASE語句使用CASE sel IS WHEN 1TO 9 = c c c out1 out1 out1 out1= 0; END CASE; CASE與IF比較 與IF語句相比,CASE語句組的程序語句是沒有先后順序的,所有表達(dá)式的值都并行處理。IF語句是有序的,先處理最起始、最優(yōu)先的條件,后處理次優(yōu)

16、先的條件。LOOP語句LOOP語句就是循環(huán)語句,它可以使包含的一組順序語句被循環(huán)執(zhí)行,其執(zhí)行的次數(shù)由設(shè)定的循環(huán)參數(shù)決定。 LOOP語句有三種格式: FOR_LOOP語句 WHILE_LOOP語句 單個LOOP語句 FOR_LOOP語句主要用于循環(huán)次數(shù)的循環(huán)程序設(shè)計??煞譃檫f增方式和遞減方式。 FOR_LOOP語句 循環(huán)標(biāo)號: FOR 循環(huán)變量 IN 初值 TO 終值 LOOP 順序語句; END LOOP 循環(huán)標(biāo)號; 遞增格式: 遞減格式:循環(huán)標(biāo)號: FOR 循環(huán)變量 IN 初值 DOWNTO 終值 LOOP 順序語句; END LOOP 循環(huán)標(biāo)號; 說明:循環(huán)從循環(huán)變量的“初值開始,到“終值

17、結(jié)束,每執(zhí)行一次循環(huán)體中的順序語句后,循環(huán)變量的值遞增或遞減1。 FOR_LOOP語句 循環(huán)標(biāo)號為任選項,用來給循環(huán)語句定位。 循環(huán)變量的初值和終值決定了循環(huán)次數(shù)取整數(shù)。 循環(huán)次數(shù): 循環(huán)次數(shù) = |終值-初值|+1 【例】用FOR_LOOP語句描述八位奇偶校驗器。 輸入信號X是一個長度為8位的標(biāo)準(zhǔn)邏輯矢量。當(dāng)X中1的個數(shù)為奇數(shù)時,輸出Y=1,否那么,Y=0。 算法:用FOR_LOOP語句對X的值逐位進行異或運算。 循環(huán)次數(shù):由循環(huán)變量n控制,記錄異或運算的次數(shù)。 循環(huán)變量的初值為0,終值為7。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY

18、 loop1 IS PORTX: IN STD_LOGIC_VECTOR7 DOWNTO 0; Y: OUT STD_LOGIC; END loop1; ARCHITECTURE example4 OF loop1 IS BEGIN PROCESS ( X ) VARIABLE temp: STD_LOGIC; BEGIN temp :=0; FOR n IN 7 DOWNTO 0 LOOP temp := temp XOR X( n ); END LOOP; Y = temp; END PROCESS; END example4; WHILE_LOOP語句是一種條件循環(huán)語句,用于循環(huán)次數(shù)未知

19、的循環(huán)程序設(shè)計。 WHILE_LOOP語句 循環(huán)標(biāo)號: WHILE 循環(huán)控制條件 LOOP 順序語句; END LOOP 循環(huán)標(biāo)號; 格式:說明:假設(shè)循環(huán)控制條件為“真,那么進行循環(huán)執(zhí)行順序語句; 假設(shè)循環(huán)控制條件為“假,那么結(jié)束循環(huán)。 【例】用WHILE_LOOP語句描述八位奇偶校驗器。 ARCHITECTURE example5 OF loop2 IS BEGIN PROCESS ( X ) VARIABLE temp: STD_LOGIC; VARIABLE n: INTEGER; BEGIN temp :=0; n := 0; WHILE n 8 LOOP temp := temp X

20、OR X( n ); n := n+1; END LOOP; Y10; END LOOP L2;- 控制語句,當(dāng)A大 于10時,跳出循環(huán) 例2:loop1:LOOP WAIT UNTIL clk=1; q = d AFTER 2 ns;END LOOP loop1; NEXT語句是一種循環(huán)控制語句,通常嵌套在LOOP語句中使用,用于進行有條件或無條件的控制執(zhí)行程序的轉(zhuǎn)向。 NEXT語句 NEXT 循環(huán)標(biāo)號 WHEN 條件表達(dá)式 ; 格式: 根據(jù)可選項,NEXT語句有三種格式: NEXT語句 格式1: NEXT 功能:無條件結(jié)束本次循環(huán),跳回到循環(huán)體的開始位置,執(zhí)行下一次循環(huán)。 格式2: NEX

21、T 循環(huán)標(biāo)號 功能:無條件結(jié)束本次循環(huán),從循環(huán)標(biāo)號規(guī)定的位置,執(zhí)行下一次循環(huán)。 格式3: NEXT WHEN 條件表達(dá)式 功能:有條件結(jié)束本次循環(huán),當(dāng)條件表達(dá)式滿足時,結(jié)束本次循環(huán),否那么繼續(xù)循環(huán)。 【例】用NEXT_WHEN語句實現(xiàn)單循環(huán)。 ARCHITECTURE example6 OF NEXT_WHEN1 IS BEGIN PROCESS ( s ) VARIABLE i: INTEGER; BEGIN L1: FOR i IN 7 DOWNTO 0 LOOP y( i ) =0; NEXT WHEN s( i ) =1; y( i ) =1; END LOOP L1; END PRO

22、CESS; END example6;- 假設(shè)s( i )=1成立, 終止本次循環(huán),返回到L1 否那么,繼續(xù)本次循環(huán)。 - 返回到L1 EXIT語句和NEXT語句一樣,都是循環(huán)控制語句,主要在LOOP語句中使用,用于進行有條件或無條件的跳轉(zhuǎn)控制。EXIT語句 EXIT 循環(huán)標(biāo)號 WHEN 條件表達(dá)式 ; 格式: 根據(jù)可選項,EXIT語句有三種格式: EXIT語句 格式1: EXIT 功能:無條件跳出循環(huán),從END LOOP下面的語句開始執(zhí)行。 格式2: EXIT 循環(huán)標(biāo)號 功能:無條件跳出循環(huán),從循環(huán)標(biāo)號規(guī)定的位置開始執(zhí)行循環(huán)體外的語句。 格式3: EXIT WHEN 條件表達(dá)式 功能:有條件

23、跳出循環(huán),當(dāng)條件表達(dá)式不成立時,繼續(xù)執(zhí)行循環(huán),否那么跳出循環(huán)。 【例】用EXIT語句實現(xiàn)兩個數(shù)組的比較。 PROCESS ( X, Y ) BEGIN Z =“00; FOR n IN 7 DOWNTO 0 LOOP IF ( X( n )= Y( n ) THEN NEXT; ELSIF ( X( n ) Y( n ) ) THEN Z =“01; EXIT; ELSE Z Y時,Z=10;當(dāng)X bTHEN tmp := a; ELSE tmp := b; END IF; END maximum; BEGIN y y y y y NULL; END CASE; END PROCESS;END

24、 behave;上例是通過對用于選通8位總線的四選一多路選擇器進行功能描述,具體說明NULL語句的使用。過程調(diào)用語句Procedure Call與其他高級程序設(shè)計語言相似,VHDL提供了子程序的概念。其中在進程、函數(shù)和過程中,可以使用過程調(diào)用語句,此時它是一種順序語句。一個過程被調(diào)用時將去執(zhí)行它的過程體。過程調(diào)用語句的書寫格式為:過程名實參表; 例:LIBRARY IEEE;USE IEEE. STD_LOGIC_1164.ALL;USE IEEE. STD_LOGIC_UNSIGNED.ALL;ENTITY max IS PORTin1:IN STD_LOGIC_VECTOR (7 DOWN

25、TO 0); in2:IN STD_LOGIC_VECTOR (7 DOWNTO 0); in3:IN STD_LOGIC_VECTOR (7 DOWNTO 0); q:OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );END max ; ARCHITECTURE rtl OF max IS PROCEDURE maximuma,b:IN STD_LOGIC_VECTOR; c:OUT STD_LOGIC_VECTORIS VARIABLE temp:STD_LOGIC_VECTORaRANGE;BEGIN IFa bTHEN temp := a; ELSE temp :

26、= b; END IF; c := temp; END maximum; BEGIN PROCESSin1,in2,tmp1VARIABLE tmp1,tmp2:STD_LOGIC_VECTOR (7 DOWNTO 0) ; BEGIN maximumin1,in2,tmp1; - -過程調(diào)用 maximumtmp1,in3,tmp2; q = tmp2; END PROCESS;END rtl;上例是一個取三個輸入位矢量最大值的功能描述,它在結(jié)構(gòu)體中的進程語句中使用了兩個過程調(diào)用語句。 斷言語句Assert斷言語句分為順序斷言語句和并行斷言語句,順序斷言語句主要用于進程、函數(shù)和過程仿真、調(diào)試

27、中的人機對話,它可以給出一個文字串作為警告和錯誤信息。斷言語句的書寫格式如下:ASSERT 條件 REPORT 報告信息 SEVERITY 出錯級別;在執(zhí)行過程中,斷言語句對條件布爾表達(dá)式的真假進行判斷,如果條件為“TURE,那么向下執(zhí)行另外一條語句;如果條件為“FALSE,那么輸出錯誤信息和錯誤嚴(yán)重程度的級別。在REPORT后面跟著的是設(shè)計者寫的字符串,通常是說明錯誤的原因,字符串要用雙引號括起來。SEVERITY后面跟著的是錯誤嚴(yán)重程度的級別,他們分別是: NOTE注意WARNING警告ERROR錯誤FAILURE失敗假設(shè)REPORT子句缺省,那么默認(rèn)消息為“Assertion viola

28、tion;假設(shè)SEVERITY子句缺省,那么出錯級別的默認(rèn)值為“ERROR。 例: RS觸發(fā)器的VHDL描述中斷言語句的使用LIBRARY IEEE;USE IEEE. STD_LOGIC_1164.ALL;ENTITY rsff IS PORTs :IN BIT; r :IN BIT; q :OUT BIT; qb :OUT BIT;END rsff;ARCHITECTURE rtl OF rsff ISBEGIN PROCESSs,rVARIABLE last_state :BIT; BEGIN ASSERTNOTs =1AND r =1 REPORT “Both s and r equa

29、l to1. SEVERITY ERROR; IFs =0AND r =0THEN last_state := last_state; ELSIFs =0AND r =1THEN last_state := 0; ELSE last_state := 1; END IF; q = last_state; qb = notlast_state;END PROCESS;END rtl; 上例中,如果 r 和 s 都為1時,表示一種不定狀態(tài)。在進程中先是設(shè)定了一條斷言語句,目的是:當(dāng)判斷 r 和 s 都為1時,輸出終端將顯示字符串“Both s and r equal to1.,同時可能終止模擬過程

30、,并顯示錯誤的嚴(yán)重程度。接下來用IF語句判別觸發(fā)器的其他三種情況,最后將值送到觸發(fā)器的兩個輸出端口上。 REPORT 語句 REPORT語句不增加硬件任何功能,但提供順序斷言語句的短格式,在仿真時使用REPORT語句可以提高程序的可讀性。REPORT語句的書寫格式為:REPORT 輸出信息 SEVERITY 出錯級別;例: RS觸發(fā)器的VHDL描述中REPORT語句的使用 (本例中,用REPORT語句代替上例進程中的斷言語句。) LIBRARY IEEE;USE IEEE. STD_LOGIC_1164.ALL;ENTITY rsff IS PORTs :IN BIT; r :IN BIT;

31、q :OUT BIT; qb :OUT BIT;END rsff;ARCHITECTURE rtl OF rsff ISBEGINPROCESSs,rVARIABLE last_state :BIT;BEGIN IFs =1AND r =1THEN REPORT “Both s and r equal to1.; ELSIF s =0AND r =0THEN last_state:= last_state; ELSIF s =0AND r =1THEN last_state := 0; ELSE last_state := 1; END IF; q = last_state; qb = not

32、last_state;END PROCESS;END rtl; 在VHDL中,并行語句在結(jié)構(gòu)體中的執(zhí)行是同時并發(fā)執(zhí)行的,其書寫次序與其執(zhí)行順序并無關(guān)聯(lián),并行語句的執(zhí)行順序是由他們的觸發(fā)事件來決定的。我們知道,實際的硬件系統(tǒng)中很多操作都是并發(fā)的,因此在對系統(tǒng)進行模擬時就要把這些并發(fā)性表達(dá)出來,并行語句正是用來表示這種并發(fā)行為的。在結(jié)構(gòu)體語句中,并行語句的位置是:ARCHITECTURE 結(jié)構(gòu)體名 OF 實體名 IS 說明語句 BEGIN 并行語句 END 結(jié)構(gòu)體名;VHDL并行語句 其中并行語句主要有以下幾種:PROCESS -進程語句BLOCK -塊語句CONCURRENT SIGNAL AS

33、SIGNMENT -并行信號代入語句CONDITIONAL SIGNAL ASSIGNMENT - -條件信號代入語句SELECTIVE SIGNAL ASSIGNMENT - -選擇信號代入語句CONCURRENT PROCEDURE CALL -并行過程調(diào)用語句ASSERT - -并行斷言語句GENERIC - -參數(shù)傳遞語句COMPONENT_INSTANT -元件例化語句GENERATE -生成語句并行描述語句語句可以是結(jié)構(gòu)性的,也可以是行為性的。下面對這些語句的應(yīng)用加以介紹。進程語句PROCESS進程語句是最主要的并行語句,它在VHDL程序設(shè)計中使用頻率最高,也是最能表達(dá)硬件描述語言

34、特點的一條語句。進程語句的內(nèi)部是是順序語句,而進程語句本身是一種并行語句。進程語句的綜合是比較復(fù)雜的,主要涉及這樣一些問題:綜合后的進程是用組合邏輯電路還是用時序邏輯電路來實現(xiàn)?進程中的對象是否有必要用存放器、觸發(fā)器、鎖存器或是RAM等存儲器件來實現(xiàn)。進程語句結(jié)構(gòu)中至少需要一個敏感信號量,否那么除了初始化階段,進程永遠(yuǎn)不會被再次激活。這個敏感量一般是一個同步控制信號,同步控制信號用在同步語句中,同步語句可以是敏感信號表、WAIT UNTIL語句或是WAIT ON語句。一般來說,只有一個同步點或者是具有多個同步點但都使用完全相同的同步控制信號的進程不需要“記憶在哪一個同步點上被掛起時,不會形成存

35、儲器。如下例所示: -綜合后不需要存儲器的VHDL進程label1:PROCESSa,b,c BEGIN -其中沒有其他同步描述AND PROCESS label1;-綜合后需要存儲器的VHDL進程label2:PROCESS BEGIN WAIT UNTIL clkEVENT AND clk=1; s =0; WAIT UNTIL clkEVENT AND clk=1; s =1;AND PROCESS label2; -不會形成存儲器的變量label3:PROCESSa,b,c VARIABLE var:BIT;BEGIN var := a XOR b; s state := go; WH

36、EN go = state := stop;- -這兩個語句是并發(fā)關(guān)系 END CASE;AND PROCESS label4;-綜合為觸發(fā)器的進程label5:PROCESSBEGIN WAIT UNTIL clkEVENT AND clk=1; q = d;END PROCESS label5; 塊語句BLOCK塊BLOCK語句可以看作是結(jié)構(gòu)體中的子模塊,塊語句把許多并行語句組合在一起形成一個子模塊,而它本身也是一個并行語句。塊語句的根本結(jié)構(gòu)如下:塊標(biāo)號: BLOCK 保護表達(dá)式類屬子句 類屬接口表;;端口子句 端口接口表;;塊說明局部BEGIN END BLOCK 塊標(biāo)號; 例: 利用塊

37、語句描述的全加器LIBRARY IEEE;USE IEEE. STD_LOGIC_1164.ALL;ENTITY add IS PORTA:IN STD_LOGIC; B:IN STD_LOGIC; Cin:IN STD_LOGIC; Co:OUT STD_LOGIC; S:OUT STD_LOGIC;END add;ARCHITECTURE dataflow OF add ISBEGIN ex : BLOCK PORTa_A:IN STD_LOGIC; a_B:IN STD_LOGIC; a_Cin:IN STD_LOGIC; a_Co:OUT STD_LOGIC; a_S:OUT STD_

38、LOGIC; PORT MAPa_A=A,a_B=B,a_Cin= Cin, a_Co= Co,a_S=S; SIGNAL tmp1,tmp2:STD_LOGIC; BEGIN label1:PROCESSa_A,a_B BEGIN tmp1= a_A XOR a_B; END PROCESS label1; label2:PROCESStmp1,a_Cin BEGIN tmp2= tmp1AND a_Cin ; END PROCESS label2; label3:PROCESStmp1,a_Cin BEGIN a_S = tmp1XOR a_Cin ; END PROCESS label3

39、; label4:PROCESSa_A,a_B,tmp2 BEGIN a_Co = tmp2 ORa_A AND a_B; END PROCESS label4; END BLOCK ex;END dataflow; 在上面的例子中,結(jié)構(gòu)體內(nèi)含有4個進程語句,這4個進程語句是并行關(guān)系,共同形成了一個塊語句。 在實際應(yīng)用中,一個塊語句中又可以包含多個子塊語句,這樣循環(huán)嵌套以形成一個大規(guī)模的硬件電路。 并行信號代入語句信號代入語句有兩種:一種是在結(jié)構(gòu)體中的進程內(nèi)使用,此時它作為一種順序語句出現(xiàn);另一種是在結(jié)構(gòu)體的進程之外使用,此時它是一種并行語句,因此稱之為并行信號代入語句。并行信號代入語句的語法

40、格式為: 信號量 = 敏感信號量表達(dá)式;需要注意的是,一條信號代入語句與一個信號代入的進程語句是等價的,我們可以把一條信號代入語句改寫成一個信號代入的進程語句。 例:LIBRARY IEEE;USE IEEE. STD_LOGIC_1164.ALL;ENTITY and_gat IS PORTa:IN STD_LOGIC; b:IN STD_LOGIC; y:OUT STD_LOGIC;END and_gat;ARCHITECTURE behave OF and_gat ISBEGIN y = a AND b; -并行信號代入語句在結(jié)構(gòu)體進程之外AND behave;本例是一個2輸入與門的VH

41、DL描述,在結(jié)構(gòu)體中使用了并行信號代入語句。下面是2輸入與門的另一種VHDL描述,在描述的結(jié)構(gòu)體中采用了與上述并行信號代入語句等價的進程語句。 例:LIBRARY IEEE;USE IEEE. STD_LOGIC_1164.ALL;ENTITY and_gat IS PORTa:IN STD_LOGIC; b:IN STD_LOGIC; y:OUT STD_LOGIC;END and_gat;ARCHITECTURE behave OF and_gat ISBEGIN PROCESS a,b BEGIN y = a AND b; -進程語句( 順序語句) AND PROCESS;AND beh

42、ave; 通過對上述兩個例子的分析可見:從并行信號代入語句描述來看,當(dāng)代入符號“=右邊的值發(fā)生任何變化時,信號代入語句的操作立即執(zhí)行,將信號代入符號“=右邊的表達(dá)式代入給左邊的信號量;從進程語句的描述來看,當(dāng)進程敏感信號表中的敏感信號量發(fā)生變化時,進程將被啟動,順序信號代入語句將被執(zhí)行以完成信號的代入操作。在VHDL中提供了三種并行信號代入語句:并發(fā)信號代入語句條件信號代入語句 選擇信號代入語句 (1) 并發(fā)信號代入語句信號代入語句在進程內(nèi)部執(zhí)行時,它是一種順序語句;信號代入語句在結(jié)構(gòu)體的進程之外出現(xiàn)時,它作為并發(fā)語句的形式出現(xiàn)。作為并發(fā)信號代入語句,在結(jié)構(gòu)體中他們是并行執(zhí)行的,他們的執(zhí)行順序

43、與書寫無關(guān)。并發(fā)信號代入語句是靠事件驅(qū)動的。對于并發(fā)信號代入語句來說,只有代入符號“=右邊的對象有事件發(fā)生時才會執(zhí)行該語句。在實際設(shè)計中,并發(fā)信號代入語句常用來進行加法器、乘法器、除法器和比較器等多種邏輯電路的描述。下面是一個用VHDL并發(fā)語句描述的全加器的例子。 例:LIBRARY IEEE;USE IEEE. STD_LOGIC_1164.ALL;ENTITY add IS PORTA:IN STD_LOGIC; B:IN STD_LOGIC; Cin:IN STD_LOGIC; Co:OUT STD_LOGIC; S:OUT STD_LOGIC;END add;ARCHITECTURE

44、dataflow OF add IS SIGNAL tmp1,tmp2:STD_LOGIC;BEGIN tmp1 = A XOR B; tmp2 = tmp1 AND Cin; -4條并發(fā)信號代入語句 S = tmp1 XOR Cin; Co = tmp2 ORA AND B;AND dataflow;在上例的結(jié)構(gòu)體中有4條并發(fā)信號代入語句,他們的執(zhí)行順序與書寫順序是無關(guān)的,因此上面的4條并發(fā)信號代入語句可以任意顛倒書寫順序,不會對執(zhí)行結(jié)果產(chǎn)生任何影響。上面提到的并發(fā)信號代入語句是事件驅(qū)動的,例如: tmp2 = tmp1 AND Cin; S = tmp1 XOR Cin;兩條語句,只要tm

45、p1 和 Cin中的值有一個發(fā)生變化,即有事件發(fā)生,那么這兩條語句就會立即并發(fā)執(zhí)行。 (2)條件信號代入語句條件信號代入語句也是一種并發(fā)描述語句,它是一種根據(jù)不同條件將不同的表達(dá)式代入目的信號的語句。條件信號代入語句的書寫格式為:目的信號 = 表達(dá)式1 WHEN 條件1 ELSE 表達(dá)式2 WHEN 條件2 ELSE 表達(dá)式2 WHEN 條件3 ELSE 表達(dá)式n-1 WHEN 條件 ELSE 表達(dá)式;條件信號代入語句執(zhí)行時要先進行條件判斷,如果條件滿足,就將條件前面的那個表達(dá)式的值代入目的信號;如果不滿足條件,就去判斷下一個條件;最后一個表達(dá)式?jīng)]有條件,也就是說在前面的條件都不滿足時,就將該

46、表達(dá)式的值代入目的信號。 下面的例子是用條件信號代入語句來描述的七段顯示譯碼器例: 采用條件代入語句描述的七段顯示譯碼器LIBRARY IEEE;USE IEEE. STD_LOGIC_1164.ALL;ENTITY se7 IS PORTinput:IN STD_LOGIC_VECTOR (3 DOWNTO 0); output:OUT STD_LOGIC_VECTOR (6 DOWNTO 0);END se7;ARCHITECTURE rtl OF se7 ISBEGIN output =0,1,1,1,1,1,1) WHEN input =“0000ELSE 0,0,0,0,1,1,0W

47、HEN input =“0001ELSE 1,0,1,1,0,1,1WHEN input =“0010ELSE 1,0,0,1,1,1,1WHEN input =“0011ELSE1,1,0,0,1,1,0WHEN input =“0100ELSE1,1,0,1,1,0,1WHEN input =“0101ELSE1,1,1,1,1,0,1WHEN input =“0110ELSE0,0,0,0,1,1,1WHEN input =“0111ELSE1,1,1,1,1,1,1WHEN input =“1000ELSE1,1,0,1,1,1,1WHEN input =“1001ELSE 1,1,1

48、,0,1,1,1WHEN input =“1010ELSE1,1,1,1,1,0,0WHEN input =“1011ELSE0,1,1,1,0,0,1WHEN input =“1100ELSE1,0,1,1,1,1,0WHEN input =“1101ELSE1,1,1,1,0,0,1WHEN input =“1110ELSE1,1,1,0,0,0,1WHEN input =“1111ELSE0,0,0,0,0,0,0; - -滅燈END rtl; 在上例中,七段顯示譯碼器有一個輸入端口input和一個輸出端口output。輸入端口input是一個四位總線,表示3到0的四位邏輯向量,表示輸入

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

50、 表達(dá)式n WHEN 條件n;VHDL在執(zhí)行選擇信號代入語句時,目的信號是根據(jù)表達(dá)式的當(dāng)前值來進行表達(dá)式代入的。當(dāng)表達(dá)式的值符合某個條件時,就把該條件前的表達(dá)式代入目的信號;當(dāng)表達(dá)式的值不符合條件時,語句就繼續(xù)向下判斷,直到找到滿足的條件為止。選擇信號代入語句與case語句相類似,都是對表達(dá)式進行測試,當(dāng)表達(dá)式的值不同時,將把不同的表達(dá)式代入目的信號。需要注意的是,選擇信號代入語句與case語句一樣,必須把表達(dá)式的值在條件中都列出來,否那么編譯將會出錯。 下面的例子是一個采用選擇信號代入語句描述的選通8位總線的四選一多路選擇器。例:LIBRARY IEEE;USE IEEE. STD_LOGI

51、C_1164.ALL;ENTITY mux4 IS PORTd0:IN STD_LOGIC_VECTOR (7 DOWNTO 0); d1:IN STD_LOGIC_VECTOR (7 DOWNTO 0); d2:IN STD_LOGIC_VECTOR (7 DOWNTO 0); d3:IN STD_LOGIC_VECTOR (7 DOWNTO 0); s0:IN STD_LOGIC; s1:IN STD_LOGIC; q:OUT STD_LOGIC_VECTOR (7 DOWNTO 0);END mux4;ARCHITECTURE rtl OF mux4 IS SIGNAL comb:STD

52、_LOGIC_VECTOR (1 DOWNTO 0);BEGIN comb = s1 & s0; WITH comb SELECT - -用comb進行選擇 q b) THEN temp := a; ELSE temp := b; END IF; c = temp; END maximun; SIGNAL tmp1,tmp2:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);BEG maximunin1,in2,tmp1; maximuntmp1,in3,tmp2; q = tmp2;END rtl; 并行斷言語句并行斷言語句的書寫格式為:ASSERT 條件 REPORT 報告

53、信息 SEVERITY 出錯級別并行斷言語句的書寫格式與順序斷言語句的書寫格式相同。順序斷言語句只能用在進程、函數(shù)和過程中,而并行斷言語句用在結(jié)構(gòu)體中。任何并行斷言語句都對應(yīng)著一個等價的被動進程語句,被動進程語句沒有輸出,因此并行斷言語句的執(zhí)行不會引起任何事件的發(fā)生,只是在斷言條件為“false時給出一條信息報告。 例:LIBRARY IEEE;USE IEEE. STD_LOGIC_1164.ALL;USE IEEE. STD_LOGIC_UNSIGNED.ALL;ENTITY example ISEND example;ARCHITECTURE behave OF example IS S

54、IGNAL comb: STD_LOGIC_VECTOR(1 DOWNTO 0);BEGIN ASSERT FALSE REPORT“This entity is a example to descript assert statement SEVERITY NOTE;END behave; 參數(shù)傳遞語句參數(shù)傳遞語句GENERIC主要用來傳遞信息給設(shè)計實體的某個具體元件,如用來定義端口寬度、器件延遲時間等參數(shù)后并將這些參數(shù)傳遞給設(shè)計實體。使用參數(shù)傳遞語句易于使設(shè)計具有通用性,例如,在設(shè)計中有一些參數(shù)不能確定,為了簡化設(shè)計和減少VHDL程序的書寫,我們通常編寫通用的VHDL程序。在設(shè)計程序中,這

55、些參數(shù)是待定的,在模擬時,只要用GENERIC語句將待定參數(shù)初始化即可。參數(shù)傳遞語句的書寫格式為:GENERIC類屬表;例:LIBRARY IEEE;USE IEEE. STD_LOGIC_1164.ALL;ENTITY and2 IS GENERICDELAY:TIME:= 10 ns; PORTa:IN STD_LOGIC; b:IN STD_LOGIC; c:OUT STD_LOGIC;END and2;ARCHITECTURE behave OF and2 ISBEGIN c = a AND b AFTERDELAY;END behave; 元件例化語句元件例化就是將預(yù)先設(shè)計好的設(shè)計實

56、體定義為一個元件,然后利用映射語句將此元件與當(dāng)前設(shè)計實體中的指定端口相連,從而為當(dāng)前設(shè)計實體引入了一個低一級的設(shè)計層次。在結(jié)構(gòu)體中,描述只表示元件或模塊和元件或模塊之間的互連,就象網(wǎng)表一樣。當(dāng)引用庫中不存在的元件時,必須首先進行元件的創(chuàng)立,然后將其放在工作庫中,通過調(diào)用工作庫來引用元件。在引用元件時,要先在結(jié)構(gòu)體中說明局部進行元件的說明,然后在使用元件時進行元件例化。元件例化語句也是一種并行語句,各個例化語句的執(zhí)行順序與例化語句的書寫順序無關(guān),而是按照驅(qū)動的事件并行執(zhí)行的。在進行元件例化時,首先要進行例化元件的說明,元件說明局部使用COMPONENT語句,COMPONENT語句用來說明在結(jié)構(gòu)體

57、中所要調(diào)用的模塊。如果所調(diào)用的模塊在元件庫中并不存在時,設(shè)計人員必須首先進行元件的創(chuàng)立,然后將其放在工作庫中通過調(diào)用工作庫來引用該元件。COMPONENT語句的一般書寫格式如下: COMPONENT GENERIC ; PORT ; END COMPONENT; - -元件說明語句在上面的書寫結(jié)構(gòu)中,保存字COMPONENT后面的“引用元件名用來指定要在結(jié)構(gòu)體中例化的元件,該元件必須已經(jīng)存在于調(diào)用的工作庫中;如果在結(jié)構(gòu)體中要進行參數(shù)傳遞,在COMPONENT語句中,就要有傳遞參數(shù)的說明,傳遞參數(shù)的說明語句以保存字GENERIC開始;然后是端口說明,用來對引用元件的端口進行說明;最后以保存字EN

58、D COMPONENT來結(jié)束 COMPONENT語句。 如果在結(jié)構(gòu)體中要引用上例中所定義的帶延遲的二輸入與門,首先在結(jié)構(gòu)體中要用COMPONENT語句對該元件進行說明,說明如下:COMPONENT and2GENERICDELAY:TIME; PORTa:IN STD_LOGIC; b:IN STD_LOGIC; c:OUT STD_LOGIC;END COMPONENT;用COMPONENT語句對要引用的元件進行說明之后,就可以在結(jié)構(gòu)體中對元件進行例化以使用該元件。元件例化語句的書寫格式為: GENERIC MAP參數(shù)映射PORT MAP端口映射; 標(biāo)號名是此元件例化的唯一標(biāo)志,在結(jié)構(gòu)體中標(biāo)

59、號名應(yīng)該是唯一的,否那么編譯時將會給出錯誤信息;接下來就是映射語句,映射語句就是把元件的參數(shù)和端口與實際連接的信號對應(yīng)起來,以進行元件的引用。VHDL提供了兩種映射方法:位置映射和名稱映射。位置映射就是PORT MAP語句中實際信號的書寫順序與COMPONENT語句中端口說明中的信號書寫順序保持一致,如下例所示: 位置映射例如:LIBRARY IEEE;USE IEEE. STD_LOGIC_1164.ALL;ENTITY example IS PORTin1,in2:IN STD_LOGIC;out:OUT STD_LOGIC;END example; ARCHITECTURE struct

60、ure OF example IS COMPONENT and2GENERICDELAY:TIME; PORTa:IN STD_LOGIC; b:IN STD_LOGIC; c:OUT STD_LOGIC;END COMPONENT;BEGIN U1 : and2 GENERIC MAP10 ns - -參數(shù)映射 PORT MAPin1,in2,out; - -端口映射END structure; 標(biāo)號名 元件名元件例化在上例中,元件U1 的端口 a 映射到信號in1,端口 b 映射到信號in2,端口c 映射到信號 out。 元件說明 名稱映射就是在PORT MAP語句中將引用的元件的端口信號

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論