Skip to content
进阶#寄存器#计数器#分频器#移位寄存器#时序逻辑

寄存器、计数器与分频 ​

1. 设计动机 ​

<>

D 触发器记住 1 位;把 8 个 D 触发器并在一起,就记住了 1 个字节——这就是寄存器(Register),CPU 里所有"暂存"都靠它。把触发器的输出按规律接回输入,它就能自动加 1——这就是计数器(Counter),是计时、分频、地址生成的核心。

晶振给的是 50MHz 方波,要得到 1Hz 的 LED 闪烁、UART 的 115200 波特率,都要靠分频器(Divider)把高频时钟降下来。这三件套是数字系统的"节拍器"。

本章讲:寄存器(并行存数据)、计数器(自动加/减)、分频器(降频率)、移位寄存器(逐位移动)。

2. 原理与逻辑图 ​

2.1 寄存器 ​

nn 个 D 触发器共用同一时钟,每个 D 接一位输入,CLK 上升沿把 nn 位数据同时锁存到 QQ。带并行加载(Load)端的寄存器可在指定拍把数据写入。

2.2 同步计数器 ​

把每个 D 接成"Di=Qi⊕END_i=Q_i\oplus EN"(T 触发器结构),所有 FF 共用同一 CLK,EN=1 时每个沿所有位同时翻转。

4 位同步计数器:4 个 FF 共用 CLK,EN=1 时每拍加 1
4 位同步计数器:4 个 FF 共用 CLK,EN=1 时每拍加 1

2.3 行波计数器 ​

最低位 FF 用外部时钟,它的 Q 输出接下一级的时钟,像"行波"一样逐位传递。电路简单,但延迟逐位累积,且各位不在同一时刻翻转。

2.4 分频器 ​

计数器计到 NN 时产生一个脉冲并复位,输出脉冲频率就是输入时钟的 1/N1/N。

3. 静态分析(计数序列) ​

4 位同步计数器输出序列(EN=1):

拍Q3Q2Q1Q0十进制
000000
100011
200102
300113
…
14111014
15111115
1600000(回卷)

4. 动态分析(波形与分频) ​

同步计数器所有位同时更新,Q0 频率 = CLK/2,Q1 = CLK/4,Q2 = CLK/8,Q3 = CLK/16。下面是 4 位计数器各位的分频波形:

观察:每高一位,频率减半、周期加倍。这就是二进制计数器天然的分频能力。

5. 同步 vs 异步计数器 ​

  • 同步计数器:所有 FF 共用同一 CLK,同时更新,无行波延迟,最高频率高;但内部要加使能/进位逻辑。
  • 异步(行波)计数器:前级 Q 当后级时钟,电路最简;但延迟逐位累积,最高频率低,且各位不在同一时刻稳定(外部同时采样多位会读到过渡值)。
  • 工程选择:同步系统一律用同步计数器;行波只在极简分频/低速场合用。

6. 元件取值与工程权衡 ​

  • 分频比 NN:要 1Hz 闪烁,50MHz 时钟需 N=50 000 000N=50\,000\,000,计数器至少 26 位(225=33.5M<50M<226=67M2^{25}=33.5\text{M}<50\text{M}<2^{26}=67\text{M})。
  • 占空比:N 分频若用"计到 N 复位",输出占空比 ≈ 1/N1/N(窄脉冲);要 50% 占空比需对称分频或取上下沿。
  • 计数器位宽:按最大计数量程选,多余位浪费翻转功耗。
  • 行波 vs 同步:高频选同步;极简低速可选行波,但不要用行波输出同时做多位总线采样。

7. 完整设计示例 ​

<>
  1. 需求:50MHz 晶振,让 LED 每秒亮灭一次(0.5Hz 翻转,1Hz 闪烁周期)。
  2. 算分频比:每秒需要 0.5 次翻转,即每 50 000 00050\,000\,000 个时钟翻转一次。N=50 000 000N=50\,000\,000。
  3. 选位宽:225=33,554,432<50M2^{25}=33{,}554{,}432<50\text{M},226=67,108,864>50M2^{26}=67{,}108{,}864>50\text{M},用 26 位计数器。
  4. 实现:26 位计数器计到 49 999 99949\,999\,999 时,把某个 FF 的 Q 作为翻转使能(或直接比较输出 1Hz 方波)。
  5. 验算:50MHz / 50M = 1Hz,LED 每秒翻转一次,肉眼看到约 1Hz 闪烁。
  6. 注意:直接用计数器高位 Q3 只能得到 50MHz/226≈0.752^{26}\approx0.75Hz,不够精确;要精确 1Hz 必须用 N 分频比较复位。

8. 仿真与实验 ​

在 Logisim 中:

  • 搭 4 位同步计数器,输出接七段数码管,验证从 0 数到 F 循环。
  • 改行波计数器,用逻辑分析仪看各位 Q 的到达时刻差(行波延迟)。
  • 搭 N 分频器:计数器计到 5 时复位,观察输出频率 = CLK/5。
  • 搭 4 位移位寄存器,串行输入一个 4 位数,4 个时钟后从 Q3 串行移出、并行从 Q0~Q3 读出。

扩展与变种电路 ​

扩展1:行波计数器 Ripple Counter ​

电路最简的计数器:前级 Q 直接当后级时钟,无需额外进位逻辑。

4 位行波计数器:Q0 时钟 FF1,Q1 时钟 FF2…延迟逐位累积
4 位行波计数器:Q0 时钟 FF1,Q1 时钟 FF2…延迟逐位累积
<>
  • 每个 FF 接成 T=1(翻转模式),外部时钟只接 FF0。
  • Q0 是 CLK/2,Q1 是 Q0/2=CLK/4,依此类推。
  • 代价:FF1 要等 Q0 翻转后才被时钟,延迟 = FF0 的 tpdt_{pd};nn 位总延迟 = n⋅tpdn\cdot t_{pd}。

设计要点:行波计数器是异步时序,不适合高速。取值/对比:行波 vs 同步——行波省门、慢;同步费门、快。适用:低速分频、极简;不适用:高速数据通路、同时采样多位总线。

<>
  • 现象:计数器从 0111→1000 时,外部逻辑采样到 0110 或 0011。
  • 原因:行波各位逐位翻转,Q3 比 Q0 晚 3tpd3t_{pd},中间瞬间各位不一致。
  • 解决:同步计数器,或在采样前用一级寄存器把行波输出"对齐"锁存。

扩展2:N 分频器 Divide-by-N ​

计数器 + 比较器,计到 N 就复位,输出固定分频比的时钟。

N 分频器:计数器计到 N 时比较器输出 TC 复位计数器,fout=fclk/N
N 分频器:计数器计到 N 时比较器输出 TC 复位计数器,fout=fclk/N
<>
  • 计数器从 0 计到 N−1,比较器检测 Q==N−1(或 N)时产生复位/使能脉冲。
  • 输出脉冲频率 fout=fclk/Nf_{out}=f_{clk}/N。
  • 占空比 ≈ 1/N1/N(窄脉冲);要 50% 占空比用 NN 偶数并取上下沿,或用约翰逊计数器。

设计要点:分频比 N 由比较值设定,改 N 即可改频率。取值/对比:二进制高位直接分频(N=2^k)vs N 分频(任意整数)——前者省比较器、后者精确。适用:UART 波特率、定时中断;不适用:需要 50% 占空比的精确时钟(除非对称设计)。

<>
  • 现象:计到 N 的瞬间复位脉冲太窄,触发器可能来不及复位。
  • 原因:比较器组合输出直接接复位,一计到 N 立刻清 0,比较条件消失,复位脉冲只有门延迟宽。
  • 解决:复位用同步释放,或用"计到 N 时停止计数一拍再清",保证复位脉冲宽度足够。

扩展3:移位寄存器 Shift Register ​

把 D 触发器首尾相连,数据每拍向右移一位,用于串并转换、延时线。

__4 位移位寄存器:Din 逐拍移入,4 拍后从 Dout 移出,Q0~Q3 并行输出

<>
  • 每个 CLK 沿:Q0←DinQ_0\leftarrow D_{in},Q1←Q0Q_1\leftarrow Q_0,Q2←Q1Q_2\leftarrow Q_1,Q3←Q2Q_3\leftarrow Q_2。
  • 串行输入 4 位,4 拍后从 Q0~Q3 并行读出——这就是"串入并出",UART 接收的核心。
  • 反向用就是"并入串出",UART 发送。

设计要点:移位寄存器位数 = 延时拍数。取值/对比:移位寄存器 vs FIFO——移位寄存器固定延时、FIFO 可变深度。适用:串并转换、延时、总线同步链;不适用:任意深度缓冲(用 FIFO)。

<>
  • 现象:慢时钟域数据经移位寄存器传到快时钟域,采到错误中间值。
  • 原因:移位寄存器每级延迟不同,数据在链上移动时各位不在同一时刻稳定。
  • 解决:跨时钟域单 bit 用两级同步器(一种特殊的移位寄存器),多 bit 用握手或异步 FIFO。

9. 常见坑与故障现象 ​

<>
  • 行波计数器当同步计数器用:高速时钟下行波各位还没稳定就被采样,输出随机错值。同步设计一律用同步计数器。
  • 分频占空比不对:直接用计数器高位输出得到窄脉冲,后级以为是 50% 方波。需要 50% 占空比要专门对称设计。
  • 计数器位宽不够:50MHz 分 1Hz 只用 24 位,224=16.7M<50M2^{24}=16.7\text{M}<50\text{M},分频比不对。按 NN 算位宽,不是拍脑袋。
  • 移位寄存器没共用时钟:某一级 CLK 接错,数据卡在某一级不动。所有 FF 必须同一时钟沿。

10. 自测题 ​

50MHz 时钟要得到 1kHz 信号,分频比 N 是多少?计数器至少几位?

N=50 000 000/1000=50 000N=50\,000\,000/1000=50\,000。215=32768<50000<216=655362^{15}=32768<50000<2^{16}=65536,计数器至少 16 位。

同步计数器和行波计数器哪个最高工作频率高?为什么?

同步计数器高。行波计数器的进位要逐位经过每个触发器的 tpdt_{pd},nn 位总延迟 n⋅tpdn\cdot t_{pd},时钟周期必须大于这个延迟;同步计数器所有位同时更新,关键路径只是一级触发器 + 使能逻辑,频率高得多。

4 位移位寄存器串行输入 1011,4 个时钟后 Q3Q2Q1Q0 是什么?

逐拍移入:第1拍 Q0=1;第2拍 Q0=0,Q1=1;第3拍 Q0=1,Q1=0,Q2=1;第4拍 Q0=1,Q1=1,Q2=0,Q3=1。即 Q3Q2Q1Q0 = 1011(原数原样右移进入寄存器)。

11. 参考资料 ​

  • M. Morris Mano, Digital Design,寄存器与计数器章节
  • sources/notes/free-textbooks-digest.md