1)引子
上一集,我们讨论了如何用二进制表示数字。像 00101010 是十进制的 42。表示和存储数字是计算机的一项重要功能,但真正的目标是以结构化和有目的的方式计算或操作数字,例如将两个数字相加。这些操作由计算机的算术和逻辑单元处理,但大多数人用它的简写来称呼它:ALU。 ALU 是计算机的数学大脑。当您了解 ALU 的设计和功能时,您就会了解现代计算机的基本组成部分。它是在计算机中完成所有计算的东西。所以基本上,一切都使用它。
不过,首先,看看这个美丽。这可能是有史以来最著名的 ALU:英特尔 74181。当它于 1970 年发布时,它是第一个完全安装在单个芯片中的完整 ALU,这在当时是一项巨大的工程壮举。所以今天我们将利用上周学到的那些出色的逻辑门来构建一个简单的 ALU 电路,其功能与 74181 的大部分功能相同。在接下来的几集中,我们将使用它从头开始构建计算机,所以它会变得有点复杂,但我认为你们可以搞定。
(2)ALU概述
ALU 实际上是两个单元合二为一。有一个算术单元和一个逻辑单元。让我们从算术单元开始,它负责处理计算机中的所有数值运算,例如加法和减法。它还做一些其他简单的事情,比如给一个数加 1,这被称为增量操作,但我们稍后会讨论这些。
今天我们将专注于一切的根本,即运算的精华,它构成计算机所做的几乎所有其他事情:将两个数字相加。我们可以完全用单个晶体管来构建这个电路,但这会很快变得混乱。因此,正如我们在第三集中讨论的那样,我们可以使用更高级别的抽象,并用逻辑门构建我们的组件。 AND、OR、NOT 和 XOR 门。
(3)从逻辑门到半加器
我们可以构建的最简单的加法电路将两个二进制数字相加。因此,我们有两个输入,A 和 B,以及一个输出,即这两位数字的和。澄清一下,A、B 和输出都是单个位。只有四种可能的输入组合。前三个是:
0 0 = 0
1 0 = 1
0 1 = 1
请记住,在二进制中,1 与真相同,0 与假相同。所以这组输入与 XOR 门的布尔逻辑完全匹配,我们可以将它用作我们的 1 位加法器。但是第四个输入组合 1 1 是一个特例。 1 1 显然是2,但二进制中没有 2 。所以当我们谈到上一集时,结果是 0,而 1 被带到下一列。所以总和实际上是二进制的 10。现在,我们的 XOR 门的输出是部分正确的。 1 1 输出 0,但我们需要一个额外的输出线用于该进位。进位位仅在输入为 1 和 1 时为真,因为这是结果大于一位可以存储的唯一时间。方便的是,我们有一个门:一个与门,只有当两个输入都为真时才为真。所以我们也会把它添加到我们的电路中。就是这样!该电路称为半加器。没那么复杂,只有两个逻辑门。但是让我们抽象出这种级别的细节,并将我们几乎铸造的半加器封装为它自己的组件,具有两个输入,位 A 和 B,以及两个输出,SUM 和 CARRY 位。
这将我们带到了另一个抽象层次......我觉得我已经说了很多,我想知道这是否会成为梗?
从逻辑门到半加器(因为只有后一级进位的输出,没有前一级进位的输入,称之为半)
(4)从半加器到全加器
无论如何,如果你想加 1 1 以上(比如5 3,101 011),我们将需要一个全加器。那个半加法器给我们留下了一个进位作为输出,这意味着当我们在多列加法中移动到下一列时,之后的每一列,我们将不得不将三个位加在一起,而不是两个。
全位加法器更复杂。它需要三个位作为输入,A、B 和 C,所以最大可能的输入是 1 1 1,等于 1 进位 1。所以我们仍然只需要两条输出线,SUM 和 CARRY。
我们可以使用半加器构建一个全加器。为此,我们使用半加器将 A B 相加,就像以前一样,然后将结果提供给第二个半加器并将 C 输入。最后,我们需要一个或门来检查是否有一个进位位为真。而已!我们刚刚做了一个全加器!同样,我们可以提升一个抽象级别,并将这个全加器包装为它自己的组件。它需要三个输入,将它们相加,然后输出 SUM 和 CARRY(如果有)。
A B后,在本位的结果和C-in继续相加,得到本位的Sum;进位,要么是A B直接造成的,要么是A B没有进位但是A B的本位结果和C-in相加后进位
(5)从全加器到加法器
有了我们的新组件,我们现在可以构建一个电路,该电路需要两个 8 位数字,我们称它们为 A 和 B,然后将它们相加。让我们从 A 和 B 的第一个位开始,我们将其称为 A0 和 B0。此时,没有要处理的进位位,因为这是我们的第一个加法。所以我们可以使用我们的半加器将这两个位加在一起。输出为 SUM0。现在我们要将 A1 和 B1 相加。之前的A0和B0相加可能有进位,所以这次我们需要使用一个也输入进位位的全加器。我们将此结果输出为 SUM1。然后,我们从这个全加器中取出任何进位,并将其运行到下一个处理 A2 和 B2 的全加器中。我们只是在一个大链中继续这样做,所以所有 8 位都已添加。注意进位位是如何向前波动到每个后续加法器的。因此,这称为 8 位纹波进位加法器。注意我们最后一个全加器是如何进行进位的。如果第 9 位有进位,则表示两个数之和太大,无法放入 8 位。这称为溢出。通常,当加法的结果太大而无法用您使用的位数表示时,就会发生溢出。这通常会导致错误和意外行为。
全加器组成加法器
众所周知,最初的吃豆人街机游戏使用 8 位来跟踪您所处的级别。这意味着,如果您通过第 255 级(8 位中可存储的最大数字)到达第 256 级,则 ALU 溢出。这导致了一系列错误和故障,使关卡无与伦比。该错误成为最伟大的吃豆人玩家的特权。所以如果我们想避免溢出,我们可以用更多的全加器扩展我们的电路,允许我们添加 16 或 32 位数字。这使得溢出不太可能发生,但代价是更多的门。另一个缺点是每个进位需要一点时间才能向前波动。诚然,时间不多。电子移动得非常快,所以我们谈论的是十亿分之一秒,但这足以对当今的快速计算机产生影响。出于这个原因,现代计算机使用一种略有不同的加法电路,称为进位前瞻加法器,它速度更快,但最终做的是完全相同的事情:将二进制数相加。
(6)加法器可以完成加、减、乘、除
ALU 的算术单元也有其他数学运算的电路,一般来说,这八种运算总是被支持的(加法、带进位加法、减法、带借位的减法、取相反数、加1、减1)。和我们的加法器一样,这些其他操作是由单独的逻辑门构建的。有趣的是,您可能已经注意到没有乘法和除法运算。那是因为简单的 ALU 没有用于此的电路,而只是执行一系列加法。假设您想将 12 乘以 5。这与将 12 加 5 次是一样的。所以需要五次通过 ALU 来完成这个乘法。很多简单的处理器,比如恒温器、电视遥控器和微波炉中的处理器,就是这样做的。它很慢,但它完成了工作。然而,更高级的处理器,如笔记本电脑或智能手机中的处理器,具有带有专用乘法电路的算术单元,正如您所料,该电路比加法更复杂。这并不神奇,它只需要更多的逻辑门,这就是为什么较便宜的处理器没有此功能的原因。
【扩充】减法是将减数进行补码运算(取反后加1)后,进入加法器。补码及其运算,在前面第4节有介绍。除法用减法实现。
(7)ALU的逻辑单元 (测试0电路)
好的,让我们继续讨论 ALU 的另一半,即逻辑单元。逻辑单元执行的不是算术运算,而是我们之前讨论过的逻辑运算,例如 AND、OR 和 NOT。它还执行简单的数值测试,例如检查数字是否为负数。例如,这是一个测试 ALU 的输出是否为零的电路。它使用一堆 OR 门来查看是否有任何位为 1。即使单个位为 1,我们也知道该数字不能为零,然后我们使用最终的非门来翻转此输入,因此仅当输入数为 0 时,输出才为 1。
(8)ALU的总结(74181的描述)
以上是对 ALU 构成的高级概述。我们甚至从头开始构建了几个主要组件,比如我们的波纹加法器,你会看到它只是一大堆以巧妙方式连接的逻辑门。这让我们回到了你在剧集开始时非常欣赏的 ALU,英特尔 74181。与我们今天制造的 8 位 ALU 不同,74181 只能处理 4 位输入,这意味着你构建的 ALU 大约是它的两倍和那个超级有名的一样好!用你的头脑!嗯,有点。我们没有建造整个东西,但你明白了。 74181 使用了大约 70 个逻辑门,它不能进行乘法或除法运算,但它在小型化方面向前迈出了一大步 ,为功能更强大、价格更便宜的计算机打开了大门。这个 4 位 ALU 电路已经很复杂了,但是我们的 8 位 ALU 需要数百个逻辑门才能完全构建,工程师在使用 ALU 时不希望看到所有的复杂性。所以他们想出了一个特殊的符号来把它包起来,看起来像一个大 V。只是另一个层次的抽象!
74181的电路图:2个操作数A、B;M用来代表进行数学运算还是逻辑运算;S用来选择哪一种数学/逻辑运算
74181在M、S、控制下对A、B进行不同的运算
74181的DIP封装拆解,注意中心的Die
The 74181 die measures 0.1 inches and has a density of about 200 components per one-tenth of an inch,看到的是74181的金属层
Ken removed the unique metal layer of the SN74181 and showed that the layout of the die largely matches the gate-diagram of the datasheet.
我们的 8 位 ALU 有两个输入,A 和 B,每个输入 8 位。我们还需要一种方法来指定 ALU 应该执行什么操作,加法或减法。为此,我们使用 4 位操作码,我们将在后面的章节中详细讨论这个,但简而言之,1000 可能是加法命令,而 1100 是减法命令。基本上,操作码告诉 ALU 执行什么操作。对输入 A 和 B 进行该操作的结果是一个 8 位输出。 ALU 还输出一系列标志,这些标志是特定状态和状态的 1 位输出。例如,如果我们减去两个数字并且结果为 0,则我们的 0 测试电路(我们之前制作的电路)将零标志设置为真。如果我们试图确定两个数字是否相等,这很有用。如果我们想测试 A 是否小于 B,我们可以使用 ALU 计算 A 减去 B 并查看负标志是否设置为真。如果是,我们就知道 A 比 B 小。最后,我们构建的加法器上的进位也连接了一根电线。所以如果有溢出,我们会知道的。这称为溢出标志。更高级的 ALU 会有更多的标志,但这三个标志是通用的并且经常使用。
,