算术逻辑单元
复习
- 有符号数与原码:原码用符号位表示正负;反码需要回卷进位参与运算,且仍有两个零
- 补码:补码是反码加 1,能统一加减法且只有一个零
- 减法器:减法器复用加法器,把减数取反再加一
TL;DR
- ALU 把常用算术和逻辑电路装进同一个盒子
- 控制码决定 ALU 此刻做哪一种运算
- ALU 只负责算,不负责保存结果
正文
桌面上的电路越来越多了:这边是加减法器,那边是与门、或门和异或门。每换一种运算都要重新接线,这和早期计算机“换一道题就重插一次线缆”有什么分别?
好在,这些电路有一个共同点:它们都拿同样的输入 A、B,也都吐出一个结果。既然如此,为什么不把它们并排接在一起,再用一个多路选择器,挑其中一个结果送出去?
- 忘记了多路选择器?请返回《常见复杂逻辑门》
这个把许多运算装在一起的大盒子,就是 算术逻辑单元,简称 ALU(Arithmetic Logic Unit)。
给运算编号
假设我们的极简 ALU 先支持四种运算,那么用两位控制码就够了:
| 控制码 | 运算 | 输出 |
|---|---|---|
00 | 加法 | A + B |
01 | 减法 | A - B |
10 | 按位与 | A AND B |
11 | 按位或 | A OR B |
思考题 1
若 ALU 想支持 8 种运算,控制码至少需要几位?为什么?
注意:盒子里所有电路 同时 在进行计算。加法器、减法器、与门、或门各自都得到了自己的答案。出口处的多路选择器,只放行我们此刻想要的那一个。这就像四条流水线一起运转,最后用一个道岔决定让哪条线的成品出来。
控制码从哪来?机器可以自己给出,但目前的话,为了避免把我们自己绕晕了,我们还是人工吧,后面可以让它自动化。
不过注意,这里提到了“控制码”的概念,它是一种控制信号。所以,我们已经在逐渐开始接触“控制单元”了,它也是一种信号,只是不参与运算。
- 忘记了控制单元?请返回最最开始的《计算机的构成》
举个例子
令 A = 0101(5)、B = 0011(3),看看控制码一变,出口的答案怎么跟着变:
| 控制码 | 运算过程 | 输出 |
|---|---|---|
00 | 5 + 3 | 1000 |
01 | 5 - 3 | 0010 |
10 | 0101 AND 0011 | 0001 |
11 | 0101 OR 0011 | 0111 |
A 和 B 从头到尾没有变,只是控制码换了,出口的答案就跟着换。这是我们第一次造出一个真正“可选功能”的部件。
虽然很简陋,但这是一个巨大的成功:机器从“只会做一件事”迈向了“听命令做事”。
思考题 2
盒子里所有电路都在同时运算,这是不是浪费?如果只想省电,有没有办法让没被选中的电路也停下来?
ALU 不会记事
这里要特别留意一件事:输入一撤走,输出也会随之消失。
ALU 像草稿纸上的心算,算得快,却不会把刚才的结果记下来。你让它算 2 + 3,它给你 5;可你一转手去算别的,那个 5 就没了。想算 2 + 3 + 4,中间的结果 5 无处安放。
这是典型的 组合逻辑:输出只取决于此刻的输入,与“过去”无关。没有一点点关系的那种,算完了转头就忘。
而且有时结果本身不够——结果是不是 0、结果是不是负数等等。
听起来很傻,结果我们不会自己看吗?
那下面这两种情况呢?
- 无符号数相加减,有没有产生进位或借位。
- 有符号数相加减,有没有发生位数不够导致溢出的情况。
这些我们就完全无从得知了,要得知可能还得自己手算一遍。但这些情况以后都会影响机器下一步该做什么。所以 ALU 还需要多“说”几句,把自己的判断一并报出来。
下一章,我们给 ALU 装几盏小小的指示灯。
小结
知识点
- ALU 将多种运算封装成一个部件
- 控制码与多路选择器决定输出哪种结果
- ALU 是组合逻辑,本身不保存结果
- 运算可以并行进行,再由选择器挑出结果
参考资料
- Wikipedia(zh):算术逻辑单元:ALU 的功能与结构
- Wikipedia(zh):多路复用器:用选择信号从多路输入中挑一路
思考题答案(仅供参考)
思考题 1
至少需要 3 位。因为 3 位控制码有 2³ = 8 种组合,刚好能为 8 种运算各分配一个编号。每多一位控制码,可表示的运算种类就翻一倍。
思考题 2
确实有浪费:没被选中的那些电路也在耗电。
想省电,可以在每路运算的出口再串一个“使能开关”(本质上还是与门),只让被选中的那一路真正输出、翻转,其余保持安静。这既省电,也避免了多路结果同时挤上输出线。不过代价是电路更复杂,所以简单的时候可以不管它。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪