原码与补码
有符号数,在代码中可以使用十进制数赋值给有符号数,在电路中,数值按照补码
形式存储
- 正数的补码:是其本身
- 负数的补码:除符号位外,其余位取反,然后
+1
reg signed [3:0] a, b;
a = 4'd6; //原码为 0110,补码为 0110
b = -4'd6; //原码为 1110 ->反码为 1001 ->补码为 1010
补码的补码是原码
算术操作符
- 将负数赋值给reg或其他无符号变量使用二进制补码
- 如果操作数的某一位是
x
或z
,则结果为x
逻辑操作符
- 如果操作数的任意一位为
x
或z
,则其等价于逻辑不确定x
- 如果操作数全为
0
,其逻辑值为0
- 如果操作数有一位为
1
,其逻辑值为1
reg a = 4'b0011; //逻辑值为 1
reg b = 4'b10xz; //逻辑值为 1
reg c = 4'b0z0x; //逻辑值为 x
根据这个例子,1
的优先级更高
移位操作符
在Verilog中,移位操作符有两种,逻辑操作符>>
和算术操作符>>>
- 无符号数:算术右移和逻辑右移没有区别,都是左侧补
0
- 有符号数
- 逻辑右移,左侧补
0
- 算术右移,符号为1则补
1
,符号为0则补0
- 逻辑右移,左侧补