轉(zhuǎn)帖-VHDL語(yǔ)法學(xué)習(xí)(1)--初步認(rèn)識(shí)VHDL
對(duì)于簡(jiǎn)單的語(yǔ)法學(xué)習(xí)可以參照這個(gè)網(wǎng)站:http://www.seas.upenn.edu/~ese201/vhdl/vhdl_primer.html#_Toc526061341 有比較詳細(xì)的講解。 VHDL是用來(lái)描述數(shù)字電路的, 可以簡(jiǎn)單的描述一個(gè)門電路,還可以甚至復(fù)雜到描述微處理器或者一個(gè)系統(tǒng),但是無(wú)論描述的電路多么復(fù)雜,它的完整結(jié)構(gòu)都是由Entity,Architecture,Configuration,Package和Library 5個(gè)部分。但是一般情況,程序中只要有Entity和Architecture就可以描述電路了??聪聢D是一個(gè)簡(jiǎn)單的VHDL程序構(gòu)造圖:造圖: 舉一個(gè)簡(jiǎn)單的例子: ENTITY mux IS GENERIC( m:TIME := 1ns); PORT( d0,d1,sel: IN BIT; q:OUT BIT ); ARCHITECTURE connect OF mux IS SIGNAL tmp: BIT; BEGIN cale:PROCESS(d0,d1,sel) VARIABLE tmp1,tmp2,tmp3:BIT; BEGIN tmp1:= d0 and sel; tmp2:= d1 and (not sel); tmp3:= tmp1 or tmp2; tmp <= tmp3; q<= tmp AFTER m; END PROCESS; END connect; 知識(shí)點(diǎn):1)關(guān)于 GENERIC GENERIC必須放在端口說(shuō)明之前,用于指定參數(shù)。上面的例子中的語(yǔ)句指定了Architecture內(nèi)的m的值為1ns。舉個(gè)例子:tmp1:=d0 and sel AFTER m; 表示d0和sel兩個(gè)輸入信號(hào)相and之后,經(jīng)過(guò)1ns延遲才送到tmp1。2)SIGNAL,VARIABLE,CONSTANT 在例子中出現(xiàn)了SIGNAL和VARIABLE兩種,有什么區(qū)別呢? SIGNAL是一種表示全局的量,用在ARCHITECTURE,PACKAGE,ENTITY中;SIGNAL賦值的時(shí)候要用<=,和給Port賦值的時(shí)候方法一樣; VARIABLE是表示局部量,用在PROCESS,F(xiàn)UNCTION,PROCEDURE;VARIABLE賦值的時(shí)候要用:=,這一點(diǎn)是很大的不同; CONSTANT是全局量,在上面提到的所有場(chǎng)合中都可以用。CONSTANT也是用:=來(lái)賦值的;3)關(guān)于VHDL的數(shù)據(jù)類型。 VHDL數(shù)據(jù)類型 VHDL是一種強(qiáng)數(shù)據(jù)類型語(yǔ)言。要求設(shè)計(jì)實(shí)體中的每一個(gè)常數(shù)、信號(hào)、變量、函數(shù)以及設(shè)定的各種參量都必須具有確定的數(shù)據(jù)類型,并且相同數(shù)據(jù)類型的量才能互相傳遞和作用。 VHDL數(shù)據(jù)類型分為四大類: 1標(biāo)量類型(SCALAR TYPE); 2復(fù)合類型(COMPOSITE TYPE); 3存取類型(ACCESS TYPE); 4文件類型(FILES TYPE) 又分為: 1預(yù)定義數(shù)據(jù)類型、 2用戶自定義數(shù)據(jù)類型 1、VHDL的預(yù)定義數(shù)據(jù)類型 1)布爾量(boolean) 布爾量具有兩種狀態(tài):false 和 true 常用于邏輯函數(shù),如相等(=)、比較(<)等中作邏輯比較。如,bit 值轉(zhuǎn)化成boolean 值: boolean_var := (bit_var = ‘1’); 2)位(bit) bit 表示一位的信號(hào)值。 放在單引號(hào)中,如 ‘0’ 或 ‘1’。 3)位矢量 (bit_vector) bit_vector 是用雙引號(hào)括起來(lái)的一組位數(shù)據(jù)。 如: “001100” X“00B10B” 4)字符(character) 用單引號(hào)將字符括起來(lái)。 variable character_var : character; ... ... Character_var : = ‘A’; 5)整數(shù)(integer) integer 表示所有正的和負(fù)的整數(shù)。硬件實(shí)現(xiàn)時(shí),利用32位的位矢量來(lái)表示。可實(shí)現(xiàn)的整數(shù)范圍為: -(231-1) to (231-1) VHDL綜合器要求對(duì)具體的整數(shù)作出范圍限定,否則無(wú)法綜合成硬件電路。 如:signal s : integer range 0 to 15; 信號(hào) s 的取值范圍是0-15,可用4位二進(jìn)制數(shù)表示,因此 s 將被綜合成由四條信號(hào)線構(gòu)成的信號(hào)。 6)自然數(shù)(natural)和正整數(shù)(positive) natural是integer的子類型,表示非負(fù)整數(shù)。 positive是integer的子類型,表示正整數(shù)。 定義如下: subtype natural is integer range 0 to integer’high; subtype positive is integer range 1 to integer’high; 7)實(shí)數(shù)(REAL)或稱浮點(diǎn)數(shù) 取值范圍:-1.0E38 - +1.0E38 實(shí)數(shù)類型僅能用于VHDL仿真器,一般綜合器不支持。 8)字符串(string) string 是 character 類型的一個(gè)非限定數(shù)組。用雙引號(hào)將一串字符括起來(lái)。如: variable string_var : string(1 to 7); …… string_var := “Rosebud”; 9)時(shí)間(TIME) 由整數(shù)和物理單位組成 如:55 ms,20 ns 10)錯(cuò)誤等級(jí)(SEVERITY_LEVEL) 仿真中用來(lái)指示系統(tǒng)的工作狀態(tài),共有四種: NOTE(注意)、WARNING(警告)、ERROR(出錯(cuò))、FAILURE(失敗) 2、IEEE預(yù)定義標(biāo)準(zhǔn)邏輯位與矢量 1)std_logic 類型 由 ieee 庫(kù)中的std_logic_1164 程序包定義,為九值邏輯系統(tǒng),如下: (‘U’,‘X’,‘0’,‘1’,‘Z’,‘W’,‘L’,‘H’,‘-’) ‘U’:未初始化的, ‘X’:強(qiáng)未知的, ‘0’:強(qiáng)0, ‘1’:強(qiáng)1, ‘Z’:高阻態(tài), ‘W’:弱未知的, ‘L’:弱0, ‘H’:弱1, ‘-’:忽略 由 std_logic 類型代替 bit 類型可以完成電子系統(tǒng)的精確模擬,并可實(shí)現(xiàn)常見(jiàn)的三態(tài)總線電路。 2)std_logic_vector 類型 由 std_logic 構(gòu)成的數(shù)組。定義如下: type std_logic_vector is array(natural range<>) of std_logic; 賦值的原則:相同位寬,相同數(shù)據(jù)類型。 3、用戶自定義類型 用戶自定義類型是VHDL語(yǔ)言的一大特色。 可由用戶定義的數(shù)據(jù)類型有: 1)枚舉類型、 2)整數(shù)和實(shí)數(shù)類型、 3)數(shù)組類型、 4)記錄類型、 5)子類型 用類型定義語(yǔ)句TYPE和子類型定義語(yǔ)句SUBTYPE實(shí)現(xiàn)用戶自定義數(shù)據(jù)類型。 TYPE語(yǔ)句格式: 例:type byte is array(7 downto 0) of bit; variable addend : byte; type week is (sun, mon, tue, wed, thu,fri, sat); type 數(shù)據(jù)類型名 is 數(shù)據(jù)類型定義 [of 基本數(shù)據(jù)類型]; SUBTYPE語(yǔ)句格式: 例: subtype digits is integer range 0 to 9; 由subtype 語(yǔ)句定義的數(shù)據(jù)類型稱為子類型。 subtype 子類型名 is 基本數(shù)據(jù)類型 約束范圍; 1)枚舉類型 枚舉該類型的所有可能的值。格式: 如:type std_logic is(‘U’,‘X’,‘0’,‘1’, ‘Z’,‘W’,‘L’,‘H’,‘-’) 如:type color is(blue,green,yellow, red); type my_logic is (‘0’, ‘1’, ‘U’, ‘Z’); variable hue : color; signal sig : my_logic; hue := blue; sig <= ‘Z’; type 類型名稱 is (枚舉文字{,枚舉文字}); 枚舉類型的編碼: 綜合器自動(dòng)實(shí)現(xiàn)枚舉類型元素的編碼,一般將第一個(gè)枚舉量(最左邊)編碼為0,以后的依次加1。編碼用位矢量表示 ,位矢量的長(zhǎng)度將取所需表達(dá)的所有枚舉元素的最小值。 如:type color is(blue,green,yellow,red); 編碼為: blue=“00”; green=“01”; yellow=“10”; red=“11”; 2)整數(shù)類型 用戶定義的整數(shù)類型是標(biāo)準(zhǔn)包中整數(shù)類型的子范圍。格式:例:type my_integer is integer range 0 to 9; 3)數(shù)組類型 數(shù)組:同類型元素的集合。VHDL支持多維數(shù)組。 多維數(shù)組的聲明: type byte is array(7 downto 0) of bit; type vector is array(3 downto 0) of byte; 限定數(shù)組、非限定數(shù)組、屬性:type 類型名稱 is range 整數(shù)范圍; 限定數(shù)組: 其索引范圍有一定的限制。 格式: 非限定數(shù)組:數(shù)組索引范圍被定義成一個(gè)類型范圍。 格式: 例:type bit_vector is array(integer range <>) of bit; variable my_vector:bit_vector (5 downto -5); type 數(shù)組名 is array(數(shù)組范圍) of 數(shù)據(jù)類型; type 數(shù)組名 is array(類型名稱 range <>) of 數(shù)據(jù)類型; 屬性: VHDL為多種類型定義了屬性。 語(yǔ)法如下: 對(duì)象’屬性 VHDL為數(shù)組預(yù)先定義的屬性: left right high low length range reverse_range 對(duì)應(yīng)變量: variable my_vector : bit_vector (5 downto -5); 各屬性如下: my_vector’left 5 my_vector’right -5 my_vector’high 5 my_vector’low -5 my_vector’length 11 my_vector’range (5 downto -5) my_vector’reverse_range (-5 to 5) 4)記錄類型 記錄是不同類型的名稱域的集合。 格式如下: 訪問(wèn)記錄體元素的方式:記錄體名.元素名 type 記錄類型名 is record 元素名:數(shù)據(jù)類型名; 元素名:數(shù)據(jù)類型名; ┇ end record; 例: constant len:integer:= 8 ; subtype byte_vec is bit_vector(len-1 downto 0); type byte_and_ix is record byte : byte_vec; ix : integer range 0 to len; end record ; signal x, y, z : byte_and_ix ; signal data : byte_vec ; signal num : integer ; ……. x.byte <= “11110000” ; x.ix <= 2 ; data <= y.byte ; num <= y.ix ; z <= x ; 5)子類型 子類型是已定義的類型或子類型的一個(gè)子集。 格式: 例: bit_vector 類型定義如下: type bit_vector is array (natural range <>) of bit; 如設(shè)計(jì)中只用16bit;可定義子類型如下: subtype my_vector is bit_vector(0 to 15); 注:子類型與基(父)類型具有相同的操作符和子程序。可以直接進(jìn)行賦值操作。 subtype 子類型名 is 數(shù)據(jù)類型名[范圍]; 4、數(shù)據(jù)類型轉(zhuǎn)換 VHDL是一種強(qiáng)類型語(yǔ)言,不同類型的數(shù)據(jù)對(duì)象必須經(jīng)過(guò)類型轉(zhuǎn)換,才能相互操作。 1)類型轉(zhuǎn)換函數(shù)方式 通過(guò)調(diào)用類型轉(zhuǎn)換函數(shù),使相互操作的數(shù)據(jù)對(duì)象的類型一致,從而完成相互操作。 library ieee; library dataio; use ieee.std_logic_1164.all; use dataio.std_logic_ops.all; entity cnt4 is port(clk: in std_logic; p: inout std_logic_vector(3 downto 0); end cnt4; architecture behv of cnt4 is begin process(clk) begin if clk’event and clk=‘1’ then p<=to_vector(2, to_integer(p)+1); end if; end process; end behv; 2)直接類型轉(zhuǎn)換方式 對(duì)相互間非常關(guān)聯(lián)的數(shù)據(jù)類型(如整型、浮點(diǎn)型),可進(jìn)行直接類型轉(zhuǎn)換。格式: 數(shù)據(jù)類型標(biāo)識(shí)符(表達(dá)式) 如:variable a, b : real; variable c, d : integer; …… a:= real(c); d:= integer(b);4)VHDL的數(shù)據(jù)類型轉(zhuǎn)換 數(shù)據(jù)類型的轉(zhuǎn)換 在VHDL程序中,不同類型的對(duì)象不能代入,因此要進(jìn)行類型轉(zhuǎn)換.類型轉(zhuǎn)換的方法有: (1)類型標(biāo)記法.用類型名稱來(lái)實(shí)現(xiàn)關(guān)系密切的標(biāo)量類型之間的 轉(zhuǎn)換. 例如: VARIABLE x:INTEGER; VARIABLE y:REAL; 使用類型標(biāo)記(即類型名)實(shí)現(xiàn)類型轉(zhuǎn)換時(shí),可采用賦值語(yǔ)句: x :=INTEGER(y); y :=REAL(x). (2)類型函數(shù)法. VHDL程序包中提供了多種轉(zhuǎn)換函數(shù),使得某些類型的數(shù)據(jù)之間可以相互轉(zhuǎn)換,以實(shí)現(xiàn)正確的賦值操作.常用的類型轉(zhuǎn)換函數(shù)有: ★CONV_INTEGER ( ):將STD_LOGIC_VECTOR類型轉(zhuǎn)換成 INTEGER類型. ★CONV_STD_LOGIC_VECTOR( ):將INTEGER類型,UNSIGNED 類型或 SIGNED類型轉(zhuǎn)換成STD_LOGIC_VECTOR類型. ★TO_BIT ( ): 將STD_LOGIC類型轉(zhuǎn)換成BIT類型. ★TO_BIT_VECTOR( ):將STD_LOGIC_VECTOR類型轉(zhuǎn)換 BIT_VECTOR 類型. ★TO_STD_LOGIC( ): 將BIT類型轉(zhuǎn)換成STD_LOGIC類型. ★TO_STD_LOGIC_VECTOR( ): 將BIT_VECTOR類型轉(zhuǎn)換成 STD_LOGIC_VECTOR類型. 注意 :引用時(shí)必須首先 打開(kāi)庫(kù)和相應(yīng)的程序包. 該函數(shù)由STD_LOGIC_UNSIGNED 程序包定義 該函數(shù)由STD_LOGIC_ARITH 程序包定義 以下函數(shù)由STD_LOGIC_1164 -0----------------------------------------------- 類型轉(zhuǎn)換 類 型 變 換 函 數(shù) 由STD_LOGIC_VECTOR轉(zhuǎn)換成INTEGER STD_LOGIC_UNSIGNED包含集 CONV_INTEGER(A) 由INTEGER,UNSDGNED,SIGNED轉(zhuǎn)換成STD_LOGIC_VECTOR 由UNSIGNED,SIGNED轉(zhuǎn)換成INTEGER STD_LOGIC_ARITH包集合 CONV_STD_LOGIC_VECTOR(A,位長(zhǎng)) CONV_INTEGER(A) 由BIT_VECTOR轉(zhuǎn)換為STD_LOGIC_VECTOR 由STD_LOGIC_VECTO轉(zhuǎn)換為BIT_VECTOR 由BIT轉(zhuǎn)換成STD_LOGIC 由STD_LOGIC轉(zhuǎn)換成BIT STD_LOGIC_1164包集合 TO_STDLOGICVECTOR(A) TO_BITVECTOR(A) TO_STDLOGIC(A) TO_BIT(A) 功 能 函 數(shù) 名 由"STD_LOGIC_VECTOR"變換成"INTEGER"的實(shí)例 LIBRARY IEEE; USE IEEE STD_LOGIC_1164.ALL; USE IEEE STD_LOGIC_UNSIGNED.ALL; ENTITY add5 IS PORT (num:IN STD_LOGIC_VECTOR (2 DOWNTO 0); ┇ ); END add5; ARCHITECTURE rtl OF add5 IS SIGNAL in_num:INTEGER RANGE 0 TO 5; ┇ BEGIN in_num<=CONV_INTEGER (num); 位矢量轉(zhuǎn)換成整數(shù)變換式 ┇ END rtl; ^0^ ------------------------ 函 數(shù) 名 功 能 STD_LOGIC_1164包集合 TO_STDLOGICVECTOR(A) 由BIT_VECTOR轉(zhuǎn)換為STD_LOGIC_VECTOR TO_BITVECTOR(A) 由STD_LOGIC_VECTO轉(zhuǎn)換為BIT_VECTOR TO_STDLOGIC(A) 由BIT轉(zhuǎn)換成STD_LOGIC TO_BIT(A) 由STD_LOGIC轉(zhuǎn)換成BIT STD_LOGIC_ARITH包集合 CONV_STD_LOGIC_VECTOR(A, 由INTEGER,UNSDGNED,SIGNED轉(zhuǎn)換 位長(zhǎng)) STD_LOGIC_VECTOR CONV_INTEGER(A) 由UNSIGNED,SIGNED轉(zhuǎn)換成INTEGER STD_LOGIC_UNSIGNED包含集 CONV_INTEGER(A) 由STD_LOGIC_VECTOR轉(zhuǎn)換成INTEGER LIBRARY IEEE; USE IEEE STD_LOGIC_1164.ALL; USE IEEE STD_LOGIC_UNSIGNED.ALL; ENTITY add5 IS PORT( num:IN STD_LOGIC_VECTOR (2 DOWNTO 0); ┇ ); END add5; ARCHITECTURE rtl OF add5 IS SIGNAL in_num:INTEGER RANGE 0 TO 5; ┇ BEGIN in_num<=CONV_INTEGER (num); --位矢量轉(zhuǎn)換成整數(shù)變換式 ┇ END rtl;
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào) 。