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