📄 bcd_add_chain.v
字号:
9'h186 : {carry_out,sum} = 5'h15;
9'h087 : {carry_out,sum} = 5'h15;
9'h187 : {carry_out,sum} = 5'h16;
9'h088 : {carry_out,sum} = 5'h16;
9'h188 : {carry_out,sum} = 5'h17;
9'h089 : {carry_out,sum} = 5'h17;
9'h189 : {carry_out,sum} = 5'h18;
9'h090 : {carry_out,sum} = 5'h09;
9'h190 : {carry_out,sum} = 5'h10;
9'h091 : {carry_out,sum} = 5'h10;
9'h191 : {carry_out,sum} = 5'h11;
9'h092 : {carry_out,sum} = 5'h11;
9'h192 : {carry_out,sum} = 5'h12;
9'h093 : {carry_out,sum} = 5'h12;
9'h193 : {carry_out,sum} = 5'h13;
9'h094 : {carry_out,sum} = 5'h13;
9'h194 : {carry_out,sum} = 5'h14;
9'h095 : {carry_out,sum} = 5'h14;
9'h195 : {carry_out,sum} = 5'h15;
9'h096 : {carry_out,sum} = 5'h15;
9'h196 : {carry_out,sum} = 5'h16;
9'h097 : {carry_out,sum} = 5'h16;
9'h197 : {carry_out,sum} = 5'h17;
9'h098 : {carry_out,sum} = 5'h17;
9'h198 : {carry_out,sum} = 5'h18;
9'h099 : {carry_out,sum} = 5'h18;
9'h199 : {carry_out,sum} = 5'h19;
default : {carry_out,sum} = 5'bxxxxx;
endcase
end
end
else if (METHOD == 1) begin
////////////////////////////////////
// adder and subtract 10's variant
////////////////////////////////////
wire [4:0] temp_sum = ina + inb + carry_in;
always @(*) begin
carry_out = temp_sum[4] |
temp_sum[3] & (temp_sum[2] | temp_sum[1]);
sum = temp_sum - {carry_out,1'b0,carry_out,1'b0};
end
end
else if (METHOD == 2) begin
/////////////////////////////////////////////////
// adder and subtract 10's variant
// re-expressed to discourage carry chain use
/////////////////////////////////////////////////
wire [5:0] temp_sum;
non_carry_add nca (.ina({1'b0,ina,carry_in}),.inb({1'b0,inb,carry_in}),.sum(temp_sum));
defparam nca .WIDTH = 6;
always @(*) begin
carry_out = temp_sum[5] |
temp_sum[4] & (temp_sum[3] | temp_sum[2]);
sum = temp_sum[5:1] - {carry_out,1'b0,carry_out,1'b0};
end
end
else if (METHOD == 3) begin
/////////////////////////////////////////////////
// hard logic based on Quartus' output from method 2
/////////////////////////////////////////////////
stratixii_lcell_comb helpr_0_I (
.dataa(!inb[1]),
.datab(!ina[1]),
.datac(!carry_in),
.datad(!ina[0]),
.datae(!inb[0]),
.dataf(1'b1),
.combout(helpr_0 ),
.shareout(),.cout(),.sharein(1'b0),.cin(1'b0),.sumout(),.datag(1'b1));
defparam helpr_0_I .shared_arith = "off";
defparam helpr_0_I .extended_lut = "off";
defparam helpr_0_I .lut_mask = 64'h6669699966696999;
stratixii_lcell_comb helpr_1_I (
.dataa(!inb[1]),
.datab(!ina[1]),
.datac(!carry_in),
.datad(!ina[0]),
.datae(!inb[0]),
.combout(helpr_1 ),
.dataf(1'b1),
.shareout(),.cout(),.sharein(1'b0),.cin(1'b0),.sumout(),.datag(1'b1));
defparam helpr_1_I .shared_arith = "off";
defparam helpr_1_I .extended_lut = "off";
defparam helpr_1_I .lut_mask = 64'h1117177711171777;
stratixii_lcell_comb sum_0_I (
.dataa(!carry_in),
.datab(!inb[0]),
.datac(!ina[0]),
.combout(sum_0),
.datad(1'b1),.datae(1'b1),.dataf(1'b1),
.shareout(),.cout(),.sharein(1'b0),.cin(1'b0),.sumout(),.datag(1'b1));
defparam sum_0_I .shared_arith = "off";
defparam sum_0_I .extended_lut = "off";
defparam sum_0_I .lut_mask = 64'h6969696969696969;
stratixii_lcell_comb sum_1_I (
.dataa(!helpr_0 ),
.datab(!helpr_1 ),
.datac(!ina[3]),
.datad(!inb[3]),
.datae(!inb[2]),
.dataf(!ina[2]),
.combout(sum_1 ),
.shareout(),.cout(),.sharein(1'b0),.cin(1'b0),.sumout(),.datag(1'b1));
defparam sum_1_I .shared_arith = "off";
defparam sum_1_I .extended_lut = "off";
defparam sum_1_I .lut_mask = 64'h522A4AAA4AAA2AAA;
stratixii_lcell_comb sum_2_I (
.dataa(!helpr_0 ),
.datab(!helpr_1 ),
.datac(!ina[3]),
.datad(!inb[3]),
.datae(!inb[2]),
.dataf(!ina[2]),
.combout(sum_2 ),
.shareout(),.cout(),.sharein(1'b0),.cin(1'b0),.sumout(),.datag(1'b1));
defparam sum_2_I .shared_arith = "off";
defparam sum_2_I .extended_lut = "off";
defparam sum_2_I .lut_mask = 64'hCEE639993999E666;
stratixii_lcell_comb sum_3_I (
.dataa(!helpr_0 ),
.datab(!helpr_1 ),
.datac(!ina[3]),
.datad(!inb[3]),
.datae(!inb[2]),
.dataf(!ina[2]),
.combout(sum_3 ),
.shareout(),.cout(),.sharein(1'b0),.cin(1'b0),.sumout(),.datag(1'b1));
defparam sum_3_I .shared_arith = "off";
defparam sum_3_I .extended_lut = "off";
defparam sum_3_I .lut_mask = 64'hF778DEE1DEE17887;
// This version has better area, but leaves the carry
// in two levels deep from the carry out rather than
// one.
//
// stratixii_lcell_comb cout_cell_I (
// .dataa(!helpr_0 ),
// .datab(!helpr_1 ),
// .datac(!ina[3]),
// .datad(!inb[3]),
// .datae(!inb[2]),
// .dataf(!ina[2]),
// .combout(cout_cell ),
// .shareout(),.cout(),.sharein(1'b0),.cin(1'b0),.sumout(),.datag(1'b1));
// defparam cout_cell_I .shared_arith = "off";
// defparam cout_cell_I .extended_lut = "off";
// defparam cout_cell_I .lut_mask = 64'h077F1FFF1FFF7FFF;
// this version is modifed to shorting the cin to cout path
stratixii_lcell_comb cout_cell_h0_I (
.dataa(!inb[1]),
.datab(!ina[1] ),
.datac(!inb[2]),
.datad(!ina[2]),
.datae(!inb[3]),
.dataf(!ina[3]),
.combout(cout_cell_h0 ),
.shareout(),.cout(),.sharein(1'b0),.cin(1'b0),.sumout(),.datag(1'b1));
defparam cout_cell_h0_I .shared_arith = "off";
defparam cout_cell_h0_I .extended_lut = "off";
defparam cout_cell_h0_I .lut_mask = 64'hfee0000000000000;
stratixii_lcell_comb cout_cell_h1_I (
.dataa(!inb[1]),
.datab(!ina[1] ),
.datac(!inb[2]),
.datad(!ina[2]),
.datae(!inb[3]),
.dataf(!ina[3]),
.combout(cout_cell_h1 ),
.shareout(),.cout(),.sharein(1'b0),.cin(1'b0),.sumout(),.datag(1'b1));
defparam cout_cell_h1_I .shared_arith = "off";
defparam cout_cell_h1_I .extended_lut = "off";
defparam cout_cell_h1_I .lut_mask = 64'hfff8800080000000;
stratixii_lcell_comb cout_cell_I (
.dataa(!cout_cell_h0),
.datab(!cout_cell_h1 ),
.datac(!ina[0]),
.datad(!carry_in),
.datae(!inb[0]),
.dataf(1'b1),
.combout(cout_cell ),
.shareout(),.cout(),.sharein(1'b0),.cin(1'b0),.sumout(),.datag(1'b1));
defparam cout_cell_I .shared_arith = "off";
defparam cout_cell_I .extended_lut = "off";
defparam cout_cell_I .lut_mask = 64'hcccacaaacccacaaa;
always @(*) begin
sum[0] = sum_0 ;
sum[1] = sum_1 ;
sum[2] = !sum_2 ;
sum[3] = !sum_3 ;
carry_out = cout_cell ;
end
end
endgenerate
endmodule
/////////////////////////////////////////////////////
module bcd_add_chain (ina,inb,sum);
parameter DEC_DIGITS = 4;
parameter METHOD = 3;
input [DEC_DIGITS*4-1:0] ina,inb;
output [DEC_DIGITS*4-1:0] sum;
wire [DEC_DIGITS:0] cin;
assign cin[0] = 1'b0;
genvar i;
generate
for (i=0;i<DEC_DIGITS;i=i+1)
begin : digs
bcd_digit_add d (
.ina(ina[(i+1)*4-1:i*4]),
.inb(inb[(i+1)*4-1:i*4]),
.sum(sum[(i+1)*4-1:i*4]),
.carry_in(cin[i]),
.carry_out(cin[i+1]));
defparam d .METHOD = METHOD;
end
endgenerate
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -