两个一位的二进制数x,y相加,假设和为s,进位为cout,其真值表为:

从真值表中,我们可以得到:s = x^y, cout = x&y,实现两个一位数相加的逻辑电路称为半加器。

实现该电路的verilog代码如下:

  1. module halfadd(x,y,s,cout);
  2.  
  3. input x;
  4. input y;
  5.  
  6. output s;
  7. output cout;
  8.  
  9. assign s = x^y;
  10. assign cout = x&y;
  11.  
  12. endmodule

相对应的testbench文件如下代码。在代码中,我们采用系统函数$random来产生随机激励。半加器电路中并没有使用时钟,但在testbench中,产生了时钟信号,主要是为了功能验证时候,有一个时间单位信号,便于检查结果。

  1. `timescale 1ns/1ns
  2. `define clock_period 20
  3.  
  4. module halfadd_tb;
  5. reg x,y;
  6.  
  7. wire cout;
  8. wire s;
  9. reg clk;
  10.  
  11. halfadd halfadd_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

在quartus II中,分析与综合后,用rtl view 可以得到 halfadd的电路如下,和我们预想的一样。

功能仿真结果如下,从波形中可以看到结果正确。

全编译后,在Cyclone IV E-EP4CE10F17C8中的门级仿真结果如下,输入和输出之间,会有几ns的时延。

通常,我们更感兴趣的是多位二进制数的相加,在多位二进制数相加时,对每一位而言,除了考虑相加的两位数(第i位),还要考虑来自低位(i-1位)的进位。实现带低位进位的两个一位数相加的逻辑电路,称为全加器。

它的真值表如下:

从真值表中,我们可以得知:s = ~x & y & ~cin + x&~y&~cin+~x&~y&cin+x&y&cin = (~x&y+x&~y)&~cin+(~x&~y+x&y)&cin=(x^y)&~cin+~(x^y)&cin=x^y^cin,

这儿我们用~表示非,+表示或。cout = x&y+x&cin+y&cin

全加器verilog代码如下:

  1. module fulladd(cin,x,y,s,cout);
  2.  
  3. input cin;
  4. input x;
  5. input y;
  6.  
  7. output s;
  8. output cout;
  9.  
  10. assign s = x^y^cin;
  11. assign cout = (x&y)|(x&cin)|(y&cin);
  12.  
  13. endmodule

对应的testbench代码如下:

  1. `timescale 1ns/1ns
  2. `define clock_period 20
  3.  
  4. module fulladd_tb;
  5. reg cin,x,y;
  6.  
  7. wire cout;
  8. wire s;
  9. reg clk;
  10.  
  11. fulladd fulladd_0(
  12. .cin(cin),
  13. .x(x),
  14. .y(y),
  15. .s(s),
  16. .cout(cout)
  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. cin = 0;
  38. repeat(2)
  39. #(`clock_period*10) cin = {$random};
  40.  
  41. end
  42.  
  43. initial begin
  44. #(`clock_period*20)
  45. $stop;
  46. end
  47.  
  48. endmodule

从rtl view中,可以看到全加器逻辑电路图如下:包括3个与门,一个三输入的异或门,一个三输入的或门。

功能仿真和门级仿真的波形如下,信号符合预期。

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

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

    类似半加器和全加器,也有半减器和全减器. 半减器只考虑当前两位二进制数相减,输出为差以及是否向高位借位,而全减器还要考虑当前位的低位是否曾有借位.它们的真值表如下: 对半减器,diff = 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. git仓库使用

    1.git命令参数 usage: git [--version] [--help] [-c name=value] [--exec-path[=<path>]] [--html-path] ...

  2. linux学习笔记-10.解压与压缩

    1.gzip压缩 gzip a.txt 2.解压 gunzip a.txt.gzgzip -d a.txt.gz 3.bzip2压缩 bzip2 a 4.解压 bunzip2 a.bz2bzip2 - ...

  3. 【原创】MySQL Can't create a new thread报错分析

    今天有两台服务器都出现了Can't create a new thread报错. [故障处理过程] 故障发生后登录服务器,检查mysql进程正常,但登录mysql报下面错误 ERROR 1135 (H ...

  4. IEnumerable<T>

    IEnumerable 饮水思源 <C#本质论> Overview 根据定义,.Net 的中集合,本质上是一个类,它最起码实现了IEnumeraable 或者非泛型的IEnumerable ...

  5. linux驱动之LCD(无framebuffer)

    <简介> a:什么是液晶 物质一般有三态,固态,气态,和液态.这只是一种比较大致的划分,但是有些物质介于液体和固体之间——液晶.一般固体的分子或原子都由固定的排列方式,但是液晶介于固体和液 ...

  6. 条件随机场(crf)及tensorflow代码实例

    对于条件随机场的学习,我觉得应该结合HMM模型一起进行对比学习.首先浏览HMM模型:https://www.cnblogs.com/pinking/p/8531405.html 一.定义 条件随机场( ...

  7. handlebars.min.js的使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Codechef September Challenge 2018 游记

    Codechef September Challenge 2018 游记 Magician versus Chef 题目大意: 有一排\(n(n\le10^5)\)个格子,一开始硬币在第\(x\)个格 ...

  9. Maven 项目不打包 *.hbm.xml 映射文件

    使用 Maven 部署 Java Web 项目时,Hibernate 的映射文件 *.hbm.xml 没有被打包部署到目标目录下,解决方法:在 pom.xml 文件中 <build> 节点 ...

  10. Wingdings 2 符号编码对照表

     http://blog.csdn.net/linux7985/article/details/5030754 符号  编码 HTML 代码  符号  编码 HTML 代码 ! ! " &q ...