类似半加器和全加器,也有半减器和全减器。

半减器只考虑当前两位二进制数相减,输出为差以及是否向高位借位,而全减器还要考虑当前位的低位是否曾有借位。它们的真值表如下:

对半减器,diff = x ^y, cin = ~x&y

对全减器,要理解真值表,可以用举列子的方法得到,比如4’b1000-4b'0001,则第一位对应0 1 0 1 1第二位对应的是0 0 1 1 1

从真值表中,可以得到 diff = x ^ y ^cout, cin = (~x&(y^cout))|(y&cout)

推导过程:diff = ~x&~y&cout + ~x&y&~cout +x&~y&~cout+x&y&cout=~x&(~y&cout+y&~cout)+x&(~y&~cout+y&cout)=~x&(y^cout)+x&~(y^cout)=x^y^cout;

cin = ~x&~y&cout+~x&y&~cout+~x&y&cout+x&y&cout=~x&(~y&cout+~x&~cout)+(~x+x)&y&cout=~x&(y^cout)+y&cout

注意:这儿 +和|都表示或。

半减器的verilog代码和testbench代码如下:

  1. module halfsub(x,y,d,cin);
  2.  
  3. input x;
  4. input y;
  5.  
  6. output d;
  7. output cin;
  8.  
  9. assign d = x^y;
  10. assign cin = (~x)&y;
  11.  
  12. endmodule

  1. `timescale 1ns/1ns
  2. `define clock_period 20
  3.  
  4. module halfsub_tb;
  5. reg x,y;
  6.  
  7. wire cin; //carryover
  8. wire d;
  9. reg clk;
  10.  
  11. halfsub halfsub_0(
  12. .x(x),
  13. .y(y),
  14. .d(d),
  15. .cin(cin)
  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

用rtl viewer,可以看到半减器逻辑图如下:

半减器功能验证的波形:

全减器的verilog代码和testbench代码如下:

  1. module fullsub(cout,x,y,d,cin);
  2.  
  3. input cout; // carry out bit, borrowed by its next low bit
  4. input x;
  5. input y;
  6.  
  7. output d;
  8. output cin;
  9.  
  10. assign d = x^y^cout;
  11. assign cin = (~x&(y^cout))|(y&cout);
  12.  
  13. endmodule

  1. `timescale 1ns/1ns
  2. `define clock_period 20
  3.  
  4. module fullsub_tb;
  5. reg x,y,cout;
  6.  
  7. wire cin; //carryover
  8. wire d;
  9. reg clk;
  10.  
  11. fullsub fullsub_0(
  12. .cout(cout),
  13. .x(x),
  14. .y(y),
  15. .d(d),
  16. .cin(cin)
  17. );
  18.  
  19. initial clk = 0;
  20. always #(`clock_period/2) clk = ~clk;
  21.  
  22. initial begin
  23. x = 0;
  24. repeat(20)
  25. #(`clock_period) x = $random;
  26.  
  27. end
  28.  
  29. initial begin
  30. y = 0;
  31. repeat(20)
  32. #(`clock_period) y = $random;
  33.  
  34. end
  35.  
  36. initial begin
  37. cout = 0;
  38. repeat(20)
  39. #(`clock_period) cout = $random;
  40.  
  41. end
  42.  
  43. initial begin
  44. #(`clock_period*20)
  45. $stop;
  46. end
  47.  
  48. endmodule

用rtl viewer,可以看到全减器逻辑图如下:

全减器的功能验证波形:

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

  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 加法器和减法器(3)

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

  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. [转]我的数据结构不可能这么可爱!——珂朵莉树(ODT)详解

    参考资料: Chtholly Tree (珂朵莉树) (应某毒瘤要求,删除链接,需要者自行去Bilibili搜索) 毒瘤数据结构之珂朵莉树 在全是珂学家的珂谷,你却不知道珂朵莉树?来跟诗乃一起学习珂朵 ...

  2. Android-Kotlin在Fragment获取View

    Android-Kotlin在Fragment获取View Overview 在使用Fragment的时候,使用了ButterKnife 来获取View但是一直出错,后来就直接使用Kotlin的导入布 ...

  3. 网络设备Web登录检测工具device-phamer

    网络设备Web登录检测工具device-phamer   为了便于管理和维护,大部分网络都提供了Web管理接口.Kali Linux提供了一款专用检测工具device-phamer.该工具可以批量检测 ...

  4. 网页图表Highcharts实践教程标之添加题副标题版权信息

    网页图表Highcharts实践教程标之添加题副标题版权信息 Highcharts辅助元素 辅助元素图表的非必要元素,如标题.版权信息.标签.载入动态.它们不和图表数据发生关联,只是额外说明一些基本信 ...

  5. HTTP协议-MIME类型

    每一个 URL 都代表着一个资源对象,而当我们请求一个网页的时候,看似只请求了一个 URI(统一资源标识符),实际上这个网页可能包含多个 URI,例如图片资源的 URI 和视频资源的 URI 等.此时 ...

  6. XXX on tree

    %了发树上莫队 nlognsqrt(n) // luogu-judger-enable-o2 #include<bits/stdc++.h> using namespace std; in ...

  7. 【转】Asp.net实现URL重写

    [概述] URL重写就是首先获得一个进入的URL请求然后把它重新写成网站可以处理的另一个URL的过程.重写URL是非常有用的一个功能,因为它可以让你提高搜索引擎阅读和索引你的网站的能力:而且在你改变了 ...

  8. spring boot 集成 druid

    写在前面 因为在用到spring boot + mybatis的项目时候,经常发生访问接口卡,服务器项目用了几天就很卡的甚至不能访问的情况,而我们的项目和数据库都是好了,考虑到可能是数据库连接的问题, ...

  9. UVA 11732 - strcmp() Anyone?(Trie)

    UVA 11732 - strcmp() Anyone? 题目链接 题意:给定一些字符串,要求两两比較,须要比較的总次数(注意.假设一个字符同样.实际上要还要和'\0'比一次,相当比2次) 思路:建T ...

  10. chrome浏览器调试报错:Failed to load resource: the server responsed width a status of 404 (Not Found)…http://127.0.0.1:5099/favicon.ico

    chrome浏览器在调试的时候默认会查找根目录下的favicon.ico文件,如果不存在就会报错. 解决办法:F12,点击<top frame>左侧漏斗形状的filter,勾选上" ...