ALU

文章目录

        • 什么是 ALU
        • ALU 的加法功能怎么实现的?
        • 锁存器
          • 怎么储存 1
          • 怎么储存 0
          • 既能储存 1,也能储存 0

什么是 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 + 1 = 10,我们需要进位(英语中进位称为 carry)。因为只有 1 & 1 等于 1,因此我们可以增加一个"And Gate"(与门)来实现进位。这样,我们就有了两个输出位,如下图,CARRY 和 SUM。

ALU_第2张图片
我们对这个特殊的逻辑电路进行一次抽象,称之为半加器(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_第3张图片
我们对上面这个特殊的逻辑电路进行一次抽象,称之为全加器(Full Adder)【给定三个输入,给出两个输出】。

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

比如计算: A 7 A 6 A 5 A 4 A 3 A 2 A 1 A 0 + B 7 B 6 B 5 B 4 B 3 B 2 B 1 B 0 A_{7}A_{6}A_{5}A_{4}A_{3}A_{2}A_{1}A_{0} + B_{7}B_{6}B_{5}B_{4}B_{3}B_{2}B_{1}B_{0} A7A6A5A4A3A2A1A0+B7B6B5B4B3B2B1B0

首先取 A 0 A_0 A0 B 0 B_0 B0,用一个半加器相加,拿到SUM位和CARRY位,保存SUM位,用CARRY位和 A 1 A_1 A1 B 1 B_1 B1相加,因为这里有三个输入,所以用到了全加器。以此类推。

实现的逻辑电路如下:

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

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

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


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

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

锁存器

我们想办法在通电的情况下,永久保存 1 位 数据(0 或 1)。

怎么储存 1

事实上,1 的储存通过下图实现,即:一个OR门,再将OR门的输出作为一边的输入。
ALU_第4张图片
比如说,一开始 A = 0,B = 0,则 OUTPUT = 0,
若 A = 1,B = 0,则 OUTPUT = 1;B = OUTPUT = 1;
此时,无论 A 为 0 或 1,B = 1,则最终输出 1;
即我们储存了 1。当然,前提是通电。

怎么储存 0

同理,通过AND门实现 0 的储存。自行推导。
ALU_第5张图片

既能储存 1,也能储存 0

为了做出有用的储存(既能储存 1,也能储存 0),我们把上面的两个电路结合起来。如下,这种电路叫“AND-OR 锁存器”。
ALU_第6张图片
该电路有两个输入线(SET 线和 RESET 线)。

  • RESET = 1 时,显然,不记录 SET 的值。无论 SET 值如何,电路始终输出 0。即储存了 0.

  • RESET = 0,SET = 1 时,电路输出 1。这时候,若 RESET = 0,SET = 0,电路输出仍为 1,即输出了上次 SET 的值!即该电路有记忆能力,成功储存了 1 bit 数据!

你可能感兴趣的:(Hardware)