如何将两位数BCD转换为二进制?

问题描述 投票:0回答:2

我想制作一个基于fpga板(spartan 3)的计算器。我有以下代码

module bcd_converter(
input [7:0] R,
output reg [3:0] Hundreds,
output reg [3:0] Tens,
output reg [3:0] Ones
);
integer i;
always @ (R)
begin
    Hundreds = 4'd0;
    Tens = 4'd0;
    Ones = 4'd0;
    for(i=7;i>=0;i = i-1) begin
        if(Hundreds >= 5)
                Hundreds = Hundreds + 3;
        if(Tens >= 5)
                Tens = Tens + 3;
        if(Ones >= 5)
                Ones = Ones + 3;

        Hundreds = Hundreds<<1;
        Hundreds[0] = Tens[3];
        Tens = Tens << 1;
        Tens[0] = Ones[3];
        Ones = Ones<<1;
        Ones[0] = R[i];


    end
end
endmodule

但是,提供的代码仅将二进制转换为 BCD。我正在寻找一种方法来扭转这个算法。有没有更好的方法将 BCD 转换为二进制?

verilog fpga spartan
2个回答
1
投票

您可以使用单独的 case 语句将每个 BCD 数字解码为二进制,然后将结果相加。例如,对于数百个案例,您的案例陈述将如下所示:

case(hundreds)
   4'd0 : hundreds_bin = 9'd0;
   4'd1 : hundreds_bin = 9'd100;
   4'd2 : hundreds_bin = 9'd200;
   4'd3 : hundreds_bin = 9'd300;
//..etc etc

0
投票

在提到的建议中,数字的大小必须为 10 位。

case(hundreds)
   4'd0 : hundreds_bin = 10'd0;
   4'd1 : hundreds_bin = 10'd100;
   4'd2 : hundreds_bin = 10'd200;
   4'd3 : hundreds_bin = 10'd300;
//..etc etc
© www.soinside.com 2019 - 2024. All rights reserved.