4.FPGA字符格式
在Verilog中,数值的表示方法灵活多样,主要分为常量表示和变量声明两部分。以下是详细介绍:
一、常量数值表示法
Verilog的常量格式为:
[位宽]'[进制标识][数值]1. 位宽(可选)
- 指定数值的二进制位数,若省略则由编译器隐式决定(通常为32位)。
- 示例:
8'd255 // 8位十进制数255(二进制:1111_1111)
16'hA15 // 16位十六进制数A15(二进制:0000_1010_0001_0101)
4'b1010 // 4位二进制数1010(十进制:10)2. 进制标识
b或B:二进制(Binary)o或O:八进制(Octal)d或D:十进制(Decimal,默认)h或H:十六进制(Hexadecimal)- 示例:
8'b1010_1010 // 二进制(下划线仅为可读性,无实际意义)
3'o7 // 八进制(7 → 二进制:111)
16'd65535 // 十进制(默认进制)
4'hF // 十六进制(F → 二进制:1111)3. 特殊符号
x或X:表示不确定值(高阻态)z或Z:表示高阻态(等同于?)- 示例:
4'b10xz // 4位二进制,第3位不确定,第4位高阻
8'hFF // 8位全1(高电平)
8'bzzzz_zzzz // 8位全高阻二、变量声明与赋值
变量需先声明位宽,再赋值。常见数据类型包括 reg、wire、integer 等。
1. 固定位宽变量
- 使用
[MSB:LSB]语法声明位宽:
reg [7:0] data; // 8位寄存器变量(MSB=7,LSB=0)
wire [15:0] address; // 16位连线型变量- 赋值时需匹配位宽:
data = 8'd255; // 正确:8位赋值
data = 16'd65535; // 错误:截断为低8位(实际值为255)2. 默认位宽变量
- 若未显式声明位宽,默认为32位:
integer count; // 32位有符号整数
count = 32'd100; // 正确赋值三、数值截断与扩展
1. 截断(Truncation)
- 当赋值的数值超过目标位宽时,只保留低N位:
reg [3:0] low4bits;
low4bits = 8'd255; // 255的二进制为1111_1111,截断后为1111(十进制15)2. 符号扩展(Signed Extension)
- 有符号数赋值到更大位宽时,高位补符号位:
reg [3:0] signed_num = 4'b1000; // 有符号数-8(补码表示)
reg [7:0] extended;
extended = signed_num; // 扩展为8'b1111_1000(十进制-8)3. 零扩展(Zero Extension)
- 无符号数赋值到更大位宽时,高位补零:
reg [3:0] unsigned_num = 4'b1000; // 无符号数8
reg [7:0] extended;
extended = unsigned_num; // 扩展为8'b0000_1000(十进制8)四、常见误区
- 省略位宽的风险:
assign data = 'd255; // 隐式为32位,可能导致位宽不匹配- 进制混淆:
8'd255 // 正确:十进制255(二进制1111_1111)
8'h255 // 错误:十六进制255 → 十进制597(超过8位,截断为低8位=93)- 符号位处理:
reg [3:0] num = -4; // 实际存储为4'b1100(补码表示)五、系统任务中的数值表示
$display格式化输出:
$display("Dec: %d, Hex: %h, Bin: %b", num, num, num);- 参数化位宽:
parameter WIDTH = 8;
reg [WIDTH-1:0] data; // 动态位宽总结
特性 | 示例 | 说明 |
二进制 |
| 8位二进制数 |
十进制 |
| 16位十进制数 |
十六进制 |
| 4位十六进制数 |
不确定值 |
| 第2位为不确定值 |
高阻态 |
| 8位全高阻 |
符号扩展 |
| 扩展为32位有符号数 |
合理使用位宽和进制表示,可避免硬件设计中的潜在错误,提高代码可靠性。
