Menu
CoddyTech

定宽数

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

在 Verilog 中,你可以声明一个具有特定位数的数字。这叫作指定位数的数字。这样做很有用,因为它可以避免混淆数字的位数,并确保硬件的行为完全符合预期。

定宽数值遵循以下格式:[bits]'[format][value]

  • bits:位数(例如,8)
  • ':用于分隔位数和格式的撇号(必需)
  • format:数字的进制:二进制用 b,十进制用 d,十六进制用 h,八进制用 o
  • value:实际的数字(例如,1010)

例如:

  • 4'b1010:4 位,二进制 1010(十进制 10)
  • 8'd255:8 位,十进制 255(二进制 11111111)
  • 16'hFF:16 位,十六进制 FF(二进制 0000000011111111)
  • 3'b1:3 位,二进制 001(左侧的位用零填充)

代码示例:

reg [7:0] data;

data = 8'b10101010;   // 8 bits, binary 10101010
data = 8'd170;        // 8 位,十进制 170
data = 8'hAA;         // 8 bits, hex AA

这三个示例都将相同的值赋给 data。

为什么位宽很重要

未指定位宽:

reg [7:0] data;
data = 1;        // 这是什么意思?是 1 位还是 8 位?

Verilog 默认将较小的数字视为 32 位,这可能会导致问题。

带位宽:

reg [7:0] data;
data = 8'b00000001;   // Clear: 8-bit value 1

零填充

将较小的值赋给较大的向量时,Verilog 会在左侧的位上填充零:

reg [7:0] data;
data = 4'b1010;    // Becomes 8'b00001010
challenge icon

挑战

填写正确位数的数字,完成代码。

要做什么:

  1. 将 a 设为表示十进制数 170 的 8 位二进制数(10101010)
  2. 将 b 设为表示十进制数 12 的 4 位二进制数(1100)
  3. 将 c 设为表示十进制数 255 的 16 位十六进制数(FF)

亲手试试

module sized_challenge;
  reg [7:0] a;
  reg [3:0] b;
  reg [15:0] c;
  
  initial begin
    a = ______;   // 170 的 8 位二进制数(10101010)
    b = ______;   // 12 的 4 位二进制数(1100)
    c = ______;   // 255 的 16 位十六进制数(FF)
    
    $display("a = %b", a);
    $display("b = %b", b);
    $display("c = %h", c);
    $finish;
  end
endmodule
quiz icon自我测试

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

基础知识中的所有课

自己练习: Verilog 在线编译器

检查进制转换: 进制转换器