# 4.1. SR Latch：如何存储 1 Bit

到此为止，我们知道了如何使用逻辑门构建计算单元，但不管是基础的逻辑门、加法器，还是复杂的 ALU, 其任意时刻的输出都仅仅与当前的输入相关，而与之前的输入或输出无关，这种电路叫着组合逻辑电路（Combinational Logic Circuit）。

组合逻辑电路的名字反应了其内在本质：即任意时刻的输出仅仅是当前输入的组合结果。组合逻辑电路是一个无状态的功能模块，这种电路具备计算能力但没有存储能力，因为只要输入改变，作为计算结果的输出就会发生改变，电路无法将结果“锁”在电路内部以供“将来”使用。

想要打破这种限制，我们可以尝试着将电路的输出作为反馈，再次作为输入信号接入到电路中，以期望让电路形成一种稳定状态。最简单的稳定态电路可以使用两个非门（Not Gate）组成：

![Two NOT Gates](https://4257267501-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdQXCtxb9g6w1DURwQ9%2F-MdQXJqxxZBTSPzE2swO%2F-MdWKJcOKAFsO14CxdvT%2Ftwo_not_gates.png?alt=media\&token=9bd3a18c-7a11-4b47-941b-8ffee1d6c3dd)

通过将该电路输出引脚 Q 又接入到输入引脚，这样该电路将一直保持稳定状态，根据信号的初始设置不同，Q 将一直处于状态 1 或者处于状态 0。但由于该电路没有输入引脚，因此并没有什么实用价值，下面我们使用两个或非门（NOR Gate）构建一个具有输入引脚的等价电路：

![Two NOR Gates](https://4257267501-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdQXCtxb9g6w1DURwQ9%2F-MdQXJqxxZBTSPzE2swO%2F-MdWKYX9RVF3TbUnleUP%2Fsr_ff.png?alt=media\&token=48766443-4dcd-4cd6-b2e2-086dd6c018d8)

> &#x20;或非门（NOR Gate）的真值表为：

| A | B | A NOR B |
| - | - | ------- |
| 0 | 0 | 1       |
| 0 | 1 | 0       |
| 1 | 0 | 0       |
| 1 | 1 | 0       |

当 S = 0, R = 0 时，该电路与上面由两个非门组成的电路完全等价。我们将该电路稍稍“旋转”一下，得到如下电路：

![SR Latch](https://4257267501-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdQXCtxb9g6w1DURwQ9%2F-MdWKlKNQdKW9dQ6SVSt%2F-MdWKq24N9GT4XsRdVQ2%2Fsr_latch.png?alt=media\&token=46b83754-a3e5-4869-99b8-0a669f5fb783)

该电路暴露了两个输入引脚：S 与 R, 此处我们要求输出引脚 Q 与 ^Q 的信号互反。电路的真值表如下：

| #No | S | R | Q | ^Q |
| --- | - | - | - | -- |
| #1  | 0 | 0 | 1 | 0  |
| #2  | 0 | 0 | 0 | 1  |
| #3  | 1 | 0 | 1 | 0  |
| #4  | 0 | 1 | 0 | 1  |
| #5  | 1 | 1 | 0 | 0  |

该电路的稳定状态只有以上 5 种，我们依次来分析分析当设置 S 与 R 时，输出信号 Q 与 ^Q 的情况：

1. &#x20;Set S = 1, R = 1: Invalid \
   虽然此时电路可以处于稳定状态，但我们认为其是非法的。因为一来 Q 与 ^Q 都是 0, 违反了我们的约定；二来在将 S, R 同时设置为 0 时会存在一个竞态条件：此时 Q 及 ^Q 理论上都会变为 1, 如果 Q 的值率先传递给 S, 则 ^Q 会变为 0; 而如果是 ^Q 的值率先传递给 R, 则 Q 会变为 0. 即我们无法知道电路的状态变化是 #5 -> #1 还是 #5 -> #2.

   &#x20;竞态条件存在的根本原因是因为电子信号的传递是需要时间的，关于电路设计中时间的概念会在后续讨论时钟时详细讨论。
2. Set S = 0, R = 0 \
   此时不管是 Q = 0, ^Q =1, 还是 Q = 1, ^Q = 0 都可以是电路处于稳定状态，而电路最终会处于何种状态取决于 Q 与 ^Q 的上一个状态。实际上，稍加分析一下就会发现，不管是 #4 -> #2 还是 #3 -> #1, Q 与 ^Q 都会保持各自之前的状态不变。
3. Set S = 1, R = 0 \
   S 为 1 必然导致 ^Q 为 0, 而 R 也为 0, 所以 Q 为 1. 注意此时 Q 与 ^Q 的状态与其之前的状态无关，当 S = 1 时，Q 的值必然被设置为 1.
4. Set S = 0, R = 1 \
   与 S = 1, R = 0 时的状态相反，此时 S = 0 必然导致 Q 被设置为 0.

如果我们将 0 作为任何电路的初始状态的话，可以发现当 S = 1, R = 0 时，Q 总会被设置为 1, 而 S = 0, R = 1 时，Q 总会被重置为 0, 而当 S = 0, R = 0 时，Q 将保持之前的状态不变，将其“锁（Latch）”在电路内部，也就是说，此时该电路具备了存储能力，并且我们可以通过 S, R 的信号对内部值进行修改！

此处 S 表示 Set, R 表示 Reset， 所以该电路叫着 SR Latch。

能够维持两种稳定状态的电路被称为双稳态锁存器（Bistable Latch），由于该电路可以稳定地表示两种状态，因此它具备存储 1 Bit 信息的能力。只要能够存储 1 Bit, 就可以存储任意 Bit, 因为我们制造出了搭建存储芯片的基础积木！

这种将输出又反馈进输入的电路叫着时序电路（Sequential Circuits），时序电路是构造存储电子芯片的基础。时序电路与组合电路的区别在于反馈模式，反馈是将过去的状态与当前的输入组合在一起，用以确定当前的输出，这里本质上是在电路设计中引入了时间的概念，即电路当前的输出不仅与当前的输入有关，还与“之前”的电路状态有关。
