跳转到内容

可编程逻辑/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 被归类为杂项运算符,仅用于定义优先级。否则,它被归类为逻辑运算符。
华夏公益教科书