累加器
复习
- ALU 能完成一次加法
- 寄存器能在时钟边沿保存多位结果
- 把寄存器输出接回 ALU,旧结果就能参与下一轮
TL;DR
- 累加器保存当前结果,让多步加法连续进行
- 时序逻辑的输出同时取决于当前输入和过去状态
- 组合逻辑负责计算,寄存器负责把结果留到下一拍
正文
来完成前面一直做不到的计算:
2 + 3 + 4
我们准备一个寄存器保存“到目前为止的和”,把它接到 ALU 的 A 端。新的加数接到 B 端,ALU 输出再绕回寄存器输入:
┌──────────┐
新加数 ─────>│ B 结果├────┐
│ ALU │ │
┌───>│ A │ │
│ └──────────┘ │
│ ▼
└───────────────[寄存器]
这个专门保存当前总和的寄存器,叫作累加器。
三拍算完
先把累加器清成 0,每拍送进一个数:
| 时钟边沿 | 新加数 | ALU 计算 | 边沿后的累加器 |
|---|---|---|---|
| 第 1 拍 | 2 | 0 + 2 | 2 |
| 第 2 拍 | 3 | 2 + 3 | 5 |
| 第 3 拍 | 4 | 5 + 4 | 9 |
每个周期里,累加器稳定地提供旧结果,ALU 计算新结果;到下一个边沿,累加器再收下它。旧结果不会在半路消失,新结果也不会在同一拍反复绕圈。
过去开始影响现在
同样输入一个 3,累加器原来是 2,结果得到 5;原来是 7,结果就得到 10。输出不再只看当前输入,还要看寄存器保存的过去。
这种电路叫作时序逻辑电路。半加器和 ALU 则属于组合逻辑:输入相同,输出就相同,不记得上一拍发生过什么。
还差一个自动指挥者
累加器已经能保存中间结果,但目前仍有人在每一拍更换加数。若想让机器自己完成“检查、累加、移位、继续”,它还要记住当前走到了哪一步,并自动决定下一步。
下一章,我们让机器把步骤也存进寄存器。
思考题
为什么只把 ALU 的输出接回输入还不够,必须在反馈路径中加入寄存器?
小结
知识点
- 累加器保存并反馈当前运算结果
- 时序逻辑会受到过去状态影响
- 寄存器让反馈结果只在时钟边沿更新
思考题答案(仅供参考)
如果没有寄存器,ALU 的新输出会立刻绕回输入,再次改变输出,信号可能在同一个周期里不断变化。寄存器把结果锁到下一个时钟边沿,才把连续运算分成清楚的一步一步。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪