⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bcd_add_chain.v

📁 本電子檔為 verilog cookbook,包含了通訊,影像,DSP等重要常用之verilog編碼,可作為工程師與初學者的參考手冊
💻 V
📖 第 1 页 / 共 2 页
字号:
        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 + -