跳轉到內容

可程式設計邏輯/VHDL 運算子

來自華夏公益教科書,開放書籍,開放世界
< 可程式設計邏輯/VHDL

本頁將討論 VHDL 運算子。

本文中使用的一些縮寫

  • int - 整數,一種資料型別
  • sl - std_logic,一種資料型別(在大多數情況下可以替換為 bit
  • slv - std_logic_vector,一種資料型別(在大多數情況下可以替換為 bit_vector
  • slu - std_logic_unsigned - ieee 庫的一部分。
  • sls - std_logic_signed - ieee 庫的一部分。
  • iff - "當且僅當"

邏輯運算子

[edit | edit source]

此列表遠未完善。

運算子 示例 描述
sl and sl a_sl <= b_sl and c_sl
a_sl <= ieee.std_logic_1164."and"(b_sl, c_sl);
當且僅當 b_sl 和 c_sl 均為 '1' 時,a_sl 為 '1'。
slv and slv a_slv <= b_slv and c_slv
a_slv <= ieee.std_logic_1164."and"(b_slv, c_slv);
應用於 a_slv、b_slv、c_slv 中的每個相應位。
a_slv、b_slv、c_slv 必須具有相同的長度(例如 8 位)
sl or sl a_sl <= b_sl or c_sl
a_sl <= ieee.std_logic_1164."or"(b_sl, c_sl);
當且僅當 b_sl 或 c_sl 中至少有一個為 '1' 時,a_sl 為 '1'。
slv or slv a_slv <= b_slv or c_slv
a_slv <= ieee.std_logic_1164."or"(b_slv, c_slv);
應用於 a_slv、b_slv、c_slv 中的每個相應位。
a_slv、b_slv、c_slv 必須具有相同的長度(例如 8 位)
sl xor sl a_sl <= b_sl xor c_sl
a_sl <= ieee.std_logic_1164."xor"(b_sl, c_sl);
當且僅當 b_sl 和 c_sl 中恰好只有一個為 '1' 時,a_sl 為 '1'。
slv xor slv a_slv <= b_slv xor c_slv
a_slv <= ieee.std_logic_1164."xor"(b_slv, c_slv);
應用於 a_slv、b_slv、c_slv 中的每個相應位。
a_slv、b_slv、c_slv 必須具有相同的長度(例如 8 位)
not sl a_sl <= not b_sl
a_sl <= ieee.std_logic_1164."not"(b_sl);
a_sl 將是 b_sl 的反轉,即當且僅當 b_sl = '0' 時為 '1'。
not slv a_slv <= not b_slv
a_slv <= ieee.std_logic_1164."not"(b_slv);
應用於 a_slv、b_slv 中的每個相應位。
a_slv、b_slv 必須具有相同的長度(例如 8 位)
sl nand sl a_sl <= b_sl nand c_sl
a_sl <= ieee.std_logic_1164."nand"(b_sl, c_sl);
當且僅當 b_sl 或 c_sl 中至少有一個為 '0' 時,a_sl 為 '1'。
等效於 not (sl and sl)
slv nand slv a_slv <= b_slv nand c_slv
a_slv <= ieee.std_logic_1164."nand"(b_slv, c_slv);
應用於 a_slv、b_slv、c_slv 中的每個相應位。
a_slv、b_slv、c_slv 必須具有相同的長度(例如 8 位)
sl nor sl a_sl <= b_sl nor c_sl
a_sl <= ieee.std_logic_1164."nor"(b_sl, c_sl);
當且僅當 b_sl 和 c_sl 均為 '0' 時,a_sl 為 '1'。
等效於 not (sl or sl)
slv nor slv a_slv <= b_slv nor c_slv
a_slv <= ieee.std_logic_1164."nor"(b_slv, c_slv);
應用於 a_slv、b_slv、c_slv 中的每個相應位。
a_slv、b_slv、c_slv 必須具有相同的長度(例如 8 位)
sl xnor sl a_sl <= b_sl xnor c_sl
a_sl <= ieee.std_logic_1164."xnor"(b_sl, c_sl);
當且僅當 b_sl 和 c_sl 均為 '1' 或 '0' 時,a_sl 為 '1'。
等效於 not (sl xor sl)
slv xnor slv a_slv <= b_slv xnor c_slv
a_slv <= ieee.std_logic_1164."xnor"(b_slv, c_slv);
應用於 a_slv、b_slv、c_slv 中的每個相應位。
a_slv、b_slv、c_slv 必須具有相同的長度(例如 8 位)

算術運算子

[edit | edit source]

關係運算符

[edit | edit source]

移位和旋轉

[edit | edit source]

運算子

[edit | edit source]

符號運算子

[edit | edit source]

符號運算子是單目運算子,即只有一個右運算元,它必須是數值型別。表示式求值的結果與運算元型別相同。有兩個符號運算子(表 12)。
表 12 : 符號運算子 

+ 身份
- 否定

當使用 ( + ) 符號運算子時,運算元將保持不變,但在 ( - ) 符號運算子的情況下,將返回帶有否定符號的運算元的值。由於優先順序較低,表示式中的符號運算子不能直接位於乘法運算子、求冪運算子 (**) 或 abs 和 not 運算子之前。當使用這些運算子時,應將符號運算子及其運算元括在括號中(示例 7)。

乘法運算子

[edit | edit source]

乘法和除法運算子是針對所有整數、浮點數預定義的。在某些情況下,它們也可能用於對物理型別物件進行運算。另一方面,mod 和 rem 運算子僅針對整數定義。當使用 mod 和 rem 運算子時,運算元和結果都將具有相同的整數型別。乘法運算子如表 13 所示。
表 13. 乘法運算子

* 乘法
/ 除法
mod 模數
rem 餘數

其他運算子

[edit | edit source]

表 14 顯示了兩個其他運算子。
表 14. 其他運算子

** 求冪
abs 絕對值

abs 運算子只有一個運算元。它允許定義運算元的絕對值。結果與運算元型別相同。求冪運算子有兩個運算元。此運算子針對任何整數或浮點數定義。右運算元(指數)必須是整數型別。當指數是正整數時,左運算元將被自身重複乘以。當指數是負數時,結果將是指數的逆,指數等於右運算元的絕對值(示例 9)。如果指數等於 0,則結果將為 1。

示例

[edit | edit source]

示例 1

[edit | edit source]
v := a + y * x;

首先執行乘法 y*x,然後將 a 加到乘法的結果中。這是因為乘法運算子比加法運算子具有更高的優先順序。

示例 2

[edit | edit source]
variable We1, We2, We3, Wy : BIT := '1';
Wy := We1 and We2 xnor We1 nor We3;

對於 We1、We2、We3 的初始值等於 '1',結果將被分配給變數 Wy,且等於 '0'。

示例 3

[edit | edit source]
variable Zm1: REAL := 100.0;
variable Zm2 : BIT_VECTOR(7 downto 0) := ('0','0','0','0','0','0','0','0');
variable Zm3, Zm4 : BIT_VECTOR(1 to 0);
Zm1 /= 342.54 -- True
Zm1 = 100.0 -- True
Zm2 /= ('1', '0', '0', '0', '0', '0', '0', '0') -- True
Zm3 = Zm4 -- True
Example 4
Zm1 > 42.54 -- True
Zm1 >= 100.0 -- True
Zm2 < ('1', '0', '0', '0', '0', '0', '0', '0') -- True
Zm3 <= Zm2 -- True

示例 5

[edit | edit source]
variable Zm5 : BIT_VECTOR(3 downto 0) := ('1','0','1','1');
Zm5 sll 1 -- ('0', '1', '1', '0')
Zm5 sll 3 -- ('1', '0', '0', '0')
Zm5 sll -3 -- Zm5 srl 3
Zm5 srl 1 -- ('0', '1', '0', '1')
Zm5 srl 3 -- ('0', '0', '0', '1')
Zm5 srl -3 -- Zm5 sll 3
Zm5 sla 1 -- ('0', '1', '1', '1')
Zm5 sla 3 -- ('1', '1', '1', '1')
Zm5 sla -3 -- Zm5 sra 3
Zm5 sra 1 -- ('1', '1', '0', '1')
Zm5 sra 3 -- ('1', '1', '1', '1')
Zm5 sra -3 -- Zm5 sla 3
Zm5 rol 1 -- ('0', '1', '1', '1')
Zm5 rol 3 -- ('1', '1', '0', '1')
Zm5 rol -3 -- Zm5 ror 3
Zm5 ror 1 -- ('1', '1', '0', '1')
Zm5 ror 3 -- ('0', '1', '1', '1')
Zm5 ror -3 -- Zm5 rol 3
constant B1: BIT_VECTOR := "0000"; -- four element array
constant B2: BIT_VECTOR := "1111"; -- four element array
constant B3: BIT_VECTOR := B1 & B2; -- eight element array, ascending
-- direction, value "00001111"
subtype BIT_VECTOR_TAB is BIT_VECTOR (1 downto 0);
constant B4: BIT_VECTOR_TAB := "01";
constant B5: BIT_VECTOR:= B4 & B2; -- six element array, descending
-- direction, value "011111"
constant B6 : BIT := '0' ;
constant B7 : BIT_VECTOR := B2 & B6;-- five element array, ascending
-- direction, value "11110"
constant B8: BIT := '1';
constant B9: BIT_VECTOR := B6 & B8; -- two element array, ascending
-- direction value "01"
z := x * ( -y) -- A legal expression
z := x / (not y) -- A legal expression

相同的表示式沒有括號將是非法的。

variable A,B :Integer;
variable C : Real;
C:= 12.34 * ( 234.4 / 43.89 );
A:= B mod 2;
2 ** 8 = 256
3.8 ** 3 = 54.872
4 ** (-2) = 1 / (4**2) = 0.0625

重要注意事項

[編輯 | 編輯原始碼]
  • 所有用於標準型別的預定義運算子都在包 STANDARD 中宣告。
  • 運算子 not 被歸類為雜項運算子,僅用於定義優先順序。否則,它被歸類為邏輯運算子。
華夏公益教科書