当前位置:   article > 正文

4bit全加器实现(行波进位加法器)_四位全加器

四位全加器

        概要:加减乘除是人类使用的最基本的数学运算。现代计算机的发明之前,人们只能通过纸笔进行运算,效率有限;随着计算机的出现,运算速度几何倍增。在现在的编程语言中,我们只需要输入一个“+”,硬件设备会自动进行加法计算。但加法到底是如和通过硬件来实现的,虽然很底层,但我觉得还是有必要了解一下。 

        本篇博客就加法器的一种实现方式进行简单介绍——行波进位加法器(也可以叫波纹进位加法器脉动进位加法器

        说到加法器(通常说的加法器应该指的是全加器),就得从半加器说起。半加器的门级原理图及真值表如下图所示:半加器的目的是实现两个一位的二进制数的加法,也就是实现0与1的加法。但其无法进行超过1位二进制数的加法,所以才有全加器的出现。

一、半加器的实现

根据半加器的门级电路图,我们可以使用Verilog语言将其描述出来

  1. /**********************************************
  2. * @Module function : 半加器
  3. * Description : 实现两个一位二进制数的相加
  4. * @Author : Akeng
  5. * @Date 2024/01/07 13:10:39
  6. * @logic { }
  7. * @repair
  8. * @version : 1.0.0
  9. **********************************************/
  10. module half_adder (
  11. input wire a,
  12. input wire b,
  13. output reg c,
  14. output reg s,
  15. output wire [1:0] sum
  16. );
  17. always @( *) begin
  18. c = a & b;
  19. s = a ^ b;
  20. end
  21. assign sum = {c,s};
  22. endmodule //half_adder

二、单bit全加器的实现

全加器两个半加器构成,如下图所示:

根据全加器的门级电路图,用代码描述如下:(该全加器现在可以进行进位的处理,要实现多bit的全加器可以将多个单bit全加器级联)

  1. /**********************************************
  2. * @Module function : 全加器
  3. * Description : 1bit加法器
  4. * @Author : Akeng
  5. * @Date 2024/01/07 22:08:14
  6. * @logic { }
  7. * @repair
  8. * @version : 1.0.0
  9. **********************************************/
  10. module full_adder (
  11. input wire a ,
  12. input wire b ,
  13. input wire cin ,
  14. output wire s ,
  15. output wire cout
  16. // output wire sum
  17. );
  18. assign s = a ^ b ^ cin;
  19. assign cout = ((a ^ b) & cin) | (a & b);
  20. // assign sum = {cout,s};
  21. endmodule //full_adder

三、4-bit全加器的实现

如上图为4-bit的行波进位加法器的结构图,根据结构图,可以得到相应的门级电路图,如下:

在代码实现中,只需将单bit的全加器例化4次,使用中间信号将其连接起来即可:

  1. module full_adder_4bit (
  2. input wire [3:0] a ,
  3. input wire [3:0] b ,
  4. input wire [0:0] cin ,
  5. output wire [3:0] s ,
  6. output wire [0:0] cout ,
  7. output wire [4:0] sum
  8. );
  9. wire [3:0] c;
  10. full_adder add_0(
  11. /* input wire */ .a (a[0] ) ,
  12. /* input wire */ .b (b[0] ) ,
  13. /* input wire */ .cin (cin ) ,
  14. /* output wire */ .s (s[0] ) ,
  15. /* output wire */ .cout(c[0] )
  16. // /* output wire */ .sum (sum[0])
  17. );
  18. full_adder add_1(
  19. /* input wire */ .a (a[1] ) ,
  20. /* input wire */ .b (b[1] ) ,
  21. /* input wire */ .cin (c[0] ) ,
  22. /* output wire */ .s (s[1] ) ,
  23. /* output wire */ .cout(c[1] )
  24. // /* output wire */ .sum (sum[1])
  25. );
  26. full_adder add_2(
  27. /* input wire */ .a (a[2] ) ,
  28. /* input wire */ .b (b[2] ) ,
  29. /* input wire */ .cin (c[1] ) ,
  30. /* output wire */ .s (s[2] ) ,
  31. /* output wire */ .cout(c[2] )
  32. // /* output wire */ .sum (sum[2])
  33. );
  34. full_adder add_3(
  35. /* input wire */ .a (a[3] ) ,
  36. /* input wire */ .b (b[3] ) ,
  37. /* input wire */ .cin (c[2] ) ,
  38. /* output wire */ .s (s[3] ) ,
  39. /* output wire */ .cout(cout )
  40. // /* output wire */ .sum (sum[3])
  41. );
  42. assign sum = {cout, s};
  43. endmodule //full_adder

通过编写仿真测试对其进行功能行检测,testbench代码如下:

  1. `timescale 1ns/1ns
  2. module tb_full_adder ();
  3. reg [3:0] a ;
  4. reg [3:0] b ;
  5. reg cin ;
  6. wire[3:0] s ;
  7. wire cout ;
  8. wire[4:0] sum ;
  9. /* full_adder full_adder(
  10. .a (a ) ,
  11. .b (b ) ,
  12. .cin (cin ) ,
  13. .s (s ) ,
  14. .cout(cout) ,
  15. .sum (sum )
  16. ); */
  17. full_adder_4bit full_adder_4bit(
  18. /* input wire [3:0] */ .a (a ) ,
  19. /* input wire [3:0] */ .b (b ) ,
  20. /* input wire [0:0] */ .cin (cin ) ,
  21. /* output wire [3:0] */ .s (s ) ,
  22. /* output wire [0:0] */ .cout(cout) ,
  23. /* output wire [4:0] */ .sum (sum )
  24. );
  25. initial begin
  26. a = 4'b0000;
  27. b = 4'b0000;
  28. cin = 1'b0;
  29. #100;
  30. $stop;
  31. end
  32. always #10 a <= {$random} % 16;
  33. always #10 b <= {$random} % 16;
  34. always #8 cin <= {$random} % 2;
  35. endmodule //tb_full_adder

通过MdelSim仿真可以看到功能得到实现


四、Vivado分析

        使用Vivado进行RTL分析后,可以看到其RTL级视图如下

        展开其中一个add模块,可以看到,其门级电路与我们前面分析的完全一样


当然,最后也可以上板玩一下,使用按键与led观察输入输出……

五、总结

        以上只是全加器的一种实现方式,使用行波进位的方法来实现,这中方法最大的缺点是延时大,随着两个加数的位宽的增大,其得到最终结果的时间也随之增大,因为下一位的结果依赖前一位的进位输出。为了优化性能,工程师设计了超前进位加法器(以后由兴趣在深入了解吧)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/948801
推荐阅读
相关标签
  

闽ICP备14008679号