3917 字
20 分钟
ECE2050-Chapter10
2025-08-24

好的,这份中文自学讲义根据您提供的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 输入都连接到其自身的 输出,这使得触发器在每个时钟有效沿都会翻转(状态从0变1,或从1变0)。
  • 工作过程:
    1. 初始状态: Q₁Q₀ = 00
    2. 第1个时钟脉冲: CLK 的下降沿使 FF0 翻转,Q₀ 从0变为1。Q̅₀ 从1变为0,这个下降沿触发 FF1,但由于是上升沿触发,所以FF1不变。状态变为 01
    3. 第2个时钟脉冲: CLK 的下降沿使 FF0 再次翻转,Q₀ 从1变为0。Q̅₀ 从0变为1,这个上升沿触发 FF1,使其翻转,Q₁ 从0变为1。状态变为 10
    4. 第3个时钟脉冲: CLK 的下降沿使 FF0 翻转,Q₀ 从0变为1。状态变为 11
    5. 第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位同步计数器

  • 电路结构:
    • FF0FF1 的时钟输入端 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)

第四部分:同步计数器的设计#

设计任何一个具有特定序列的同步计数器,都可以遵循以下六个标准步骤。

设计步骤:

  1. 状态图 (State Diagram): 画出计数器需要遵循的状态转换顺序。
  2. 次态表 (Next-State Table): 将状态图转换成表格形式,列出每个“当前状态”对应的“下一个状态”。
  3. 触发器转换表 (Flip-Flop Transition Table): 根据所选的触发器类型(如J-K或D),确定从当前态转换到次态时,触发器的输入应该是什么。
  4. 卡诺图 (Karnaugh Maps): 为每个触发器的每个输入建立一个卡诺图,并根据次态表和转换表填入数据。
  5. 逻辑表达式 (Logic Expressions): 从卡诺图中化简得出每个触发器输入的最简逻辑表达式。
  6. 电路实现 (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)
  • 工作原理:
    1. 并行的8位数据连接到多路选择器的8个数据输入端。
    2. 一个3位计数器(可以从000数到111)的输出连接到多路选择器的选择端。
    3. 随着时钟脉冲,计数器从000循环到111,依次选中了D₀, D₁, D₂, …, D₇,并将它们送到单根串行输出线上。
    4. 8个时钟周期后,一个字节的并行数据就转换成了一串串行数据。

第七部分:章节回顾与测验#

7.1 章节回顾#

  • 计数器: 基本概念,分为异步和同步两种。
  • 异步计数器: 结构简单,但有累积延迟,速度慢。
  • 同步计数器: 速度快,性能好,但电路设计更复杂。
  • 向上/向下计数器: 可改变计数方向的双向计数器。
  • 同步计数器设计: 学习了设计的六个步骤。
  • 级联计数器: 用于扩展计数器的模。
  • 计数器译码: 用于检测计数器的特定状态,并需要注意毛刺问题。

7.2 随堂测验 (判断题)#

  1. 同步计数器不能用J-K触发器实现。

    • 错误 (False)。同步和异步计数器都可以用J-K触发器实现。J-K触发器功能强大,是设计计数器的常用选择。
  2. 异步计数器也被称为纹波计数器。

    • 正确 (True)。因为时钟信号像波纹一样逐级通过触发器链。
  3. 一个十进制计数器有12个状态。

    • 错误 (False)。十进制(decade)计数器有10个状态(0到9)。
  4. 一个有四个级(four stages)的计数器最大模为16。

    • 正确 (True)。四级意味着有4个触发器(4位),最大模为 2⁴ = 16。
  5. 要实现最大模为32,需要16级。

    • 错误 (False)。要实现模32,需要 2ⁿ ≥ 32,所以 n=5 即可,即需要5级(5个触发器)。
  6. 如果一个4位向上/向下计数器当前状态是1000,在向下计数模式下,下一个状态是0111。

    • 正确 (True)。1000 (8) 向下计数一位是 0111 (7)。
  7. 两个级联的十进制计数器将时钟频率分频10倍。

    • 错误 (False)。两个级联的十进制计数器构成一个模100 (10 * 10) 的计数器,它会将时钟频率分频100倍。
  8. 一个带有截断序列的计数器的状态数比其最大可能的状态数要少。

    • 正确 (True)。例如,4位十进制计数器有10个状态,少于其最大可能的16个状态。
  9. 要实现模100,需要10个十进制计数器。

    • 错误 (False)。要实现模100,只需要将两个模10的十进制计数器级联即可 (10 * 10 = 100)。
ECE2050-Chapter10
https://chr0mium.link/posts/ece2050-chapter10/
作者
Cr
发布于
2025-08-24
许可协议
CC BY-NC-SA 4.0