主要描述語句.ppt_第1頁
主要描述語句.ppt_第2頁
主要描述語句.ppt_第3頁
主要描述語句.ppt_第4頁
主要描述語句.ppt_第5頁
已閱讀5頁,還剩100頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

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

2、語句分為順序執(zhí)行語句(Sequential)和并行執(zhí)行語句(Parallel)。,VHDL順序語句主要包括: 變量賦值語句(Variable Evaluate) 信號(hào)賦值語句(Signal Evaluate) WAIT語句 IF 語句 CASE 語句 LOOP 語句 NEXT 語句 EXIT 語句 RETURN 語句 NULL 語句 過程調(diào)用語句(Procedure Call) 斷言語句(Assert) REPORT 語句,變量賦值語句 變量賦值語句語法格式為: 變量賦值目標(biāo) := 賦值表達(dá)式,例: VARIABLE s:BIT := 0; PROCESS(s) VARIABLE count:

3、INTEGER := 0 -變量說明 BEGIN count := s+1 -變量賦值 END PROCESS;,信號(hào)賦值語句 在VHDL語言中,用符號(hào)“=”為信號(hào)賦值。 信號(hào)賦值語句的規(guī)范書寫格式如下: 目的信號(hào)量 = TRANSPORTINERTIAL信號(hào)變量表達(dá)式; 其中TRANSPORT表示傳輸延遲,INERTIAL表示慣性延遲。要求“=”兩邊的信號(hào)變量類型和位長度應(yīng)該一致。 例: s =TRANSPORT t AFTER 10ns; d = INERTIAL 2 AFTER 3ns, 1 AFTER 8ns;,例:s = a NOR(b AND c); 3個(gè)敏感量a,b,c中任何一個(gè)

4、發(fā)生變化,該語句都將被執(zhí)行。,WAIT語句 WAIT語句在進(jìn)程中起到與敏感信號(hào)一樣重要的作用,敏感信號(hào)觸發(fā)進(jìn)程的執(zhí)行,WAIT語句同步進(jìn)程的執(zhí)行,同步條件由WAIT語句指明。進(jìn)程在仿真運(yùn)行中處于執(zhí)行或掛起兩種狀態(tài)之一。當(dāng)進(jìn)程執(zhí)行到等待語句時(shí),就將被掛起并設(shè)置好再次執(zhí)行的條件。WAIT語句可以設(shè)置4種不同的條件:無限等待、時(shí)間到、條件滿足以及敏感信號(hào)量變化。這幾類WAIT語句可以混合使用?,F(xiàn)分別介紹如下:,(1)WAIT -無限等待語句 這種形式的WAIT語句在關(guān)鍵字“WAIT”后面不帶任何信息,是無限等待的情況。,(2)WAIT ON 信號(hào)表 -敏感信號(hào)等待語句 這種形式的WAIT語句使進(jìn)程暫

5、停,直到敏感信號(hào)表中某個(gè)信號(hào)值發(fā)生變化。WAIT ON語句后面跟著的信號(hào)表,在敏感信號(hào)表中列出等待語句的敏感信號(hào)。當(dāng)進(jìn)程處于等待狀態(tài)時(shí),其中敏感信號(hào)發(fā)生任何變化都將結(jié)束掛起,再次啟動(dòng)進(jìn)程。,例A PROCESS BEGIN y = a AND b; WAIT ON a,b; END PROCESS; 例B PROCESS(a,b) BEGIN y = a AND b; END PROCESS;,在例A中執(zhí)行所有語句后,進(jìn)程將在WAIT語句處被掛起,直到a或b中任何一個(gè)信號(hào)發(fā)生變化,進(jìn)程才重新開始。例A與例B是等價(jià)的。,需要注意的是,在使用WAIT ON語句的進(jìn)程中,敏感信號(hào)量應(yīng)寫在進(jìn)程中的WA

6、IT ON語句后面;而在不使用WAIT ON語句的進(jìn)程中,敏感信號(hào)量應(yīng)在開頭的關(guān)鍵詞PROCESS后面的敏感信號(hào)表中列出。VHDL規(guī)定,已列出敏感信號(hào)表的進(jìn)程不能使用任何形式的WAIT語句。,(3)WAIT UNTIL 條件 -條件等待語句 這種形式的WAIT語句使進(jìn)程暫停,直到預(yù)期的條件為真。WAIT UNTIL后面跟的是布爾表達(dá)式,在布爾表達(dá)式中隱式地建立一個(gè)敏感信號(hào)量表,當(dāng)表中任何一個(gè)信號(hào)量發(fā)生變化時(shí),就立即對(duì)表達(dá)式進(jìn)行一次測評(píng)。如果其結(jié)果使表達(dá)式返回一個(gè)“真”值,則進(jìn)程脫離掛起狀態(tài),繼續(xù)執(zhí)行下面的語句。即WAIT UNTIL語句需滿足以下條件: 在條件表達(dá)式中所含的信號(hào)發(fā)生了變化; 此

7、信號(hào)改變后,且滿足WAIT UNTIL語句中表達(dá)式的條件。 這兩個(gè)條件缺一不可,且必須按照上述順序來完成。,WAIT UNTIL語句有以下三種表達(dá)方式: WAIT UNTIL 信號(hào) = VALUE; WAIT UNTIL 信號(hào)EVENT AND信號(hào) = VALUE; WAIT UNTIL 信號(hào)STABLE AND信號(hào) = VALUE; 例如: WAIT UNTIL clock = “1”; WAIT UNTIL rising_edge(clk); WAIT UNTIL clk =1AND clk EVENT; WAIT UNTIL NOT clk STABLE AND clk= “1”;,一般

8、的,在一個(gè)進(jìn)程中使用了WAIT語句后,綜合器會(huì)綜合產(chǎn)生時(shí)序邏輯電路。時(shí)序邏輯電路的運(yùn)行依賴WAIT UNTIL表達(dá)式的條件,同時(shí)還具有數(shù)據(jù)存儲(chǔ)的功能。,(4)WAIT FOR 時(shí)間表達(dá)式 -超時(shí)等待語句 例如:WAIT FOR 40 ns; 在該語句中,時(shí)間表達(dá)式為常數(shù)40ns,當(dāng)進(jìn)程執(zhí)行到該語句時(shí),將等待40ns,經(jīng)過40ns之后,進(jìn)程執(zhí)行WAIT FOR的后繼語句。 例如:WAIT FOR(a*(b+c); 在此語句中,(a*(b+c)為時(shí)間表達(dá)式,WAIT FOR語句在執(zhí)行時(shí),首先計(jì)算表達(dá)式的值,然后將計(jì)算結(jié)果返回作為該語句的等待時(shí)間。,IF語句 在VHDL語言中,IF語句的作用是根據(jù)指

9、定的條件來確定語句的執(zhí)行順序。IF語句可用于選擇器、比較器、編碼器、譯碼器、狀態(tài)機(jī)等的設(shè)計(jì),是VHDL語言中最常用的語句之一。IF語句按其書寫格式可分為以下3種。,1.門閂控制語句 這類語句書寫格式為: IF 條件 THEN 順序語句 END IF;,當(dāng)程序執(zhí)行到這種門閂控制型IF語句時(shí),首先判斷語句中所指定的條件是否成立。如果條件成立,則程序繼續(xù)執(zhí)行IF語句中所含的順序處理語句;如果條件不成立,程序?qū)⑻^IF語句所包含的順序處理語句,而向下執(zhí)行IF的后繼語句。,例: 利用IF語句引入D觸發(fā)器 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY

10、 dff IS PORT(clk,d:IN STD_LOGIC; q:OUT STD_LOGIC); END dff; ARCHITECTURE rtl OF dff IS BEGIN PROCESS (clk) BEGIN IF (clkEVENT AND clk=1) THEN q = d; END IF; END PROCESS; END rtl;,2.二選一控制語句 這種語句的書寫格式為: TF 條件 THEN 順序語句 ELSE 順序語句 END IF;,當(dāng)IF條件成立時(shí),程序執(zhí)行THEN和ELSE之間的順序語句部分;當(dāng)IF語句的條件得不到滿足時(shí),程序執(zhí)行ELSE和END IF之間的

11、順序處理語句。即依據(jù)IF所指定的條件是否滿足,程序可以進(jìn)行兩條不同的執(zhí)行路徑。,例:二選一電路結(jié)構(gòu)體的描述 ARCHITECTURE rtl OF mux2 IS BEGIN PROCESS (a,b,s) BEGIN IF (s =1) THEN c = a; ELSE c = b; END IF; END PROCESS; END rtl;,3.多選擇控制語句 這種語句的書寫格式為: IF 條件 THEN 順序語句 ELSEIF 順序語句 ELSEIF 順序語句 ELSE 順序語句 END IF;,這種多選擇控制的IF語句,實(shí)際上就是條件嵌套。它設(shè)置了多個(gè)條件,當(dāng)滿足所設(shè)置的多個(gè)條件之一時(shí)

12、,就執(zhí)行該條件后的順序處理語句。當(dāng)所有設(shè)置的條件都不滿足時(shí),程序執(zhí)行ELSE和END IF之間的順序處理語句。,例: 利用多選控制語句設(shè)計(jì)的四選一多路選擇器 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY mux4 IS PORT(input: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 IS BEGIN PROCESS (input,se

13、l) BEGIN IF (sel=“00”) THEN y= input(0); ELSIF(sel=“01”)THEN y= input(1); ELSIF(sel=“10”)THEN y= input(2); ELSE y= input(3); END IF; END PROCESS; END rtl;,CASE語句 CASE語句根據(jù)滿足的條件直接選擇多項(xiàng)順序語句中的一項(xiàng)執(zhí)行,它常用來描述總線行為、編碼器、譯碼器等的結(jié)構(gòu)。 CASE語句的結(jié)構(gòu)為: CASE 表達(dá)式 IS WHEN 條件選擇值 = 順序語句, WHEN 條件選擇值 = 順序語句, END CASE; 其中WHEN條件選擇值可

14、以有四種表達(dá)方式; (1)單個(gè)普通數(shù)值,形如WHEN 選擇值 = 順序語句; (2)并列數(shù)值,形如WHEN 值/值/值 = 順序語句; (3)數(shù)值選擇范圍,形如WHEN 值TO值 = 順序語句; (4)WHEN OTHERS = 順序語句;,當(dāng)執(zhí)行到CASE語句時(shí),首先計(jì)算CASE和IS之間的表達(dá)式的值,然后根據(jù)條件語句中與之相同的選擇值,執(zhí)行對(duì)應(yīng)的順序語句,最后結(jié)束CASE語句。,使用CASE語句需注意以下幾點(diǎn): CASE語句中每一條語句的選擇值只能出現(xiàn)一次,即不能有相同選擇值的條件語句出現(xiàn)。 CASE語句執(zhí)行中必須選中,且只能選中所列條件語句中的一條,即CASE語句至少包含一個(gè)條件語句。

15、除非所有條件語句中的選擇值能完全覆蓋CASE語句中表達(dá)式的取值,否則最末一個(gè)條件語句中的選擇必須用“OTHERS”表示,它代表已給出的所有條件語句中未能列出的其他可能的取值。關(guān)鍵詞OTHERS只能出現(xiàn)一次,且只能作為最后一種條件取值。使用OTHERS是為了使條件語句中的所有選擇值能覆蓋表達(dá)式的所有取值,以免綜合過程中插入不必要的鎖存器。這一點(diǎn)對(duì)于定義為STD_LOGIC和STD_LOGIC_VECTOR數(shù)據(jù)類型的值尤為重要,因?yàn)檫@些數(shù)據(jù)對(duì)象的取值除了1、0之外,還可能出現(xiàn)輸入高阻態(tài)Z,不定態(tài)X等取值。,例1 CASE語句使用 CASE command IS WHEN “00”= c c c c

16、 NULL; -無效 END CASE; 例2 CASE語句使用 CASE sel IS WHEN 1TO 9 = c c c = 3; END CASE; 在例2中,第一個(gè)WHEN語句的意思是當(dāng)sel 的值是從1到9 中任意一個(gè)數(shù)值時(shí),信號(hào)c的值取1;第二個(gè)WHEN語句的意思是當(dāng)sel 的值為11或12兩者之一時(shí),信號(hào) c 的取值為2;第三個(gè)WHEN語句的意思是當(dāng)sel 的值不為前面兩種情況時(shí),信號(hào)c 的取值為3。,-適合4選1數(shù)據(jù)選擇器,例3 3-8譯碼器。 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY decoder3_8 IS P

17、ORT(a,b,c,g1,g2a,g2b:IN STD_LOGIC; y:OUT STD_LOGIC_VECTOR (7 DOWNTO 0); END decoder3_8; ARCHITECTURE rtl OF decoder3_8 IS SIGNAL indata:STD_LOGIC_VECTOR (2 DOWNTO 0); BEGIN indata = c USE IEEE. STD_LOGIC_1164.ALL; ENTITY parity_check IS PORT(a:IN STD_LOGIC_VECTOR (7 DOWNTO 0); y:OUT STD_LOGIC); END

18、parity_check ; ARCHITECTURE rtl OF parity_check IS BEGIN PROCESS(a) VARIABLE tmp:STD_LOGIC,BEGIN tmp:=0; FOR i IN 0 TO 7 LOOP tmp:= tmp XOR a(i); END LOOP; y = tmp; - -y=1,a為奇數(shù)個(gè)1。y=0, a為偶數(shù)個(gè)1。 END PROCESS; END rtl;,3.WHILE_LOOP語句 這種語句的書寫格式為: 標(biāo)號(hào): WHILE 條件 LOOP 順序處理語句 END LOOP標(biāo)號(hào); 在該LOOP語句中,沒有給出循環(huán)次數(shù)的范圍,

19、而是給出了循環(huán)執(zhí)行順序語句的條件;沒有自動(dòng)遞增循環(huán)變量的功能,而是在順序處理語句中增加了一條循環(huán)次數(shù)計(jì)算語句,用于循環(huán)語句的控制。循環(huán)控制條件為布爾表達(dá)式,當(dāng)條件為“真”時(shí),則進(jìn)行循環(huán),如果條件為“假”,則結(jié)束循環(huán)。,例:8位奇偶校驗(yàn)電路的WHILE_LOOP設(shè)計(jì)形式 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY parity_check IS PORT(a:IN STD_LOGIC_VECTOR (7 DOWNTO 0); y:OUT STD_LOGIC); END parity_check ; ARCHITECTURE behav O

20、F parity_check IS BEGIN PROCESS(a) VARIABLE tmp:STD_LOGIC,BEGIN tmp := 0; i := 0; WHILE (i 8)LOOP tmp := tmp XOR a(i); i := i+1; END LOOP; y = tmp; END PROCESS; END behav;,NEXT語句 NEXT語句的書寫格式為: NEXT標(biāo)號(hào)WHEN 條件 該語句主要用于LOOP語句內(nèi)部的循環(huán)控制。當(dāng)NEXT語句后不跟標(biāo)號(hào),NEXT語句作用于當(dāng)前最內(nèi)層循環(huán),即從LOOP語句的起始位置進(jìn)入下一個(gè)循環(huán)。若NEXT語句不跟WHEN 條件,NEXT

21、語句立即無條件跳出循環(huán)。,例:NEXT語句應(yīng)用舉例 WHILE data 1 LOOP data := data+1; NEXT WHEN data=3 - -條件成立而無標(biāo)號(hào),跳出循環(huán) data := data* data; END LOOP;,N1:FOR i IN 10 DOWNTO 1 LOOP N2:FOR j IN 0 TO i LOOP NEXT N1 WHEN i=j; - -條件成立,跳到N1處 matrix(i,j):= j*i+1; - -條件不成立,繼續(xù)內(nèi)層循環(huán)N2 END LOOP N2; END LOOP N1;,EXIT語句 EXIT語句的書寫格式為: EXITL

22、OOP標(biāo)號(hà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)號(hào)時(shí),表明跳到標(biāo)號(hào)處繼續(xù)執(zhí)行。含WHEN條件時(shí),如果條件為“真”,跳出LOOP語句;如果條件為“假”,則繼續(xù)執(zhí)行LOOP循環(huán)。 EXIT語句不含標(biāo)號(hào)和條件時(shí),表明無條件結(jié)束LOOP語句的執(zhí)行,因此,它為程序需要處理保護(hù)、出錯(cuò)和警告狀態(tài),提供了一種快捷、簡便的調(diào)試方法。,例兩個(gè)元素位矢量a、b進(jìn)行比較,當(dāng)發(fā)現(xiàn)a與b不同時(shí),跳出循環(huán)比較程序并報(bào)告比較結(jié)果。 SIGNA

23、L a,b:STD_LOGIC_VECTOR (0 TO 1); SIGNAL a_less_than_b:BOOLEAN; a_less_than_b = FALSE; FOR i IN 1TO 0 LOOP IF(a(i)=1AND b(i)=0)THEN a_less_than_b = FALSE; EXIT; ELSEIF(a(i)=0AND b(i)=1)THEN a_less_than_b = TRUE; EXIT; ELSE NULL END IF; END LOOP;,- - a1a0 與 b1b0比較大小,返回語句 RETURN RETURN語句是一段子程序結(jié)束后,返回主程序

24、的控制語句。它只能用于函數(shù)與過程體內(nèi),并用來結(jié)束當(dāng)前最內(nèi)層函數(shù)或過程體的執(zhí)行。 RETURN語句的書寫格式為: RETURN; RETURN 表達(dá)式;,例:在函數(shù)體中使用RETURN語句 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY example IS PORT(a,b:IN INTEGER; y:OUT INTEGER); END example ; ARCHITECTURE rtl OF example IS BEGIN PROCESS(a,b) FUNCTION maximum (a,b:INTEGER)RETURN INTEGE

25、R IS VARIABLE tmp:INTEGER;,BEGIN IF(a b)THEN tmp := a; ELSE tmp := b; END IF; END maximum; BEGIN y = maximum(a,b); END PROCESS; END rtl;,上例是一個(gè)對(duì)兩個(gè)輸入整數(shù)取最大值的功能描述,在結(jié)構(gòu)體的進(jìn)程中定義了一個(gè)取最大值的函數(shù)。在函數(shù)體中正是通過RETURN語句將比較得到的最大值返回的,并結(jié)束該函數(shù)體的執(zhí)行。,NULL語句 NULL語句是空操作語句,不完成任何操作,執(zhí)行NULL語句只是讓程序運(yùn)行流程走到下一個(gè)語句。 NULL語句的書寫格式為: NULL; NULL

26、語句常用于CASE語句中,利用NULL來表示所余的不用的條件下的操作行為,以滿足CASE語句對(duì)條件值全部列舉的要求。,例:采用NULL語句的四選一數(shù)據(jù)選擇器。 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY mux4 IS PORT(d0 :IN STD_LOGIC_VECTOR (7 DOWNTO 1); d1 :IN STD_LOGIC_VECTOR (7 DOWNTO 1); d2 :IN STD_LOGIC_VECTOR (7 DOWNTO 1); d3 :IN STD_LOGIC_VECTOR (7 DOWNTO 1); s0 :

27、IN STD_LOGIC; s1 :IN STD_LOGIC; y :OUT STD_LOGIC_VECTOR (7 DOWNTO 1) ); END mux4 ; ARCHITECTURE behave OF mux4 IS,BEGIN lable:PROCESS(d0,d1,d2,d3,s0,s1) VARIABLE tmp:INTEGER; BEGIN tmp := 0; IF(s0=1)THEN tmp := tmp+1; END IF; IF(s1=1)THEN tmp := tmp+2; END IF;,CASE tmp IS WHEN 0 = y y y y NULL; END

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

29、ORT(in1:IN STD_LOGIC_VECTOR (7 DOWNTO 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 maximum(a,b:IN STD_LOGIC_VECTOR; c:OUT STD_LOGIC_VECTOR)IS VARIABLE temp:STD_LOGIC_VECTOR(aRANGE

30、); BEGIN IF(a b)THEN temp := a; ELSE temp := b; END IF; c := temp; END maximum;,BEGIN PROCESS(in1,in2,tmp1) VARIABLE tmp1,tmp2:STD_LOGIC_VECTOR (7 DOWNTO 0) ; BEGIN maximum(in1,in2,tmp1); - -過程調(diào)用 maximum(tmp1,in3,tmp2); q = tmp2; END PROCESS; END rtl; 上例是一個(gè)取三個(gè)輸入位矢量最大值的功能描述,它在結(jié)構(gòu)體中的進(jìn)程語句中使用了兩個(gè)過程調(diào)用語句。,斷

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

32、 WARNING(警告) ERROR(錯(cuò)誤) FAILURE(失?。?若REPORT子句缺省,則默認(rèn)消息為“Assertion violation”;若SEVERITY子句缺省,則出錯(cuò)級(jí)別的默認(rèn)值為“ERROR”。,例: RS觸發(fā)器的VHDL描述中斷言語句的使用 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY rsff IS PORT(s :IN BIT; r :IN BIT; q :OUT BIT; qb :OUT BIT); END rsff; ARCHITECTURE rtl OF rsff IS BEGIN PROCESS(s,r)

33、 VARIABLE last_state :BIT;,BEGIN ASSERT(NOT(s =1AND r =1) REPORT “Both s and r equal to1.” SEVERITY ERROR; IF(s =0AND r =0)THEN last_state := last_state; ELSIF(s =0AND r =1)THEN last_state := 0; ELSE last_state := 1; END IF; q = last_state; qb = not(last_state); END PROCESS; END rtl;,上例中,如果 r 和 s 都為

34、1時(shí),表示一種不定狀態(tài)。在進(jìn)程中先是設(shè)定了一條斷言語句,目的是:當(dāng)判斷 r 和 s 都為1時(shí),輸出終端將顯示字符串“Both s and r equal to1.”,同時(shí)可能終止模擬過程,并顯示錯(cuò)誤的嚴(yán)重程度。接下來用IF語句判別觸發(fā)器的其他三種情況,最后將值送到觸發(fā)器的兩個(gè)輸出端口上。,REPORT 語句 REPORT語句不增加硬件任何功能,但提供順序斷言語句的短格式,在仿真時(shí)使用REPORT語句可以提高程序的可讀性。 REPORT語句的書寫格式為: REPORT 輸出信息 SEVERITY 出錯(cuò)級(jí)別; 例: RS觸發(fā)器的VHDL描述中REPORT語句的使用 (本例中,用REPORT語句代替

35、上例進(jìn)程中的斷言語句。),LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY rsff IS PORT(s :IN BIT; r :IN BIT; q :OUT BIT; qb :OUT BIT); END rsff; ARCHITECTURE rtl OF rsff IS BEGIN PROCESS(s,r) VARIABLE last_state :BIT;,BEGIN IF(s =1AND r =1)THEN REPORT “Both s and r equal to1.”; ELSIF (s =0AND r =0)THEN last_s

36、tate:= last_state; ELSIF (s =0AND r =1)THEN last_state := 0; ELSE last_state := 1; END IF; q = last_state; qb = not(last_state); END PROCESS; END rtl;,在VHDL中,并行語句在結(jié)構(gòu)體中的執(zhí)行是同時(shí)并發(fā)執(zhí)行的,其書寫次序與其執(zhí)行順序并無關(guān)聯(lián),并行語句的執(zhí)行順序是由他們的觸發(fā)事件來決定的。 我們知道,實(shí)際的硬件系統(tǒng)中很多操作都是并發(fā)的,因此在對(duì)系統(tǒng)進(jìn)行模擬時(shí)就要把這些并發(fā)性體現(xiàn)出來,并行語句正是用來表示這種并發(fā)行為的。 在結(jié)構(gòu)體語句中,并行語句的位置

37、是: ARCHITECTURE 結(jié)構(gòu)體名 OF 實(shí)體名 IS 說明語句 BEGIN 并行語句 END 結(jié)構(gòu)體名;,VHDL并行語句,其中并行語句主要有以下幾種: PROCESS -進(jìn)程語句 BLOCK -塊語句 CONCURRENT SIGNAL ASSIGNMENT -并行信號(hào)代入語句 CONDITIONAL SIGNAL ASSIGNMENT - -條件信號(hào)代入語句 SELECTIVE SIGNAL ASSIGNMENT - -選擇信號(hào)代入語句 CONCURRENT PROCEDURE CALL -并行過程調(diào)用語句 ASSERT - -并行斷言語句 GENERIC - -參數(shù)傳遞語句 CO

38、MPONENT_INSTANT -元件例化語句 GENERATE -生成語句 并行描述語句語句可以是結(jié)構(gòu)性的,也可以是行為性的。下面對(duì)這些語句的應(yīng)用加以介紹。,進(jìn)程語句(PROCESS) 進(jìn)程語句是最主要的并行語句,它在VHDL程序設(shè)計(jì)中使用頻率最高,也是最能體現(xiàn)硬件描述語言特點(diǎn)的一條語句。進(jìn)程語句的內(nèi)部是是順序語句,而進(jìn)程語句本身是一種并行語句。進(jìn)程語句的綜合是比較復(fù)雜的,主要涉及這樣一些問題:綜合后的進(jìn)程是用組合邏輯電路還是用時(shí)序邏輯電路來實(shí)現(xiàn)?進(jìn)程中的對(duì)象是否有必要用寄存器、觸發(fā)器、鎖存器或是RAM等存儲(chǔ)器件來實(shí)現(xiàn)。 進(jìn)程語句結(jié)構(gòu)中至少需要一個(gè)敏感信號(hào)量,否則除了初始化階段,進(jìn)程永遠(yuǎn)不會(huì)

39、被再次激活。這個(gè)敏感量一般是一個(gè)同步控制信號(hào),同步控制信號(hào)用在同步語句中,同步語句可以是敏感信號(hào)表、WAIT UNTIL語句或是WAIT ON語句。一般來說,只有一個(gè)同步點(diǎn)或者是具有多個(gè)同步點(diǎn)但都使用完全相同的同步控制信號(hào)的進(jìn)程不需要“記憶”在哪一個(gè)同步點(diǎn)上被掛起時(shí),不會(huì)形成存儲(chǔ)器。如下例所示:,-綜合后不需要存儲(chǔ)器的VHDL進(jìn)程 label1:PROCESS(a,b,c) BEGIN -其中沒有其他同步描述 AND PROCESS label1; -綜合后需要存儲(chǔ)器的VHDL進(jìn)程 label2:PROCESS BEGIN WAIT UNTIL clkEVENT AND clk=1; s =0

40、; WAIT UNTIL clkEVENT AND clk=1; s =1; AND PROCESS label2;,-不會(huì)形成存儲(chǔ)器的變量 label3:PROCESS(a,b,c) VARIABLE var:BIT; BEGIN var := a XOR b; s = var AND c; AND PROCESS label3; -需要存儲(chǔ)器的變量 label4:PROCESS TYPE state_table IS (stop,go); VARIABLE state:table_ state; BEGIN WAIT UNTIL clkEVENT AND clk=1;,CASE state

41、 IS - - state在賦值之前先被讀訪問 WHEN stop = state := go; WHEN go = state := stop;- -這兩個(gè)語句是并發(fā)關(guān)系 END CASE; AND PROCESS label4;,-綜合為觸發(fā)器的進(jìn)程 label5:PROCESS BEGIN WAIT UNTIL clkEVENT AND clk=1; q = d; END PROCESS label5;,塊語句(BLOCK) 塊(BLOCK)語句可以看作是結(jié)構(gòu)體中的子模塊,塊語句把許多并行語句組合在一起形成一個(gè)子模塊,而它本身也是一個(gè)并行語句。 塊語句的基本結(jié)構(gòu)如下: 塊標(biāo)號(hào): BLOC

42、K 保護(hù)表達(dá)式 類屬子句 類屬接口表;; 端口子句 端口接口表;; 塊說明部分 BEGIN END BLOCK 塊標(biāo)號(hào);,例: 利用塊語句描述的全加器 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY add IS PORT(A: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 IS BEGIN,ex : BLOCK PORT(a_A:IN STD_L

43、OGIC; a_B:IN STD_LOGIC; a_Cin:IN STD_LOGIC; a_Co:OUT STD_LOGIC; a_S:OUT STD_LOGIC); PORT MAP(a_A=A,a_B=B,a_Cin= Cin, a_Co= Co,a_S=S); SIGNAL tmp1,tmp2:STD_LOGIC; BEGIN label1:PROCESS(a_A,a_B) BEGIN tmp1= a_A XOR a_B; END PROCESS label1;,label2:PROCESS(tmp1,a_Cin) BEGIN tmp2= tmp1AND a_Cin ; END PROC

44、ESS label2; label3:PROCESS(tmp1,a_Cin) BEGIN a_S = tmp1XOR a_Cin ; END PROCESS label3; label4:PROCESS(a_A,a_B,tmp2) BEGIN a_Co = tmp2 OR(a_A AND a_B); END PROCESS label4; END BLOCK ex; END dataflow;,在上面的例子中,結(jié)構(gòu)體內(nèi)含有4個(gè)進(jìn)程語句,這4個(gè)進(jìn)程語句是并行關(guān)系,共同形成了一個(gè)塊語句。 在實(shí)際應(yīng)用中,一個(gè)塊語句中又可以包含多個(gè)子塊語句,這樣循環(huán)嵌套以形成一個(gè)大規(guī)模的硬件電路。,并行信號(hào)代入語句

45、信號(hào)代入語句有兩種:一種是在結(jié)構(gòu)體中的進(jìn)程內(nèi)使用,此時(shí)它作為一種順序語句出現(xiàn);另一種是在結(jié)構(gòu)體的進(jìn)程之外使用,此時(shí)它是一種并行語句,因此稱之為并行信號(hào)代入語句。 并行信號(hào)代入語句的語法格式為: 信號(hào)量 = 敏感信號(hào)量表達(dá)式; 需要注意的是,一條信號(hào)代入語句與一個(gè)信號(hào)代入的進(jìn)程語句是等價(jià)的,我們可以把一條信號(hào)代入語句改寫成一個(gè)信號(hào)代入的進(jìn)程語句。,例: LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY and_gat IS PORT(a:IN STD_LOGIC; b:IN STD_LOGIC; y:OUT STD_LOGIC); END an

46、d_gat; ARCHITECTURE behave OF and_gat IS BEGIN y = a AND b; -并行信號(hào)代入語句(在結(jié)構(gòu)體進(jìn)程之外) AND behave; 本例是一個(gè)2輸入與門的VHDL描述,在結(jié)構(gòu)體中使用了并行信號(hào)代入語句。下面是2輸入與門的另一種VHDL描述,在描述的結(jié)構(gòu)體中采用了與上述并行信號(hào)代入語句等價(jià)的進(jìn)程語句。,例: LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY and_gat IS PORT(a:IN STD_LOGIC; b:IN STD_LOGIC; y:OUT STD_LOGIC); END

47、 and_gat; ARCHITECTURE behave OF and_gat IS BEGIN PROCESS (a,b) BEGIN y = a AND b; -進(jìn)程語句( 順序語句) AND PROCESS; AND behave;,通過對(duì)上述兩個(gè)例子的分析可見:從并行信號(hào)代入語句描述來看,當(dāng)代入符號(hào)“=”右邊的值發(fā)生任何變化時(shí),信號(hào)代入語句的操作立即執(zhí)行,將信號(hào)代入符號(hào)“=”右邊的表達(dá)式代入給左邊的信號(hào)量;從進(jìn)程語句的描述來看,當(dāng)進(jìn)程敏感信號(hào)表中的敏感信號(hào)量發(fā)生變化時(shí),進(jìn)程將被啟動(dòng),順序信號(hào)代入語句將被執(zhí)行以完成信號(hào)的代入操作。 在VHDL中提供了三種并行信號(hào)代入語句: 并發(fā)信號(hào)代入

48、語句 條件信號(hào)代入語句 選擇信號(hào)代入語句,(1) 并發(fā)信號(hào)代入語句 信號(hào)代入語句在進(jìn)程內(nèi)部執(zhí)行時(shí),它是一種順序語句;信號(hào)代入語句在結(jié)構(gòu)體的進(jìn)程之外出現(xiàn)時(shí),它作為并發(fā)語句的形式出現(xiàn)。作為并發(fā)信號(hào)代入語句,在結(jié)構(gòu)體中他們是并行執(zhí)行的,他們的執(zhí)行順序與書寫無關(guān)。 并發(fā)信號(hào)代入語句是靠事件驅(qū)動(dòng)的。對(duì)于并發(fā)信號(hào)代入語句來說,只有代入符號(hào)“=”右邊的對(duì)象有事件發(fā)生時(shí)才會(huì)執(zhí)行該語句。 在實(shí)際設(shè)計(jì)中,并發(fā)信號(hào)代入語句常用來進(jìn)行加法器、乘法器、除法器和比較器等多種邏輯電路的描述。下面是一個(gè)用VHDL并發(fā)語句描述的全加器的例子。,例: LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.

49、ALL; ENTITY add IS PORT(A: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 IS SIGNAL tmp1,tmp2:STD_LOGIC;,BEGIN tmp1 = A XOR B; tmp2 = tmp1 AND Cin; -4條并發(fā)信號(hào)代入語句 S = tmp1 XOR Cin; Co = tmp2 OR(A AND B); AND dataflow;,在上例的結(jié)構(gòu)體中有4條

50、并發(fā)信號(hào)代入語句,他們的執(zhí)行順序與書寫順序是無關(guān)的,因此上面的4條并發(fā)信號(hào)代入語句可以任意顛倒書寫順序,不會(huì)對(duì)執(zhí)行結(jié)果產(chǎn)生任何影響。上面提到的并發(fā)信號(hào)代入語句是事件驅(qū)動(dòng)的,例如: tmp2 = tmp1 AND Cin; S = tmp1 XOR Cin; 兩條語句,只要tmp1 和 Cin中的值有一個(gè)發(fā)生變化,即有事件發(fā)生,那么這兩條語句就會(huì)立即并發(fā)執(zhí)行。,(2)條件信號(hào)代入語句 條件信號(hào)代入語句也是一種并發(fā)描述語句,它是一種根據(jù)不同條件將不同的表達(dá)式代入目的信號(hào)的語句。條件信號(hào)代入語句的書寫格式為: 目的信號(hào) = 表達(dá)式1 WHEN 條件1 ELSE 表達(dá)式2 WHEN 條件2 ELSE

51、表達(dá)式2 WHEN 條件3 ELSE 表達(dá)式n-1 WHEN 條件 ELSE 表達(dá)式; 條件信號(hào)代入語句執(zhí)行時(shí)要先進(jìn)行條件判斷,如果條件滿足,就將條件前面的那個(gè)表達(dá)式的值代入目的信號(hào);如果不滿足條件,就去判斷下一個(gè)條件;最后一個(gè)表達(dá)式?jīng)]有條件,也就是說在前面的條件都不滿足時(shí),就將該表達(dá)式的值代入目的信號(hào)。,下面的例子是用條件信號(hào)代入語句來描述的七段顯示譯碼器 例: 采用條件代入語句描述的七段顯示譯碼器 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY se7 IS PORT(input:IN STD_LOGIC_VECTOR (3 DOWNT

52、O 0); output:OUT STD_LOGIC_VECTOR (6 DOWNTO 0)); END se7; ARCHITECTURE rtl OF se7 IS BEGIN output =(0,1,1,1,1,1,1) WHEN input =“0000”ELSE (0,0,0,0,1,1,0)WHEN input =“0001”ELSE (1,0,1,1,0,1,1)WHEN input =“0010”ELSE,(1,0,0,1,1,1,1)WHEN input =“0011”ELSE (1,1,0,0,1,1,0)WHEN input =“0100”ELSE (1,1,0,1,1

53、,0,1)WHEN input =“0101”ELSE (1,1,1,1,1,0,1)WHEN input =“0110”ELSE (0,0,0,0,1,1,1)WHEN input =“0111”ELSE (1,1,1,1,1,1,1)WHEN input =“1000”ELSE (1,1,0,1,1,1,1)WHEN input =“1001”ELSE (1,1,1,0,1,1,1)WHEN input =“1010”ELSE (1,1,1,1,1,0,0)WHEN input =“1011”ELSE (0,1,1,1,0,0,1)WHEN input =“1100”ELSE (1,0,1

54、,1,1,1,0)WHEN input =“1101”ELSE (1,1,1,1,0,0,1)WHEN input =“1110”ELSE (1,1,1,0,0,0,1)WHEN input =“1111”ELSE (0,0,0,0,0,0,0); - -滅燈 END rtl;,在上例中,七段顯示譯碼器有一個(gè)輸入端口input和一個(gè)輸出端口output。輸入端口input是一個(gè)四位總線,表示3到0的四位邏輯向量,表示輸入是一個(gè)四位二進(jìn)制數(shù)。輸出端口output也以總線形式表示,它表示6到0的7位邏輯向量,表示輸出是一個(gè)七位二進(jìn)制數(shù),以驅(qū)動(dòng)共陰極顯示七段數(shù)碼管。 在上例的結(jié)構(gòu)體中,用一個(gè)條件代入

55、語句來完成所有狀態(tài)的顯示譯碼。在保留字WHEN的前面是驅(qū)動(dòng)顯示數(shù)碼管的七位位矢量,WHEN的后面是譯碼的條件。需要說明的是條件信號(hào)代入語句中的書寫順序不是固定的,位置是可以任意顛倒的,他們并不表示執(zhí)行的先后順序,實(shí)際上他們是并發(fā)執(zhí)行的。,(3) 選擇信號(hào)代入語句 選擇信號(hào)代入語句的書寫格式為: WITH 表達(dá)式 SELECT 目的信號(hào) = 表達(dá)式1 WHEN 條件1; 表達(dá)式2 WHEN 條件2; 表達(dá)式3 WHEN 條件3; 表達(dá)式n WHEN 條件n; VHDL在執(zhí)行選擇信號(hào)代入語句時(shí),目的信號(hào)是根據(jù)表達(dá)式的當(dāng)前值來進(jìn)行表達(dá)式代入的。當(dāng)表達(dá)式的值符合某個(gè)條件時(shí),就把該條件前的表達(dá)式代入目的

56、信號(hào);當(dāng)表達(dá)式的值不符合條件時(shí),語句就繼續(xù)向下判斷,直到找到滿足的條件為止。選擇信號(hào)代入語句與case語句相類似,都是對(duì)表達(dá)式進(jìn)行測試,當(dāng)表達(dá)式的值不同時(shí),將把不同的表達(dá)式代入目的信號(hào)。需要注意的是,選擇信號(hào)代入語句與case語句一樣,必須把表達(dá)式的值在條件中都列出來,否則編譯將會(huì)出錯(cuò)。,下面的例子是一個(gè)采用選擇信號(hào)代入語句描述的選通8位總線的四選一多路選擇器。 例: LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY mux4 IS PORT(d0:IN STD_LOGIC_VECTOR (7 DOWNTO 0); d1:IN STD_LOG

57、IC_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_LOGIC_VECTOR (1 DOWNTO 0); BEGIN comb = s1 USE IEEE. STD_LOGIC_1164.ALL; USE IEEE. STD_LOGIC_UNSIGNED.ALL; ENTITY max IS PORT(in1:IN STD_LOGIC_VECTOR (7 DOWNTO 0); in2:IN STD_LOGIC_VECTOR (7 DOWNTO 0); in3:IN STD

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論