前言

之前的文章《verilog学习:使用VCS仿真验证一个全加器》,示范了下全加器,这篇文章就展开说一下加法器。

  • 参考的视频有:
    【老邱数电】半加器与全加器基础
    单片机功能这么强,为什么还要组合逻辑器件?
    数字电路中全加器是什么原理,专用的加法器芯片有哪些
    0200410-104536-数字电路(1)-半加器和全加器的设计1

加法器(Adder)

  • 加法器分为1位数加法器和多位数加法器,1位数加法器又可以分为半加器和全加器。
  • 半加:两个1位二进制数相加,不考虑来自低位的进位(2个二进制数相加);
  • 全加:两个1位二进制数与来自低位的进位三者相加(3个二进制数相加);
  • 半加器+半加法和全加法是算术运算电路中的基本单元,它们是完成1位二进制相加的一种组合逻辑电路。

1.半加器(Half Adder)

不考虑低位的进位信号,将两个一位二进制数相加,只求本位和

  • 二进制加法隐含条件:变量只取0和1;逢二进位;
  • 真值表如下:
被加数A 加数B 和数S 进位CO
0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1

由表中可以看见,这种加法没有考虑低位来的进位,所以称为半加。

  • 跟据真值表,写出方程;根据表达式画出逻辑图:

1.1 半加器verilog设计代码

  • 第一种写法:
module half_adder(input a,             //第一个加数ainput b,             //第二个加数boutput sum,          //和output cout          //位
);     assign sum=a ^ b;     //sum=a⊕bassign cout=a & b;   //cout=abendmodule
  • 第二种写法:
module half_adder(cout,sum,a,b);    output   cout;               output   sum;               input    a,b;               wire     cout,sum  ;          //assign   {cout,sum}=a+b;   assign cout = a & b;assign sum = a ^ b;    endmodule
  • 这两种写法综合出来的电路图是一样的,如下:
  • 第三种写法:
module half_adder(cout,sum,a,b);    output   cout;               output   sum;               input    a,b;               wire     cout,sum  ;          assign   {cout,sum}=a+b;   //assign cout = a & b;//assign sum = a ^ b;    endmodule
  • 第三种写法综合出来的电路图如下:

1.2 测试文件testbench

`timescale 1ns/10ps
//`include "adder.v"
module adder_testbench;        reg    a,b;                   wire   sum,cout;           integer i,j;   adder  adder_te(.sum  ( sum ),.cout  ( cout),.a     ( a  ),.b     ( b  ));   initial begina=0;b=0;for(i=1;i<16;i=i+1)#20   a=i;endinitial beginfor(j=1;j<16;j=j+1)#10   b=j;endinitial begin$monitor($time,,,"%d + %d ={%b,%d}",a,b,cout,sum);#160  $finish;endendmodule
  • 三种方式产生的波形文件都一样(注意,这里是1bit数相加,高位会溢出的)!

2.全加器(Full Adder)

  • 半加法器中,不考虑输入进位,在全加法器设计中将第i-1位的输出进位当
    作第i位的输入。
  • 在将两个多位二进制数相加时,除了最低位以外,每一位都应该考虑来自低位的进位,即将两个对应位的加数和来自低位的进位3个数相加。这种运算称为全加,所用的电路称为全加器。
  • 两个1位二进制数相加,考虑低位进位

一位全加器的真值表如下图,其中Ai为被加数,Bi为加数,相邻低位来的进位数为Ci-1,输出本位和为Si。向相邻高位进位数为Ci

进位输入Ci-1 被加数Ai 加数Bi 本位和Si 进位输出Ci
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1


一位全加器的逻辑表达式如下:

Si=Ai⊕Bi⊕Ci-1

电路图如下:

2.1 全加器verilog设计代码

  • 第一种写法:
module full_add (a,b,cin,sum,cout);  input a,b,cin;       output sum,cout;               reg sum,cout;             always @(a or b or cin)beginsum = a ^ b ^ cin;cout = a & b |(cin&(a^b));endendmodule

综合出来的电路:

  • 第二种写法:
module full_add (a,b,cin,sum,cout);  input a,b,cin;       output sum,cout;               reg sum,cout;                always @(a or b or cin)beginsum = a ^ b ^ cin;//cout = a & b |(cin&(a^b));cout = (a & b)|(b & cin)|(a & cin);end   endmodule

综合出来的电路:

  • 第三种写法:
module full_add (a,b,cin,sum,cout);  input a,b,cin;       output sum,cout;               reg sum,cout;reg m1,m2,m3;                 always @(a or b or cin)begin{cout,sum} = a + b + cin;endendmodule

综合出来的电路:

2.2 测试文件testbench

`timescale 1ns/10ps
//`include "full_add.v"
module full_add_testbench;        reg    a,b,cin;                   wire   sum,cout;           integer i,j,k;  full_add  full_adder_te(.sum  ( sum ),.cout  ( cout),.a     ( a  ),.b     ( b  ),.cin   ( cin)); initial begina=0;for(i=1;i<16;i=i+1)#20   a=~a;endinitial beginb=0;for(j=1;j<16;j=j+1)#10   b=~b;endinitial begincin=0;for(k=1;k<16;k=k+1)#5   cin=~cin;endinitial begin$monitor($time,,,"%d + %d + %d ={%b,%d}",a,b,cin,cout,sum);#80  $finish;endendmodule
  • 这三种方法的仿真波形都一样,可对比:


3.其实还有很多种加法器,可深入了解



后记

  • 查看往期文章,请点击跳转
    《IC前端数字验证导学》
    《如何学习verilog,如何快速入门?》
    《verilog学习:一个简单的入门verilog例子》
    《verilog学习:使用VCS仿真验证一个全加器》
  • 如需长期追更,可以扫码关注下面这个公众号

verilog学习:加法器相关推荐

  1. Verilog学习之路(8)— 时序电路的设计

    Verilog学习之路(8)- 时序电路的设计 一.前言 时序逻辑电路的输出不仅与当前时刻输入变量的取值有关,而且与电路的原状态,即与过去的输入情况有关. 时序逻辑电路的两个特点: 时序逻辑电路包括组 ...

  2. verilog学习笔记之一--(简化)华莱士(Wallace)树形乘法器设计--(原代码出自用芯学项目)

    verilog学习笔记之一–(简化)华莱士(Wallace)树形乘法器设计–(原代码出自用芯学项目) 学习准备1: 树形乘法器原理:参考<数字集成电路-电路.系统与设计(第二版)>–P43 ...

  3. Verilog学习笔记

    Verilog学习笔记 本文根据学习菜鸟教程下Verilog教程总结得到,主要记载一些硬件语言描述下的骚操作,仅供学习. 归约操作符 归约操作符包括:归约与(&),归约与非( ~ &) ...

  4. Verilog学习笔记-——Verilog模块例化

    Verilog学习笔记---Verilog模块例化 在一个模块中引用另一个模块,对其端口进行相关连接,叫做模块例化.模块例化建立了描述的层次.信号端口可以通过位置或名称关联,端口连接也必须遵循一些规则 ...

  5. 【Verilog学习笔记】D触发器(门级和行为级)+4位寄存器+一个完整的激励程序

    [Verilog学习笔记]D触发器(门级和行为级)+4位寄存器+一个完整的激励程序 首先展示以下完整的程序 `timescale 1ns / 1psmodule hardreg( input wire ...

  6. Verilog学习之路(4)— Verilog HDL的程序设计语句

    Verilog HDL的程序设计语句 一.连续赋值语句 连续赋值语句通常用来描述组合逻辑电路,连续赋值的目标类型主要是标量线网和向量线网两种,标量线网如"wire a,b;",向量 ...

  7. verilog学习:一个简单的入门verilog例子

    前言 之前的文章<如何学习verilog,如何快速入门?>中提到了verilog学习,只想传输一个观点:刚开始学习的时候,建议直接通过视频学习,当您有收获时,再去查阅书籍,把它们当成工具书 ...

  8. verilog学习|《Verilog数字系统设计教程》夏宇闻 第三版思考题答案(第三章)

    <Verilog数字系统设计教程>夏宇闻 第三版思考题 答案合集 : Verilog学习系列 第三部分 1.模块由几个部分组成?   由描述接口和描述逻辑功能两部分组成. 2.端口分为几种 ...

  9. 我的 System Verilog 学习记录(1)

    引言 技多不压身,准备开始学一些 System Verilog 的东西,充实一下自己,这个专栏的博客就记录学习.找资源的一个过程,希望可以给后来者一些借鉴吧,IC找工作的都加把油! 本文是准备先简单介 ...

最新文章

  1. U3D协程Coroutine之WWW与Update()的并行测试
  2. 化工原理 蒸馏(下)
  3. druid监控配置及sql注入防火墙配置
  4. 小鹏汽车自动驾驶内推(社招+校招)
  5. VMware虚拟化/云计算
  6. Android:四大架构的优缺点,你真的了解吗? 1
  7. [bzoj1834][ZJOI2010]network 网络扩容
  8. atitit.api设计 方法 指南 手册 v2 q929.docx
  9. 浮动元素遇到标准流元素 会发生转角遇到爱
  10. dev cpp的常用快捷键
  11. 从制造到智造,用友U9 cloud2022成为制造业专精特新高效增长新引擎
  12. 服务器虚拟化解锁方案,RX 5700乐成刷入RX 5700 XT BIOS:频率、功耗双双解锁
  13. 使用博图V15和KEPServerEX6软件进行OPC Server读取PLC数据仿真(对PLC数据采集和边缘计算程序测试的准备)
  14. leetcode Patching Array
  15. 数据可视化路上——中国地图可视化
  16. 量化交易的相对强弱(RSI )指标计算及策略
  17. APS选型时需要考虑哪些因素?
  18. 【网络安全】Chrome 94 CORS private adress 问题
  19. .Net Core 6.0 + Vue 项目尝试
  20. Win32中改变Edit控件字体颜色

热门文章

  1. 基于Java毕业设计学生综合测评系统源码+系统+mysql+lw文档+部署软件
  2. 《文献笔记》三维血管重建 1-乳房X摄影图像
  3. 百度拼音---基于国内最大搜索引擎百度带来的精确词库打字体验
  4. http访问K8s集群
  5. 【转】将图集切割成单个单个的图片
  6. Cloud Insight让bearychat更好玩!
  7. 100A有源电力滤波器(APF)MATLAB仿真,两种谐波补偿模式:全阶补偿和选阶补偿
  8. YOLOv5在无人机/遥感场景下做旋转目标检测时进行的适应性改建详解(踩坑记录)...
  9. Sky中国War3的旗帜
  10. OCR 图片文字识别图解教程