目录

  1. 整数与浮点数转换
  2. 二进制、十进制、十六进制转换
  3. 有符号数与无符号数转换
  4. 定点数与浮点数转换
  5. BCD(8421 码)转换
  6. 优化方案
  7. 参考资料

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 的转换值


7. 参考资料

  1. IEEE 754 浮点标准
  2. Verilog BCD 转换示例
  3. 定点数与浮点数转换
  4. FPGA 计算优化