让电路记住一个比特
复习
- 算术逻辑单元:ALU 把算术与逻辑运算集成起来,用控制码选择运算
- ALU 状态标志:ALU 用零、负数、进位和溢出标志记录结果特征
- 运算器总装:把运算部件组装成一个能算加减乘除的运算器
TL;DR
- 把输出反馈到输入,过去就能影响现在
- 交叉连接的逻辑门可以维持 0 或 1
- 增加控制输入后,就得到能写入和保持的锁存器
正文
组合逻辑像一面镜子:面前是什么,它就照出什么;输入一撤,刚才的结果也不复存在。
思考题 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 仍然留在刚才写入的状态。
就这样,我们天马行空的想法,真的让电路记住了一个 bit。
把危险组合藏起来
不过,最后一行是个麻烦:S、R 同时为 1,等于同时喊“置位”和“复位”,破坏了两个输出本该互为相反数的关系。
既然“写 0”和“写 1”本就不该同时发生,不如干脆只提供一根数据线 D(Data,数据),再用一根使能线 E(Enable,是否启用)决定这一拍要不要写入:
- E = 0:保持原值
- E = 1:Q 跟随 D
电路内部把 D 原样送往一路、取反后送往另一路,所以无论如何都不会同时要求写 0 和写 1。这就是 D 锁存器,它用一个巧妙的小设计,把那个危险组合从接口上“藏”了起来。
思考题 2
SR 锁存器为什么要禁止 S = 1、R = 1?D 锁存器又是怎样使这种输入“根本不会出现”的?
不过,D 锁存器仍有它的软肋:E 为 1 的整段时间里,门一直开着,D 一变,Q 就跟着变。
许多部件若同时敞开大门,数据就会全乱套,就像一个古典乐团,每个声部都各自演唱,不管其他,演奏出来的结果肯定不能叫音乐了。
所以,下一章,我们给全机安排同一个总指挥。
小结
知识点
- 反馈让旧输出参与决定新输出
- 两个稳定状态可以表示一个比特
- SR 锁存器能够置位、复位与保持
- D 锁存器用一根数据线避开冲突输入
参考资料
- Wikipedia(zh):锁存器:交叉耦合反馈构成的记忆单元
- Wikipedia(zh):触发器:时钟控制的存储单元
思考题答案(仅供参考)
思考题 1
没有反馈时,输出只取决于当前外部输入。写入信号一撤,就没有任何信号继续支撑旧输出;有反馈时,旧输出会绕回输入端,参与维持自身,所以能“记住”。
思考题 2
因为 S = R = 1 意味着同时要求输出为 1 和 0,两个输出无法再保持互为相反数,解开这个输入后结果还可能不确定(看哪边跑得比较快)。
D 锁存器通过内部布线,让 D 的“原值”和“反值”分别接到置位与复位端:写 1 时只碰置位端,写 0 时只碰复位端,两边永远不会同时为 1,从源头上避开了这个禁止组合。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪