【问题标题】:Hexadecimal to BCD Conversion十六进制到 BCD 转换
【发布时间】:2023-04-01 23:18:01
【问题描述】:

我正在尝试在 Verilog 中将十六进制转换为 BCD。我没有使用任何时钟。在我的程序中,我一次输入一个输入并将其转换并显示结果。但是,我的程序给出了未定义的结果。我该如何解决?

module HexToBCD(num,result);

input num;

output [7:0]result;

assign result[0]=num%2;
assign num=num/2;

assign result[1]=num%2;
assign num=num/2;

assign result[2]=num%2;
assign num=num/2;

assign result[3]=num%2;
assign num=num/2;

assign result[4]=num%2;
assign num=num/2;

assign result[5]=num%2;
assign num=num/2;

assign result[6]=num%2;
assign num=num/2;

assign result[7]=num%2;
assign num=num/2;

endmodule

【问题讨论】:

    标签: binary hex verilog


    【解决方案1】:

    我发现你的模块有一些不寻常的地方。

    1. num 是 1 位宽,但您试图将其除以 2。

    2. 您正在分配给input

    3. 您对 num 进行了 8 次相同的分配。 Verilog 不是这样工作的。所有连续的分配都是并行评估的。

    【讨论】:

    • k.任何想法如何将十六进制转换为 bcd。我会在verilog中实现,但是我不知道在prog语言中将hex转换为bcd的方法
    【解决方案2】:

    以下代码将 8 位二进制数转换为等效的 BCD。算法解释请参考this link

    module bcd (
        input [7:0] binary,
        output reg [3:0] hundreds,
        output reg [3:0] tens,
        output reg [3:0] ones);
    
    integer i;
    always @(binary) begin
        // set 100's, 10's, and 1's to zero
        hundreds = 4'd0;
        tens = 4'd0;
        ones = 4'd0;
    
        for (i=7; i>=0; i=i-1) begin
            // add 3 to columns >= 5
            if (hundreds >= 5)
                hundreds = hundreds + 3;
            if (tens >= 5)
                tens = tens + 3;
            if (ones >= 5)
                ones = ones + 3;
    
            // shift left one
            hundreds = hundreds << 1;
            hundreds[0] = tens[3];
            tens = tens << 1;
            tens[0] = ones[3];
            ones = ones << 1;
            ones[0] = binary[i];
        end
    end
    endmodule
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多