当前位置:   article > 正文

各种加法器的比对分析与Verilog实现(1)_行波进位加法器

行波进位加法器

        接下来几篇博客,我将介绍常见的几种加法器设计,包括超前进位、Kogge-Stone、brent-kung、carry-skip、Conditional-Sum等加法器的原理及Verilog实现。

       本文将介绍行波进位加法器、超前进位加法器的原理及Verilog实现。

1. 行波进位加法器 (Ripple Carry Adder, RCA)

1.1 原理

       从下方原理图即可看出,行波进位加法器由一系列全加器级联而成,这种加法器面积小,由于每一比特的进位输入必须等待前一比特完成进位输出的计算,所以这种加法器的速度慢。

行波进位加法器结构示意图

1.2 Verilog实现

(1)完成单比特全加器的模块

  1. module full_adder(
  2. input a,
  3. input b,
  4. input c_in,
  5. output sum,
  6. output c_out
  7. );
  8. assign {c_out,sum} = a + b + c_in;
  9. endmodule

(2)全加器级联

  1. module RCA(
  2. input [3:0] a,
  3. input [3:0] b,
  4. input c_in,
  5. output [3:0] sum,
  6. output c_out
  7. );
  8. wire sum1,sum2,sum3,sum4;
  9. wire c_out1,c_out2,c_out3;
  10. assign sum = {sum4,sum3,sum2,sum1};
  11. full_adder f0(
  12. .a(a[0]),
  13. .b(b[0]),
  14. .c_in(c_in),
  15. .sum(sum1),
  16. .c_out(c_out1)
  17. );
  18. full_adder f1(
  19. .a(a[1]),
  20. .b(b[1]),
  21. .c_in(c_out1),
  22. .sum(sum2),
  23. .c_out(c_out2)
  24. );
  25. full_adder f2(
  26. .a(a[2]),
  27. .b(b[2]),
  28. .c_in(c_out2),
  29. .sum(sum3),
  30. .c_out(c_out3)
  31. );
  32. full_adder f3(
  33. .a(a[3]),
  34. .b(b[3]),
  35. .c_in(c_out3),
  36. .sum(sum4),
  37. .c_out(c_out)
  38. );
  39. endmodule
Vivado综合电路(RCA)

2. 超前进位加法器 (Carry Look Ahead Adder , CLA)

2.1 设计原理

一位全加器真值表

       我们可以按A、B异或结果和A·B结果分成3组(表中用不同颜色进行区分),不难发现,第一组没有进位,第三组必有进位,第二组中Ci为1则有进位。因此可以通过这种特性提前得到进位。

       定义:

       根据真值表的特点可以推出:

       因此,CLA的计算流程如下:

       1) 对面向输入的第一层,并行预计算gi和pi

       2) 计算进位ci

       3) 根据pi和ci计算si

       超前进位加法器优化改进行波进位器的关键路径,通过采用并行计算进位的方法,解决了行波进位加法器的进位依赖问题。然而对于大位宽的超前进位加法器,进位逻辑计算单元面积耗费大。

2.2 Verilog实现

(1)pg单元设计

  1. module pg_cell(
  2. input a,
  3. input b,
  4. output g,
  5. output p
  6. );
  7. assign g = a & b;
  8. assign p = a ^ b;
  9. endmodule

(2)CLA实现

  1. module LCA #(width=4) (
  2. input [width-1:0] op1,
  3. input [width-1:0] op2,
  4. input cin,
  5. output [width-1:0] sum1,
  6. output [width-1:0] sum2,
  7. output cout,
  8. output cout2
  9. );
  10. //CLA
  11. wire [width-1:0] g;
  12. wire [width-1:0] p;
  13. wire [width:0] c;
  14. //gp generator
  15. genvar i;
  16. for( i=0; i<width; i=i+1) begin
  17. pg_cell pg_cell_u(
  18. .a( op1[i]),
  19. .b( op2[i]),
  20. .g( g[i] ),
  21. .p( p[i] )
  22. );
  23. end
  24. //carry generator
  25. assign c[0] = cin;
  26. assign c[1] = g[0] + ( c[0] & p[0] );
  27. assign c[2] = g[1] + ( (g[0] + ( c[0] & p[0]) ) & p[1] );
  28. assign c[3] = g[2] + ( (g[1] + ( (g[0] + (c[0] & p[0]) ) & p[1])) & p[2] );
  29. assign c[4] = g[3] + ( (g[2] + ( (g[1] + ( (g[0] + (c[0] & p[0]) ) & p[1])) & p[2] )) & p[3]);
  30. assign cout = c[width];
  31. genvar k;
  32. for( k=0; k<width; k=k+1) begin
  33. assign sum1[k] = p[k] ^ c[k];
  34. end
  35. endmodule
Vivado综合电路(CLA)

求学路上,你我共勉(๑•̀ㅂ•́)و✧

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号