




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、VHDL語言描述系統(tǒng)硬件行為時,按語句執(zhí)行順序可以 分 為 順 序 ( S e q u e n t i a l ) 描 述 語 句 和 并 發(fā)(Concurrent)描述語句。靈活運用這兩類語句就可以正確地描述系統(tǒng)的并發(fā)行為和順序行為。例如,進程語句(Process Statement)是一個并發(fā)語句。在一個構(gòu)造體內(nèi)可以有幾個進程語句同時存在,各進程語句是并發(fā)執(zhí)行的各進程語句是并發(fā)執(zhí)行的。但是,在進程內(nèi)部所有語進程內(nèi)部所有語句應(yīng)是順序描述語句句應(yīng)是順序描述語句,也就是說,是按書寫的順序自上至下,一個語句一個語句地執(zhí)行的。例如,IF 語句、LOOP語句等都屬于此類順序描述語句。執(zhí)行順序與書寫順序
2、一致,與傳統(tǒng)軟件設(shè)計語言的特點相似。順序語句只能用在進程與子程序中。語句中所涉及到的系統(tǒng)行為有時序流、控制、條件和迭代等;語句的功能操作有算術(shù)、邏輯運算,信號和變量的賦值,子程序調(diào)用等。在VHDL語言中順序描述語句有以下幾種:* WAIT語句;語句; * 斷言語句;斷言語句; * 信號代入語句;信號代入語句;* 變量賦值語句;變量賦值語句; * IF語句;語句; * CASE語句;語句;* LOOP語句;語句; * NEXT語句;語句; * EXIT 語句;語句;* 過程調(diào)用語句;過程調(diào)用語句; * NULL語句語句進程在仿真時的兩個狀態(tài):執(zhí)行或掛起。進程狀態(tài)的變化受WAIT語句的控制。當(dāng)進程
3、執(zhí)行到WAIT語句時,就將被掛起,并設(shè)置好再次執(zhí)行的條件。WAIT語句可以設(shè)置4種不同的條件:無限等待、時間到、條件滿足以及敏感信號量變化。這幾類條件可以混用,其書寫格式為: WAIT :無限等待:無限等待 WAIT ON :敏感信號量變化:敏感信號量變化 WAIT UNTIL: 條件滿足條件滿足 WAIT FOR: 時間到時間到 WAIT ON 語句的完整書寫格式為: WAIT ON 信號信號,信號,信號;WAIT ON 后面跟著的是一個或多個信號量,例如: WAIT ON a , b;該語句表明,等待信號量a或b中只要有一個發(fā)生變化,進程將結(jié)束掛起狀態(tài),而繼續(xù)執(zhí)行WAIT ON 語句的后繼
4、語句,從而再次啟動進程的執(zhí)行。從這一點來看,與進程指定的敏感信號量有新的變化時,也會啟動進程的情況相類似。PROCESS (a,b) BEGIN y=a AND b; END PROCESS;PROCESS BEGIN y=a AND b; WAIT ON a,b; END PROCESS; 上面兩個進程的描述是完全等價的,只是WAIT ON和PROCESS中所使用的敏感信號量的書寫方法有區(qū)別。在使用WAIT ON語句的進程中,敏感信號量應(yīng)寫在進程中的WAIT ON語句后面;而在不使用WAIT ON語句的進程中,敏感信號量只應(yīng)在進程開頭的PROCESS后跟的括號中說明。敏感信號量列表和 wai
5、t on 語句只能選其一,兩者不能同時使用。注意 如果如果PROCESS 語句已有敏感信號量說明,那么語句已有敏感信號量說明,那么在進程中再不能使用在進程中再不能使用WAIT ON 語句。例如,下面的描語句。例如,下面的描述是非法的。述是非法的。PROCESS (a,b) BEGIN y=a AND b; WAIT ON a,b; 錯誤語句錯誤語句END PROCESS; WAIT UNTIL 語句的完整書寫格式為: WAIT UNTIL 表達式;表達式; 當(dāng)表達式的值為“真”時,進程被啟動,否則進程被掛起。 該語句在表達式中將建立一個隱式的敏感信號量隱式的敏感信號量表表,當(dāng)表中的任何一個信號
6、量發(fā)生變化時,就立即對表達式進行一次評估。如果評估結(jié)果使表達式返回一個“真”值,則進程脫離等待狀態(tài),繼續(xù)執(zhí)行下一個語句。例如: WAIT UNTIL (X*10)100);在這個例子中,當(dāng)信號量X的值大于或等于10時,進程執(zhí)行到該語句將被掛起;當(dāng)X的值小于10時進程再次被啟動,繼續(xù)執(zhí)行WAIT 語句的后繼語句。例:用wait until語句描述時鐘沿,實現(xiàn)D觸發(fā)器 architecture rtl of d is begin process begin wait until clkevent and clk=1; q = d; end process; end rtl; WAIT FOR 語句
7、的完整書寫格式為: WAIT FOR 時間表達式;時間表達式;WAIT FOR 語句后面跟著的是時間表達式,當(dāng)進程執(zhí)行到該語句時將被掛起,直到指定的等待時間到時,進程再開始執(zhí)行WAIT FOR 語句后繼的語句。例如: WAIT FOR 20ns;這個語句中時間表達式是一個常數(shù)值20ns,當(dāng)進程執(zhí)行到該語句時將等待20ns。一旦20ns時間到,進程將執(zhí)行WAIT FOR 語句的后繼語句。 例如: WAIT FOR (a*(b+c);此語句中,F(xiàn)OR后面是一個時間表達式,a*(b+c)是時間量。WAIT FOR 語句在等待過程中,要對表達式進行一次計算,計算結(jié)果返回的值就作為該語句的等待時間。例如
8、,a=2,b=50ns,c=70ns。那么WAIT FOR (a*(b+c)這個語句將等待240ns,也就是說該語句和WAIT FOR 240ns是等價的。 在前面已敘述的3個WAIT語句中,等待的條件都是單一的,要么是信號量,要么是布爾量,要么是時間量。實際上WAIT語句還可以同時使用多個等待條件。例如: WAIT ON nmi,interrupt UNTIL (nmi=TRUE) OR (interrupt=TRUE) FOR 5us;上述語句等待的是3個條件: 第一,信號量nmi和interrupt任何一個有一次新的變化; 第二,信號量nmi或interrupt任何一個取值為“真”; 第
9、三,該語句已等待5us。只要上述3個條件中一個或多個條件滿足,進程將再次啟動,繼續(xù)執(zhí)行WAIT語句的后繼語句。 應(yīng)該注意的是,在多條件等待時,表達式的值至應(yīng)該注意的是,在多條件等待時,表達式的值至少應(yīng)包含一個信號量的值少應(yīng)包含一個信號量的值,例如: WAIT UNTIL (interrupt=TRUE) OR (old_clk=1);如果該語句的interrupt和old_clk兩個都是變量,而不是信號量,那么,即使兩個變量的值有新的改變,該語句也不會對表達式進行評估和計算(事實上,在掛起的進程中變量的值是不可能改變的)。這樣,該等待語句將變成無限的等待語句,包含該等待語句的進程就不能再啟動。
10、在多種等待條件中,只有信號量變化才能引起等待語句表達式的一次新的評價和計算。 往往在所設(shè)計的程序模塊中,等待語句所等待的條件,在實際執(zhí)行時不一定會碰到。這時,等待語句通常要加一項超時等待項,以防止該等待語句進入無限期的等待狀態(tài)。但是,如果采用這種方法,應(yīng)作適當(dāng)?shù)奶幚恚駝t就會產(chǎn)生錯誤的行為。ARCHITECTURE wait_example OF wait_example IS SINGAL sendB,sendA:STD_LOGIC;BEGIN sendA= 0 ; A:PROCESS BEGIN WAIT UNTIL sendB= 1 ; sendA= 1 AFTER 10 ns; WAI
11、T UNTIL sendB= 0 ; sendA= 0 AFTER 10 ns; END PTROCESS A; B:PROCESS BEGIN WAIT UNTIL sendA= 0 ; sendB= 0 AFTER 10 ns; WAIT UNTIL sendA= 1 ; sendB= 1 AFTER 10 ns; END PTROCESS B;END wait_example; 進程A執(zhí)行到第一條wait語句時處于無限期等待狀態(tài),進程B執(zhí)行到第二條wait語句時處于無限期等待狀態(tài)。兩個進程處于相互等待狀態(tài),每個進程的等待條件都需要對方繼續(xù)執(zhí)行。這種情況我們稱為“死鎖”狀態(tài)。為了能夠避免這
12、種無限等待狀態(tài),我們可以加入超時等待語句,同時用ASSERT語句進行提示。ARCHITECTURE wait_example OF wait_example IS SINGAL sendB,sendA:STD_LOGIC;BEGIN sendA= 0 ; A:PROCESS BEGIN WAIT UNTIL( sendB= 1 ) FOR 1 us; ASSERT(sendB= 1 ) REPORT”sendB timed out at 1 “ SEVERITY ERROR; sendA= 1 AFTER 10 ns; WAIT UNTIL (sendB= 0 ) FOR 1 us; ASSE
13、RT(sendB= 0 ) REPORT”sendB timed out at 0 “ SEVERITY ERROR sendA= 0 AFTER 10 ns; END PTROCESS A; B:PROCESS BEGINWAIT UNTIL( sendA= 0 ) FOR 1 us; ASSERT(sendA= 0) REPORT”sendA timed out at 1 “ SEVERITY ERROR; sendB= 0 AFTER 10 ns; WAIT UNTIL (sendA= 1 ) FOR 1 us; ASSERT(sendA= 0 ) REPORT”sendA timed
14、out at 0 “ SEVERITY ERROR sendB= 1 AFTER 10 ns; END PTROCESS B;END wait_example; 如果條件不滿足則等待如果條件不滿足則等待1us之之后執(zhí)行后續(xù)的程序,而不會無限后執(zhí)行后續(xù)的程序,而不會無限期等待。期等待。ASSERT語句主要用于程序仿真、調(diào)試中的人機對話,它可以給出一個文字串作為警告和錯誤信息。ASSERT語句的書寫格式為: ASSERT 條件條件 REPORT 輸出信息輸出信息 SEVERITY 級別級別; 如果條件為真則向下執(zhí)行另一個語句,如果條件為假,則輸出錯誤信息和錯誤級別。REPORT后面的錯誤信息應(yīng)用雙
15、引號括起來。 ASSERT語句給程序的調(diào)試和仿真帶來極大的方便,這樣的語句一般只用于行為級仿真中,而不能進行邏輯綜合。例: ASSERT(sendB= 1 ) REPORT “sendB timed out at 1 ” SEVERITY ERROR; 該斷言語句的條件信號量是sendB=1。如果執(zhí)行到該語句時,信號量sendB=0,說明條件不滿足,就會輸出REPORT后跟的文字串。該文字串說明,出現(xiàn)了超時等待錯誤。SEVERITY后跟的錯誤等級告訴操作人員,其出錯等級為ERROR。書寫格式:目的信號量目的信號量=信號量表達式;信號量表達式;意義:將右邊信號量表達式的值賦給左邊的目的信號量。
16、1)代入符號與小于等于的區(qū)別; 2)代入符號兩邊信號量的類型和長度應(yīng)一致; 3)信號一般使用的場合及與變量的區(qū)別。注意書寫格式:目的變量:目的變量:=表達式;表達式;意義:表達式的值替代目的變量的值,立即有效。1)兩邊的數(shù)據(jù)類型必須相同;2)目的變量的類型和范圍及初值應(yīng)事先給出;3)右邊的表達式可以是變量,信號或字符;4)變量只在進程或子程序中使用,它無法傳遞到進程之外。注意1)賦值方式的不同: 變量:= 表達式; 信號 = 表達式; 2)硬件實現(xiàn)的功能不同: 信號代表電路單元、功能模塊間的互聯(lián),代表實際的硬件連線;變量代表電路單元內(nèi)部的操作,代表暫 存的臨時數(shù)據(jù)。3)有效范圍的不同: 信號:
17、程序包、實體、結(jié)構(gòu)體;全局量。 變量:進程、子程序;局部量。4)賦值行為的不同: 信號賦值延遲更新數(shù)值;變量賦值立即更新數(shù)值; 補充:變量與信號的差異 信號賦值: architecture rtl of sig is signal a,b : std_logic; - 定義信號定義信號 begin process(a, b) begin a = b ; b = a ; end process ; end rtl ; - 結(jié)果是結(jié)果是 a 和和 b 的值互換的值互換補充舉例:信號賦值與變量賦值的比較 在進程內(nèi)部信號是延時更新,信號只有在進程內(nèi)部信號是延時更新,信號只有在整個過程執(zhí)行完畢后在整個過
18、程執(zhí)行完畢后(end process)才更新完才更新完成。成。此例中, a = b先是b的初值賦給a,但a的值并不是立即更新;所以在執(zhí)行 b = a 時,a是先前的a,即是要將a的初始值賦給b;當(dāng)程序執(zhí)行到end process時,a和b才更新完成,最終a和b值互換。- 變量賦值: architecture rtl of var is begin process variable a,b:std_logic; - 定義變量定義變量 begin a := b ; b := a ; end process ; end rtl; - 結(jié)果是結(jié)果是a和和b的值都等于的值都等于b的初值的初值 補充舉例:
19、信號賦值與變量賦值的比較變量的賦值立即生效,a的值立即更新為b的初始值此時的a已經(jīng)變?yōu)閎的初值,于是就是將b的初值代入ba. 一個進程:最后一次賦值有效 補充:信號的多次賦值architecture rtl of ex is signal a : std_logic;begin process() begin a = b; a = c; end process;end rtl;- 結(jié)果是結(jié)果是a=cb. 多個進程:多源驅(qū)動 線與、線或、三態(tài) 補充:信號的多次賦值- 結(jié)果是信號結(jié)果是信號a將由多個驅(qū)動源驅(qū)動將由多個驅(qū)動源驅(qū)動architecture rtl of ex is signal a :
20、 std_logic;begin process() begin a = b; end process; process() begin a = c; . end process;end ex;進程語句(Process Statement)是一個并發(fā)語句。在一個構(gòu)造體內(nèi)可以有幾個進程語句同時存在,各進程語句是并發(fā)執(zhí)行的。但是,在進程內(nèi)部所有語句應(yīng)是順序描述語句注意 IF語句可用于選擇器、比較器、編碼器、譯碼器狀態(tài)機的設(shè)計,是VHDL語言中最基礎(chǔ)、最常用的語句。 IF語句根據(jù)制定的條件來確定語句執(zhí)行順序,共有三種類型。1、IF語句的門閂控制語句的門閂控制格式: IF 條件條件 THEN 順序處理
21、語句;順序處理語句; END IF;當(dāng)程序執(zhí)行到該IF語句時,就要判斷IF語句所指定的條件是否成立。如果條件成立,則執(zhí)行順序處理語句;不成立則跳過IF語句所包含的順序處理語句,而向下執(zhí)行IF語句的后續(xù)語句。這里的條件起到門閂的控制作用。LIBRARY IEEE;USE IEEE.STD.LOGIC.1164.ALL;ENTITY dff IS PORT(clk,d : IN STD_LOGIC; q : OUT STD_LOGIC);END dff;ARCHITECTURE rtl OF dff ISBEGIN PROCESS( clk ) BEGIN IF( clkEVENT AND clk
22、= 1 ) THEN q=d; END IF; END PROCESS;END trl;注此例中,IF語句的條件是時鐘信號clk事件發(fā)生,且時鐘clk=1(時鐘脈沖上升沿到來)。只有在這個時候d端信號值才賦值給q端。當(dāng)該條件不滿足時,q端維持原來的輸出值。格式: IF 條件條件 THEN 順序處理語句;順序處理語句; ELSE 順序處理語句;順序處理語句; END IF;當(dāng)條件滿足時,則執(zhí)行THEN和ELSE之間的順序處理語句;如不滿足則執(zhí)行ELSE和END IF之間的順序處理語句。二選一電路二選一電路ARCHITECTURE rtl OF mux2 ISBEGIN PROCESS( a, b
23、, sel ) BEGIN IF ( sel = 1 ) THEN c= a; ELSE c=b; END IF; END PROCESS;END rtl;此例中,二選一電路的輸入端為a和b,選擇控制端為sel,輸出端為c。注格式: IF 條件條件 THEN 順序處理語句;順序處理語句; ELSIF 條件條件 THEN 順序處理語句;順序處理語句; ELSIF 條件條件 THEN 順序處理語句;順序處理語句; ELSE 順序處理語句;順序處理語句; END IF; 在多選擇控制的IF語句中,設(shè)置了多個條件。當(dāng)某個條件滿足時就執(zhí)行跟在該條件這后的順序處理語句, 如果條件都不滿足則執(zhí)行ELSE和E
24、ND IF之間的語句。 IF語句的多選擇控制又稱為IF語句的嵌套。注四選一電路:四選一電路: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 ISBEGIN PROCESS( input, sel ) BEGIN IF ( sel = “00” ) T
25、HEN 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;注 if_then_elsif 語句中隱含了優(yōu)先級別的判斷,最先出現(xiàn)的條件優(yōu)先級最高,可用于設(shè)計具有優(yōu)先級的電路。如8-3優(yōu)先級編碼器。 (1)IF語句可以用于凡是可以進行條件控制的邏輯電路設(shè)計。 (2)IF語句的條件判斷的輸出是布爾量,即是“真”(true)或“假”(FALSE)。因此
26、在IF語句的條件表達式中只能使用關(guān)系運算操作符(=,/=, =)及邏輯運算操作符的組合表達式。 case 語句常用來描述總線或編碼、譯碼行為。 可讀性比if 語句強。格式: CASE 表達式表達式 IS WHEN 條件表達式條件表達式=順序處理語句;順序處理語句; END CASE;當(dāng)CASE 和 IS 之間的表達式表達式的取值滿足指定的條件表達式條件表達式的值時,程序?qū)?zhí)行后跟的,由符號=所指的順序處理語句。條件表達式條件表達式的形式可以是: 1)一個值;2)多個值的“或”關(guān)系;3)一個取值范圍;4)表示其它所有的缺省值。CASE語句中條件表達式四種不同的表達形式: WHEN 值值=順序處理
27、語句;順序處理語句;-單個值單個值 WHEN 值值| 值值| 值值| | 值值|=順序處理語句;順序處理語句;-多個值的多個值的“或或” WHEN 值值 TO 值值=順序處理語句;順序處理語句;-一個取值范圍一個取值范圍 WHEN OTHERS=順序處理語句;順序處理語句;-其它所有缺省值其它所有缺省值CASE語句使用舉例LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux4 IS PORT ( a, b, i0 ,i1, i2, i3 : IN STD_LOGIC; q : OUT STD_LOGIC);END mux4;ARCHITECTU
28、RE mux4_behave OF mux4 IS SIGNAL sel : STD_LOGIC_VECTOR( 1 DOWNTO 0);BEGIN selqqqq=i3; END CASE;END PROCESS;END mux4_behave;1)前面例子中使用多選擇控制的IF語句來描述四選一選擇器時,發(fā)現(xiàn) if_then_elsif 語句中隱含了優(yōu)先級別的判斷,最先出現(xiàn)的條件優(yōu)先級最高。1)而在使用CASE語句描述選擇器行為時,CASE語句沒有值的優(yōu)先級,所有值是并行處理的;2)WHEN后面的值應(yīng)全部列出來;3)WHEN后面的值不能重復(fù)使用。注并 置 運 算符 用 于 位的 連 接 而構(gòu)
29、 成 位 矢量帶有WHEN OTHERS項舉例(3-8譯碼器)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY decode3to8 IS PORT ( a, b, c, G1, G2A, G2B: IN STD_LOGIC; y : OUT STD_LOGIC_VECTOR( 7 DOWNTO 0);END decode3to8;ARCHITECTURE rtl OF decode3to8 IS SIGNAL indata: STD_LOGIC_VECTOR( 2 DOWNTO 0);BEGIN indatayyyyyyyy=“XXXXXXXX”
30、; END CASE; ELSE Y 順序處理語句; WHEN 分支條件 = 順序處理語句; WHEN 分支條件 = 順序處理語句; END CASE; LOOP語句與其它高級語句中的循環(huán)語句一樣,使程序能進行有規(guī)則的循環(huán),循環(huán)次數(shù)受迭代算法控制。 VHDL語言中常用來描述位片邏輯及迭代電路的行為。 LOOP語句書寫格式一般有兩種:1)FOR循環(huán)變量;2)WHILE條件。1、FOR 循環(huán)變量循環(huán)變量書寫格式如下標(biāo)號標(biāo)號:FOR 循環(huán)變量循環(huán)變量 IN 離散范圍離散范圍 LOOP 順序處理語句;順序處理語句; END LOOP 標(biāo)號標(biāo)號;循環(huán)變量的值在每次循環(huán)中都將發(fā)生變化;離散范圍則表示循環(huán)變
31、量在循環(huán)過程中依次取值的范圍。例如: sum:=0;ASUM: FOR i IN 1 TO 9 LOOP sum=i+sum; -sum初始值為0END LOOP ASUM;該例中i是循環(huán)變量,它可取1,2,.,9共9個值,也就是sum=i+sum的算式應(yīng)循環(huán)計算9次。該程序的功能是對19的數(shù)進行累加計算。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 ;AR
32、CHITECTURE rtl OF parity_check ISBEGIN PROCESS( a ) VARIABLE tmp: STD_LOGIC; BEGIN tep:= 0; FOR i IN 0 TO 7 LOOP tmp:=tmp XOR a( i ); END LOOP; y=tep; END PROCESS;END rtl;1)本例實際是8位偶校驗電路2)i是一個循環(huán)變量,使用時無需先聲明,也不能代入信號量和變量。3)進程內(nèi)tmp是變量,tmp的值通過賦給信號y而帶出進程。對送進來的8位數(shù)每一位都與中間變量相異或輸入8位2進制代碼輸出校驗碼奇偶校驗位注 什么是奇偶校驗電路? 利
33、用奇(偶)校驗方法進行檢錯的組合邏輯電路稱為奇偶校驗器。 奇偶校驗的原理: 根據(jù)代碼中全部位數(shù)相加的“和”來進行奇校驗或偶校驗。 “和”操作的特點:偶數(shù)個1,它的和總是0;奇數(shù)個1,它的和總是1。 奇校驗就是看2進制數(shù)的1的個數(shù)為奇數(shù);偶校驗相反,就 是 看 2 進 制 數(shù) 中 1 的 個 數(shù) 為 偶 數(shù)。 補充:奇偶校驗基礎(chǔ)知識補充:奇偶校驗基礎(chǔ)知識書寫格式如下: 標(biāo)號標(biāo)號: WHILE 條件條件 LOOP 順序處理語句;順序處理語句; END LOOP 標(biāo)號標(biāo)號;如果條件為“真” ,則進行循環(huán);如果條件為“假”,則結(jié)束循環(huán)。如: i:=1; sum:=0; sbcd: WHILE ( i1
34、0 ) LOOP sum:= i+sum; i:=i+1; END LOOP sbcd;-對19的數(shù)進行累加計算,利用i10的條件使程序結(jié)束循環(huán),通過i:=i+1實現(xiàn)循環(huán)變量的遞增。-循環(huán)變量循環(huán)變量 i 需事先定義、賦需事先定義、賦初值,并指定其變化方式。初值,并指定其變化方式。例:用WHILE語句來描述奇偶校驗電路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_c
35、heck;ARCHITECTURE behave OF parity_check ISBEGIN PROCESS( a ) VARIABLE temp : STD_LOGIC; VARIABLE i : INTEGER; BEGIN temp :=0; i:= 0; WHILE (I8 ) LOOP temp:= temp XOR a( I ); i:= i+1; END LOOP; y= temp; END PROCESS;END behave;在WHILE-LOOP語句中的變量i要首先聲明才能使用,這一點和FOR-LOOP語句中不一樣。循環(huán)變量循環(huán)變量 i 需事先定義、需事先定義、賦初值,
36、并指定其變化賦初值,并指定其變化方式。方式。一般使用FOR-LOOP語句比 WHILE-LOOP語句更多。在LOOP語句中用NEXT語句來跳出本次循環(huán),格式為: NEXT 標(biāo)號標(biāo)號 WHEN 條件條件; NEXT語句執(zhí)行時將停止本次迭代,而轉(zhuǎn)入下一次新的迭代?!皹?biāo)號”為下次迭代的起始位置,而條件為NEXT語句執(zhí)行的條件。如果無“標(biāo)號”也無條件,則只要執(zhí)行到該語句就無條件跳出本次循環(huán),從LOOP語句的起始位置進入下一次循環(huán)。 NEXT語句實際上是用于語句實際上是用于LOOP語句的內(nèi)部循環(huán)控制。語句的內(nèi)部循環(huán)控制。PROCESS( a, b) CONSTANT max_limit : INTEGE
37、R := 255;BEGIN FOR i IN 0 TO max_limit LOOP IF (done( i )= TRUE ) THEN NEXT; ELSE done ( i ):= TRUE ; END IF ; q( i )=a ( i )AND b( i ); END LOOP;END PROCESS;無“標(biāo)號”也無條件,則只要執(zhí)行到該語句就無條件跳出本次循環(huán) EXIT 語句用于結(jié)束循環(huán)狀態(tài),從LOOP語句中跳出,結(jié)束LOOP語句的正常執(zhí)行。格式: EXIT 標(biāo)號標(biāo)號 WNEN 條件條件; 如果EXIT后面沒有跟“標(biāo)號”和“WHEN條件”,則程序執(zhí)行到該語句時就無條件地從LOOP語
38、句中跳出,結(jié)束循環(huán)狀態(tài),繼續(xù)執(zhí)行LOOP語句后繼的語句。PROCESS( a ) VARIABLE int_a : INTEGER;BEGIN int_a := a; FOR i IN 0 TO max_limit LOOP IF ( int_a=0 ) THEN EXIT; ELSE int_a :=int_a 1; q( i )=3.1416/ REAL( a*i ); END IF; y=q ;END PROCESS; 本 例 中 , 如 果int_a小于或等于0時就執(zhí) 行 E X I T 語 句 ,LOOP語句執(zhí)行結(jié)束。EXIT 語句的三種書寫格式語句的三種書寫格式 1.EXIT語句后
39、面沒有“循環(huán)標(biāo)號”或“WHEN條件”,當(dāng)執(zhí)行到該語句時就跳出包含該EXIT語句的循環(huán)。 2.EXIT語句后跟“LOOP語句的標(biāo)號”,執(zhí)行EXIT語句時將跳到標(biāo)號所說明的標(biāo)號。 3. EXIT 語句后跟“WHEN 條件”語句,只有當(dāng)條件為真時才跳出循環(huán),如果條件不為真則執(zhí)行下一條語句。 next語句與exit語句的格式與操作功能非常相似; 區(qū)別是:next語句是跳向loop語句的起始點,而exit語句則是跳向loop語句的 終點。 VHDL的并發(fā)語句用來描述一組并發(fā)行為,它是并發(fā)執(zhí)行的,與程序的書寫順序無關(guān)。 進程語句(PROCESS);并發(fā)(CONCURRENT)信號代入語句;條件(CONDI
40、TIONAL)信號代入語句;選擇(SELECTIVE)信號代入語句;并發(fā)(CONCURRENT PROCEDURE)過程調(diào)用語句;塊(BLOCK)語句。 各個進程之間是并發(fā)處理的,而在進程內(nèi)部則是按順序處理的。在一個構(gòu)造體內(nèi)部可以有多個PROCESS語句同時并發(fā)執(zhí)行。PROCESS語句是VHDL語句中是基本的語句。特點: 1、進程與進程,或其它并發(fā)語句之間的并發(fā)性; 2、進程內(nèi)部的順序性; 3、進程的啟動與掛起,必須要有一個顯式的敏感 信號量表或者包含一個WAIT語句; 4、進程與進程,或其它并發(fā)語句之間的通信。 代入語句(用符號“=”)可以在進程內(nèi)部在進程內(nèi)部使用,是按使用,是按順序執(zhí)行順序
41、執(zhí)行的;代入語句也可以在構(gòu)造體內(nèi)部的進程外進程外使用,那么這些代入語句之間是并發(fā)執(zhí)行并發(fā)執(zhí)行的。因此,一個并發(fā)信號代入語句實際上是一個進程的縮寫。 并發(fā)代入語句在仿真時刻同時運行,它表征了各個獨立器件的各自的獨立操作。如: a=b+c; d=e*f; 代入符號“=”的右邊可以用算術(shù)表達式,也可以用邏輯運算表達式,還可以用關(guān)系操作表達式。-分別描述加法器和乘法器行為。在實際系統(tǒng)中加法器和乘法器是同時并發(fā)執(zhí)行的。ARCHITECTURE behave OF a_var ISBEGIN output=a(i);END behave;可以等效于:可以等效于:ARCHITECTURE behave OF
42、 a_var ISBEGIN PROCESS( a,i ) BEGIN output=a(i); END PROCESS;END behave;一個簡單并行信號賦值語句是一個進程的縮寫。5.2.3 條件信號代入語句條件信號代入語句格式:目的信號量 = 表達式1 WHEN 條件1 ELSE 表達式2 WHEN 條件2 ELSE 表達式3 WHEN 條件3 ELSE 表達式n;ELSE在每個表達式后面都跟有用“WHEN”所指定的條件,如果滿足該條件,則該表達式值代入目的信號量;如果條件不滿足,則再判斷下一個表達式所指定的條件。最后一個表達式可以不跟條件,即所有條件都不滿足時(具有優(yōu)先級)利用條件信
43、號代入語句實現(xiàn)四選一邏輯電路。利用條件信號代入語句實現(xiàn)四選一邏輯電路。ENTITY mux4 IS PORT ( i0, i1, i2, i3, a, b : IN STD_LOGIC; q : OUT STD_LOGIC);END mux4;ARCHITECTURE rtl OF mux4 IS SIGNAL sel : STD_LOGIC_VECTOR ( 1 DOWNTO 0 ); BEGIN sel= b&a; q= i0 WHEN sel=“00” ELSE q= i1 WHEN sel=“01” ELSE q= i2 WHEN sel=“10” ELSE q= i3 WHEN se
44、l=“11” ELSE X;END rtl;條件信號代入語句與IF語句的區(qū)別IF語句只能在進程內(nèi)部使用,而條件信號代入語句則可以在進程內(nèi)部也可以在進程之外。條件信號代入語句中的ELSE是必須的,而IF語句中的ELSE可有可無;條件信號代入語句不能進行嵌套,受制于沒有自身值代入的描述,不能生成鎖存電路。條件信號代入語句所描述的電路與邏輯電路實際工作比較相近,故一般設(shè)計都難以掌握。只有當(dāng)進程語句、IF語句和CASE語句難于描述時,才用條件信號代入語句。條件信號賦值語句與進程中的多選擇 if 語句等價:q = a WHEN sela = 1 ELSE b WHEN selb = 1 ELSE c;P
45、ROCESS(sela, selb, a, b, c)BEGIN IF sela=1 THEN q = a; ELSIF selb=1 THEN q = b; ELSE q = c; END IF;END PROCESS; 格式:WITH 表達式 SELECT 目的信號量 = 表達式1 WHEN 條件1, 表達式2 WHEN 條件2, 表達式n WHEN 條件n; 1)不能有重疊的條件分支。 2)最后條件可為 others。否則,其它條件 必須能包含表達式的所有可能值。 3)選擇信號賦值語句與進程中的 case 語 句等價。注用選擇信號代入語句實現(xiàn)四選一電路用選擇信號代入語句實現(xiàn)四選一電路LI
46、BRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux IS PORT ( i0, i1, i2, i3, a, b : IN STD_LOGIC; q : OUT STD_LOGIC );END mux;ARCHITECTURE behave OF mux IS SIGNAL sel : INTEGER;BEGIN WITH sel SELECT q=i0 WHEN 0, i1 WHEN 1, i2 WHEN 2 , i3 WHEN 3, X WHEN OTHERS;sel q q q q = d; END CASE;END PROCESS;WIT
47、H sel SELECT q = a WHEN “00”, b WHEN “01”, c WHEN “10”, d WHEN OTHERS; 并發(fā)過程調(diào)用(Concurrent Procedure Call )語句可以出現(xiàn)在構(gòu)造體中,而且是一種可以在進程之外執(zhí)行的過程調(diào)用語句。有關(guān)過程的結(jié)構(gòu)及書寫方法在前面已講過,我們回顧一下。格式: PROCEDUREPROCEDURE 過程名(參數(shù)過程名(參數(shù)1, 參數(shù)參數(shù)2, ) ISIS 定義語句定義語句; BEGINBEGIN 順序處理語句順序處理語句; END END 過程名;過程名;并發(fā)過程調(diào)用語句是一個完整的語句,在它的前面可以加標(biāo)號;并發(fā)過程
48、調(diào)用語句是應(yīng)帶有IN,OUT或者INOUT的參數(shù),它們應(yīng)列于過程名后跟的括號內(nèi);并發(fā)過程調(diào)用可以有多個返回值,但這些返回值必須通過過程中所定義的輸出參數(shù)帶回。并發(fā)過程調(diào)用語句實際上是一個過程調(diào)用進程的簡寫。在過程中盡量不要出現(xiàn)自變量表中沒有出現(xiàn)過的信號量,如果出現(xiàn)將會帶來問題。ARCHITECTURE BEGIN vector_to_int (z, x_flag, q ) END;ARCHITECTURE BEGIN PROCESS( z, q ) BEGIN vector_to_int (z, x_flag, q ) END PROCESS;END; 并發(fā)過程調(diào)用是對位矢量Z進行數(shù)值轉(zhuǎn)化,使
49、之成為十進制數(shù)整數(shù)q。 x_flag是標(biāo)志位,為“真”表明轉(zhuǎn)換失敗,為“假”表明轉(zhuǎn)換成功。左例左例中并發(fā)過程調(diào)用語句和中并發(fā)過程調(diào)用語句和右例右例的過程調(diào)用進程完全等效的過程調(diào)用進程完全等效5.2.6 塊(塊(BLOCK)語句)語句標(biāo)號:標(biāo)號: BLOCK 塊頭塊頭 說明語句說明語句; BEGIN 并發(fā)處理語句并發(fā)處理語句; END BLOCK 標(biāo)號名;標(biāo)號名;BLOCK是一個并發(fā)執(zhí)行語句,通常用于構(gòu)造體的結(jié)構(gòu)化描述,其格式為:說明語句通常包括:USE子句;子程序說明及子程序體;類型說明;常數(shù)說明;信號說明; 元件說明。 設(shè)計一個CPU,為簡化起見,假設(shè)這個CPU只由ALU(算術(shù)邏輯單元)模塊
50、和REG8(寄存器)模塊組成。其中ALU模塊和REG8模塊的行為分別由兩個BLOCK語句來描述。每個模塊相當(dāng)于CPU電原理圖中的子原理圖(REG8模塊中又由8個REG1,REG2,REG8子模塊組成)。在每個塊內(nèi)能夠有局部信號、數(shù)據(jù)類型、常數(shù)等說明。任何一個客體可以在構(gòu)造體中說明,也可以在塊中說明。ARCHITECTURE cpu_blk OF IS SIGNAL ibus, dbus : tw32;BEGIN ALU: BLOCK SIGNAL qbus : tw32; BEGIN -ALU行為描述語句行為描述語句 END BLOCK ALU; REG8: BLOCK SIGNAL zbus
51、 : tw32; BEGIN REG1: BLOCK -REG1 行為描述語句行為描述語句 END BLOCK REG1; -其它其它REG8行為描述語句行為描述語句 END BLOCK REG8;END cpu_blk;ALU模塊模塊REG模塊模塊子模塊子模塊11)由于BLOCK可以嵌套,內(nèi)層BLOCK塊能夠使用外層BLOCK塊所說明的信號,而外層BLOCK塊卻不能夠使用內(nèi)層BLOCK塊中所說明的信號。2)BLOCK是一個獨立的子結(jié)構(gòu),它可以包含PORT和GENERIC語句。3)不同的模塊中使用相同的信號名,在語法上是合法的,而且這兩個信號分別在各自的說明區(qū)域有效。因此可以這樣認為,它們是具
52、有相同信號名各自獨立的信號。但是,為了能正確區(qū)分,我們通常取不同的名字,不至發(fā)生混淆。 如:如: BLK1: BLOCK SIGNAL qbus : tw32; BEGIN BLK2: BLOCK SIGNAL qbus : tw32; BEGIN -BLK2語句語句 END BLOCK BLK2; -BLK1語句語句 END BLOCK BLK1;應(yīng)用BLOCK語句應(yīng)注意的問題改為改為BLK2_qbus5.3.1 命名規(guī)則和注解的標(biāo)記命名規(guī)則和注解的標(biāo)記 在在VHDL語句中大小寫是沒有區(qū)別的,語句中大小寫是沒有區(qū)別的,所有語句中用大寫字母或小寫字母都可以,也可有大小寫混合使用。但有兩種情但有
53、兩種情況例外,這就是用單引號括起來的字符和用雙引號括起來的字況例外,這就是用單引號括起來的字符和用雙引號括起來的字符串,這時大寫字母和小寫字母是有區(qū)別的。符串,這時大寫字母和小寫字母是有區(qū)別的。 在VHDL語言中所使用的名字(名稱),如信號名、實體名,構(gòu)造體名、變量名等,在命名時應(yīng)遵守如下規(guī)則: 1)名字的最前面應(yīng)該是英文字母; 2)能使用的字符只有英文字母、數(shù)字和下劃線“_” ; 3)不能連續(xù)使用“_”符號,在名字的最后也不能使用“_” 。 4)其注釋從兩個短劃線“-”符號開始到該項末尾(回車、換 行符)結(jié)束。命名舉例命名舉例SIGNAL a_bus : STD_LOGIC_VECTOR(
54、7 DOWNTO 0 );SIGNAL 302_bus : -不能以數(shù)字開頭SIGNAL b_bus : -不能作為名稱的字母SIGNAL a_bus : -_不能連著使用SIGNAL a_bus_ : -不能放在名稱的最后。 VHDL語句中有屬性預(yù)定義功能,該功能有許多重要的應(yīng)用,例如檢出時鐘邊沿,完成定時檢查,獲得未約束的數(shù)據(jù)類型的范圍等。ATTRIBUTE語句可以從所指定的客體中獲得語句可以從所指定的客體中獲得關(guān)心的數(shù)據(jù)或信息。關(guān)心的數(shù)據(jù)或信息。如: TYPE number IS INTEGER RANGE 9 DOWNTO 0;若想得到 number的最大值,則可用下面的語句: i:=
55、 numberHIGH; -i=9而要得到最小值則可用: i:= numberLOW; -i=0 通過預(yù)定義屬性描述語句,可以得到客體的有關(guān)值、功能、類型和范圍。 自定義一個叫“number”的數(shù)據(jù)類型,它取值90的整數(shù)數(shù)值類屬性用來得到數(shù)組、塊或者一般數(shù)據(jù)的有關(guān)值。數(shù)值類屬性又分為3個子類: 一般數(shù)據(jù)的數(shù)值屬性; 數(shù)組的數(shù)值屬性; 塊的數(shù)值屬性。1)一般數(shù)據(jù)的數(shù)值屬性)一般數(shù)據(jù)的數(shù)值屬性一般數(shù)據(jù)的數(shù)值屬性的書寫格式為: 客體客體 屬性名屬性名一般數(shù)據(jù)的數(shù)值屬性有以下4種: TLEFT-得到數(shù)據(jù)類或子類區(qū)間的最左端的值; TRIGHT-得到數(shù)據(jù)類或子類區(qū)間的最右端的值; THIGH-得到數(shù)據(jù)類
56、或子類區(qū)間的最高端的值; TLOW-得到數(shù)據(jù)類或子類區(qū)間的最低端的值;T為客體,代表一般數(shù)據(jù)類和子類的名稱,符號“”緊跟客體后面,符號“”后面是屬性名。例:例: TYPE number IS 0 TO 9; i:=numberLEFT; - i=0 i:=numberRIGHT; - i=9 i:=numberHIGHT; - i=9 i:=numberLOW; - i=0改為改為 9 DOWNTO 0,則會怎樣?則會怎樣? 數(shù)值類屬性不光適用于數(shù)字類型,而且該屬性還可以適用于任何標(biāo)量類型。如: TYPE tim IS ( sec, min, hours, day, month, year )
57、;SUBTYPE reverse_tim IS tim RANGE month DOWNTO min; tim1=timLEFT; -得到得到sec tim2=timRIGHT; -得到得到y(tǒng)ear tim3=timHIGH; -得到得到y(tǒng)ear tim4=timLOW; -得到得到sec tim5=reverse_timLEFT; -得到得到month tim6=reverse_timRIGHT; -得到得到min tim7=reverse_timHIGH; -得到得到month tim8=reverse_timLOW; -得到得到min 在使用時,應(yīng)注意方向,即是用在使用時,應(yīng)注意方向,即
58、是用DOWNTO 還是還是TO,LEFT和和LOW,RIGHT和和HIGHT是不一樣的。是不一樣的。枚舉類型數(shù)據(jù)定義,數(shù)據(jù)的序號值從左到右遞增子類型的定義,注意數(shù)據(jù)的區(qū)間用的是DOWNTO枚舉類型數(shù)據(jù)的數(shù)值屬性 數(shù)組的類屬性只有一個即:TLENGTH,得到給定數(shù)組的長度。例:PROCESS ( a ) TYPE bit4 IS ARRAY ( 0 TO 3 ) of BIT ; TYPE bit_strange IS ARRAY ( 10 TO 20 )OF BIT ; VARIABLE len1, len2 : INTEGER;BEGIN len1:= bit4LENGTH; -len1=4
59、 len2:=bit_strangeLENGTH; -len2=11END PROCESS; 該屬性可用于任何標(biāo)量類數(shù)組(如枚舉類型)和多維的標(biāo)量類區(qū)間的數(shù)組。具體請同學(xué)們看書。一個包含4個元素數(shù)組的定義一個包含11個元素數(shù)組的定義,其起始位10和終值位20.塊的數(shù)據(jù)屬性有兩種:STRUCTURE和 BEHAVIOR。這兩種屬性用于塊和構(gòu)造體,通過它們可以驗證所說明的塊或構(gòu)造體是用結(jié)構(gòu)描述方式還是用行為方式來描述模塊的。這對設(shè)計人員檢查程序是非常有用的。 如果塊有標(biāo)號說明,或者構(gòu)造體有構(gòu)造體名說明,而且在塊和構(gòu)造體中不存在COMPNENT語句,那么用屬性BEHAVIOR將得到“TRUE”的信息
60、; 如果在塊和構(gòu)造體中只有COMPONET語句或被動進程,那么用屬性STRUCTURE將得到“TRUE”的信息。 函數(shù)類屬性是指屬性以函數(shù)的形式,讓設(shè)計人員得到有關(guān)數(shù)據(jù)類型、數(shù)組、信號的某些信息。 函數(shù)類屬性3種:數(shù)據(jù)類型屬性函數(shù);數(shù)組屬性函數(shù);信號屬性函數(shù)。1)數(shù)據(jù)類型屬性函數(shù))數(shù)據(jù)類型屬性函數(shù) 用數(shù)據(jù)類型屬性函數(shù)可以得到有關(guān)數(shù)據(jù)類型的各種信息。 例如,給出某類數(shù)據(jù)值的位置,那么利用位置函數(shù)屬性就可以得到該位置的數(shù)值。另外,利用其它相應(yīng)屬性還可以得到某些值的左鄰值各右鄰值等等。POS(x) -得到輸入x值的位序號;VAL(x) -得到輸入位置序號x的值;SUCC(x) -得到輸入x值的下一個
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025開學(xué)第一課專題觀后感
- 彭水2025年上半年公招擬錄用公務(wù)員人民警察公示
- 肩關(guān)節(jié)鏡圍手術(shù)期護理
- 小班健康:小嘴巴咬人行為解析與引導(dǎo)
- 電飯鍋產(chǎn)品培訓(xùn)
- 有限空間作業(yè)安全管理
- 胸外科術(shù)后并發(fā)疼痛護理
- 學(xué)生營養(yǎng)健康日
- 劉天鵬健康講座
- 小班健康活動《心情娃娃》教案設(shè)計
- 打架傷人和解協(xié)議書范本
- 2025至2030全球及中國浮式液化天然氣行業(yè)產(chǎn)業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
- 2025年湖北省中考生物、地理合卷試卷真題(含答案)
- 藥品陳列養(yǎng)護管理制度
- 智慧校園建設(shè)“十五五”發(fā)展規(guī)劃
- 招商人員筆試題目及答案
- 2025至2030年中國智能炒菜機(炒菜機器人)行業(yè)市場現(xiàn)狀調(diào)查及前景戰(zhàn)略研判報告
- 路面銑刨工入場安全教育試卷(含答案)
- 物理●湖北卷丨2024年湖北省普通高中學(xué)業(yè)水平選擇性考試物理試卷及答案
- 2024大華網(wǎng)絡(luò)攝像機使用說明書全集
- T/CNFAGS 15-2024綠色合成氨分級標(biāo)準(zhǔn)(試行)
評論
0/150
提交評論