《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 6 章 存储器和时钟信号 阅读笔记 6
第 6 章 存储器和时钟信号
在前面的章节中,我们看到了如何组合数字逻辑门以产生有用的组合逻辑电路,其输出是输入的函数。
本章将讨论时序逻辑电路。这些电路有存储功能,能够保存过去的记录。
我们将介绍一些特殊类型的存储设备:锁存器和触发器。
我们还将介绍时钟信号,它是一种同步多个电路元件的方法。
6.1 时序逻辑电路和存储器
现在,我们来看一种被称为时序逻辑电路的数字电路。
时序逻辑电路的输出不仅取决于其当前的一组输入,还取决于该电路过去的输入。
换句话说,时序逻辑电路对自己以前的状态有一定的了解。
数字设备在存储器中存储过去状态的记录,存储器是用来保存和检索二进制数据的组件。
让我们考虑一个简单的时序逻辑:投币式自动贩卖机。自动贩卖机至少有两个输入:投币口和自动贩卖按钮。
为了简单起见,我们假设自动贩卖机只出售一种商品,且该商品价格为一枚硬币。
除非插入硬币,否则自动贩卖按钮不会执行任何操作。如果自动贩卖机是基于组合逻辑的,其状态只取决于当前输入,那么就必须在插入硬币的同时按下自动贩卖按钮。
幸运的是,自动贩卖机不是这样工作的!它们有存储器,能跟踪硬币是否已经插入。
当我们按下自动贩卖按钮时,自动贩卖机中的时序逻辑会检查其存储器以查看之前是否有硬币插入,如果有,机器就会分配商品。
本章后面的内容将以这个时序逻辑示例为基础。
由于有存储器,因此实现时序逻辑是可能的。
存储器保存二进制数据,其存储容量用位或字节来衡量。
现代计算机设备(比如智能手机)通常具有至少 1GB 的存储器。这是超过 80 亿位!
我们从更简单的具有 1 位存储容量的存储设备开始介绍。
6.2 SR 锁存器
锁存器是一种记忆一位的存储设备。SR 锁存器有两个输入—— S(用于置位)和 R(用于复位),以及一个被称为 Q 的输出—— “被记忆的” 单个位。
当 S 被设为 1 时,输出 Q 也变为 1。当 S 变为 0 时,Q 还是等于 1,因为锁存器记得这个之前的输入。
这就是存储器的本质——存储器组件记得之前的输入,即使该输入发生了变化。
当 R 被设为 1 时,指示复位/清除该存储器位,所以输出 Q 变为 0。就算 R 变回 0,Q 也将保持为 0。
我们在表 6-1 中总结了 SR 锁存器的行为。
表 6-1 SR 锁存器的行为
| S | R | Q (输出) | 功能 |
|---|---|---|---|
| 0 | 0 | 保持之前的值 | 保持 |
| 0 | 1 | 0 | 复位 |
| 1 | 0 | 1 | 置位 |
| 1 | 1 | X | 无效 |
根据设计,同时把 S 和 R 设置为 1,输入无效,此时,Q 的值未定义。
实际上,尝试这样做会导致 Q 变为 1 或者 0,但我们不能确定是哪一个。
此外,尝试同时置位和复位锁存器是没有意义的。
SR 锁存器的电路图符号如图 6-1 所示。
图 6-1 SR 锁存器的电路图符号
图 6-1 中有个额外的输出:Q。
它读作 “Q 的补码” “非 Q” 或 “Q 的倒置”。它与 Q 正好相反。当 Q 为 1 时,Q 带横杠为 0,反之亦然。
在不需要额外设置的情况下,Q 和 Q 带横杠都得到是很有用的。
我们可以非常简单地用两个 NOR 门和一些连线来实现 SR 锁存器。
也就是说,需要做些思考才能理解设计是如何工作的。
观察图 6-2 展示的电路,它是 SR 锁存器的一种实现。
在图 6-2 中,我们有两个 NOR 门在所谓的交叉耦合结构中。
提醒一下,仅当两个输入都为 0 时,NOR 门才输出1;否则,输出 0。
N1 的输出接入 N2 的输入端,N2 的输出接入 N1 的输入端。S 和 R 是输入,Q 和 Q 带横杠是输出。
让我们通过激活和清除各种输入来看看电路是如何工作的,同时也看看输出。假设初始 S 为 0,R 为 1。
图 6-2 用交叉耦合的 NOR 门实现 SR 锁存器
初始状态 (S = 0,R = 1):
1)R = 1,所以 N2 的输出为 0。
2)N2 的输出送入 N1。
3)S = 0,所以 N1 的输出为 1。
4)初始 Q=0。
总结:当 R 变高时,输出变低(见图 6-3)。
图 6-3 SR 锁存器,初始状态
接下来,清除所有输入 (S = 0,R = 0):
1)R 变为 0。
2)N2 的另一个输入仍为 1,所以 N2 的输出仍为 0。
3)因此,Q 仍等于 0。
总结:电路记得之前的输出状态(见图 6-4)。
图 6-4 SR 锁存器,输入变低
接下来,激活 S 输入(S = 1,R = 0):
1)S 变为 1。
2)这使得 N1 的输出变为 0。
3)现在,N2 的输入为 0 和 0,所以 N2 的输出为 1。
4)因此,Q 现在等于 1。
总结:把 S 置高使得输出变高(见图 6-5)。
图 6-5 SR 锁存器,S 变高
最后,再次清除所有输入 (S = 0,R = 0):
1)S 变为 0。
2)N1 的另一个输入仍为 1,所以 N1 的输出也还是 0。
3)N2 的输入不变。
4)因此,Q 仍然等于 1。
总结:电路记得之前的输出状态(见图 6-6)。
图 6-6 SR锁存器,S 变低
综上所述,我们刚才描述了 SR 锁存器的预期行为,如之前在表 6-1 中总结的那样。
当 S(置位)为 1 时,输出 Q 变为 1,即使 S 变回 0,它也保持为 1。
当 R(复位)为 1 时,输出 Q 变为 0,即使 R 变回 0,它也保持为 0。
这样,电路就会记得 1 或 0,我们有了一位的存储器!即使有两个输出(Q 和 Q 带横杠),它们也仅仅是同一个位的不同表示。请记住,同时设置 S = 1 和 R = 1 是无效输入。
为了理解 SR 锁存器的行为,我们研究了当输入保持高电平然后再变低时电路的行为。
但是,S 和 R 通常只需要 “脉冲” 变化即可。
当电路处于静止状态时,S 和 R 都为低电平。
当我们想要改变其状态时,没有理由长时间让 S 和 R 保持高电平,只需要快速将其变高,然后再变低——一个简单的输入脉冲。
通用逻辑门
我们刚刚演示了如何用 NOR 门构建 SR 锁存器。实际上,NOR 门可以用来构建任何其他的逻辑电路,而不仅仅是 SR 锁存器。
NOR 门被称为通用逻辑门,可用于实现任何逻辑功能。NAND 也是如此。
现在我们已经研究了 SR 锁存器的内部设计,接下来便可以选择用图 6-1 中的符号来表示 SR 锁存器,而不必再关注锁存器的内部结构。这是封装的另一个例子!
我们把设计细节放入 “黑盒”,这样更易于使用这个设计,而无须担心其内部细节。
我发现用简单的术语来描述SR锁存器是很有帮助的:它是 1 位的存储设备,其状态 Q 为 1 或 0。S 输入把 Q 置位为 1,R 输入把 Q 复位为 0。
6.3 在电路中使用 SR 锁存器
现在我们有了基本的存储设备——SR 锁存器,让我们通过示例电路看看它的用法。
我们回到自动贩卖机的例子,用锁存器设计一个自动贩卖机电路。该电路有如下需求:
- 电路有两个输入:COIN 按钮和 VEND 按钮。按下 COIN 代表插入硬币,按下 VEND 使机器自动售出一个商品(电路会点亮 LED 表示自动售出商品)。
- 电路有两个 LED 输出:COIN LED 和 VEND LED。当插入硬币时,COIN LED 点亮。VEND LED 点亮表示一个商品已经被自动售出。
- 除非先插入硬币,否则机器不会自动售出商品。
- 为了简单起见,假设只能插入一枚硬币。插入更多硬币不会改变电路状态。
- 在自动售出商品后,通常我们希望电路自动复位,回到 “无硬币” 状态。但是,为了简化设计,我们将跳过自动复位,转为手动复位。
在概念层面上,自动贩卖机电路实现如图 6-7 所示。
图 6-7 手动复位的自动贩卖机概念电路
我们来看看图 6-7。当按下 COIN 按钮时,COIN 存储器(SR 锁存器)保存 “硬币已经插入” 的事实。
然后,这个存储器输出1,表示硬币已经插入,COIN LED 亮起。
当按下 VEND 按钮时,如果之前已经有硬币插入,AND 门输出 1,VEND LED 亮起。
如果之前没有硬币插入,但按下了 VEND 按钮,则无事发生。
要清除 COIN LED 并复位设备,必须手动把 “复位” 输入设置为 1。
这个基本的自动贩卖机电路演示了存储器在电路中的实际应用。
由于电路中包含了存储器元件,因此 VEND 按钮可以根据之前是否有硬币插入表现出不同的行为。
但是,一旦 COIN 位在存储器中被置位,它就会一直保持置位状态,直到电路被手动复位。
这不够理想,所以我们把电路升级一下,让它在发生售出操作后能自动复位。
当机器售出商品后,我们希望 COIN 位能复位为 0,因为售出行为 “使用了” 硬币。
换句话说,售出行为也应该能让 COIN 存储器复位。
为了实现这个逻辑,我们把 AND 门的输出连接到存储器复位端,如图 6-8 所示。这样,当 VEND LED 亮起时,COIN 存储器复位。
图 6-8 自动复位的自动贩卖机概念电路
图 6-8 中展示的系统在售出商品时会复位系统,但这个设计有问题。你能找出来吗?
这个问题可能不明显。如果你完成了设计 7,你可能想在刚刚搭建的电路上尝试这种复位方式,即从 AND 门的输出连一根线到SR锁存器的 R 输入,按下 COIN,然后按下 VEND。
问题是,虽然复位行为符合预期,但它的速度太快了,以至于 VEND LED 立刻就熄灭了,更有可能的是 VEND LED 压根儿就没亮过。
这里我们就有了一个设计例子,它在技术上是可行的,但运行速度太快,设备用户看不到发生了什么。这是用户界面设计中非常常见的问题。
我们构建的设备和程序通常运行得太快,以至于我们必须故意放慢速度,以便用户能跟上。
在这种情况下,一个解决方案就是在复位线上引入延迟,这样 VEND LED 就有时间在复位前亮起1~2s,如图 6-9 所示。
图 6-9 自动延迟复位的自动贩卖机概念电路
我们怎么添加延迟呢?一种方法是用电容器。电容器是一种存储能量的电气元件。
当电流通过电容器时,电容器充电。电容器存储电荷能力的度量称为电容,以法拉为单位(符号为 F)。
一法拉是一个非常大的值,所以我们一般用微法拉 (μF) 为单位来对电容器评级。
当电容器未充电时,它的行为就像是短路。一旦电容器充电,它就像开路一样。
电容器充电或放电所需的时间由其电容和电路中的电阻控制。大电容和电阻使电容器充电时间更长,所以我们可以用电容器和电阻在电路中引入延迟,这个延迟是由电容器充电产生的。
到目前为止,本章对存储器的讨论仅限于单个位的设备。尽管 1 位存储器的应用有限,但在第 7 章中,我们将看到如何把一组单个位的存储单元组合在一起来表示更多的数据。
6.4 时钟信号
随着电路变得越来越复杂,我们常常需要让各种元件保持同步,以便它们能同时改变状态。
对于有多个存储设备的电路,我们必须这样做,因为我们希望能确保同时设置所有存储的位。当需要同时考虑一组位时尤其如此。
我们可以用时钟信号来同步多个电路元件。时钟信号(简称时钟)的电压电平在高电平和低电平之间交替变化。
通常,信号以规律的节奏变化,其中,一半时间为高电平,另一半时间为低电平。我们把这种类型的信号称为方波。
图 6-10 显示了随时间变化的 5V 方波时钟信号。
图 6-10 5 V 方波时钟信号
一次电压上升和下降是一个脉冲。
从低电平到高电平再回到低电平(或从高电平到低电平再回到高电平)的完整振荡是一个周期。
我们用每秒周期数——也称为赫兹 (Hz)——来衡量时钟信号的频率。
图 6-11 所示时钟信号的频率为 2 Hz,因为该信号在 1s 内完成了两次完整的振荡。
图 6-11 2 Hz 时钟信号
当电路使用一个时钟时,所有需要同步的元件都要连接到该时钟。
每个元件都被设计为仅当出现时钟脉冲时,才允许改变状态。
时钟驱动的元件通常在脉冲的上升沿或下降沿触发状态改变。
在脉冲上升沿改变状态的元件被称为正边沿触发元件,在脉冲下降沿改变状态的元件被称为负边沿触发元件。
图 6-12 提供了上升沿和下降沿的例子。
图 6-12 脉冲边沿演示
本书中的图把脉冲边沿表示为垂直线,这意味着从低电平到高电平是瞬时变化的,反之亦然。
但是,实际上改变状态是要花时间的,不过在这里为了方便讨论,我们假设状态改变是瞬间发生的。
6.5 JK 触发器
使用时钟的 1 位存储设备称为触发器。
术语 “锁存器” 和 “触发器” 的用法有些重叠,但在这里我们用 “锁存器” 指代无时钟的存储设备,用 “触发器” 指代有时钟的存储设备。
你可能在其他地方会看到这两个术语可以互换使用或者有不同的含义。
让我们来研究一个特定的时钟控制存储设备:JK 触发器。JK 触发器是 SR 锁存器的扩展,所以我们来比较一下这两者,如表 6-2 所示。
SR 锁存器用输入 S 设置存储位,用输入 R 复位存储位;同样,JK 触发器用输入 J 置位,输入 K 复位。
当 S 或 R 设置为高电平时,SR 锁存器立即改变状态,而 JK 触发器则只在出现时钟脉冲时改变状态。
JK 触发器还增加了一个额外的功能:当 J 和 K 都设置为高电平时,输出从低电平到高电平或从高电平到低电平切换一次。
表 6-2 SR 锁存器与 JK 触发器的比较
| 比较项 | SR锁存器 | JK触发器 |
|---|---|---|
| 改变状态 | 当 S 或 R 变高电平时,立即改变 | 若 J 或 K 设置为高电平,则仅当出现时钟脉冲时改变 |
| 置位 | S=1 | J=1 |
| 复位 | R=1 | K=1 |
| 切换 | 不适用 | J=1 且 K=1 |
当在图中表示 JK 触发器时,可以使用图 6-13 所示的符号。
图 6-13 JK 触发器,正边沿触发(左),负边沿触发(右)
图 6-13 展示了两种版本的 JK 触发器。左边是正边沿触发 JK 触发器,这意味着它在时钟脉冲的上升沿改变状态。
右边是负边沿触发 JK 触发器(注意CLK输入端的圆圈),它在时钟脉冲的下降沿改变状态。
这两个设备的其他行为完全一样。
因此,JK 触发器是 1 位存储设备,仅当其接收到时钟脉冲时改变状态。
除了由时钟控制状态变化且能切换其值之外,它与 SR 锁存器非常相似。表 6-3 总结了 JK 触发器的行为。
表 6-3 JK 触发器行为总结
| J | K | 时钟 | Q(输出) | 操作 |
|---|---|---|---|---|
| 0 | 0 | 脉冲 | 保持之前的值 | 保持 |
| 0 | 1 | 脉冲 | 0 | 复位 |
| 1 | 0 | 脉冲 | 1 | 置位 |
| 1 | 1 | 脉冲 | 翻转之前的值 | 切换 |
我们不会像对 SR 锁存器一样对 JK 触发器进行逐步解说。相反,理解 JK 触发器最好的方法就是直接使用它。
6.6 T 触发器
把 J 和 K连接起来,将它们当作一个输入端就会创造出一个触发器,这个触发器在出现时钟脉冲时只做两件事情:要么切换其值,要么保持其值。
要了解为什么会出现这种情况,请查阅表 6-3 并注意当 J 和 K 都是 0 或都是 1 时的行为。
连接 J 和 K 是一种常用技术,这种方式下产生的触发器是 T 触发器。图 6-14 展示了 T 触发器的符号。
图 6-14 J 和 K 连接起来的 JK 触发器被称为 T 触发器
因此,当 T 为 1 时,T 触发器只在出现时钟脉冲时切换其值。表 6-4 总结了 T 触发器的行为。
表 6-4 T 触发器的行为总结
| T | 时钟 | Q | 操作 |
|---|---|---|---|
| 0 | 脉冲 | 保持之前的值 | 保持 |
| 1 | 脉冲 | 翻转之前的值 | 切换 |
6.7 在 3 位计数器中使用时钟
为了演示时钟在电路中的使用,我们构建一个 3 位计数器——一个从 0 计数到 7 的二进制电路。
该电路有三个存储元件,每个都代表 3 位计数器中的一位。
该电路有一个时钟输入,当出现时钟脉冲时,3 位计数值递增(加 1)。
由于所有的位都代表一个数字,所以用时钟来同步它们的状态变化就很重要。我们用 T 触发器来实现它。
表 6-5 用 3 位数进行二进制计数
| 二进制 | 十进制 |
|---|---|
| 000 | 0 |
| 001 | 1 |
| 010 | 2 |
| 011 | 3 |
| 100 | 4 |
| 101 | 5 |
| 110 | 6 |
| 111 | 7 |
表 6-5 回顾了用 3 位数进行二进制计数的方法。
表 6-5 把 3 位数拆分,表示为一行的多个单值。
现在,我们把每一位分配给标记为 Q_0、Q_1 和 Q_2 的存储元件。
Q_0 代表最低有效位,Q_2 代表最高有效位,如表 6-6 所示。
表 6-6 二进制计数,每位分配给单独的存储元件
| 二进制 | Q_2 | Q_1 | Q_0 | 十进制 |
|---|---|---|---|---|
| 000 | 0 | 0 | 0 | 0 |
| 001 | 0 | 0 | 1 | 1 |
| 010 | 0 | 1 | 0 | 2 |
| 011 | 0 | 1 | 1 | 3 |
| 100 | 1 | 0 | 0 | 4 |
| 101 | 1 | 0 | 1 | 5 |
| 110 | 1 | 1 | 0 | 6 |
| 111 | 1 | 1 | 1 | 7 |
如果我们分开看表 6-6 中的 Q 列,就能看出一个模式。
当我们计数时,Q_0 每次都会切换。当 Q_0 之前为 1 时,Q_1 就会切换。当 Q_0 和 Q_1 之前都为 1 时,Q_2 就会切换。
换句话说,除了Q_0,当前面所有位都为 1 时,每位都会在下一次计数时进行切换。
T 触发器很适合实现这个计数器,因为它们的工作就是切换!
我们来看如何构建电路来实现这个功能,如图 6-15 所示。
图 6-15 用 T 触发器构建的 3 位计数器
在图 6-15 中,3 个 T 触发器使用了同一个时钟信号,所以它们是同步的。
T_0 连接 5V,因此,Q_0 每个时钟脉冲都会进行切换。T_1 连接到 Q_0,因此仅当 Q_0 为高电平时,时钟脉冲才会使 Q_1 进行切换。
T_2 连接到 Q_0 AND Q_1,因此仅当 Q_0 和 Q_1 都为高电平时,时钟脉冲才会使 Q_2 进行切换。
考虑一下我们如何把这样的计数器与之前设计的自动贩卖机组合使用。
除了简单地跟踪硬币是否插入,我们还可以跟踪插入的硬币数量,至少可以跟踪多达 7 枚硬币!
要让自动贩卖机计数器发挥作用,它还需要能倒着计数,因为每卖出一件商品都应减少硬币计数。我不会在这里详细介绍如何在自动贩卖机电路中添加计数器,但你可以自行尝试。
可以在线获得具有递增和递减计数功能的计数器电路设计,也可以采用诸如 74191 这样的递增/递减计数器 IC。
我们用T触发器构建了一个计数器,T 触发器是用 JK 触发器构建的,JK 触发器又是基于晶体管的数字逻辑电路!这再次演示了封装是如何让我们构建复杂系统,并在此过程中隐藏细节的。
6.8 总结
本章介绍了时序逻辑电路和时钟信号。
你了解到和组合逻辑电路不同,时序逻辑电路有存储器,可以记录过去的状态。
你还了解了 SR 锁存器—一个简单的 1 位存储设备。
我们讨论了如何用时钟信号同步包括存储设备在内的多个电路元件,时钟信号是一种在高电平和低电平之间交替的电信号。
时钟控制的 1 位存储设备被称为触发器,它使状态改变只在与时钟信号同步时发生。
你了解了 JK 触发器是如何工作的、怎样用 JK 触发器构造 T 触发器,以及如何同时使用时钟和 T 触发器来搭建 3 位计数器。