进阶 #hardware

计数器

计数器(Counter)是用触发器级联实现的二进制计数值电路,广泛用于分频、定时和寻址

什么是计数器?

你有没有想过——你的运动手环是怎么知道你走了多少步的?机械手表为什么能精确计时?

它们的核心都是一个计数器(Counter)——一个能对脉冲个数进行计数的电路。

计数器是时序逻辑电路的重要应用。将多个 D 触发器 级联,每个触发器的输出会随着时钟脉冲自动翻转,实现对脉冲个数的二进制计数

计数器的本质是一个累加记忆电路——每来一个时钟脉冲,计数值加 1。

3 位二进制计数器

将 3 个 D 触发器级联,每个触发器的 Q̅ 输出接回自己的 D 输入(构成翻转模式),前一级的输出作为后一级的时钟:

🔄 为什么会翻转? 回忆一下 D 触发器的工作原理:D 输入的值会在时钟上升沿被保存到 Q。如果把 Q̅(Q 的反相)接到 D,那么当 Q=1 时,Q̅=0,下次时钟到来时 D=0,Q 就变成 0——这就实现了每次时钟触发时自动翻转。这种接法叫T 触发器模式(Toggle)。

graph LR
    CLK[时钟脉冲] --> FF0
    FF0[FF₀<br>最低位] --> FF1[FF₁<br>中间位]
    FF1 --> FF2[FF₂<br>最高位]

    FF0 --> Q0[Q₀]
    FF1 --> Q1[Q₁]
    FF2 --> Q2[Q₂]

当每个触发器的 D 端连接到自己的 Q̅ 时,每个时钟周期触发器都会翻转一次(T 触发器模式)。因此:

  • FF₀:每个时钟翻转
  • FF₁:Q₀ 从 1→0 时翻转
  • FF₂:Q₁ 从 1→0 时翻转

计数序列

时钟脉冲Q₂Q₁Q₀十进制值
00000
10011
20102
30113
41004
51015
61106
71117
80000(归零)

8 个时钟周期完成一个循环,这就是 模 8 计数器(3 位计数器)。

行波计数器

上面的电路叫行波计数器(Ripple Counter)——进位像波浪一样逐级传递。优点是电路简单,缺点是:

  • 每级触发器有传播延迟(几十纳秒)
  • 级数越多,总延迟越大
  • 高频时可能出现计数错误
graph LR
    subgraph RIPPLE[行波计数器]
        CLK --> FF0
        FF0 -->|Q₀ 作为时钟| FF1
        FF1 -->|Q₁ 作为时钟| FF2
    end

N 位行波计数器的最高工作频率受限于 N × 单级延迟。

同步计数器

同步计数器(Synchronous Counter) 所有触发器共享同一个时钟,用组合逻辑判断何时翻转:

graph LR
    CLK[时钟] --> FF0
    CLK --> FF1
    CLK --> FF2

    AND1[与门] --> FF1
    AND2[与门] --> FF2

    FF0 --> AND1
    FF0 --> AND2
    FF1 --> AND2
  • FF₀ 每个时钟翻转
  • FF₁ 在 Q₀=1 时翻转
  • FF₂ 在 Q₀=1 且 Q₁=1 时翻转

所有触发器同时翻转,没有级联延迟,适合高频应用。

分频器

计数器的另一个重要用途是分频

  • Q₀ 的频率是时钟的 1/2
  • Q₁ 的频率是时钟的 1/4
  • Q₂ 的频率是时钟的 1/8

这就是 D 触发器 中提到的”分频器”应用——每个触发器将频率减半。

实际应用

  • 程序计数器(PC):CPU 中的程序计数器本质上就是一个计数器,每执行一条指令自动加 1,指向下一条指令的地址
  • 定时器:对已知频率的时钟脉冲计数,实现精确的时间测量
  • 频率计:测量外部信号的频率
  • 地址发生器:按顺序访问内存地址

小结

计数器是触发器级联的典型应用。从行波计数器到同步计数器,体现了”用更多逻辑门换取更高速度”的工程设计思想。计数器与 寄存器 都是 CPU 中的重要基础部件。

接下来,我们将学习如何用寄存器阵列构建更大规模的存储结构——随机存取存储器