4. 时钟与复位电路:晶振电路设计、时钟分配网络、复位电路设计要点
时钟和复位,是数字系统的“心跳”和“总闸”。
我见过不少项目,功能逻辑调得通通透透,一上电就跑飞,或者时序乱得一塌糊涂。十有八九,问题都出在这两个地方。说白了,时钟抖一抖,系统抖三抖;复位没做好,启动就翻车。
这一章,咱们就把晶振怎么选、时钟树怎么分、复位怎么给,掰开揉碎了讲清楚。
4.1 晶振电路设计:给系统一个稳定的“心跳”
晶振电路看着简单,就一个晶体加俩电容,但坑不少。
4.1.1 晶体 vs 振荡器:选哪个?
| 类型 | 内部结构 | 输出信号 | 典型应用 | 成本 |
|---|---|---|---|---|
| 无源晶体(Crystal) | 仅石英谐振片 | 差分正弦波(需芯片内部振荡器配合) | MCU、SoC 主时钟 | 低 |
| 有源振荡器(Oscillator) | 晶体 + 振荡电路 + 整形 | 方波(CMOS / LVCMOS) | FPGA、高速SerDes、以太网PHY | 高 |
我个人习惯:MCU 项目能用无源晶体就用无源晶体,便宜且灵活。但遇到 FPGA 或者对抖动要求严苛的高速接口,我直接上有源振荡器,省心。
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 就对了。
4.1.3 PCB 布局要点
- 晶体尽量靠近芯片:走线长度控制在 10mm 以内。
- 包地处理:晶体下方不要走其他信号线,尤其是高频数字线。
- 电容对称放置:两个匹配电容要对称,且靠近晶体引脚。
- 避免过孔:晶体走线不要打过孔,寄生电感会影响起振。
4.2 时钟分配网络:把“心跳”送到每个角落
时钟分配,说白了就是怎么把晶振产生的那一个干净时钟,分发给芯片里几十上百个模块,同时保证每个模块收到的时钟质量不下降。
4.2.1 时钟拓扑结构
常见的时钟分配拓扑有三种:
- H 树(H-Tree):等长走线,时钟偏斜最小,适合片上时钟分配。
- 时钟缓冲树(Clock Buffer Tree):用多级缓冲器驱动扇出,适合板级多负载场景。
- PLL 分频扇出:先倍频再分频,适合多频率需求。
下面这张图展示了板级时钟分配网络的典型结构:
4.2.2 时钟偏斜(Skew)与抖动(Jitter)
这两个概念容易混淆,我简单区分一下:
- 时钟偏斜(Skew):同一时钟到达不同负载的时间差。说白了就是“谁先到、谁后到”。
- 时钟抖动(Jitter):时钟边沿在时间轴上的随机偏移。说白了就是“该到的时候没到”。
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 复位信号处理
复位信号最容易出问题的地方是:毛刺和异步。
典型的复位电路设计:
// 异步复位、同步释放(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 复位网络设计
和时钟一样,复位信号也需要“分配”。
- 全局复位:所有模块共用同一个复位信号。
- 局部复位:不同模块有独立的复位信号,方便调试。
- 复位树:用缓冲器驱动多个负载,保证复位信号边沿陡峭。
4.3.4 复位时序要求
复位信号必须满足芯片手册的时序要求:
| 参数 | 说明 | 典型要求 |
|---|---|---|
| 复位脉冲宽度 | 复位信号保持有效的时间 | > 10ms(上电复位) |
| 复位释放时间 | 复位释放后到时钟稳定的时间 | > 100μs |
| 复位与时钟关系 | 复位释放必须在时钟稳定之后 | 先稳时钟,再释放复位 |
嗯,这里要注意:很多芯片要求复位释放时,时钟已经稳定。如果时钟还没稳定就释放复位,状态机可能进入未知状态。我一般会在电源监控芯片上加一个延迟输出,确保时钟稳定后再释放复位。
4.4 本章小结
时钟和复位,是硬件设计的“基本功”。
- 晶振电路:匹配电容别算错,布局要靠近芯片。
- 时钟分配:等长走线、缓冲器选型、注意偏斜和抖动。
- 复位电路:异步复位同步释放、去抖处理、时序要求。
这些细节,看起来不起眼,但每一个都是前人踩过的坑。你想想看,如果时钟抖了 100ps,高速接口可能就误码了;如果复位没做同步,系统可能永远跑不起来。所以,别嫌麻烦,该做的处理一个都不能少。