目录
1. 整数与浮点数转换
1.1 Verilog 整数转换
Verilog 主要使用 整数(integer) 处理数值。
整数转换示例:
integer a;
reg [7:0] b;
always @(posedge clk) begin
a = b; // reg 类型自动转换为 integer
end
1.2 浮点数转换
Verilog 不直接支持浮点数,但可以用 IEEE 754 标准 进行转换。
reg [31:0] float_data; // IEEE 754 单精度浮点数
real r_data;
always @(posedge clk) begin
r_data = $bitstoshortreal(float_data); // 二进制转换为 real
end
2. 二进制、十进制、十六进制转换
Verilog 直接支持不同进制数格式:
reg [7:0] bin_data = 8'b10101010; // 二进制
reg [7:0] dec_data = 8'd170; // 十进制
reg [7:0] hex_data = 8'hAA; // 十六进制
2.1 二进制转十进制
Verilog 自动处理进制转换:
integer dec_value;
reg [7:0] bin_value = 8'b00010110; // 22
always @(posedge clk) begin
dec_value = bin_value; // 22
end
2.2 十进制转二进制
reg [7:0] bin_result;
always @(posedge clk) begin
bin_result = 8'd25; // 25 对应二进制 00011001
end
3. 有符号数与无符号数转换
3.1 无符号转有符号(Zero Extension)
reg [7:0] unsigned_val = 8'b00001111;
reg signed [7:0] signed_val;
always @(posedge clk) begin
signed_val = unsigned_val; // 保持相同数值
end
3.2 有符号转无符号(Sign Extension)
reg signed [7:0] signed_val = -8'sd5;
reg [7:0] unsigned_val;
always @(posedge clk) begin
unsigned_val = signed_val[7:0]; // 可能产生错误值
end
⚠ 注意:直接转换 可能导致错误,需要符号扩展:
assign unsigned_val = { {8{signed_val[7]}}, signed_val };
4. 定点数与浮点数转换
4.1 定点数转整数
reg signed [15:0] fixed_val = 16'b0001001100000000; // Q8.8 格式 (19.0)
integer int_val;
always @(posedge clk) begin
int_val = fixed_val >>> 8; // 19
end
4.2 整数转定点数
integer int_val = 19;
reg signed [15:0] fixed_val;
always @(posedge clk) begin
fixed_val = int_val <<< 8; // Q8.8 格式 (19.0)
end
5. BCD(8421 码)转换
5.1 二进制转 BCD(8421 码)
BCD 使用 双倍 Dabble 算法(Double Dabble Algorithm):
module bin_to_bcd (
input [7:0] bin,
output reg [11:0] bcd
);
integer i;
always @(bin) begin
bcd = 12'd0;
for (i = 7; i >= 0; i = i - 1) begin
if (bcd[3:0] >= 5) bcd[3:0] = bcd[3:0] + 3;
if (bcd[7:4] >= 5) bcd[7:4] = bcd[7:4] + 3;
if (bcd[11:8] >= 5) bcd[11:8] = bcd[11:8] + 3;
bcd = {bcd[10:0], bin[i]};
end
end
endmodule
输入 8'b00101010
(十进制 42),输出 4'b0100_0010
(BCD 码 42)。
5.2 BCD 转二进制
module bcd_to_bin (
input [11:0] bcd,
output reg [7:0] bin
);
always @(bcd) begin
bin = (bcd[11:8] * 100) + (bcd[7:4] * 10) + bcd[3:0];
end
endmodule
6. 优化方案
6.1 减少逻辑运算
使用 位操作 代替乘法:
assign bin = (bcd[11:8] << 6) + (bcd[11:8] << 5) + (bcd[7:4] << 3) + (bcd[7:4] << 1) + bcd[3:0];
6.2 使用 Lookup Table(LUT)
可用 ROM 预存转换表,减少计算:
reg [7:0] bcd_lut [0:99]; // 存储 0~99 的转换值
发表回复