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