好了,之前讲的运算都是基于齿轮等物理硬件而实现的,现在开始讲基于逻辑门的算术运算!
算术逻辑单元 ALU
算术逻辑单元(arithmetic and logic unit) 是能实现多组算术运算和逻辑运算的组合逻辑电路,简称ALU。
英特尔 74181:第一个封装在单个芯片内的完整ALU,只能处理4位输入。
ALU组成 1个算术单元和1个逻辑单元
算术单元
负责计算机里的所有数字操作。
基于逻辑门的算术单元:我们可以用上一P学习到的用晶体管实现两个数的相加,但是涉及到多个数相加的情况时,必然需要更多的晶体管,此时电路复杂性增加,因此我们最终采用逻辑门来抽象实现加法等算术运算。
半加器:
对于单个异或门的半加器来说,除了1 + 1 的结果无法体现进位之外,其他情况结果正确,因此我们需要添加额外的输出CARRY作为“进位”。
这里的与门只考虑是否进位,也就是当两个输入都为1时,输出1,其他情况为0。
全加器:如果运算超过1 + 1,即类似1 + 1 + 1(为什么不是10 + 1 或 1 + 10呢?因为每一个输入端都是一个字节,意味每一个输入端只能是1 或者 0,而不可能是10)这种超过两个数的情况时,就需要采用全加器来实现算术运算(注意:全加器只适用3个数相加)
8位行波进位加法器:
可以看到,A0 + B0采用半加器独立组件,而之后的独立组件都采用全加器,这是因为在运算A0 + B0 时没有上一步的进位作为第三输入端,所以采用半加器就足够了。
溢出:最后全加器的进位carry必须满足恒为0,如果为1则说明运算结果超出8位,发生溢出现象,这会导致错误和不可预期的结果。
解决溢出:添加更多的全加器,使得最终结果大于8位即可,但电路的复杂性和进位耗费的时间会因此增加。
超前进位加法器 现代计算机用的加法器:超前进位加法器(carry look ahead adder)是对普通的全加器进行改良而设计成的并行加法器,主要是针对普通全加器串联时互相进位产生的延迟进行了改良。超前进位加法器是通过增加了一个不是十分复杂的逻辑电路来做到这点的。
逻辑单元
负责实现单个或多个数值的逻辑判断,比如:A是否为0,A是否大于B,A是否小于B等。
行波进位加法器:串行进位,高位的运行要等待低位的进位传到。不同于并行进位如选择进位或超前进位等等。
8位ALU:
上面的输入端 INPUT:A和B,皆为8个字节;
左边的操作代码 OPERATION CODE:指示ALU执行4个字节数值对应的命令代码,比如1000 = ADD,1100 = SUBTRACT;
下面的输出 OUTPUT:一个输出端,8个字节;
右边的标志 FLAG:1个字节
(1)OVERFLOW:溢出标志,通过对两个数执行加法运算,判断最后一个全加器的进位端是否为1,若为1,则表示溢出;
(2)ZERO:0标志,运用上面提及到的A是否为0的逻辑电路,判断某一个数是否为0;
(3)NEGATIVE:比较标志,对A与B进行减法运算,通过对结果和0进行比较,输出A与B的大小关系,若为1,则A < B。