让电路记住一个比特
复习
- 运算器能根据当前输入立刻给出结果
- 输入一变,组合逻辑的旧结果就消失
- 我们需要保存中间结果,才能完成连续运算
TL;DR
- 把输出反馈到输入,过去就能影响现在
- 交叉连接的逻辑门可以维持 0 或 1
- 增加控制输入后,就得到能写入和保持的锁存器
正文
组合逻辑像一面镜子:面前是什么,它就照出什么;输入一撤,刚才的结果也不复存在。
想让电路记住过去,一个自然的念头是:把输出绕回来,重新接到输入。 外部信号离开以后,电路仍能用自己的旧输出支撑下一刻。
先试一个会打架的接法
如果把非门的输出直接接回自己的输入,就会得到:
Q = NOT Q
Q 是 0,非门就要求它变成 1;Q 是 1,非门又要求它变回 0。电路找不到安稳的位置,只会受到传播延迟影响不断变化。它能产生振荡,却不能可靠地记住一个确定值。
两个门互相照看
换成两个或非门,让每个门的输出接到另一个门的输入。忽略外部控制时,它有两个稳定状态:
Q = 1,Q̅ = 0
Q = 0,Q̅ = 1
外部信号可以把电路推到其中一个状态;信号撤走后,交叉反馈仍会把它维持下去。两个稳定状态正好代表一个比特的 0 和 1。
记忆并不是某个逻辑门突然学会的新本领,而是来自连接方式:旧输出绕回来,成了新输入的一部分。
给记忆装上两个按钮
我们再加入 S(Set,置位)与 R(Reset,复位),告诉电路要写 1、写 0,还是保持原值。它现在有了一个名字:SR 锁存器。
| S | R | Q 的下一状态 | 含义 |
|---|---|---|---|
| 0 | 0 | 保持原值 | 不写入 |
| 1 | 0 | 1 | 写入 1 |
| 0 | 1 | 0 | 写入 0 |
| 1 | 1 | 不使用 | 两边同时发号施令 |
关键是第一行:S、R 都回到 0 后,Q 仍然留在刚才写入的状态。一个比特真的被记住了。
把危险组合藏起来
S、R 同时为 1 会破坏两个输出应当互为相反数的关系。既然写 0 与写 1 不该同时发生,我们干脆只提供一根数据线 D,再用使能线 E 决定是否写入:
- E = 0:保持原值
- E = 1:Q 跟随 D
电路内部把 D 原样送往一路,再取反送往另一路,因此不会同时要求写 0 和写 1。这就是 D 锁存器。
不过,E 为 1 的整段时间里,锁存器的门一直开着,D 一变,Q 就跟着变。许多部件若同时敞开大门,数据会一路向前乱跑。下一章,我们给全机安排同一个交接节拍。
思考题
为什么完全切断反馈后,外部写入信号一撤,电路就无法继续保存旧状态?
小结
知识点
- 反馈让旧输出参与决定新输出
- 两个稳定状态可以表示一个比特
- SR 锁存器能够置位、复位与保持
- D 锁存器用一根数据线避开冲突输入
思考题答案(仅供参考)
没有反馈时,输出只取决于当前外部输入。写入信号一撤,旧输出也就没有任何信号继续支撑;有反馈时,旧输出会回到输入端,参与维持自身。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪