Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

让电路记住一个比特

复习

  • 算术逻辑单元: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 锁存器 。

SRQ 的下一状态含义
00保持原值不写入
101写入 1
010写入 0
11不使用两边同时发号施令

  关键是第一行: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 锁存器用一根数据线避开冲突输入

参考资料

  1. Wikipedia(zh):锁存器:交叉耦合反馈构成的记忆单元
  2. Wikipedia(zh):触发器:时钟控制的存储单元

思考题答案(仅供参考)

思考题 1

  没有反馈时,输出只取决于当前外部输入。写入信号一撤,就没有任何信号继续支撑旧输出;有反馈时,旧输出会绕回输入端,参与维持自身,所以能“记住”。

思考题 2

  因为 S = R = 1 意味着同时要求输出为 1 和 0,两个输出无法再保持互为相反数,解开这个输入后结果还可能不确定(看哪边跑得比较快)。

  D 锁存器通过内部布线,让 D 的“原值”和“反值”分别接到置位与复位端:写 1 时只碰置位端,写 0 时只碰复位端,两边永远不会同时为 1,从源头上避开了这个禁止组合。

协议

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

封面图

设计师 | 南国微雪