4. 时钟与复位电路:晶振电路设计、时钟分配网络、复位电路设计要点

时钟和复位,是数字系统的“心跳”和“总闸”。

我见过不少项目,功能逻辑调得通通透透,一上电就跑飞,或者时序乱得一塌糊涂。十有八九,问题都出在这两个地方。说白了,时钟抖一抖,系统抖三抖;复位没做好,启动就翻车。

这一章,咱们就把晶振怎么选、时钟树怎么分、复位怎么给,掰开揉碎了讲清楚。

4.1 晶振电路设计:给系统一个稳定的“心跳”

晶振电路看着简单,就一个晶体加俩电容,但坑不少。

4.1.1 晶体 vs 振荡器:选哪个?

类型 内部结构 输出信号 典型应用 成本
无源晶体(Crystal) 仅石英谐振片 差分正弦波(需芯片内部振荡器配合) MCU、SoC 主时钟 低
有源振荡器(Oscillator) 晶体 + 振荡电路 + 整形 方波(CMOS / LVCMOS) FPGA、高速SerDes、以太网PHY 高

我个人习惯:MCU 项目能用无源晶体就用无源晶体,便宜且灵活。但遇到 FPGA 或者对抖动要求严苛的高速接口,我直接上有源振荡器,省心。

经验之谈: 无源晶体的负载电容(CL)必须和芯片手册匹配。我曾经在一个项目里用了 12pF 的晶体,结果芯片手册要求 18pF,起振时间长了 3 倍,低温下干脆不起振。后来换了匹配的晶体,问题解决。

4.1.2 匹配电容计算

匹配电容不是随便选的。公式很简单:

CL = (C1 * C2) / (C1 + C2) + Cstray

其中 Cstray 是 PCB 走线和引脚寄生电容,一般取 2~5pF。

举个例子:晶体要求 CL=18pF,Cstray 估算 3pF,那么:

18 = (C1 * C2) / (C1 + C2) + 3
假设 C1 = C2 = C,则:
18 = C/2 + 3  →  C = 30pF

所以两个匹配电容都选 30pF 就对了。

注意: 匹配电容不要选太大,否则起振电流大、功耗高;也不要选太小,否则频率偏差大。我曾经见过有人为了省成本,把 30pF 换成 10pF,结果频率偏了 200ppm,串口通信直接乱码。

4.1.3 PCB 布局要点

  • 晶体尽量靠近芯片:走线长度控制在 10mm 以内。
  • 包地处理:晶体下方不要走其他信号线,尤其是高频数字线。
  • 电容对称放置:两个匹配电容要对称,且靠近晶体引脚。
  • 避免过孔:晶体走线不要打过孔,寄生电感会影响起振。

4.2 时钟分配网络:把“心跳”送到每个角落

时钟分配,说白了就是怎么把晶振产生的那一个干净时钟,分发给芯片里几十上百个模块,同时保证每个模块收到的时钟质量不下降。

4.2.1 时钟拓扑结构

常见的时钟分配拓扑有三种:

  • H 树(H-Tree):等长走线,时钟偏斜最小,适合片上时钟分配。
  • 时钟缓冲树(Clock Buffer Tree):用多级缓冲器驱动扇出,适合板级多负载场景。
  • PLL 分频扇出:先倍频再分频,适合多频率需求。

下面这张图展示了板级时钟分配网络的典型结构:

板级时钟分配网络典型结构 有源振荡器 50MHz 时钟缓冲器 1:4 FPGA (Bank 3) 以太网 PHY DDR 控制器 备用 / 扩展接口 每个分支走线需等长,且远离开关电源等噪声源

4.2.2 时钟偏斜(Skew)与抖动(Jitter)

这两个概念容易混淆,我简单区分一下:

  • 时钟偏斜(Skew):同一时钟到达不同负载的时间差。说白了就是“谁先到、谁后到”。
  • 时钟抖动(Jitter):时钟边沿在时间轴上的随机偏移。说白了就是“该到的时候没到”。
避坑指南: 我曾经在一个多板互联的项目里,因为时钟走线没做等长,导致两个 FPGA 之间的时钟偏斜差了 1.2ns。结果高速接口怎么调都调不通,最后用示波器一量才发现问题。后来加了蛇形走线做等长,偏斜降到 50ps 以内,问题解决。

4.2.3 时钟缓冲器选型

参数 说明 典型值
扇出数 输出通道数量 1:4 / 1:8 / 1:10
附加抖动 缓冲器自身引入的抖动 < 0.1ps RMS
输出类型 LVCMOS / LVDS / HCSL 根据负载选择
工作频率 最大支持频率 200MHz ~ 2GHz

我建议:对于高速时钟(>100MHz),优先选 LVDS 或 HCSL 输出的缓冲器,抗干扰能力强。低速时钟用 LVCMOS 就行,便宜。

4.3 复位电路设计要点:让系统“干净”地启动

复位电路看着简单,但设计不好,系统可能永远跑不起来,或者跑着跑着莫名其妙复位。

4.3.1 复位类型

  • 上电复位(POR):芯片内部检测电源上升,自动复位。
  • 外部手动复位:按键或外部信号触发。
  • 看门狗复位:系统死机时自动复位。
  • 软件复位:通过寄存器触发复位。

4.3.2 复位信号处理

复位信号最容易出问题的地方是:毛刺和异步。

重要: 复位信号必须做去抖和同步处理。我曾经见过一个项目,复位按键没做去抖,结果按键按下时产生了几微秒的毛刺,导致 FPGA 内部状态机进入非法状态。后来加了一个 RC 低通滤波 + 施密特触发器,问题解决。

典型的复位电路设计:

// 异步复位、同步释放(Asynchronous Reset, Synchronous Release)
module reset_sync (
    input  wire clk,
    input  wire rst_n_async,
    output reg  rst_n_sync
);

reg rst_n_meta;

always @(posedge clk or negedge rst_n_async) begin
    if (!rst_n_async) begin
        rst_n_meta <= 1'b0;
        rst_n_sync <= 1'b0;
    end else begin
        rst_n_meta <= 1'b1;
        rst_n_sync <= rst_n_meta;
    end
end

endmodule

这个电路的作用:

  • 异步复位:不管时钟有没有,复位信号一来,立刻复位。
  • 同步释放:复位释放时,等时钟沿来才释放,避免亚稳态。

4.3.3 复位网络设计

和时钟一样,复位信号也需要“分配”。

  • 全局复位:所有模块共用同一个复位信号。
  • 局部复位:不同模块有独立的复位信号,方便调试。
  • 复位树:用缓冲器驱动多个负载,保证复位信号边沿陡峭。
经验之谈: 我习惯在 FPGA 设计中,把全局复位信号先做一次“异步复位、同步释放”,然后再分发给各个模块。这样既保证了复位及时性,又避免了亚稳态。另外,复位信号走线要远离时钟线,防止串扰导致误复位。

4.3.4 复位时序要求

复位信号必须满足芯片手册的时序要求:

参数 说明 典型要求
复位脉冲宽度 复位信号保持有效的时间 > 10ms(上电复位)
复位释放时间 复位释放后到时钟稳定的时间 > 100μs
复位与时钟关系 复位释放必须在时钟稳定之后 先稳时钟,再释放复位

嗯,这里要注意:很多芯片要求复位释放时,时钟已经稳定。如果时钟还没稳定就释放复位,状态机可能进入未知状态。我一般会在电源监控芯片上加一个延迟输出,确保时钟稳定后再释放复位。

4.4 本章小结

时钟和复位,是硬件设计的“基本功”。

  • 晶振电路:匹配电容别算错,布局要靠近芯片。
  • 时钟分配:等长走线、缓冲器选型、注意偏斜和抖动。
  • 复位电路:异步复位同步释放、去抖处理、时序要求。

这些细节,看起来不起眼,但每一个都是前人踩过的坑。你想想看,如果时钟抖了 100ps,高速接口可能就误码了;如果复位没做同步,系统可能永远跑不起来。所以,别嫌麻烦,该做的处理一个都不能少。