寄存器
复习
- 让电路记住一个比特:用交叉耦合的反馈做出能保存一个比特的锁存器
- 给电路一个共同节拍:用时钟统一各部件交接数据的时机
- 触发器:触发器在时钟边沿保存一个比特,避免锁存器跟随输入
TL;DR
- 多只触发器共用一个时钟,就组成一个寄存器
- 8 位寄存器可以保存一个 8 位数
- 写使能决定本次时钟边沿要写入还是继续保持
正文
一只触发器只能记 0 或 1。可我们想记住 ALU 算出的 00101101,一只怎么够?
答案很朴素:既然一位不够,那就排成一队。
八只一起拍照
把 8 只 D 触发器并排,让它们共用同一根时钟线。时钟上升沿到来时,每只触发器各自收下自己那一位:
D7 D6 D5 D4 D3 D2 D1 D0
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
[触发器 × 8] ← 同一个时钟
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0
这组排好队的触发器,就叫作寄存器(register)。8 只保存 8 位,32 只保存 32 位。
这里的关键词是“共用”:所有位必须在同一个时钟边沿一起更新。 要是各自为政,一个数就可能一半是刚写进来的新值、一半还是上一拍的旧值,变成一个谁也不认识的杂种数字。
不是每一拍都要改
如果每次时钟上升沿都无条件写入,寄存器里的值会被入口不断覆盖,根本存不住东西。所以还得再给它加一根写使能线 LOAD:
LOAD = 1:本次边沿收下新的 DLOAD = 0:本次边沿继续保存旧的 Q
实现方法仍然是那位老朋友——多路选择器。它在“新输入 D”和“旧输出 Q”之间二选一,把胜者送进触发器。这和前面加法器用多路选择器切换功能,是同一个套路。在计算机里,没有什么问题是一层选择加一层解决不了的。
离 ALU 最近的记事本
寄存器很快,因为它直接由触发器拼成,只在边沿动作;代价是每一位都要花掉不少电路。因此,寄存器适合暂存眼前马上就要用的数据,而不是保存成千上万份文件——那是后面存储器要操心的规模问题。
但对眼下的问题,它已经足够了。只要把一个寄存器接到 ALU 的输出,再把寄存器的输出绕回 ALU 的输入,运算结果就能在下一拍继续参与运算。
下一章,我们终于让 2 + 3 + 4 不靠人重新抄写中间结果,自己一步步算完。
思考题 1
寄存器里原来是
0101。下一次上升沿到来时输入为1010,但LOAD = 0。边沿之后寄存器保存什么?
思考题 2
为什么寄存器必须让所有位“共用一个时钟”?如果每一位各用各的时钟,会出什么问题?
小结
知识点
- 多只触发器并排组成多位寄存器
- 所有位必须在同一时钟边沿更新
- 写使能控制写入或保持
参考资料
- Wikipedia(zh):寄存器:寄存器与触发器的关系
- Wikipedia(zh):触发器:寄存器中的基本存储单元
思考题答案(仅供参考)
思考题 1
仍然是 0101。LOAD = 0 时,多路选择器把旧输出送回输入,因此本次边沿只是把原值再次保存,入口的新值 1010 被挡在门外。
思考题 2
因为一个多位数据必须作为一个整体被读写。若各位时钟不同步,有的位已经更新、有的位还停留在旧值,中间就会出现一个毫无意义的混合结果,后续电路读到的就是错的。统一时钟正是为了让所有位在同一瞬间一起换值。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪