Verilog—运算符、赋值语句、结构说明语句
引言:
一、运算符
1. 逻辑运算符
(1) && 逻辑与;
(2) || 逻辑或;
(3) ! 逻辑非。
注意:
- 返回的运算值是一位的 1 或 0 ,代表真或者假。返回值也可能是 x 值,表示不确定,这种情况下,0 和 x 的效果一样。(即非真即假)
- 出现多位信号的直接逻辑判断,需要近似处理:“操作数是确定值且不全为 0 ,则等价为逻辑 1;不是逻辑 1 则等价为逻辑 0”
eg.
a = 4'b0010;
b = !a;
// a的操作数是确定值,且不全为 0 ,所以 a 认定为逻辑真,则 b 认定为逻辑假。
a = 4'b0010;
b = 4'b000x;
c = a | b;
// a 为逻辑真, b 中包含了 x ,虽然不全为 0 ,但也不是确定值,所以 b 不能等价为逻辑真,按非真即假的原则,b 被认为逻辑假,所以 c 为逻辑真。
2. 关系运算符
> < >= <=
注意:
- 返回的运算值是一位的 1 或 0 ,代表真或者假。返回值也可能是 x 值,表示不确定,这种情况下,0 和 x 的效果一样。(即非真即假)
- 算数运算符优先级 高于 关系运算符
a < size - 1 // 先算 (size - 1)
size - (1 < a) // 先判断 1 与 a 的大小关系,返回 1 or 0 ,再用size-1 or size-0
3. 等式运算符
(1) == 等于;
(2) != 不等于;
(3) === 等于;
(4) !== 不等于。
注意:
- 返回逻辑值 1 或 0 。
- 前两个运算符只对 0 和 1 进行比较,相同为 1 ,不同为 0 。如果出现 x 或 z ,则逻辑值为 x 。
- 后两个运算符对 x 和 z 也进行判断,完全一样为 1 ,有不同即为 0 。
eg.
1 == x; // 逻辑值为 x
1 === x; //逻辑值为 0
x == x; //逻辑值为 x
x === x; //逻辑值为 1
- 后两个运算符不可综合。实际电路中避免使用 z 或 x 这些高阻或不定态,尤其是 x 的影响,所以一般使用前两个进行建模。使用前两个运算符尽量避免出现不定态 x 。
4. 移位运算符
(1) >> 逻辑右移。
(2) << 逻辑左移。
(3) >>> 算数右移。
(4) <<< 算数左移。
注意:
- 逻辑移位,空缺位补 0 。
- 算数移位,符号位也要跟着动。正数左右移空位补 0 ;负数左移低位补 0 ,右移高位补 1
5. 位拼接运算符
注意:
- 每个部分可以是信号,或者信号的某一位或某几位,也可以是确切的数值。但是,位拼接运算符的信号宽度必须指明!
reg [3:0] a,b,c;
a = 4'b0000;
b = 4'b1111;
c = 4'b0101;
x1 = {a, b, c}; //0000_1111_0101
x2 = {a[3], b, c}; //0_1111_0101
x3 = {a[2:0], b[0], c}; //000_1_0101
x4 = {a[0], b[0], c[0], 2'b00}; //01100
错误代码如下:
x5 = {a[0], b[0], c[0], 'b0}; //error:未指明最后一个信号的宽度
x6 = {a[0], b[0], c[0], 0}; //error:未指明最后一个信号的宽度
6. 缩减运算符
& | ^ ^~
a = 4'b0101;
&a // 执行 0&1&0&1,结果为0
|a // 执行 0|1|0|1,结果为1
^a // 执行 0^1^0^1,结果为0
^~a // 执行 0^~1^~0^~1,结果为1
注意:
- 把数据的每一位按从左至右的顺序一次操作,并得到一个 1 位的运算结果。
- 区别于按位运算符是双目运算符,缩减运算符是单目操作符(只带一个操作数),一般出现在操作数的最前方。
7. 条件运算符
条件表达式? 真时执行语句:假时执行语句;
8. 优先级
| 操作 | 操作符号 | 优先级 |
|---|---|---|
| 按位取反、逻辑非 | ! ~ | 最高 |
| 算数运算符 | * / % + - | |
| 移位运算符 | << >> | |
| 关系运算符 | < <= > >= | |
| 等式运算符 | == != === !== | |
| 缩减、按位 | (1)& ~& (2)^ ^~ (3) ~ | |
| 逻辑运算符 | &&与 或 | |
| 条件运算符 | ?: | 最低 |

浙公网安备 33010602011771号