VHDL常見的語法結(jié)構(gòu),粘貼此處方便查詢
一個(gè)VHDL程序代碼包含實(shí)體(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 (idle, forward, backward, stop);
–枚舉數(shù)據(jù)類型,常用于有限狀態(tài)機(jī)的狀態(tài)定義
一般來說,枚舉類型的數(shù)據(jù)自動(dòng)按順序依次編碼。
2.子類型
在原有已定義數(shù)據(jù)類型上加一些約束條件,可以定義該數(shù)據(jù)類型的子類型。VHDL不允許不同類型的數(shù)據(jù)直接進(jìn)行操作運(yùn)算,而某個(gè)數(shù)據(jù)類型的子類型則可以和原有類型數(shù)據(jù)直接進(jìn)行操作運(yù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 signal_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: coeffs := (); –常量系數(shù)聲明并賦初值
4.端口數(shù)組
在定義電路的輸入/輸出端口時(shí),有時(shí)需把端口定義為矢量陣列,而在ENTITY中不允許使用TYPE進(jìn)行類型定義,所以必須在包集(PACKAGE)中根據(jù)端口的具體信號特征建立用戶自定義的數(shù)據(jù)類型,該數(shù)據(jù)類型可以供包括ENTITY在內(nèi)的整個(gè)設(shè)計(jì)使用。
—————————————PACKAGE———————————-
library ieee;
use ieee.std_logic_1164.all;
——————————————
PACKAGE my_data_types IS
TYPE vector_array IS ARRAY (natural range <>) OF STD_LOGIC_VECTOR(7 DOWNTO 0); –聲明8位的數(shù)組
END my_data_types;
———————————–Main Code—————————————
library ieee;
use ieee.std_logic_1164.all;
use work.my_data_types.all; –用戶自定義包集
——————————————————————
ENTITY mux IS
PORT (inp: IN vector_array(0 to 3);
END mux;
——————————————————————————-
5.有符號數(shù)和無符號數(shù)
要使用SIGNED和UNSIGNED類型數(shù)據(jù),必須在代碼開始部分聲明ieee庫中的包集std_logic_arith。它們支持算術(shù)運(yùn)算但不支持邏輯運(yùn)算。
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;–非法(不支持邏輯運(yùn)算)
——————————————————————————-
STD_LOGIC_VECTOR類型的數(shù)據(jù)不能直接進(jìn)行算術(shù)運(yùn)算,只有聲明了std_logic_signed和std_logic_unsigned兩個(gè)包集后才可以像SIGNED和UNSIGNED類型的數(shù)據(jù)一樣進(jìn)行算術(shù)運(yùn)算。
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_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ù)。
二、運(yùn)算操作符和屬性
1.運(yùn)算操作符
l賦值運(yùn)算符
賦值運(yùn)算符用來給信號、變量和常數(shù)賦值。
<=用于對SIGNAL類型賦值;
:=用于對VARIABLE,CONSTANT和GENERIC賦值,也可用于賦初始值;
=>用于對矢量中的某些位賦值,或?qū)δ承┪恢獾钠渌毁x值(常用OTHERS表示)。
例:
SIGNAL x: STD_LOGIC;
VARIABLE y: STD_LOGIC_VECTOR(3 DOWNTO 0);–最左邊的位是MSB
SIGNAL w: STD_LOGIC_VECTOR(0 TO 7);–最右邊的位是MSB
x <= ‘1’;
y := “0000”;
w <= “1000_0000”;– LSB位為1,其余位為0
w
l邏輯運(yùn)算符
操作數(shù)必須是BIT, STD_LOGIC或STD_ULOGIC類型的數(shù)據(jù)或者是這些數(shù)據(jù)類型的擴(kuò)展,即BIT_VECTOR, STD_LOGIC_VECTOR,STD_ULOGIC_VECTOR。
VHDL的邏輯運(yùn)算符有以下幾種:(優(yōu)先級遞減)
?NOT —— 取反
?AND —— 與
?OR —— 或
?NAND —— 與非
?NOR —— 或非
?XOR —— 異或
l算術(shù)運(yùn)算符
操作數(shù)可以是INTEGER, SIGNED, UNSIGNED, 如果聲明了std_logic_signed或std_logic_unsigned,可對STD_LOGIC_VECTOR類型的數(shù)據(jù)進(jìn)行加法或減法運(yùn)算。
+ —— 加
-—— 減
* —— 乘
/ —— 除
** —— 指數(shù)運(yùn)算
MOD —— 取模
REM —— 取余
ABS —— 取絕對值
加,減,乘是可以綜合成邏輯電路的;除法運(yùn)算只在除數(shù)為2的n次冪時(shí)才能綜合,此時(shí)相當(dāng)于對被除數(shù)右移n位;對于指數(shù)運(yùn)算,只有當(dāng)?shù)讛?shù)和指數(shù)都是靜態(tài)數(shù)值(常量或GENERIC參數(shù))時(shí)才是可綜合的;對于MOD運(yùn)算,結(jié)果的符號同第二個(gè)參數(shù)的符號相同,對于REM運(yùn)算,結(jié)果的符號同第一個(gè)參數(shù)符號相同。
l關(guān)系運(yùn)算符
=, /=,
左右兩邊操作數(shù)的類型必須相同。
l移位操作符
其中左操作數(shù)必須是BIT_VECTOR類型的,右操作數(shù)必須是INTEGER類型的(可以為正數(shù)或負(fù)數(shù))。
VHDL中移位操作符有以下幾種:
usll邏輯左移– 數(shù)據(jù)左移,右端補(bǔ)0;
usrl邏輯右移– 數(shù)據(jù)右移,左端補(bǔ)0;
usla算術(shù)左移– 數(shù)據(jù)左移,同時(shí)復(fù)制最右端的位,填充在右端空出的位置;
usra算術(shù)右移– 數(shù)據(jù)右移,同時(shí)復(fù)制最左端的位,填充在左端空出的位置;
urol循環(huán)邏輯左移 — 數(shù)據(jù)左移,從左端移出的位填充到右端空出的位置上;
uror循環(huán)邏輯右移 – 數(shù)據(jù)右移,從右端移出的位填充到左端空出的位置上。
例:x <= “01001”,那么:
y <= x sll 2;–邏輯左移2位,y<=”00100”
y <= x sla 2;–算術(shù)左移2位,y<=”00111”
y <= x srl 3;–邏輯右移3位,y<=”00001”
y <= x sra 3;–算術(shù)右移3位,y<=”00001”