构建一个同步计数器
你可能不知道,但同步计数器在数字电子技术中无处不在。CPU中充满了它们,家用电器的微控制器里也都有,数码时钟中也有。它们无处不在!所有集成电路制造商都生产非常精密、多功能的同步计数器,例如74HC193、DM74LS169和SN54ALS191A。
许多电子爱好者都熟悉异步溢流计数器。它们易于理解,运行效果也很出色。那么,它们到底有什么问题呢?
计数器由移位寄存器构成。移位寄存器需要一定时间才能改变状态。当计数器某一级的时钟输入依赖于前一级的状态变化时,这种延迟就会累积起来。对于速度较慢的计数器来说,传播延迟并不重要。但如果你有一个工作频率为1 GHz的64位计数器,即使每个阶段的传播延迟仅为0.1纳秒,也会造成灾难性后果。你必须等待多个时钟周期,才能让计数器最终稳定到其最终状态。
因此,数字逻辑设计者被教导要完全避免使用异步计数器。即使在低速下,它们也会引发过多的时序问题;而在高速下,则完全无法使用。
本教程主要介绍人字拖和同步计数器,包括如何进行加减计数、如何将数字预加载到计数器中、以及如何将多个计数器级联连接,涵盖现代多功能同步计数器所能实现的所有功能!
我最近一直在使用Logisim尝试各种计数器的设计。之前我在另一篇文章《使用Logisim进行逻辑设计》中介绍了Logisim,该软件可在此处获取。现在我对计数器有了很多了解,将在本教程中与大家分享。
The JK Flip Flop
触发器是一种基本的时序逻辑电路,用于存储单个二进制数据位(1 或 0)。与简单的逻辑门不同,触发器具有两种稳定状态,并依赖“反馈”机制,因此输出既取决于当前输入,也取决于过去输入。由于触发器能够保持状态,因此它是存储器、寄存器和计数器的基础。
虽然有多种类型的翻转器,但这里我们将讨论的所有内容都是基于JK翻转器实现的。过去我一直认为JK翻转器相比开关式翻转器、SR翻转器和D翻转器显得更加神秘,但实际上,JK翻转器只是通用型翻转器,可以轻松配置成任何你需要的类型。
所有双稳态触发器都有一个时钟输入和两个输出:Q 和 Q'(不是 Q)。JK 双稳态触发器还有两个额外的输入 J 和 K,使其可以配置成任意类型的双稳态触发器。
JK触发器由四个门构成,如上图所示。您也可以看到JK触发器的真值表。
那么,我们如何用JK触发器来制作其他类型的翻转器呢?让我们从T型或开关式翻转器开始。以下是它的真值表:
对于一个翻转器,当 T 为 1 时,它会在每次上升的时钟脉冲时改变状态;如果 T 为 0,则在时钟脉冲下不会发生任何变化。
使用JK触发器创建一个翻转开关,只需将J和K端连接在一起,它们就变成了T。
同样,D触发器的真值表如下:
并且可以从JK触发器如下推导出来:
SR触发器的真值表如下:
它可以从JK触发器推导出来,如下所示:
因此,我们可以轻松地从JK触发器中推导出任何需要的翻转器。我们设计的所有计数器都将由JK触发器构成!
异步溢流计数器
最简单的二进制计数器由多个触发翻转器组成,其中一个翻转器的输出作为下一个翻转器的时钟输入:
我们有四个JK触发器,以切换型触发器的形式配置。其中一阶段的Q'输出连接到下一阶段的时钟输入。当时钟脉冲上升时,进入第一阶段并使该阶段保持开启状态。第二个时钟脉冲将第一阶段关闭,导致其Q'变为高电平,从而激活第二阶段,依此类推。该计数器可从0计数到15。
正如我们之前所说,异步计数器会累积传播延迟,因此接下来我们将讨论的其他内容都是同步的。
在这个计数器中,我将翻转阶段从左到右排列,这似乎是我们正常阅读和处理信息的方式。但通常我们期望看到数字的最低有效位在右边,而更高有效位在左边,因此你可以看到,我反转了LED显示计数器输出时的顺序。这一点适用于我在此展示的所有计数器。
同步计数器
同步计数器比异步计数器更复杂,但其所有阶段的状态会同时变化。它们具有单个阶段的传播延迟,但不像异步计数器那样存在累积的传播延迟。
使用JK触发器构建同步计数器有多种方法,上面的方法可能是最简单的。我们再次使用四个JK触发器,并将其配置为翻转触发器。首先要注意的是,这四个触发器都直接由时钟信号驱动,状态变化是同步进行的。第一个阶段在每次上升沿时钟脉冲时都会发生翻转。但其他三个阶段只有在前面所有阶段都处于高电平时才会翻转,这正是你所看到的与门的功能。这些与门仅当其前面的所有阶段均已为高电平时,才会将T端置为高电平,从而允许翻转操作。这个计数器从0计数到15,与之前看到的异步计数器一样。
请注意,我添加了一个第三个与门,用于产生进位位。稍后我们将讨论如何将多个同步计数器连接起来或级联使用。
上下/下降计数器
下同步计数器与上同步计数器仅略有不同。第一级仍然在每次上升时钟脉冲时翻转,而其他三个阶段则只有在前面所有阶段都为低电平时才会翻转。
由于上升和下降计数器相似,因此通过添加几个与门来选择计数方向,可以相当容易地创建一个上升和下降计数器,如下图所示。
可预设计数器
一般来说,如果计数器能够预设为特定数值,就会更加实用。我们可以通过使用门电路将JK触发器临时转换为SR触发器来实现这一点。然后,将所需的预设值输入到S和R引脚上,在下一个上升的时钟脉冲时,预设值就会被加载到触发器中。接着关闭预设信号,我们的触发器便会重新变为计数器状态。
对于我在此展示的具体情况,我们先使用了下降同步计数器,然后添加了预加载电路,并在最右侧额外增加了一个触发器(即D型触发器锁存器),当计数达到0时停止计数,并保持在0状态,直到再次使用预加载来恢复下降计数器。例如,这个计数器可以作为定时器使用,从一个预设数值开始,向下计数至0。
在上图中,我们刚刚将十进制数10(二进制为1010)加载到下方的预加载器中,然后按下了时钟按钮,我们的10现在出现在计数器的输出端。
级联同步计数器
在实际电路中,通常通过将多个同步计数器集成电路连接或级联来构建大型计数器。由于每个IC中的每个触发器都接收到时钟信号,这种同步计数器的级联过程变得复杂。
要使计数器的某一段增加,必须满足两个条件:其前一段的计数器所有翻转器都处于高电平状态(最大计数设置为进位高),并且该前一段的计数器已经完成加一操作。同时满足这两个条件的信号称为溢出信号。
在Logisim中,我们可以通过将4位的加/减计数器封装成一个子电路来演示级联,这就像将其转换为一个集成电路一样。
这是我们带有升降沿逻辑和级联逻辑的子电路计数器。首先,我们需要修改计数使能信号,当值为0时,所有4个触发器停止计数。为此,在电路底部添加了三个与门。然后我们再增加一个与门,将进位位和计数使能信号组合起来,生成进位信号,用于指示计数器的下一阶段进行加一操作。
这是一个由5个4位子电路组成的20位计数器。
我们也可以用十六进制显示来替代这20个LED,将每个4位子电路的内容以一个十六进制数的形式显示出来。
十进制计数器
我们以上面的20位同步计数器为例,将其改造成一个十进制加法计数器。
上图展示了我们在计数器子电路右上角所做的部分修改。我们移除了最后一个进位级,并用一个与门替代,当计数达到9时,该与门才变为高电平,从而在计数到9时产生进位信号,而不是15。此外,另一个与门在计数达到10时被激活,将所有触发器设置为0。
所以,这是我们20位十进制计数器的递增方式。我们需要添加一些额外的逻辑,以便让十进制计数器能够进行递减计数。
可上下设定的级联同步计数器
我们终于可以将所有内容整合起来,创建一个具备之前讨论过的全部功能的计数器。以下是我们的同步计数器,支持预设、升降以及级联功能。
上方是我们的最终计数器的4位子电路。下方我们使用了5个这样的子电路,构建了一个20位计数器,并将所有部分连接起来,使我们的计数器具备了这些功能。
这类计数器用途最为广泛,因此常被集成到计算机硬件和其他电子设备中。大多数集成电路供应商都提供与我们上述子电路非常相似的4位计数器,例如74HC193、DM74LS169和SN54ALS191A等IC芯片。
本文编译自hackster.io





