• 加法器—笔记


    加法器

    • 加法器是完成加法功能的单元,它有两个或三个数据输入端口和两个输出端口。
    • 针对二进制的加法运算,如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=ABˉ+BAˉ=AB C o u n t = A ⋅ B Count=A\cdot B Count=AB
    • 对应真值表
      在这里插入图片描述
    • 可以发现, 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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
    • RTL视图
      在这里插入图片描述

    全加器

    • 在半加器的基础上,考虑低位运算的进位,因此全加器有三个输入端口。
      在这里插入图片描述

    • 逻辑表达式 F = A ⊕ B ⊕ C i n F=A\oplus B\oplus Cin F=ABCin C o u t = A ⋅ B + C i n ( A ⊕ B ) Cout = A\cdot B+Cin(A\oplus B) Cout=AB+Cin(AB)

    • 对应的真值表
      在这里插入图片描述

    • 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));
      
      endmodule
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
    • RTL视图
      在这里插入图片描述

    • 另外一种实现全加器,利用两个半加器实现
      在这里插入图片描述

    • 由于全加器考虑了低位运算的进位,由此我们可以使用级联多个全加器来轻松实现多位数据的加法,如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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
    • 前面谈到了,对于多位总线数据的加法,如果使用行波进位,具有很长的进位链和关键途经,耗时长,效率低。因此去引进基于行波进位衍生的几种加法器。

    进位选择加法器

    • 已经学过多路选择器,是否可以加入多路选择器来改善行波进位的效率问题呢?还是以上述为例,给出一个16位的加法器add16,设计一个32位加法器。
    • 用进位选择的方式,框图如下
      在这里插入图片描述
    • 使用3个16位加法器:构建两个高16位加法器,一个进位给0,一个进位给1。通过低16位加法器的进位信号去选择输出哪个加法器的值。
    • Verilog 实现
      在这里插入图片描述
    • 仿真结果
      在这里插入图片描述
    • 优缺点:
      • 高位与低位可以同时运算,降低耗时;
      • 电路面积大(如上图,多用一路加法器跟选择器);
  • 相关阅读:
    SCConv:用于特征冗余的空间和通道重构卷积
    MCE | 磁珠 VS 琼脂糖珠
    Fiddle日常运用手册(3)-对移动端产品进行数据接口抓包
    Mybatis中${}和#{}的区别
    如何使用国际腾讯云服务器进行外网访问?
    量化交易入门教程
    ES&elasticsearch-header菜鸟教程06--模糊查询
    二十三种设计模式全面解析-装饰器模式-超越继承的灵活装扮
    博日科技招股书失效,中金公司已停止对其辅导,放弃港交所上市?
    《HelloGitHub》第 90 期
  • 原文地址:https://blog.csdn.net/Cherish1ove/article/details/125433341