手工加法运算时候,我们都是从最低位的数字开始,逐位相加,直到最高位。如果第i位产生进位,就把该位作为第i+1位输入。同样的,在逻辑电路中,我们可以把一位全加器串联起来,实现多位加法,比如下面的四位加法电路。这种加法电路叫行波进位加法器。

每一级的进位cout传到下一级时都有一个延时,假设为t, 则总的延时为 n*t, n为操作数的位数,比如四位行波进位加法器,为4t。因为t是固定的时间,所以32位或者64位加法时候,这个时延可能不可接受,影响电路的时序,所以我们需要找到更加高效的加法器。

下面是8位行波进位加法器的代码。通过改变参数n的值,我们能够实现的不同位操作数的行波进位加法。

  1. module addern(x, y, s, cout);
  2. parameter n=8;
  3. input [n-1:0] x;
  4. input [n-1:0] y;
  5. output reg[n-1:0] s;
  6. output reg cout;
  7.  
  8. reg [n:0] c;
  9. integer k;
  10.  
  11. always @(x,y) begin
  12. c[0] = 1'b0;
  13. for(k = 0; k < n; k = k + 1) begin
  14. s[k] = x[k]^y[k]^c[k];
  15. c[k+1] = (x[k]&y[k])|(x[k]&c[k])|(y[k]&c[k]);
  16. end
  17. cout = c[n];
  18.  
  19. end
  20.  
  21. endmodule

或者我们能够使用generate  … endgenerate,在其中用for循环实例化fulladd模块来实现同样功能。代码如下:

  1. module addern(x, y, s, cout);
  2. parameter n=32;
  3. input [n-1:0] x;
  4. input [n-1:0] y;
  5. output [n-1:0] s;
  6. output cout;
  7.  
  8. wire [n:0] c;
  9. genvar k;
  10. assign c[0]=0;
  11. assign cout=c[n];
  12.  
  13. generate
  14. for(k = 0; k <= n-1; k = k + 1) begin:addbit
  15. fulladd stage(c[k],x[k],y[k],s[k],c[k+1]);
  16. end
  17. endgenerate
  18.  
  19. endmodule

使用下面的testbench代码:

  1. `timescale 1ns/1ns
  2. `define clock_period 20
  3.  
  4. module addern_tb;
  5. reg [7:0] x,y;
  6.  
  7. wire cout;
  8. wire [7:0] s;
  9. reg clk;
  10.  
  11. addern #(.n(8)) addern_0(
  12. .x(x),
  13. .y(y),
  14. .s(s),
  15. .cout(cout)
  16. );
  17.  
  18. initial clk = 0;
  19. always #(`clock_period/2) clk = ~clk;
  20.  
  21. initial begin
  22. x = 0;
  23. repeat(20)
  24. #(`clock_period) x = $random;
  25.  
  26. end
  27.  
  28. initial begin
  29. y = 0;
  30. repeat(20)
  31. #(`clock_period) y = $random;
  32.  
  33. end
  34.  
  35. initial begin
  36. #(`clock_period*20)
  37. $stop;
  38. end
  39.  
  40. endmodule

进行功能验证,我们得到如下的波形,注意设置radix位unsigned,以便查看结果是否正确。

我们也可以使用下面的代码实现相同的功能。这段代码在quartus II选用Cyclone IV E-EP4CE10F17C8综合后,得到下面的逻辑电路,应该是调用了内置的加法器ip。

  1. module addern( x, y,s,cout);
  2.  
  3. parameter n=8;
  4. input [n-1:0] x;
  5. input [n-1:0] y;
  6. output [n-1:0] s;
  7. output cout;
  8.  
  9. assign {cout, s} = x + y ;
  10.  
  11. endmodule

Verilog 加法器和减法器(3)的更多相关文章

  1. Verilog 加法器和减法器(8)-串行加法器

    如果对速度要求不高,我们也可以使用串行加法器.下面通过状态机来实现串行加法器的功能. 设A=an-1an-2-a0, B=bn-1bn-2-b0,是要相加的两个无符号数,相加的和为:sum=sn-1s ...

  2. Verilog 加法器和减法器(4)

    类似于行波进位加法器,用串联的方法也能够实现多位二进制数的减法操作.  比如下图是4位二进制减法逻辑电路图. 8位二进制减法的verilog代码如下: module subn(x, y, d,cin) ...

  3. Verilog 加法器和减法器(7)

    在计算机中浮点数 表示通常采用IEEE754规定的格式,具体参考以下文章. https://www.cnblogs.com/mikewolf2002/p/10095995.html 下面我们在Veri ...

  4. Verilog 加法器和减法器(6)

    为了减小行波进位加法器中进位传播延迟的影响,可以尝试在每一级中快速计算进位,如果能在较短时间完成计算,则可以提高加法器性能. 我们可以进行如下的推导: 设 gi=xi&yi, pi = xi ...

  5. Verilog 加法器和减法器(2)

    类似半加器和全加器,也有半减器和全减器. 半减器只考虑当前两位二进制数相减,输出为差以及是否向高位借位,而全减器还要考虑当前位的低位是否曾有借位.它们的真值表如下: 对半减器,diff = x ^y, ...

  6. Verilog 加法器和减法器(1)

    两个一位的二进制数x,y相加,假设和为s,进位为cout,其真值表为: 从真值表中,我们可以得到:s = x^y, cout = x&y,实现两个一位数相加的逻辑电路称为半加器. 实现该电路的 ...

  7. Verilog 加法器和减法器(5)

    前面二进制加法运算,我们并没有提操作数是有符号数,还是无符号数.其实前面的二进制加法对于有符号数和无符号数都成立.比如前面的8位二进制加法运算,第一张图我们选radix是unsigned,表示无符号加 ...

  8. 基于Xilinx的Synthesize

    所谓综合.就是讲HDL语言.原理图等设计输入翻译成由与.或.非们和RAM.触发器登记本逻辑单元的逻辑连接(即网表).并依据目标和要求(约束条件)优化生成的逻辑连接. ISE-XST XST是Xilin ...

  9. FPGA综合工具--Synplify Pro的常用选项及命令

    最近要用到Synplify,但以前没使用过,无基础,找到一篇帖子,隧保存下来. 本文转自:http://blog.sina.com.cn/s/blog_65fe490d0100v8ax.html Sy ...

随机推荐

  1. Spring拦截器和过滤器

    什么是拦截器 拦截器(Interceptor): 用于在某个方法被访问之前进行拦截,然后在方法执行之前或之后加入某些操作,其实就是AOP的一种实现策略.它通过动态拦截Action调用的对象,允许开发者 ...

  2. python文件相关操作

    Python文件相关操作 打开文件 打开文件,采用open方法,会将文件的句柄返回,如下: f = open('test_file.txt','r',encoding='utf-8') 在上面的代码中 ...

  3. 我的php.ini上传文件配置

    可以通过phpinfo查看.当前的配置信息 # php -i | grep php.ini              //查看php.ini位置 file_uploads = on          ...

  4. 15、Redis的集群

     写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------------------- ...

  5. [BZOJ1115][POI2009]石子游戏Kam解题报告|阶梯博弈

    有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏.问先手是否必胜. 首先 ...

  6. java native方法与JNI实现

    native方法定义: 简单地讲,一个Native Method就是一个java调用非java代码的接口.一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如 ...

  7. nginx php-fpm安装配置(转)

    nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端. nginx一般是把请求发fastcgi管理进程处理,fascgi管 ...

  8. 一种高效的序列化方式——MessagePack

    最近在弄一些数据分析方面的内容,发现很多时候数据瓶颈在模块之间的数据序列化和反序列化上了,原来项目中用的是Json,找了一圈发现Json.net在Json序列化库中已经是性能的佼佼者了,便准备从序列化 ...

  9. 【 D3.js 入门系列 --- 9 】 常见可视化图形

    本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. Layout ,直译为"布局,安排".但在 ...

  10. 收集的MySQL的面试题分享给大家

    1.怎样登陆mysql数据库 mysql -u username -p 2.怎样开启/关闭mysql服务 service mysql start/stop 3.查看mysql的状态 service m ...