上一集,我们谈论了如何用二进制表示数字。像 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 会有更多的标志,但这三个标志是通用的并且常常利用。