第4章 源同步接口的时序分析
RGMII 本质上是一种源同步接口。什么意思呢?就是发送端自己产生时钟,和数据一起送出去。接收端直接用这个时钟去采数据。听起来比全局时钟简单,对吧?但实际做起来,坑一点不少。
我早年做第一个百兆项目时,觉得 RGMII 不就是四根线嘛,PCB 走线等长不就行了?结果板子回来,偶尔丢包。查了三天,最后发现是时钟和数据之间有个很小的相位偏移,导致建立时间不够。嗯,从那以后,我每次画 RGMII 布局前,都要仔细算一遍时序裕量。
4.1 源同步接口的时序要素
要理解时序分析,先得说清楚几个关键参数。你想想看,接收端看到的数据和时钟是什么关系?
- Tcycle:时钟周期。千兆 RGMII 是 125 MHz,周期 8 ns。
- Tco:发送端从时钟边沿到数据输出的延迟。通常芯片手册会给出最小值/最大值。
- Tskew:时钟与数据之间的偏斜。RGMII 要求时钟边沿对齐数据中间,理想偏斜是 0,但实际有误差。
- Tsetup:接收端需要的建立时间。
- Thold:接收端需要的保持时间。
说白了,时序分析就是算一笔账:数据从发送端出来,经过 PCB 走线,到达接收端,比时钟早到多久?晚到多久?这笔账算不清楚,板子就不可能稳定工作。
4.2 时序裕度计算公式
RGMII 的接收时序分析,核心是两个不等式。用文字说就是:
- 建立时间裕度 = (数据到达时间 - 时钟到达时间) - Tsetup
- 保持时间裕度 = (时钟到达时间 - 数据到达时间) - Thold
把具体参数带进去,比如一个典型千兆 PHY 芯片:Tco(min)=0.5 ns,Tco(max)=2.0 ns,PCB 走线延迟按 150 ps/inch 估算,假设你的走线长度差控制在 0.5 inch 以内。那么:
| 参数 | 最小值 (ns) | 最大值 (ns) |
|---|---|---|
| Tco | 0.5 | 2.0 |
| PCB 走线延迟差 | 0 | 0.3 |
| 总偏斜 Tskew | 0.5 | 2.3 |
| 接收端 Tsetup | 1.0 | |
| 接收端 Thold | 0.5 | |
你看,在最差情况下,数据相对时钟只提前 0.5 ns 到达。而接收端需要 1.0 ns 的建立时间。这显然不满足!所以必须加内部延时,比如在 FPGA 里用 IDELAY 把数据往后推 1.5 ns,或者用 PLL 把时钟相位移 90°。
4.3 我的实战避坑清单
- 走线等长≠时序满足:等长只是减少 PCB 延迟差,但芯片内部的 Tco 差异才是大头。所以每个 RGMII 通道都要单独做延时校准。
- 别信仿真数据:板厂给的 PCB 延迟模型往往偏理想。我吃过亏:仿真通过,量产 10% 的板子不稳定。后来干脆在 FPGA 里加自动校准逻辑,跑一次调一次。
- 双沿采样是重点:RGMII 在时钟上升沿和下降沿都传数据。如果上升沿没问题,下降沿出问题,别急着怀疑芯片,先去查占空比。
4.4 时序分析流程框架
下面这张图,是我做 RGMII 调试时脑子里一直挂着的流程。每一步都对应一个检查点,回头翻也方便。
这套流程我用了好几年,每次新项目都会走一遍。平时 PCB 阶段就提前估算,等样板回来再用示波器实测数据与时钟边沿位置,对比手册给的范围。如果实测偏小,就在软件里把 FPGA 的 IDELAY 往上调一两档。
最后总结一句话:源同步接口的时序分析不是单纯的理论计算,而是“理论+实测+迭代”的过程。你只要把流程走通了,后续调延时就会变得很机械——上示波器、读芯片状态、调 IDELAY、确认眼图,重复三次就好了。