二进制到BCD码转换

1. 理论基础

在单片机里面,如:显示个温度值,这时,要取一个数的个位、十位、百位,可以用/和 %(求商和求余)来解决。 但是,在FPGA里面用求商和求余将会非常消耗资源,这样就必须用到二进制转BCD码了,这里介绍一种简单的加3移位算法。 注:B代表二进制,D代表十进制,0x代表十六进制,BCD为BCD码,下同。

1、加3移位法

以二进制数(0000_101 Xn)B=(10+Xn)D为例,

串行输入三位后,(0101)B=5(D)

左移一位后:(0000_101Xn)B=(10+Xn)D

如果(0000_101Xn)B直接输出显示为:

当Xn=0时,0000_1010=0x0A。此为错误的BCD码。

采用加3移位法,修正移位结果:

串行输入三位后,结果大于4

(0101)B=5(D)

加3:(0101)B+(0011)B=(1000)B –十进制表示:5+3=8

再左移一位后:

(1000Xn)B= (0001_000Xn)BCD

对应十进制显示:1 Xn

每四位BCD码对应一位十进制数,即:(10+Xn)D,转换成功

注:Xn为下一位串行输入的二进制数。

2. 代码

module binary2bcd(binary_data,tens,ones);
input [4:0] binary_data;
output reg [3:0] tens;
output reg [3:0] ones;
 
always @*
case(binary_data)
    5'd0: 
        begin
            tens = 4'd0;
            ones = 4'd0;
        end
    5'd1:
        begin
            tens = 4'd0;
            ones = 4'd1;
        end
    5'd2:
        begin
            tens = 4'd0;
            ones = 4'd2;
        end
    5'd3:
        begin
            tens = 4'd0;
            ones = 4'd3;
        end
    5'd4:
        begin
            tens = 4'd0;
            ones = 4'd4;
        end
    5'd5:
        begin
            tens = 4'd0;
            ones = 4'd5;
        end
    5'd6:
        begin
            tens = 4'd0;
            ones = 4'd6;
        end
    5'd7:
        begin
            tens = 4'd0;
            ones = 4'd7;
        end
    5'd8:
        begin
            tens = 4'd0;
            ones = 4'd8;
        end
    5'd9:
        begin
            tens = 4'd0;
            ones = 4'd9;
        end
    5'd10: 
        begin
            tens = 4'd1;
            ones = 4'd0;
        end
    5'd11:
        begin
            tens = 4'd1;
            ones = 4'd1;
        end
    5'd12:
        begin
            tens = 4'd1;
            ones = 4'd2;
        end
    5'd13:
        begin
            tens = 4'd1;
            ones = 4'd3;
        end
    5'd14:
        begin
            tens = 4'd1;
            ones = 4'd4;
        end
    5'd15:
        begin
            tens = 4'd1;
            ones = 4'd5;
        end
    5'd16:
        begin
            tens = 4'd1;
            ones = 4'd6;
        end
    5'd17:
        begin
            tens = 4'd1;
            ones = 4'd7;
        end
    5'd18:
        begin
            tens = 4'd1;
            ones = 4'd8;
        end
    5'd19:
        begin
            tens = 4'd1;
            ones = 4'd9;
        end
    5'd20: 
        begin
            tens = 4'd2;
            ones = 4'd0;
        end
    5'd21:
        begin
            tens = 4'd2;
            ones = 4'd1;
        end
    5'd22:
        begin
            tens = 4'd2;
            ones = 4'd2;
        end
    5'd23:
        begin
            tens = 4'd2;
            ones = 4'd3;
        end
    5'd24:
        begin
            tens = 4'd2;
            ones = 4'd4;
        end
    5'd25:
        begin
            tens = 4'd2;
            ones = 4'd5;
        end
    5'd26:
        begin
            tens = 4'd2;
            ones = 4'd6;
        end
    5'd27:
        begin
            tens = 4'd2;
            ones = 4'd7;
        end
    5'd28:
        begin
            tens = 4'd2;
            ones = 4'd8;
        end
    5'd29:
        begin
            tens = 4'd2;
            ones = 4'd9;
        end
    5'd30:
        begin
            tens = 4'd3;
            ones = 4'd0;
        end
    5'd31:
        begin
            tens = 4'd3;
            ones = 4'd1;
        end
endcase
 
/*
integer i;
 
always @(binary_data)
begin
    tens = 4'd0;
    ones = 4'd0;
 
    for (i=7; i >= 0; i=i-1)
    begin
        if (tens>=5)
            tens = tens +3;
        if (ones >= 5)
            ones = ones +3;
        tens = tens << 1;
        tens[0] = ones[3];
        ones = ones << 1;
        ones[0] = binary_data[i];
    end
end
*/
 
endmodule