verilog学习:加法器
前言
之前的文章《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学习:加法器相关推荐
- Verilog学习之路(8)— 时序电路的设计
Verilog学习之路(8)- 时序电路的设计 一.前言 时序逻辑电路的输出不仅与当前时刻输入变量的取值有关,而且与电路的原状态,即与过去的输入情况有关. 时序逻辑电路的两个特点: 时序逻辑电路包括组 ...
- verilog学习笔记之一--(简化)华莱士(Wallace)树形乘法器设计--(原代码出自用芯学项目)
verilog学习笔记之一–(简化)华莱士(Wallace)树形乘法器设计–(原代码出自用芯学项目) 学习准备1: 树形乘法器原理:参考<数字集成电路-电路.系统与设计(第二版)>–P43 ...
- Verilog学习笔记
Verilog学习笔记 本文根据学习菜鸟教程下Verilog教程总结得到,主要记载一些硬件语言描述下的骚操作,仅供学习. 归约操作符 归约操作符包括:归约与(&),归约与非( ~ &) ...
- Verilog学习笔记-——Verilog模块例化
Verilog学习笔记---Verilog模块例化 在一个模块中引用另一个模块,对其端口进行相关连接,叫做模块例化.模块例化建立了描述的层次.信号端口可以通过位置或名称关联,端口连接也必须遵循一些规则 ...
- 【Verilog学习笔记】D触发器(门级和行为级)+4位寄存器+一个完整的激励程序
[Verilog学习笔记]D触发器(门级和行为级)+4位寄存器+一个完整的激励程序 首先展示以下完整的程序 `timescale 1ns / 1psmodule hardreg( input wire ...
- Verilog学习之路(4)— Verilog HDL的程序设计语句
Verilog HDL的程序设计语句 一.连续赋值语句 连续赋值语句通常用来描述组合逻辑电路,连续赋值的目标类型主要是标量线网和向量线网两种,标量线网如"wire a,b;",向量 ...
- verilog学习:一个简单的入门verilog例子
前言 之前的文章<如何学习verilog,如何快速入门?>中提到了verilog学习,只想传输一个观点:刚开始学习的时候,建议直接通过视频学习,当您有收获时,再去查阅书籍,把它们当成工具书 ...
- verilog学习|《Verilog数字系统设计教程》夏宇闻 第三版思考题答案(第三章)
<Verilog数字系统设计教程>夏宇闻 第三版思考题 答案合集 : Verilog学习系列 第三部分 1.模块由几个部分组成? 由描述接口和描述逻辑功能两部分组成. 2.端口分为几种 ...
- 我的 System Verilog 学习记录(1)
引言 技多不压身,准备开始学一些 System Verilog 的东西,充实一下自己,这个专栏的博客就记录学习.找资源的一个过程,希望可以给后来者一些借鉴吧,IC找工作的都加把油! 本文是准备先简单介 ...
最新文章
- U3D协程Coroutine之WWW与Update()的并行测试
- 化工原理 蒸馏(下)
- druid监控配置及sql注入防火墙配置
- 小鹏汽车自动驾驶内推(社招+校招)
- VMware虚拟化/云计算
- Android:四大架构的优缺点,你真的了解吗? 1
- [bzoj1834][ZJOI2010]network 网络扩容
- atitit.api设计 方法 指南 手册 v2 q929.docx
- 浮动元素遇到标准流元素 会发生转角遇到爱
- dev cpp的常用快捷键
- 从制造到智造,用友U9 cloud2022成为制造业专精特新高效增长新引擎
- 服务器虚拟化解锁方案,RX 5700乐成刷入RX 5700 XT BIOS:频率、功耗双双解锁
- 使用博图V15和KEPServerEX6软件进行OPC Server读取PLC数据仿真(对PLC数据采集和边缘计算程序测试的准备)
- leetcode Patching Array
- 数据可视化路上——中国地图可视化
- 量化交易的相对强弱(RSI )指标计算及策略
- APS选型时需要考虑哪些因素?
- 【网络安全】Chrome 94 CORS private adress 问题
- .Net Core 6.0 + Vue 项目尝试
- Win32中改变Edit控件字体颜色
热门文章
- 基于Java毕业设计学生综合测评系统源码+系统+mysql+lw文档+部署软件
- 《文献笔记》三维血管重建 1-乳房X摄影图像
- 百度拼音---基于国内最大搜索引擎百度带来的精确词库打字体验
- http访问K8s集群
- 【转】将图集切割成单个单个的图片
- Cloud Insight让bearychat更好玩!
- 100A有源电力滤波器(APF)MATLAB仿真,两种谐波补偿模式:全阶补偿和选阶补偿
- YOLOv5在无人机/遥感场景下做旋转目标检测时进行的适应性改建详解(踩坑记录)...
- Sky中国War3的旗帜
- OCR 图片文字识别图解教程