




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、VHDL語法簡單總結(jié)一個VHDL程序代碼包含實體(entity)、結(jié)構(gòu)體(architecture)、配置(configuration)、程序包(package)、庫(library)等。 一、 數(shù)據(jù)類型1.用戶自定義數(shù)據(jù)類型使用關(guān)鍵字TYPE,例如:TYPE my_integer IS RANGE -32 TO 32;用戶自定義的整數(shù)類型的子集TYPE student_grade IS RANGE 0 TO 100;用戶自定義的自然數(shù)類型的子集TYPE state IS (id
2、le, forward, backward, stop);枚舉數(shù)據(jù)類型,常用于有限狀態(tài)機的狀態(tài)定義一般來說,枚舉類型的數(shù)據(jù)自動按順序依次編碼。2.子類型在原有已定義數(shù)據(jù)類型上加一些約束條件,可以定義該數(shù)據(jù)類型的子類型。VHDL不允許不同類型的數(shù)據(jù)直接進(jìn)行操作運算,而某個數(shù)據(jù)類型的子類型則可以和原有類型數(shù)據(jù)直接進(jìn)行操作運算。子類型定義使用SUBTYPE關(guān)鍵字。3.數(shù)組(ARRAY)ARRAY是將相同數(shù)據(jù)類型的數(shù)據(jù)集合在一起形成的一種新的數(shù)據(jù)類型。TYPE type_name IS ARRAY (specification) OF data_type;定義新的數(shù)組類型語法結(jié)構(gòu)SIGNAL sign
3、al_name: type_name := initial_value;使用新的數(shù)組類型對SIGNAL,CONSTANT, VARIABLE進(jìn)行聲明例如:TYPE delay_lines IS ARRAY (L-2 DOWNTO 0) OF SIGNED (W_IN-1 DOWNTO 0);濾波器輸入延遲鏈類型定義TYPE coeffs IS ARRAY (L-1 DOWNTO 0) OF SIGNED (W_COEF-1 DOWNTO 0);濾波器系數(shù)類型定義SIGNAL delay_regs: delay_lines; 信號延遲寄存器聲明CONSTANT coef:
4、 coeffs := ( ); 常量系數(shù)聲明并賦初值4.端口數(shù)組在定義電路的輸入/輸出端口時,有時需把端口定義為矢量陣列,而在ENTITY中不允許使用TYPE進(jìn)行類型定義,所以必須在包集(PACKAGE)中根據(jù)端口的具體信號特征建立用戶自定義的數(shù)據(jù)類型,該數(shù)據(jù)類型可以供包括ENTITY在內(nèi)的整個設(shè)計使用。PACKAGE-library ieee;use ieee.std_logic_1164.all;PACKAGE my_data_types IS TYPE vector_array IS
5、ARRAY (natural range <>) OF STD_LOGIC_VECTOR(7 DOWNTO 0); 聲明8位的數(shù)組END my_data_types;Main Codelibrary ieee;use ieee.std_logic_1164.all;use work.my_data_types.all; 用戶自定義包集ENTITY mux ISPORT (inp: IN vector_array(0 to 3);END mux;-5.有符號數(shù)和無符號數(shù)要使用SIGNED和UNSIGNED類型數(shù)據(jù),必須在代碼開始部分聲明ieee庫中的包集std_logic_arith
6、。它們支持算術(shù)運算但不支持邏輯運算。library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;SIGNAL a: IN SIGNED (7 DOWNTO 0);SIGNAL b: IN SIGNED (7 DOWNTO 0);SIGNAL x: IN SIGNED (7 DOWNTO 0);v <= a + b;w <= a AND b; 非法(不支持邏輯運算)-STD_LOGIC_VECTOR類型的數(shù)據(jù)不能直接進(jìn)行算術(shù)運算,只有聲明了std_logic_signed和std_l
7、ogic_unsigned兩個包集后才可以像SIGNED和UNSIGNED類型的數(shù)據(jù)一樣進(jìn)行算術(shù)運算。6.數(shù)據(jù)類型轉(zhuǎn)換在ieee庫的std_logic_arith包集中提供了許多數(shù)據(jù)類型轉(zhuǎn)換函數(shù):1. conv_integer(p): 將數(shù)據(jù)類型為INTEGER,UNSIGNED,SIGNED,STD_ULOGIC或STD_LOGIC的操作數(shù)p轉(zhuǎn)換成INTEGER類型。不包含STD_LOGIC_VECTOR。2 conv_unsigned(p,b):將數(shù)據(jù)類型為INTEGER,UNSIGNED,SIGNED或STD_ULOGIC的操作數(shù)p轉(zhuǎn)換成位寬為b的UNSIGNED類型數(shù)據(jù)。3 conv_
8、signed(p,b):將數(shù)據(jù)類型為INTEGER, UNSIGNED, SIGNED或STD_ULOGIC的操作數(shù)p轉(zhuǎn)換成位寬為b的SIGNED類型的數(shù)據(jù)。4 conv_std_logic_vector(p, b):將數(shù)據(jù)類型為INTEGER, UNSIGNED, SIGNED或STD_LOGIC的操作數(shù)p轉(zhuǎn)換成位寬為b的STD_LOGIC_VECTOR類型的數(shù)據(jù)。 二、 運算操作符和屬性1. 運算操作符l&
9、#160; 賦值運算符賦值運算符用來給信號、變量和常數(shù)賦值。<= 用于對SIGNAL類型賦值;:= 用于對VARIABLE,CONSTANT和GENERIC賦值,也可用于賦初始值;=> 用于對矢量中的某些位賦值,或?qū)δ承┪恢獾钠渌毁x值(常用OTHERS表示)。例:SIGNAL x: STD_LOGIC;VARIABLE y: STD_LOGIC_VECTOR(3 DOWNTO 0); 最左邊的位是M
10、SBSIGNAL w: STD_LOGIC_VECTOR(0 TO 7); 最右邊的位是MSBx <= 1;y := “0000”;w <= “1000_0000”; LSB位為1,其余位為0w <= (0 => 1, OTHERS => 0); LSB位是1, 其他位是0l 邏輯運算符操作數(shù)必須是BIT, STD_LOGIC或STD_ULOGIC類型的數(shù)據(jù)或者是這些數(shù)據(jù)類型的擴(kuò)展,即BIT_VECTOR, STD_LOGIC_VECTOR,STD_ULOGIC_VECTO
11、R。VHDL的邏輯運算符有以下幾種:(優(yōu)先級遞減) NOT 取反 AND 與 OR 或 NAND 與非 NOR 或非 XOR 異或l 算術(shù)運算符操作數(shù)可以是INTEGER, SIGNED, UNSIGNED, 如果聲明了std_logic_signed或std_logic_unsigned,可對STD_LOGIC_VECTOR類型的數(shù)據(jù)進(jìn)行加法或減法運算。+ 加-
12、0; 減* 乘/ 除* 指數(shù)運算MOD 取模REM 取余ABS 取絕對值加,減,乘是可以綜合成邏輯電路的;除法運算只在除數(shù)為2的n次冪時才能綜合,此時相當(dāng)于對被除數(shù)右移n位;對于指數(shù)運算,只有當(dāng)?shù)讛?shù)和指數(shù)都是靜態(tài)數(shù)值(常量或GENERIC參數(shù))時才是可綜合的;對于MOD運算,結(jié)果的符號同第二個參數(shù)的符號相同,對于REM運算,結(jié)果的符號同第一個參數(shù)符號相同。l 關(guān)系運算符=, /=, <, >, <=, >=左右兩邊操作數(shù)的類型必須相同。l
13、160; 移位操作符<左操作數(shù)> <移位操作符> <右操作數(shù)>其中左操作數(shù)必須是BIT_VECTOR類型的,右操作數(shù)必須是INTEGER類型的(可以為正數(shù)或負(fù)數(shù))。VHDL中移位操作符有以下幾種:u sll 邏輯左移 數(shù)據(jù)左移,右端補0;u srl 邏輯右移 數(shù)據(jù)右移,左端補0;u sla 算術(shù)左移 數(shù)據(jù)左移,同時復(fù)制最右端的位,填充在右端空出的位
14、置;u sra 算術(shù)右移 數(shù)據(jù)右移,同時復(fù)制最左端的位,填充在左端空出的位置;u rol 循環(huán)邏輯左移 數(shù)據(jù)左移,從左端移出的位填充到右端空出的位置上;u ror 循環(huán)邏輯右移 數(shù)據(jù)右移,從右端移出的位填充到左端空出的位置上。例:x <= “01001”,那么:y <= x sll 2; 邏輯左移2位,y<=”00100”y <= x sla 2;
15、算術(shù)左移2位,y<=”00111”y <= x srl 3; 邏輯右移3位,y<=”00001”y <= x sra 3; 算術(shù)右移3位,y<=”00001”y <= x rol 2; 循環(huán)左移2位,y<=”00101”y <= x srl -2; 相當(dāng)于邏輯左移2位l 并置運算符用于位的拼接,操作數(shù)可以是支持邏輯運算的任何數(shù)據(jù)類型。有以下兩種:² &²
16、 (, , , )與Verilog中的功能一樣。2. 屬性(ATTRIBUTE)l 數(shù)值類屬性數(shù)值類屬性用來得到數(shù)組、塊或一般數(shù)據(jù)的相關(guān)信息,例如可用來獲取數(shù)組的長度和數(shù)值范圍等。以下是VHDL中預(yù)定義的可綜合的數(shù)值類屬性:dLOW 返回數(shù)組索引的下限值dHIGH
17、0; 返回數(shù)組索引的上限值dLEFT 返回數(shù)組索引的左邊界值dRIGHT 返回數(shù)組索引的右邊界值dLENGTH 返回矢量的長度值dRANGE
18、; 返回矢量的位寬范圍dREVERSE_RANGE 按相反的次序返回矢量的位寬范圍例:定義信號 SIGNAL d: STD_LOGIC_VECTOR(7 DOWNTO 0);則有:dLOW = 0, dHIGH = 7, dLEFT = 7, dRIGHT = 0, dLENGTH = 8, dRANGE = (7 DOWNTO 0), dREVERSE_RANGE = (0 TO 7).l 信號類屬性對于信號s,有以下預(yù)定義的屬性(
19、可綜合的):sEVENT 若s的值發(fā)生變化,則返回布爾量TRUE,否則返回FALSEsSTABLE 若s保持穩(wěn)定,則返回TRUE,否則返回FALSE例:clk的上升沿判斷IF (clkEVENT AND clk = 1)IF (NOT clkSTABLE AND clk = 1)WAIT UNTIL (clkEVENT AND clk = 1)3.
20、 通用屬性語句GENERIC語句提供了一種指定常規(guī)參數(shù)的方法,所指定的參數(shù)是靜態(tài)的,增加了代碼的可重用性,類似于Verilog中的parameter與defparam。GENERIC語句必須在ENTITY中進(jìn)行聲明,由GENERIC語句指定的參數(shù)是全局的,不僅可在ENTITY內(nèi)部使用,也可在后面的整個設(shè)計中使用。語法結(jié)構(gòu)如下:GENERIC (parameter_name: parameter_type := parameter_value);用GENERIC語句指定多個參數(shù):GENERIC (n: INTEGE
21、R := 8; vector: BIT_VECTOR := “0000_1111”); 三、 并發(fā)代碼VHDL中并發(fā)描述語句有WHEN和GENERATE。除此之外,僅包含AND, NOT, +, *和sll等邏輯、算術(shù)運算操作符的賦值語句也是并發(fā)執(zhí)行的。在BLOCK中的代碼也是并發(fā)執(zhí)行的。從本質(zhì)上講,VHDL代碼是并行執(zhí)行的。只有PROCESS, FUNCTION, PROCEDURE內(nèi)部的代碼才是順序執(zhí)行的。但是當(dāng)它們作為一個整體時,與其他模塊之間又是并行執(zhí)行的。并發(fā)代碼稱為“
22、數(shù)據(jù)流”代碼。通常我們只能用并發(fā)描述語句來實現(xiàn)組合邏輯電路,為了實現(xiàn)時序邏輯電路,必須使用順序描述語句。事實上,使用順序描述語句可以同時實現(xiàn)組合邏輯電路和時序邏輯電路。在并發(fā)代碼中可以使用以下各項:Ø 運算操作符Ø WHEN語句(WHEN/ELSE或WITH/SELECT/WHEN)Ø GENERATE語句Ø BLOCK語句使用運算操作符運算類型運算操作符操作數(shù)類型邏輯運算NOT, AND, NAND,ORNOR, XOR, XNORBIT, BIT_VECTOR,
23、STD_LOGIC, STD_LOGIC_VECTORSTD_ULOGIC, STD_ULOGIC_VECTOR算術(shù)運算符+, , *, /, *INTEGER, SIGNED, UNSIGNED比較運算符=, /=, <, >, <=, >=任意數(shù)據(jù)類型移位運算符sll, srl, sla, sra, rol, rorBIT_VECTOR并置運算符&,(, , ,)STD_LOGIC, STD_LOGIC_VECTOR, STD_ULOGICSTD_ULOGIC_VECTOR, SIGNED, UNSIGNEDWHEN語句WHEN語句是一種基本的并發(fā)描述語句,
24、有兩種形式:WHEN/ELSE和WITH/SELECT/WHEN。WHEN/ELSE語法結(jié)構(gòu):assignment WHEN condition ELSEassignment WHEN condition ELSE;WITH/SELECT/WHEN語法結(jié)構(gòu)WITH identifier SELECTassignment WHEN value,assignemnt WHEN value,;當(dāng)使用WITH/SELECT/WHEN時,必須對所有可能出現(xiàn)的條件給予考慮,使用關(guān)鍵字OTHERS,如果在某些條件出現(xiàn)時不需要進(jìn)行任何操作,那應(yīng)該使用UNAFFECTED。例: -with WHEN/
25、ELSE-Output <= “000” WHEN (inp = 0 OR reset = 1) ELSE “001” WHEN ctl = 1 ELSE “010”;with WITH/SELECT/WHENWI
26、TH control SELECT Output <= “000” WHEN reset, “111” WHEN set,
27、0; UNAFFECTED WHEN OTHERS;對于WHEN語句,WHEN value的描述方式有以下幾種:WHEN value &
28、#160;針對單個值進(jìn)行判斷WHEN value1 to value2 針對取值范圍進(jìn)行判斷WHEN value1 | value2 | 針對多個值進(jìn)行判斷GENERATE語句GENERATE語句和順序描述語句中的LOOP語句一樣用于循環(huán)執(zhí)行某項操作,通常與FOR一起使用。語法結(jié)構(gòu)如下:label: FOR identifier IN range GENERATE
29、0; (concurrent assignments)END GENERATEGENERATE語句還有另一種形式:IF/GENERATE,此處不允許使用ELSE。IF/GENERATE可以嵌套在FOR/GENERATE內(nèi)部使用。反之亦然。Label1: FOR identifier IN range GENERATE Label2: IF condition GENERATE
30、; (concurrent assignments) END GENERATE;END GENERATE;例:SIGNAL x: BIT_VECTOR(7 DOWNTO 0);SIGNAL y: BIT_VECTOR(15 DOWNTO 0);SIGNAL z: BIT_VECTOR(7 DOWNTO 0);G1: FOR i IN xRANGE GENERATEz(i) <= x(i) AND y(i+8);END GENERATE;GENERAT
31、E中循環(huán)操作的上界和下界必須是靜態(tài)的,在使用過程中還要注意多值驅(qū)動問題。例:OK: FOR i IN 0 TO 7 GENERATE Output(i) <= 1 WHEN (a(i) AND b(i) = 1 ELSE 0;END GENERATE;NotOK: FOR i IN 0 TO 7 GENERATE accum <= “1111_1111”
32、0; WHEN (a(i) AND b(i) = 1 ELSE “0000_0000”;END GENERATE;-NotOK: FOR i IN 0 TO 7 GENERATE Accum <= accum + 1 WHEN x(i) = 1;END GENERATE;-塊語句(BLOCK)VHDL中有兩種BLOCK:simple BLOCK和guarded BLOCK。n Simple BLOCKSimple BLOCK僅僅是
33、對原有代碼進(jìn)行區(qū)域分割,增強整個代碼的可讀性和可維護(hù)性。語法結(jié)構(gòu)如下:label:BLOCK declarative partBEGIN (concurrent statement)END BLOCK label;-ARCHITETURE exampleBEGIN
34、160;block1: BLOCK BEGIN END BLOCK block1; block2: B
35、LOCK BEGIN END BLOCK block2;END example; 例:b1: BLOCK SIGNAL a: STD_LOGIC;BEGIN a &l
36、t;= input_sig WHEN ena = 1 ELSE z;END BLOCK b1;-無論是simple BLOCK還是guarded BLOCK,其內(nèi)部都可以嵌套其他的BLOCK語句,相應(yīng)的語法結(jié)構(gòu)如下:label1: BLOCK 頂層BLOCK聲明部分BEGIN 頂層BLOCK并發(fā)描述部分label2: BLOCK
37、; 嵌套BLOCK聲明部分BEGIN 嵌套BLOCK并發(fā)描述部分 END BLOCK label2;頂層BLOCK其他并發(fā)描述語句END BLOCK label1;n Guarded BLOCK多了一個衛(wèi)式表達(dá)式,只有當(dāng)衛(wèi)式表達(dá)式為真時才能執(zhí)行。語法結(jié)構(gòu)如下:Label: BLOCK(衛(wèi)式表達(dá)式)
38、; 聲明部分BEGIN (衛(wèi)式語句和其他并發(fā)描述語句)END BLOCK label; 四、 順序代碼在PROCESS, FUNCTION, PROCEDURE內(nèi)部的代碼都是順序執(zhí)行的,這樣的語句包括IF,WAIT,CASE和LOOP。變量只能在順序代碼中使用,相對于信號而言,變量是局部的,所以它的值不能傳遞到PROCESS,F(xiàn)UNCTION和PROCEDURE的外部。1.
39、160; 進(jìn)程(PROCESS)進(jìn)程內(nèi)部經(jīng)常使用IF,WAIT,CASE或LOOP語句。PROCESS具有敏感信號列表(sensitivity list),或者使用WAIT語句進(jìn)行執(zhí)行條件的判斷。PROCESS必須包含在主代碼段中,當(dāng)敏感信號列表中的某個信號發(fā)生變化時(或者當(dāng)WAIT語句的條件得到滿足時),PROCESS內(nèi)部的代碼就順序執(zhí)行一次。語法結(jié)構(gòu)如下:label: PROCESS (sensitivity list) VARIABLE name t
40、ype range := initial_value; BEGIN (順序執(zhí)行的代碼)END PROCESS label;如果要在PROCESS內(nèi)部使用變量,則必須在關(guān)鍵字BEGIN之前的變量聲明部分對其進(jìn)行定義。變量的初始值是不可綜合的,只用于仿真。在設(shè)計同步電路時,要對某些信號邊沿的跳變進(jìn)行監(jiān)視(時鐘的上升沿或下降沿)。通常使用EVENT屬性來監(jiān)視一個信號是否發(fā)生了變化。2. 信號和變量信號可在PACKAGE,ENTITY和ARCHITEC
41、TURE中聲明,而變量只能在一段順序描述代碼的內(nèi)部聲明。因此,信號通常是全局的,變量通常是局部的。賦予變量的值是立刻生效的,在后續(xù)的代碼中,此變量將使用新的變量值,而信號的值通常只有在整個PROCESS執(zhí)行完畢后才開始生效。3. IF語句IF/ELSE語句在綜合時可能會產(chǎn)生不必要的優(yōu)先級解碼電路。IF語句語法結(jié)構(gòu)如下:IF conditions THEN assignments;ELSIF conditions THEN assignments;ELSE assignments;END IF;例:IF (x < y)
42、temp := “1111_1111”;ELSIF (x = y AND w = 0) THEN temp := “1111_0000”;ELSE temp := (OTHERS => 0);4. WAIT語句如果在process中使用了WAIT語句,就不能使用敏感信號列表了。WAIT語句使用以下3種形式的語法結(jié)構(gòu):WAIT UNTIL signal_condition;WAIT ON signal1 , signal2, .;WAIT FOR time;WAIT UNTIL 后面只有一個信號條件表達(dá)式,更適
43、合于實現(xiàn)同步電路(將時鐘的上升沿或下降沿作為條件),由于沒有敏感信號列表,所以它必須是process的第一條語句。當(dāng)WAIT UNTIL語句的條件滿足是,process內(nèi)部的代碼就執(zhí)行一遍。帶有同步復(fù)位的8bit寄存器process 沒有敏感信號列表begin wait until (clkevent and clk = 1); if (rst = 1) then
44、 output <= (others => 0); elsif (clkevent and clk = 1) then output <= input;
45、160;end if;end process;WAIT ON 語句中可以出現(xiàn)多個信號,只要信號列表中的任何一個發(fā)生變化,process內(nèi)的代碼就開始執(zhí)行。帶異步復(fù)位的8bit寄存器processbegin wait on clk, rst; if (rst = 1) then
46、160;output <= (others => 0); elsif (clkevent and clk = 1) then output <= input; end if;end process;WAIT FOR 語句只能用于仿真。 5.&
47、#160; CASE 語句CASE語句的語法結(jié)構(gòu)如下:CASE 表達(dá)式 IS WHEN 條件表達(dá)式 => 順序執(zhí)行語句; WHEN 條件表達(dá)式 => 順序執(zhí)行語句; END CASE例:case cont
48、rol is when “00 => x <= a; y <= b; when “01 => x <= b; y <= c;
49、0; when others => x <= “0000; y <= “zzzz”;end case;關(guān)鍵詞OTHERS代表了所有未列出的可能情況,與Verilog中default相當(dāng)。關(guān)鍵詞NULL表示沒有操作發(fā)生,如WHEN OTHERS => NULL.CASE語句允許在每個測試條件下執(zhí)行多個賦值操作,WHEN語句只允許執(zhí)行一個賦值操作。6. LOOP語句LOOP語句用在需要多次重復(fù)執(zhí)行時。語法結(jié)構(gòu)有以下幾種:FOR/LOOP: 循環(huán)固定
50、次數(shù)label: FOR 循環(huán)變量 IN 范圍 LOOP (順序描述語句)END LOOP label;WHILE/LOOP: 循環(huán)執(zhí)行直到某個條件不再滿足label: WHILE condition LOOP (順序描述語句)END LOOP label;EXIT: 結(jié)束整個循環(huán)操作label: EXIT label WHEN condition;NEXT: 跳出本次循
51、環(huán)label: NEXT loop_label WHEN condition; Example: FOR/LOOPfor i in 0 to 5 loop x(i) <= enable and w(i+2); y(0, i) <= w(i);end loopExample: WHILE/LOOPwhile (i < 10) loop 09
52、0; wait until clkevent and clk = 1; (其他語句)end loop; for i in 0 to datarange loop case data(i) is when 0 => coun
53、t := count + 1; when others => null; end case;end loop;7. CASE語句和IF語句的比較IF語句和CASE語句編寫的代碼在綜合、優(yōu)化后最終生成的電路結(jié)構(gòu)是一樣的。例:下面兩段代碼綜合后可以得到結(jié)構(gòu)相同的多路復(fù)用器with
54、 IFif (sel = “00) then x <= a;elsif (sel = “01) then x <= b;elsif (sel = “10) then x <= c;else x <= d;end if;-with casecase sel is when “00 => x <= a;
55、; when “01 => x <= b; when “10 => x <= c; when others => x <= d;end case;8.
56、60; CASE語句和WHEN語句的比較case語句和when語句的不同之處在于,when語句是并發(fā)執(zhí)行的,case語句是順序?qū)嵭械?。下面兩段代碼的功能等效-with whenwith sel select x <= a when “000, b when “001,
57、0; c when “101, unaffected when others;-with casecase sel is when “000 => x <= a;
58、 when “001 => x <= b; when “101 => x <= c; when others => null;end case;9. 使用順序代碼設(shè)計組合邏輯電路原則1:確保在process中用到的所有輸入信號都出現(xiàn)在敏感信號列表中;原則2:電路的真值表必須在代碼中完整的反映出來。(否
59、則會生成鎖存器) 五、 信號和變量常量和信號是全局的,既可以用在順序執(zhí)行的代碼中,也可用在并發(fā)執(zhí)行的代碼中。變量是局部的,只能用在順序代碼中,并且它們的值是不能直接向外傳遞的。1. 常量CONSTANT name: type := value;2. 信號-signalVHDL中的signal代表的是邏輯電路中的“硬”連線,既可用于
60、電路的輸入/輸出端口,也可用于電路內(nèi)部各單元之間的連接。Entity的所有端口默認(rèn)為signal。格式如下:SIGNAL name: type range := initial value;當(dāng)信號用在順序描述語句中時,其值不是立刻更新的,信號值是在相應(yīng)的進(jìn)程、函數(shù)或過程完成之后才進(jìn)行更新的。對信號賦初值的操作時不可綜合的。3. 變量變量僅用于局部電路的描述,只能在順序執(zhí)行的代碼中使用,而且對它的賦值是立即生效的,所以新的值可在下一行代碼中立即使用。格式:VARIABLE name: type range := initial
61、 value;對變量的賦初值操作也是不可綜合的。4. 寄存器的數(shù)量當(dāng)一個信號的賦值是以另一個信號的跳變?yōu)闂l件時,或者說當(dāng)發(fā)生同步賦值時,該信號經(jīng)過編譯后就會生成寄存器。如果一個變量是在一個信號跳變時被賦值的,并且該值最終又被賦給了另外的信號,則綜合后就會生成寄存器。如果一個信號在還沒有進(jìn)行賦值操作時已被使用,那么也會在綜合時生成寄存器。process (clk)begin if (clkevent and clk = 1) then
62、 output1 <= temp; output1被寄存 output2 <= a;
63、160; output2被寄存 end if;end process; process (clk)begin if (clkevent and clk = 1) then output1 <= temp; &
64、#160; output1被寄存 end if; output2 <= a; output2未被寄存end process; process (clk) variable temp:
65、 bit;begin if (clkevent and clk = 1) then temp <= a; end if; x <= temp;
66、 temp促使x被寄存end process; 六、 包集元件1. 包集經(jīng)常使用的代碼通常以component,function或procedure的形式編寫。這些代碼被添加到package中,并在最后編譯到目標(biāo)library中。Package中還可以包含TYPE和CONSTANT的定義。語法格式如下:package package_name is
67、160; (declaration)end package_name;package body package_name is (function and procedure description)end package_name;Example6.1 簡單的程序包library ieee;use ieee.std_logic_1164.all;-package my_package is typ
68、e state is (st1, st2, st3, st4); type color is (red, green, blue); constant vec: std_logic_vector(7 downto0) := “1111_1111;end my_package;Example6.2 內(nèi)部包含函數(shù)的packagelibrary ieee;u
69、se ieee.std_logic_1164.all;-package my_package is type state is (st1, st2, st3, st4); type color is (red, green, blue); contant vec: std_logic_vector(7 downto 0) := “1111_1111;&
70、#160; function positive_edge(signal s: std_logic) return boolean;end my_package;-package body my_package is function positive_edge(signal s: std_logic) return boolean is begin
71、60; return(sevent and s = 1); end positive_edge;end my_package;為了在QUARTUS II中使用這些package,要在當(dāng)前project目錄下新建一個文件夾,不妨起名為user_lib,把要編譯的package放進(jìn)此文件夾中,然后在AssignmentsàSettingàLibr
72、ary中設(shè)置相應(yīng)的目錄即可。在VHDL代碼中要使用這些package,要在主程序中加入如下代碼:use work.package_name.all;2. 元件component一個元件是一段結(jié)構(gòu)完整的常用代碼,包括聲明,實體和結(jié)構(gòu)體,使用component可以使代碼具有層次化的結(jié)構(gòu)。元件聲明:component comp_name is port (
73、 port_name1: signal_mode signal_type; port_name2: signal_mode signal_type;
74、 );end component;元件實例化:label: comp_name port map (port_list);元件的聲明可以放在主代碼中,即調(diào)用該元件的代碼;或者將元件的聲明放到package中,使用時在主代碼中增加一條USE語句即可,這樣避免了主代碼中每實例化一個元件就要聲明一次的麻煩。 3. 端口映射在元件實例化過程中,有兩種方法實現(xiàn)元件端口的映射:位置映射和名稱映射。compone
75、nt inverter is port ( a: in std_logic; b: out std_logic
76、60;);end component;U1: inverter port map(x, y);此處采用的是位置映射法,x對應(yīng)a,y對應(yīng)b。U1: inverter port map(a => x, b=> y);此處采用的是名稱映射法。對于不需要使用的端口可以斷開,只需使用關(guān)鍵字open即可,但是輸入端口不能指定為空連接。比如:U2: my_circuit port map(x => a, y => b, w => open, z => b); 4. GENERIC參數(shù)映射元件實
77、例化時如果要通過GENERIC傳遞參數(shù),則需進(jìn)行GENERIC參數(shù)的映射。元件實例化的格式如下:label: comp_name generic map(param_list) port map(port_list);七、 函數(shù)和過程Function和procedure統(tǒng)稱為子程序,內(nèi)部包含的都是順序描述的VHDL語言.八、 有限狀態(tài)機狀態(tài)機的設(shè)計包含兩個主要過程:狀態(tài)機建模和狀態(tài)的編碼。1.有限狀態(tài)機的建模有限狀態(tài)機通常使用CASE語句來建模,一般的模型由兩個進(jìn)程組成,一個進(jìn)程用來實現(xiàn)時序邏輯電路,另一個進(jìn)程用來實現(xiàn)組合邏輯電路。模型的構(gòu)建:(1)
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030中國壁掛壁爐行業(yè)發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報告
- 2025至2030中國坐在洗滌器干燥器上行業(yè)發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報告
- 2025至2030中國在線費用報告軟件行業(yè)發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報告
- 父親節(jié)的作文高中(11篇)
- 狀物作文我愛茉莉花500字(14篇)
- 母親心臟驟停急救方法
- 新生兒肺透明膜病的護(hù)理
- 假如我是一只小鳥作文(9篇)
- 改寫秋思1200字8篇
- 一個有趣的童話冒險故事14篇范文
- 立式水輪機組軸線調(diào)整及導(dǎo)軸承的間隙分配ppt課件
- DLT 596-2021 電力設(shè)備預(yù)防性試驗規(guī)程
- 內(nèi)分泌系統(tǒng)疾病病例分析
- 鋁箔軋制油過濾技術(shù)
- 華星全站儀使用說明書-
- 專項審計報告模板(青島市高新技術(shù)企業(yè)認(rèn)定專用)
- 成都市所有的藥房.doc
- 現(xiàn)澆混凝土單向板肋梁樓蓋設(shè)計
- 基于BIM模型技術(shù)交底應(yīng)用
- 產(chǎn)品設(shè)計和開發(fā)控制程序
- DLT5210.1-2021電力建設(shè)施工質(zhì)量驗收及評價規(guī)程
評論
0/150
提交評論