图中下面是二进制码,上面是BCD码,注意看规律,就可以任意扩展或者缩小位宽
`timescale 1ns / 1ps
module binary_to_bcd
(
input [9:0] i_bin ,
output [3:0] o_bcd_ones ,
output [3:0] o_bcd_tens ,
output [3:0] o_bcd_hundreds
);
wire [3:0] c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12;
wire [3:0] d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12;
assign d1 = {1'b0, i_bin[9:7]};
assign d2 = {c1[2:0], i_bin[6]};
assign d3 = {c2[2:0], i_bin[5]};
assign d4 = {c3[2:0], i_bin[4]};
assign d5 = {c4[2:0], i_bin[3]};
assign d6 = {c5[2:0], i_bin[2]};
assign d7 = {c6[2:0], i_bin[1]};
assign d8 = {1'b0,c1[3],c2[3],c3[3]};
assign d9 = {c8[2:0], c4[3]};
assign d10 = {c9[2:0], c5[3]};
assign d11 = {c10[2:0], c6[3]};
assign d12 = {1'b0,c8[3],c9[3],c10[3]};
add3 m1(d1,c1);
add3 m2(d2,c2);
add3 m3(d3,c3);
add3 m4(d4,c4);
add3 m5(d5,c5);
add3 m6(d6,c6);
add3 m7(d7,c7);
add3 m8(d8,c8);
add3 m9(d9,c9);
add3 m10(d10,c10);
add3 m11(d11,c11);
add3 m12(d12,c12);
assign o_bcd_ones = {c7[2:0],i_bin[0]};
assign o_bcd_tens = {c11[2:0],c7[3]};
assign o_bcd_hundreds = {c12[2:0],c11[3]};
endmodule
图中方框代码为
`timescale 1ns / 1ps
module add3
(
input [3:0] i_d ,
output reg [3:0] o_q
);
always @ (i_d)
begin
case(i_d)
4'b0000 : o_q <= 4'b0000;
4'b0001 : o_q <= 4'b0001;
4'b0010 : o_q <= 4'b0010;
4'b0011 : o_q <= 4'b0011;
4'b0100 : o_q <= 4'b0100;
4'b0101 : o_q <= 4'b1000;
4'b0110 : o_q <= 4'b1001;
4'b0111 : o_q <= 4'b1010;
4'b1000 : o_q <= 4'b1011;
4'b1001 : o_q <= 4'b1100;
default : o_q <= 4'b0000;
endcase
end
endmodule