16bitBCD加法
BCD编码就是用4的位二进制来代表一个10进制的位 即 B C D 10010000 BCD_{10010000} BCD10010000码代表98,而二进制代表152。
充分利用模块思想,16bit的BCD加法可以由4个4bitBCD加法组成。
module top_module(
input [15:0] a, b,
input cin,
output cout,
output [15:0] sum );
wire [2:0] cout_temp;
bcd_add u_bcd_add_0(a[3:0],b[3:0],cin,cout_temp[0],sum[3:0]);
generate
genvar i;
for(i=1;i<3;i=i+1)begin:bcd_add_16
bcd_add u_bcd_add(a[(i+1)*4-1:i*4],b[(i+1)*4-1:i*4],cout_temp[i-1],cout_temp[i],sum[(i+1)*4-1:i*4]);
end
endgenerate
bcd_add u_bcd_add_3(a[15:12],b[15:12],cout_temp[2],cout,sum[15:12]);
endmodule
4bitBCD加法
4bitBCD可以由两个4bit全加器组成。
module bcd_add (
input [3:0] a,
input [3:0] b,
input cin,
output cout,
output [3:0] sum );
wire [1:0]cout_temp;
wire [3:0] sum_temp;
wire [3:0] b_temp;
assign b_temp = (sum_temp[3]&sum_temp[2]|sum_temp[3]&sum_temp[1]|cout_temp[0])?4'b0110:4'b0;
add_4 u_add4_1(a,b,cin,cout_temp[0],sum_temp);
add_4 u_add4_2(sum_temp,b_temp,0,cout_temp[1],sum);
assign cout = cout_temp[0]|cout_temp[1];
endmodule
首先可以发现4bitBCD对于两个4bit数相加若小于等于 9 1001 9_{1001} 91001那么就可以直接用4bit全加器的结果来代表,一旦大于 9 1001 9_{1001} 91001,则对应的4bit全加器则需要加 6 110 6_{110} 6110才能代表BCD的结果,例如
B C