ALU


ALU

什么是 ALU

算术逻辑单元(Arithmetic&logical Unit)是中央处理器(CPU)的执行单元,是所有中央处理器的核心组成部分。

宏观上比喻,就是一个能做整数加减法的计算器。注意,这里有两个限制,一是整数,二是只能做加减法(当然,本质上,减法也是一种加法)。那怎么做乘除运算呢?答案就是,不断地加(或减)。那这样不是很耗时间?对的,为此,可以做出更昂贵的部件(更多的逻辑门)实现乘除运算,当然,这不在本章的讨论范围内。

ALU 的加法功能怎么实现的?

首先,我们来讨论最简单的只有 1 位二进制加法运算。这种运算只有四种可能:0 + 0 = 0,0 + 1 = 1,1 + 0 = 1,1 + 1 = 10。

可以发现,这和异或运算很相像,至少前三个都对了,而第四个也对了一半(1 ⊕ 1 = 0)。所以只要对异或的逻辑门(Logic Gate)进行一定改造,即可满足只有 1 位二进制加法运算。
ALU
对于1 + 1 = 10,我们需要进位(英语中进位称为 carry)。因为只有 1 & 1 等于 1,因此我们可以增加一个"And Gate"(与门)来实现进位。这样,我们就有了两个输出位,如下图,CARRY 和 SUM。

ALU
我们对这个特殊的逻辑电路进行一次抽象,称之为半加器(Half Adder)【给定两个输入,给出两个输出】。

显然,半加器最多位运算是 1 + 1,如果我们要实现更多位的运算呢?如 1 + 1 + 1。我们可以使用多个半加器。如下图,将一个半加器的输出结果作为另一个半加器的输入结果。【注意,下图中最左的 C 为一个新的输入的数,而半加器右上角的 C 为 Carry 位的数。】

比如说 A = 1,B = 1,C = 1,则经过第一个半加器,C = 1,S = 0。

接着,第二个半加器的 A = S = 0,B = C = 1,S = 1,C = 0。

最终的 CARRY 位为 1 OR 0 = 1,SUM = S = 1。由此最终结果为 11。

ALU
我们对上面这个特殊的逻辑电路进行一次抽象,称之为全加器(Full Adder)【给定三个输入,给出两个输出】。

现在,我们有了半加器和全加器,我们可以做一些很酷的事情了,比如 8 位加法器。

比如计算:A0A1A2A3A4A5A6A7+B0B1B2B3B4B5B6B7A_{0}A_{1}A_{2}A_{3}A_{4}A_{5}A_{6}A_{7} + B_{0}B_{1}B_{2}B_{3}B_{4}B_{5}B_{6}B_{7}

实现的逻辑电路如下:
ALU
如果第 9 位有进位,如 11111111 + 00000001 = 100000000。这将意味着容纳不下新的位数(8 个座位怎么坐 9 个人呢),由此部分数据遭到丢失,这称之为“溢出(Overflow)”。

如果想避免溢出,需要增加更多的全加器,当然,这需要更多代价,金钱和时间(因为进位需要时间)。

对于上面这个 8 位加法器,我们可以再进行一次抽象(这样我们可以专注于怎么思考,而不是怎么实现),用一个大 V 表示,如下图:

ALU
除了有 INPUT、OPERATION CODE、OUTPUT,我们还可以设置一个标志位(FLAG),这很有用,比如 OVERFLOW 可以知道本次运算是否溢出,ZERO 为 TRUE,则表示参与运算的两数相等,NEGATIVE 可以比较参与运算的两个数的大小。

高级的 ALU 可以有更多的标志位,上面的三个标志是普遍使用的。