好的,这份中文自学讲义根据您提供的PPT内容编写而成,其中包含了所有幻灯片的信息,并增加了额外的解释和说明,以帮助您更好地理解。
ECE 2050 数字逻辑与系统 - 第10章:计数器
自学讲义 讲师: Tinghuan CHEN, Ph.D. 机构: 香港中文大学(深圳)
上周内容回顾
在深入本章之前,我们先快速回顾一下上周学习的核心概念:
- (同步)时序逻辑计数器: 了解了计数器作为一种基本的时序逻辑电路。
- 有限状态机 (Finite State Machine, FSM):
- 摩尔型有限状态机 (Moore FSM): 输出仅取决于当前状态。
- 米利型有限状态机 (Mealy FSM): 输出取决于当前状态和当前输入。
- 时序参数 (Timing):
- 建立时间 (Setup time): 在时钟有效沿到来之前,数据必须保持稳定的最短时间。
- 保持时间 (Hold time): 在时钟有效沿到来之后,数据必须保持稳定的最短时间。
- 孔径时间 (Aperture time): 建立时间和保持时间之和,是数据必须稳定的时间窗口。
- 传播延迟 (Propagation delay): 输入变化到输出响应变化所需的时间。
- 污染延迟 (Contamination delay): 输入变化到输出开始变化的最短时间。
- 动态约束 (Dynamic Discipline): 确保电路正常工作的时序规则。
第一部分:计数器(Counters)基础
1.1 什么是计数器?
- 计数器是一种数字电路,它的状态会在每个时钟脉冲的有效沿(通常是上升沿或下降沿)递增或递减。
- 它主要用于按预定顺序循环遍历一组数字。例如,一个3位二进制计数器会按以下顺序循环:
000, 001, 010, 011, 100, 101, 110, 111, 000, 001...
- 计数器的基本符号
下图是一个通用的计数器符号,它有:
- CLK (Clock): 时钟输入端。
- Reset: 复位/清零输入端,用于将计数器强制恢复到初始状态(如000)。
- Q: 计数器的输出。对于一个N位计数器,会有N个输出位。
- N: 表示这是一个N位计数器。
1.2 计数器的应用实例
- 数字时钟: 用于计算秒、分、时。
- 程序计数器 (Program Counter, PC): 在计算机处理器中,它负责记录当前正在执行指令的内存地址。
第二部分:异步计数器 (Asynchronous Counters)
2.1 定义与工作原理
异步计数器,也常被称为纹波计数器 (Ripple Counters),其核心特点是:内部的各个触发器(Flip-Flops)不共享同一个时钟信号。
通常,只有第一个触发器(最低有效位 LSB)连接到外部时钟源,而后续每个触发器的时钟都由前一个触发器的输出驱动。
示例:一个2位异步计数器
- 电路结构:
- 由两个D触发器(FF0 和 FF1)构成。
- 外部时钟
CLK
仅连接到FF0
的时钟输入端。 FF0
的反向输出Q̅₀
连接到FF1
的时钟输入端。- 每个触发器的
D
输入都连接到其自身的Q̅
输出,这使得触发器在每个时钟有效沿都会翻转(状态从0变1,或从1变0)。
- 工作过程:
- 初始状态:
Q₁Q₀ = 00
。 - 第1个时钟脉冲:
CLK
的下降沿使FF0
翻转,Q₀
从0变为1。Q̅₀
从1变为0,这个下降沿触发FF1
,但由于是上升沿触发,所以FF1
不变。状态变为01
。 - 第2个时钟脉冲:
CLK
的下降沿使FF0
再次翻转,Q₀
从1变为0。Q̅₀
从0变为1,这个上升沿触发FF1
,使其翻转,Q₁
从0变为1。状态变为10
。 - 第3个时钟脉冲:
CLK
的下降沿使FF0
翻转,Q₀
从0变为1。状态变为11
。 - 第4个时钟脉冲:
CLK
的下降沿使FF0
翻转,Q₀
从1变为0。Q̅₀
从0变为1,这个上升沿触发FF1
,使其翻转,Q₁
从1变为0。状态变回00
,完成一个计数周期。
- 初始状态:
2.2 异步计数器的主要缺点:累积延迟
当我们将异步计数器扩展到更多位(如上图的3位计数器)时,其主要缺点就显现出来了。
- 传播延迟 (Propagation Delay): 每个触发器从接收到时钟信号到其输出稳定都需要一小段时间,这被称为传播延迟(
t_p
)。 - 累积效应: 在异步计数器中,时钟信号像“涟漪”或“波纹”一样逐级传播。
FF1
的状态变化必须等待FF0
的输出稳定,FF2
必须等待FF1
的稳定,以此类推。 - 总延迟时间: 对于一个N位异步计数器,总的延迟时间为
tp(tot) = N * t_p
(其中t_p
是单个触发器的延迟)。 - 最高时钟频率: 这个总延迟限制了计数器能够正常工作的最高时钟频率
f_max = 1 / tp(tot)
。位数越多,延迟越大,速度越慢。
2.3 异步十进制计数器 (Asynchronous Decade Counters)
- 模 (Modulus): 计数器在一个完整周期中所包含的独立状态的数量。一个N位二进制计数器的最大模为 2ⁿ。
- 截断序列 (Truncated Sequence): 有时我们需要的状态数少于 2ⁿ。例如,十进制计数器需要10个状态(0到9),而不是4位计数器所能提供的16个状态。这种序列被称为截断序列。
工作原理:
为了实现十进制计数,我们使用一个4位计数器,并通过外部逻辑在计数到10(二进制 1010
)时立即将其复位 (Reset) 到0。
- 电路: 当输出
Q₃
和Q₁
同时为1时(代表数值10),NAND门的输出变为低电平,触发所有触发器的CLR
(清零)端,使计数器复位到0000
。 - 毛刺 (Glitch): 在电路复位之前,计数器会短暂地进入
1010
这个无效状态。这个短暂的、不希望出现的状态被称为“毛刺”。这是异步电路中常见的问题。
第三部分:同步计数器 (Synchronous Counters)
3.1 定义与工作原理
为了克服异步计数器的速度限制,我们使用同步计数器。其核心特点是:所有触发器的时钟输入端都连接到同一个外部时钟信号。 这意味着所有触发器的状态变化是同时发生的(在同一个时钟沿)。
示例:一个2位同步计数器
- 电路结构:
FF0
和FF1
的时钟输入端C
都连接到CLK
。FF0
的J、K输入接高电平(HIGH),使其在每个时钟脉冲都翻转。FF1
的J、K输入连接到FF0
的输出Q₀
。这意味着FF1
只有在Q₀
为1时,才会在下一个时钟脉冲翻转。
- 优点: 由于所有状态都在同一时间更新,消除了异步计数器的累积延迟问题,因此可以工作在更高的时钟频率下。
3.2 3位与4位同步二进制/十进制计数器
-
3位同步计数器: 逻辑更加复杂。
FF2
的翻转条件是Q₁
和Q₀
同时为1。这通过一个与门来实现。 -
4位同步十进制计数器: 逻辑更加复杂,需要设计特定的逻辑电路来控制J-K输入,以实现从
1001
(9) 到0000
的跳转。其逻辑表达式如下,具体推导过程将在设计部分讲解。J₁ = K₁ = Q̅₀Q₃
J₂ = K₂ = Q₀Q₁
J₃ = K₃ = Q₀Q₁Q₂ + Q₀Q₃
3.3 向上/向下同步计数器 (Up/Down Synchronous Counters)
这种计数器,也称为双向计数器 (Bidirectional Counter),可以根据一个控制信号来改变计数方向。
- 工作原理:
- 有一个
UP/DOWN
控制输入。 - 当
UP/DOWN
为高电平(向上计数)时,进位逻辑(例如Q₀
控制FF1
)正常工作。 - 当
UP/DOWN
为低电平(向下计数)时,进位逻辑会使用前一个触发器的反向输出(例如Q̅₀
控制FF1
),从而实现向下计数。 - 逻辑表达式清晰地展示了这种控制:
J₁ = K₁ = (Q₀ ⋅ UP) + (Q̅₀ ⋅ DOWN)
- 有一个
第四部分:同步计数器的设计
设计任何一个具有特定序列的同步计数器,都可以遵循以下六个标准步骤。
设计步骤:
- 状态图 (State Diagram): 画出计数器需要遵循的状态转换顺序。
- 次态表 (Next-State Table): 将状态图转换成表格形式,列出每个“当前状态”对应的“下一个状态”。
- 触发器转换表 (Flip-Flop Transition Table): 根据所选的触发器类型(如J-K或D),确定从当前态转换到次态时,触发器的输入应该是什么。
- 卡诺图 (Karnaugh Maps): 为每个触发器的每个输入建立一个卡诺图,并根据次态表和转换表填入数据。
- 逻辑表达式 (Logic Expressions): 从卡诺图中化简得出每个触发器输入的最简逻辑表达式。
- 电路实现 (Counter Implementation): 根据逻辑表达式画出最终的电路图。
示例:设计一个3位格雷码 (Gray Code) 计数器
-
Step 1 & 2: 状态图和次态表
-
Step 3 & 4: 转换表和卡诺图 使用J-K触发器的转换表,并为
J₀, K₀, J₁, K₁, J₂, K₂
六个输入分别建立卡诺图。 -
Step 5: 逻辑表达式 通过化简卡诺图得到:
J₀ = Q₂Q₁ + Q̅₂Q̅₁ = Q₂ ⊕ Q₁
K₀ = Q₂Q₁ + Q̅₂Q̅₁ = Q₂ ⊕ Q₁
J₁ = Q̅₂Q₀
K₁ = Q₂Q₀
J₂ = Q₁Q̅₀
K₂ = Q̅₁Q̅₀
-
Step 6: 电路实现 根据上述表达式连接逻辑门和触发器。
第五部分:高级计数器技术
5.1 级联计数器 (Cascaded Counters)
当需要一个比单个芯片能提供的模更大的计数器时,可以将多个计数器级联(串联)起来。
-
异步级联: 第一个计数器的输出作为第二个计数器的时钟。总模数是各个计数器模数的乘积。例如,一个模4计数器和一个模8计数器级联,得到一个模32 (
4 * 8
) 的计数器。 -
同步级联: 所有计数器共享同一个时钟。第一个计数器达到其终端计数值 (Terminal Count) 时,会产生一个输出信号(如RCO)来使能 (Enable) 第二个计数器。这种方式速度更快,性能更好。例如,两个模10的计数器同步级联,可以构成一个模100 (
10 * 10
) 的计数器。 -
带截断序列的级联: 可以通过预置 (Preset) 计数器的初始值来实现任意模的计数。例如,要实现一个模40,000的计数器,可以使用一个最大模为 65,536 (2¹⁶) 的16位计数器。每次计数器溢出时,不让它回到0,而是将其预置到
65,536 - 40,000 = 25,536
。这样,它只需计数40,000次就会再次溢出。
5.2 计数器译码 (Counter Decoding)
译码是指使用逻辑门(如与门)来检测计数器何时处于某个特定状态。
-
示例: 要检测3位计数器何时处于状态6(二进制
110
),可以使用一个三输入与门,其输入分别为Q₂
,Q₁
, 和Q̅₀
。当Q₂=1
,Q₁=1
,Q₀=0
时,该与门的输出为高电平。 -
译码毛刺 (Decoding Glitches): 由于触发器输出存在微小的延迟差异,计数器在从一个状态转换到下一个状态时,可能会短暂地出现不正确的中间状态。这会导致译码电路产生错误的尖峰脉冲(毛刺)。
-
解决方案: 使用一个选通信号 (Strobe) 来消除毛刺。通常,可以将时钟信号的反相信号用作译码器的使能端。这样,译码器只在时钟为低电平、计数器输出稳定的期间工作,从而忽略了在时钟上升沿附近可能发生的毛刺。
第六部分:计数器应用
6.1 数字时钟
数字时钟是计数器的经典应用。
- 时钟源: 通常使用一个60Hz的交流电信号,通过整形电路转换成稳定的60Hz脉冲信号。
- 秒/分计数器: 使用一个模60的计数器。这通常由一个模10计数器和一个模6计数器级联而成。它们从0计数到59,然后循环。
- 小时计数器: 逻辑稍微复杂,需要从1计数到12,然后循环。
- 显示: 计数器的输出(通常是BCD码)被送到 BCD-7段译码器,驱动数码管显示数字。
6.2 并行到串行数据转换 (P/S Data Conversion)
在数据通信中,经常需要将并行数据(多位同时传输)转换为串行数据(一位一位地传输)。
- 电路: 使用一个计数器和一个多路选择器 (Multiplexer, MUX)。
- 工作原理:
- 并行的8位数据连接到多路选择器的8个数据输入端。
- 一个3位计数器(可以从000数到111)的输出连接到多路选择器的选择端。
- 随着时钟脉冲,计数器从000循环到111,依次选中了D₀, D₁, D₂, …, D₇,并将它们送到单根串行输出线上。
- 8个时钟周期后,一个字节的并行数据就转换成了一串串行数据。
第七部分:章节回顾与测验
7.1 章节回顾
- 计数器: 基本概念,分为异步和同步两种。
- 异步计数器: 结构简单,但有累积延迟,速度慢。
- 同步计数器: 速度快,性能好,但电路设计更复杂。
- 向上/向下计数器: 可改变计数方向的双向计数器。
- 同步计数器设计: 学习了设计的六个步骤。
- 级联计数器: 用于扩展计数器的模。
- 计数器译码: 用于检测计数器的特定状态,并需要注意毛刺问题。
7.2 随堂测验 (判断题)
-
同步计数器不能用J-K触发器实现。
- 错误 (False)。同步和异步计数器都可以用J-K触发器实现。J-K触发器功能强大,是设计计数器的常用选择。
-
异步计数器也被称为纹波计数器。
- 正确 (True)。因为时钟信号像波纹一样逐级通过触发器链。
-
一个十进制计数器有12个状态。
- 错误 (False)。十进制(decade)计数器有10个状态(0到9)。
-
一个有四个级(four stages)的计数器最大模为16。
- 正确 (True)。四级意味着有4个触发器(4位),最大模为 2⁴ = 16。
-
要实现最大模为32,需要16级。
- 错误 (False)。要实现模32,需要 2ⁿ ≥ 32,所以 n=5 即可,即需要5级(5个触发器)。
-
如果一个4位向上/向下计数器当前状态是1000,在向下计数模式下,下一个状态是0111。
- 正确 (True)。1000 (8) 向下计数一位是 0111 (7)。
-
两个级联的十进制计数器将时钟频率分频10倍。
- 错误 (False)。两个级联的十进制计数器构成一个模100 (
10 * 10
) 的计数器,它会将时钟频率分频100倍。
- 错误 (False)。两个级联的十进制计数器构成一个模100 (
-
一个带有截断序列的计数器的状态数比其最大可能的状态数要少。
- 正确 (True)。例如,4位十进制计数器有10个状态,少于其最大可能的16个状态。
-
要实现模100,需要10个十进制计数器。
- 错误 (False)。要实现模100,只需要将两个模10的十进制计数器级联即可 (
10 * 10 = 100
)。
- 错误 (False)。要实现模100,只需要将两个模10的十进制计数器级联即可 (