负数
本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 16 课,共 90 课。
在 Verilog 中,负数使用二进制补码格式表示。二进制补码是一种用二进制表示正数和负数的方法。最高有效位(MSB)表示符号:
- 0 = 正数
- 1 = 负数
如何计算二进制补码
要找出一个数的二进制补码:
- 将正数写成二进制形式
- 翻转所有位(0 变成 1,1 变成 0)
- 加 1
示例:用 4 位表示 -5
| 步骤 | 操作 | 结果 |
|---|---|---|
| 1 | 5 的二进制表示 | 0101 |
| 2 | 翻转所有位 | 1010 |
| 3 | 加 1 | 1011 |
-5 的 4 位二进制补码是 4'b1011
在 Verilog 中书写负数
你可以直接用十进制格式书写负数:
reg signed [3:0] a;
a = -5; // Verilog 会自动使用二进制补码对于指定宽度的二进制数,你必须写出二进制补码的值:
a = 4'b1011; // This is -5 in 4-bit two's complement有符号与无符号
默认情况下,reg 和 wire 信号是无符号的。要处理负数,请将信号声明为 signed:
reg signed [3:0] negative; // 可存储 -8 到 7
reg [3:0] positive; // 可存储 0 到 15有符号数的范围
对于 N 位,有符号数可以表示:
- 最小值: -2^(N-1)
- 最大值: 2^(N-1) - 1
| 位数 | 范围 |
|---|---|
| 4 位 | -8 至 7 |
| 8 位 | -128 至 127 |
| 16 位 | -32768 至 32767 |
重要说明
- 使用
signed关键字来处理负数 - 如果没有
signed,reg或wire会将每个值都视为正数
- 使用
signed时,二进制补码运算会自动生效 - 最高有效位决定符号:1 = 负数,0 = 正数
挑战
填写正确的二进制补码,完成代码。
操作要求:
- 使用 4 位二进制补码将
a设为 -3 - 使用 4 位二进制补码将
b设为 -8 - 使用 4 位二进制补码将
c设为 -1
亲手试试
module negative_challenge;
reg signed [3:0] a, b, c;
initial begin
a = 4'b______; // -3 in 4-bit two's complement
b = 4'b______; // -8 in 4-bit two's complement
c = 4'b______; // -1 in 4-bit two's complement
$display("a = %d", a);
$display("b = %d", b);
$display("c = %d", c);
$finish;
end
endmodule这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器