二进制到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