寄存器
复习
- 一只 D 触发器能在时钟边沿保存一个比特
- 边沿之间,输出会保持不变
- 运算器需要保存完整的多位数字
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
这组触发器叫作寄存器。8 只保存 8 位,32 只保存 32 位。它们必须一起更新,否则一个数可能一半是新的、一半是旧的。
不是每一拍都要改
如果每次时钟上升沿都写入,寄存器里的值会不断被入口覆盖。所以还要增加一根写使能线 LOAD:
LOAD = 1:本次边沿收下新的 DLOAD = 0:本次边沿继续保存旧的 Q
实现方法仍然是熟悉的多路选择器。它在“新输入 D”和“旧输出 Q”之间二选一,再送进触发器。
离 ALU 最近的记事本
寄存器很快,因为它直接由触发器组成;代价是每一位都要花不少电路。因此,寄存器适合暂存眼前就要使用的数据,而不是保存成千上万份文件。
但对我们眼下的问题已经够了。把一个寄存器接到 ALU 输出,再把它的输出绕回 ALU 输入,运算结果就能在下一拍继续参与运算。
下一章,我们终于让 2 + 3 + 4 不靠人重新抄写中间结果,自己一步步算完。
思考题
寄存器里原来是
0101。下一次上升沿到来时输入为1010,但LOAD = 0。边沿之后寄存器保存什么?
小结
知识点
- 多只触发器并排组成多位寄存器
- 所有位必须在同一时钟边沿更新
- 写使能控制写入或保持
思考题答案(仅供参考)
仍然是 0101。LOAD = 0 时,多路选择器把旧输出送回输入,因此本次边沿只是把原值再次保存。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪