二、 運算操作符和屬性
1. 運算操作符
l 賦值運算符
賦值運算符用來給信號、變量和常數賦值。
<= 用於對SIGNAL類型賦值;
:= 用於對VARIABLE,CONSTANT和GENERIC賦值,也可用於賦初始值;
=> 用於對矢量中的某些位賦值,或對某些位之外的其他位賦值(常用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 <= (0 => ‘1’, OTHERS => ‘0’); – LSB位是1, 其他位是0
l 邏輯運算符
操作數必須是BIT, STD_LOGIC或STD_ULOGIC類型的數據或者是這些數據類型的擴展,即BIT_VECTOR, STD_LOGIC_VECTOR,STD_ULOGIC_VECTOR。
VHDL的邏輯運算符有以下幾種:(優先級遞減)
? NOT —— 取反
? AND —— 與
? OR —— 或
? NAND —— 與非
? NOR —— 或非
? XOR —— 異或
l 算術運算符
操作數可以是INTEGER, SIGNED, UNSIGNED, 如果聲明了std_logic_signed或std_logic_unsigned,可對STD_LOGIC_VECTOR類型的數據進行加法或減法運算。
+ —— 加
- —— 減
* —— 乘
/ —— 除
** —— 指數運算
MOD —— 取模
REM —— 取余
ABS —— 取絕對值
加,減,乘是可以綜合成邏輯電路的;除法運算只在除數為2的n次冪時才能綜合,此時相當於對被除數右移n位;對於指數運算,只有當底數和指數都是靜態數值(常量或GENERIC參數)時才是可綜合的;對於MOD運算,結果的符號同第二個參數的符號相同,對於REM運算,結果的符號同第一個參數符號相同。
l 關系運算符
=, /=, <, >, <=, >=
左右兩邊操作數的類型必須相同。
l 移位操作符
<左操作數> <移位操作符> <右操作數>
其中左操作數必須是BIT_VECTOR類型的,右操作數必須是INTEGER類型的(可以為正數或負數)。
VHDL中移位操作符有以下幾種:
u sll 邏輯左移 – 數據左移,右端補0;
u srl 邏輯右移 – 數據右移,左端補0;
u sla 算術左移 – 數據左移,同時復制最右端的位,填充在右端空出的位置;
u sra 算術右移 – 數據右移,同時復制最左端的位,填充在左端空出的位置;
u rol 循環邏輯左移 — 數據左移,從左端移出的位填充到右端空出的位置上;
u ror 循環邏輯右移– 數據右移,從右端移出的位填充到左端空出的位置上。
例:x <= “01001”,那么:
y <= x sll 2; – 邏輯左移2位,y<=”00100”
y <= x sla 2; – 算術左移2位,y<=”00111”
y <= x srl 3; – 邏輯右移3位,y<=”00001”
y <= x sra 3; – 算術右移3位,y<=”00001”
y <= x rol 2; – 循環左移2位,y<=”00101”
y <= x srl -2; –相當於邏輯左移2位
l 並置運算符
用於位的拼接,操作數可以是支持邏輯運算的任何數據類型。有以下兩種:
2 &
2 (, , , )
與Verilog中{}的功能一樣。
2. 屬性(ATTRIBUTE)
l 數值類屬性
數值類屬性用來得到數組、塊或一般數據的相關信息,例如可用來獲取數組的長度和數值范圍等。
以下是VHDL中預定義的可綜合的數值類屬性:
d’LOW –返回數組索引的下限值
d’HIGH –返回數組索引的上限值
d’LEFT –返回數組索引的左邊界值
d’RIGHT –返回數組索引的右邊界值
d’LENGTH –返回矢量的長度值
d’RANGE –返回矢量的位寬范圍
d’REVERSE_RANGE –按相反的次序返回矢量的位寬范圍
例:定義信號 SIGNAL d: STD_LOGIC_VECTOR(7 DOWNTO 0);
則有:d’LOW = 0, d’HIGH = 7, d’LEFT = 7, d’RIGHT = 0, d’LENGTH = 8, d’RANGE = (7 DOWNTO 0), d’REVERSE_RANGE = (0 TO 7).
l 信號類屬性
對於信號s,有以下預定義的屬性(可綜合的):
s’EVENT 若s的值發生變化,則返回布爾量TRUE,否則返回FALSE
s’STABLE 若s保持穩定,則返回TRUE,否則返回FALSE
例:clk的上升沿判斷
IF (clk’EVENT AND clk = ‘1’)
IF (NOT clk’STABLE AND clk = ‘1’)
WAIT UNTIL (clk’EVENT AND clk = ‘1’)
3. 通用屬性語句
GENERIC語句提供了一種指定常規參數的方法,所指定的參數是靜態的,增加了代碼的可重用性,類似於Verilog中的parameter與defparam。GENERIC語句必須在ENTITY中進行聲明,由GENERIC語句指定的參數是全局的,不僅可在ENTITY內部使用,也可在后面的整個設計中使用。語法結構如下:
GENERIC (parameter_name: parameter_type := parameter_value);
用GENERIC語句指定多個參數:
GENERIC (n: INTEGER := 8; vector: BIT_VECTOR := “0000_1111”);