Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

寄存器

复习

  • 一只 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:本次边沿收下新的 D
  • LOAD = 0:本次边沿继续保存旧的 Q

  实现方法仍然是熟悉的多路选择器。它在“新输入 D”和“旧输出 Q”之间二选一,再送进触发器。

离 ALU 最近的记事本

  寄存器很快,因为它直接由触发器组成;代价是每一位都要花不少电路。因此,寄存器适合暂存眼前就要使用的数据,而不是保存成千上万份文件。

  但对我们眼下的问题已经够了。把一个寄存器接到 ALU 输出,再把它的输出绕回 ALU 输入,运算结果就能在下一拍继续参与运算。

  下一章,我们终于让 2 + 3 + 4 不靠人重新抄写中间结果,自己一步步算完。

思考题

  寄存器里原来是 0101。下一次上升沿到来时输入为 1010,但 LOAD = 0。边沿之后寄存器保存什么?

小结

知识点

  • 多只触发器并排组成多位寄存器
  • 所有位必须在同一时钟边沿更新
  • 写使能控制写入或保持

思考题答案(仅供参考)

  仍然是 0101LOAD = 0 时,多路选择器把旧输出送回输入,因此本次边沿只是把原值再次保存。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪