当前位置:网站首页>加法器—笔记
加法器—笔记
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 实现

- 仿真结果

- 优缺点:
- 高位与低位可以同时运算,降低耗时;
- 电路面积大(如上图,多用一路加法器跟选择器);
边栏推荐
- 开启创客教育造物学的领域
- 数据库乱码问题
- 友链须知
- A pit filling trip based on LNMP to build a personal website
- 第九章 APP项目测试(3) 测试工具
- 【PaddleDetection】ModuleNotFoundError: No module named ‘paddle‘
- Li Kou daily question - day 29 -1491 Average wage after removing minimum wage and maximum wage
- Is Guotai Junan Securities reliable? Is it safe to open a securities account?
- Li Kou daily question - day 29 -523 Count odd numbers in interval range
- 双亲委派机制的理解学习
猜你喜欢

Tardigrade: Trino's solution to ETL scenarios

Win 10出现bitlocke恢复,蓝屏错误代码0x1600007e

Change of monitoring documents and folders of "operation and maintenance department"

Extensible database (Part 2)

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

音频 scipy 中 spectrogram 的运作机制

以自动化赋能转型,飞鹤乳业加速迈向数字化!

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

工业物联网将取代人工发展吗?

Scalable storage system (I)
随机推荐
力扣每日一题-第29天-1491.去掉最低工资和最高工资后的平均工资
Floating point and complex type of go data type (4)
Execution plan in MySQL of database Series
谈云原生,不得不谈的容器
Chapter IX app project test (3) test tools
数据库系列之MySQL中的分页查询优化
如何修改SE38编辑器主题
Summary of the use of composition API in the project
Go speed
可扩展存储系统(上)
A pit filling trip based on LNMP to build a personal website
Use js programming questions [split] in Niuke
collections. Use of defaultdict()
Huawei equipment WLAN basic service configuration command
小程序image组件不显示图片?
vscode中出现无法在只读编辑器中编辑
密码加密md5和加盐处理
Websocket (simple experience version)
云应用、服务的“5层”架构
资源管理、高可用与自动化(中)