当前位置:网站首页>加法器—笔记
加法器—笔记
2022-06-28 03:08:00 【江南小作坊】
加法器
- 加法器是完成加法功能的单元,它有两个或三个数据输入端口和两个输出端口。
- 针对二进制的加法运算,如
0+0=0,0+1=1,1+1=0,进位为1。 - 根据输入端口的个数不同,加法器分为半加器和全加器。
半加器
- 两个输入端口,加数与被加数;两个输出端口,进位和结果。
- 常见符号

- 逻辑表达式 F = A ⋅ B ˉ + B ⋅ A ˉ = A ⊕ B F=A\cdot\bar{B}+B\cdot\bar{A}=A\oplus B F=A⋅Bˉ+B⋅Aˉ=A⊕B C o u n t = A ⋅ B Count=A\cdot B Count=A⋅B
- 对应真值表

- 可以发现, F F F与 A . B A.B A.B的关系是异或门, C o u n t Count Count与 A . B A.B A.B的关系是与门。因此一个半加器可以用一个异或门与一个与门构成。

- Verilog描述
module half_adder( input A, input B, output F, output Cout ); assign F = A ^ B; assign Cout = A & B; endmodule - RTL视图

全加器
在半加器的基础上,考虑低位运算的进位,因此全加器有三个输入端口。

逻辑表达式 F = A ⊕ B ⊕ C i n F=A\oplus B\oplus Cin F=A⊕B⊕Cin C o u t = A ⋅ B + C i n ( A ⊕ B ) Cout = A\cdot B+Cin(A\oplus B) Cout=A⋅B+Cin(A⊕B)
对应的真值表

Verilog语法
module full_adder( input A, input B, input Cin, output F, output Cout ); assign F = A^B^Cin; assign Cout = A&B|(Cin&(A^B)); endmoduleRTL视图

另外一种实现全加器,利用两个半加器实现

由于全加器考虑了低位运算的进位,由此我们可以使用级联多个全加器来轻松实现多位数据的加法,如8位数据

采用这种级联方式也叫行波进位加法器,如有进位,就像波纹一样从低位传至高位。这种加法器,由于每一个全加器都需要等待它的前一级全加器的进位输出才能完成计算,因此耗时长、效率低。为了提升加法的时间效率,人们引入了进位选择加法器和超前进位加法器。
HDLBits上面有个有关加法器题目:给出一个16位的加法器add16,设计一个32位加法器。

这个16位加法器,可以通过行波进位的级联方式构成,其内部结构可以先不纠结,就如何构成32位加法器进行理解。
Verilog 实现
module top_module( input [31:0] a, input [31:0] b, output [31:0] sum ): // 定义内部连接线 wire [15:0] a_1, a_2; wire [15:0] b_1, b_2; wire [15:0] sum_1, sum_2; wire cin_1, cin_2, cout_1; // 注意,这里可以看到下面那个进位是没有输出的,所以,可以不定义。 // 将线与端口数据连接起来 assign cin_1 = 0; assign a_1 = a[15:0]; assign a_2 = a[31:16]; assign b_1 = b[15:0]; assign b_2 = b[31:16]; assign sum = { sum_2,sum_1}; // 调用add16模块 add16 add16_inst_1(.a(a_1),.b(b_1),.cin(cin_1),.cout(cout_1)); add16 add16_inst_2(.a(a_2),.b(b_2),.cin(cin_2)); endmodule前面谈到了,对于多位总线数据的加法,如果使用行波进位,具有很长的进位链和关键途经,耗时长,效率低。因此去引进基于行波进位衍生的几种加法器。
进位选择加法器
- 已经学过多路选择器,是否可以加入多路选择器来改善行波进位的效率问题呢?还是以上述为例,给出一个16位的加法器add16,设计一个32位加法器。
- 用进位选择的方式,框图如下

- 使用3个16位加法器:构建两个高16位加法器,一个进位给0,一个进位给1。通过低16位加法器的进位信号去选择输出哪个加法器的值。
- Verilog 实现

- 仿真结果

- 优缺点:
- 高位与低位可以同时运算,降低耗时;
- 电路面积大(如上图,多用一路加法器跟选择器);
边栏推荐
- composition api在项目中的使用总结
- Summary of SQL basic syntax for C #
- Learning - useful resources
- Li Kou daily question - day 29 -575 Divide candy
- Pycharm不同项目之间共用第三方模块
- WebSocket(简单体验版)
- How does the open-ended Hall current sensor help the transformation of DC power distribution?
- 力扣每日一题-第29天-523.在区间范围统计奇数数目
- Typescript union type
- 猴子都会用的圆形滑动自动吸附UI工具
猜你喜欢

数据库系列之MySQL和TiDB中慢日志分析

Custom controls under WPF and adaption of controls in Grid

leetcode:494.数组中添加加减运算符得到指定值的所有方法

leetcode:单调栈结构(进阶)

JVM一:JVM入门以及Class文件认识

A pit filling trip based on LNMP to build a personal website

Dataloader parameter collate_ Use of FN

可扩展数据库(上)

多线程与高并发四:VarHandle与强软弱虚引用和ThreadLocal

数据库系列之MySQL配置F5负载均衡
随机推荐
音频 scipy 中 spectrogram 的运作机制
Go 数据类型篇(四)之浮点型与复数类型
WARN: SQL Error: …
开口式霍尔电流传感器如何助力直流配电改造?
MySQL 数据库的自动备份操作
Research and arrangement of electronic map coordinate system
【PaddleDetection】ModuleNotFoundError: No module named ‘paddle‘
leetcode:单调栈结构(进阶)
一千行 MySQL 学习笔记,值得收藏!
Introduction to kubernetes resource object and common commands
uni-app 如何根据环境自动切换请求的地址
【毕业季】研究生の毕业总结
数据库系列之MySQL和TiDB中慢日志分析
vscode中出现无法在只读编辑器中编辑
解析STEAM教育框架下未来教师研究能力
继承
数据库的迁移
How does the open-ended Hall current sensor help the transformation of DC power distribution?
Excel知识技能汇总
Scalable storage system (I)