• 加法器


     

    计算机里的加减乘除四则运算,最基本的就是加法运算,其余三种运算都可以通过加法运算来实现。

     

    I. 半加器 (Half Adder)

    考虑一位二进制加法运算,如果不考虑进位的话,我们可以得到如下真值表:

    A,B表示输入,C(Carry)表示进位,S(Sum)表示结果。

    可以得到:

     

    用逻辑门来实现:

    II. 全加器 (Full Adder)

    有了半加器以后我们发现,这种加法器并不能实现多位数的加法,因此诞生了有进位的全加器。和半加器不一样,一个全加器有三个输入(A,B和低位进位)和两个输出(和以及进位输出)。

    列出真值表:

     

     可以得到:

     

     逻辑门实现:

    III. 纹波进位加法器 (Ripple Carry Adder)

    将n个全加器级联起来,就是一个n位的加法器,这就是逐级进位加法器。

    考虑到门电路中的电场状态改变需要时间,如果输入电平发生了变化,那么输出电平需要一段时间后才会响应,当然这段时间很小,小到了纳秒级别。因此,这种加法器有个缺点:每一位的进位输入依赖于上一位的进位输出,只有前一位的进位信号稳定后,这一位的全加器的运算才是有意义的。如果位数n很大的话,整个加法器会变慢,最后会限制CPU主频的提高。

    IV. 超前进位加法器 (Carry-lookahead Adder)

    既然级联一位的加法器算有这样的缺点,那就干脆直接设计一个位数足够大的加法器!

    我们列出2位的全加器的真值表:

     

    我们看到,随着n增大,真值表的行数是指数级别增长的。即使位数仅仅只有2,真值表的行数都达到了32,人工求解布尔表达式变得很困难。但是理论上,这样的全加器的确存在,而且实际上,有一个更优雅的设计方法。

    再次考虑上面讲到的全加器,不再以级联的方式获得进位输入,而是直接根据输入,设计电路得到合适的进位,这样设计出来的加法器叫做超前进位加法器。

     

     

    其中,每一级的进位可以由当前的两个位产生(generate),C_{k_g}=A_kB_k;或者由上一级传递(propagate)的进位 {C_{in}}_k={C_{out}}_{k-1} 和当前输入累加导致的,C_{k_{p}}=A_k+ B_k,因此下一级的进位是C_{k+1}=C_{k_g}+C_{k_p} cdot C_i=A_kB_k+C_k(A_k+B_k)

    因此,得到关于2位超前进位加法器的布尔表达式:

    Y_0=A_0oplus B_0oplus C_0=A_0oplus B_0oplus CY_1=A_1oplus B_1oplus C_1=A_1oplus B_1oplus (C_{0_g}+C_{0_p} cdot C_0 )=A_1oplus B_1oplus (A_0B_0+C(A_0+B_0))Carry=C_2=C_{1_g}+C_{1_p}cdot C_1=A_1B_1+(A_1+B_1)cdot (A_0B_0+C(A_0+B_0))

     

     

     

    考虑到集成电路的面积,成本,功耗,散热等因素,超前进位加法器的位数一般不会过大。一般将几个超前进位加法器(如8位,16位)级联起来,得到位数够宽的加法器。

     

     

    链接:https://www.zhihu.com/question/29707696/answer/114610705
    来源:知乎

  • 相关阅读:
    移动端事件
    移动端的三种布局
    bootstrap自定义——栅格列数修改
    less文件的运行
    lessc的安装
    nodejs的安装
    jquery插件之jquery-ui
    指定网卡进行ping操作
    汇编语言从入门到精通-4标识符和表达式
    汇编语言从入门到精通-3操作数的寻址方式
  • 原文地址:https://www.cnblogs.com/mlgjb/p/8323940.html
Copyright © 2020-2023  润新知