Menu
CoddyTech

负数

本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 16 课,共 90 课。

在 Verilog 中,负数使用二进制补码格式表示。二进制补码是一种用二进制表示正数和负数的方法。最高有效位(MSB)表示符号:

  • 0 = 正数
  • 1 = 负数

如何计算二进制补码

要找出一个数的二进制补码:

  1. 将正数写成二进制形式
  2. 翻转所有位(0 变成 1,1 变成 0)
  3. 加 1

示例:用 4 位表示 -5

步骤操作结果
15 的二进制表示0101
2翻转所有位1010
3加 11011

-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 = 正数
challenge icon

挑战

填写正确的二进制补码,完成代码。

操作要求:

  1. 使用 4 位二进制补码将 a 设为 -3
  2. 使用 4 位二进制补码将 b 设为 -8
  3. 使用 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
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基础知识中的所有课

自己练习: Verilog 在线编译器