定宽数
本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 14 课,共 90 课。
在 Verilog 中,你可以声明一个具有特定位数的数字。这叫作指定位数的数字。这样做很有用,因为它可以避免混淆数字的位数,并确保硬件的行为完全符合预期。
定宽数值遵循以下格式:[bits]'[format][value]
bits:位数(例如,8)':用于分隔位数和格式的撇号(必需)
format:数字的进制:二进制用b,十进制用d,十六进制用h,八进制用ovalue:实际的数字(例如,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挑战
填写正确位数的数字,完成代码。
要做什么:
- 将
a设为表示十进制数 170 的 8 位二进制数(10101010) - 将
b设为表示十进制数 12 的 4 位二进制数(1100) - 将
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这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器
检查进制转换: 进制转换器