3. 系统时钟与数据的关系
讲RGMII的延时校准,绕不开时钟与数据的相爱相杀。你可能看过不少文档,上来就是Tsu、Th、Tskew一堆公式。其实啊,把这件事想透了,后面调起参数来特别顺手。我个人习惯先掰扯清楚时钟到底怎么管数据的,然后再看延时怎么补偿。
3.1 为什么时钟是RGMII的灵魂?
RGMII用的是DDR(双数据率)采样,也就是说时钟的上升沿和下降沿都要锁存数据。一根时钟线,两个边沿,各管一套4bit数据。你想想看,两个沿之间只差半个时钟周期,数据窗口天然就窄。
举个例子,125MHz的时钟周期是8ns。上升沿到下降沿只有4ns。数据必须在这4ns内稳定下来,而且还不能碰到下一个沿的建立、保持时间。我在做一款千兆交换机的时候,第一次没注意时钟占空比,结果下降沿老丢包——其实就是占空比偏了0.5ns,数据的有效窗口被挤没了。
所以理解时钟,就是理解两个边沿的“分工”和“临界条件”。
3.2 时钟与数据的相对相位
说白了,MAC发给PHY的RGMII数据,是以时钟为参考的。发送端在时钟边沿附近把数据推出来,接收端要在同一个边沿附近把它抓进去。但物理走线总有延时,PCB上的走线长度、封装寄生参数都会让时钟和数据到达接收端的时间差发生变化。
这里引入两个关键参数:
- 建立时间(Tsu)——数据必须在时钟有效边沿之前稳定,并保持这个稳定状态一段最短时间。
- 保持时间(Th)——数据必须在时钟有效边沿之后继续稳定一段时间。
标准RGMII接口要求接收端内部对时钟进行相移(通常移90°或240°),让时钟的采样点在数据窗口的正中间。这样做的好处是抗干扰能力强,坏处是如果时钟的占空比或抖动超标,这个“中间位置”就会漂。
3.3 内部延时 vs 外部延时
RGMII规范里允许两种延时方式:
- 内部延时(internal delay)——在PHY或MAC芯片内部,通过PLL或delay cell把时钟或数据路径上的信号延迟一个固定量。常见的是2ns(大约90°相移)。
- 外部延时——在PCB上通过蛇形走线或串阻、RC网络来调。现在已经很少这么干了,因为精度差、温度漂移大。
我个人更喜欢用内部延时,因为可控、稳定。不过要注意:不同厂家的芯片内部延时基准不一样,有的叫“TX delay”,有的叫“RX clock skew”。看数据手册时别搞混。
3.4 时序关系图解
下面这张图把时钟、数据以及内部延时后的采样时钟画在一起。你可以清楚看到:
- 原始时钟(CLK)
- 发送数据(TXD)在CLK边沿变化
- 接收端经过内部延时后的采样时钟(CLK_delayed)
- 数据稳定窗口和建立/保持时间边界
3.5 延时校准的核心逻辑
综上,系统时钟与数据的关系可以总结成一句话:让采样时钟的边沿正好落到数据窗口的中间。怎么实现?靠idelay或ocdelay。但具体调多少,取决于三样东西:
- PCB走线延时差
- 芯片内部PLL的初始相位
- 温度电压变化导致的漂移
实战建议:在第一个原型板上,先用示波器抓一下时钟和数据的相对相位。如果眼图中央离时钟边沿差得远,别急着改软件,先检查PCB等长、参考平面是否完整。我遇到过两次,都是layout没做回流地过孔导致的假性相位偏移。
所以下一遍硬件投板之前,最好在RGMII时钟路径上预留RC或0Ω电阻,以备外部粗调。不过现在主流方案都走内部数字延时了,调起来就是写寄存器的事。嗯,但数字延时也有坑——延迟步长不准、非线性,这些我们后面几章会专门展开。
| 参数 | SDR采样 | DDR采样(RGMII) |
|---|---|---|
| 每个时钟周期采几次 | 1次(边沿) | 2次(上升+下降) |
| 数据窗口宽度(125MHz) | ~8ns | ~4ns |
| 对占空比敏感度 | 低 | 高 |
| 典型延时需求 | 可忽略或简单匹配 | 需要精细的内/外部延时 |
3.6 避坑指南
- 别只看时钟频率,要看数据率。125MHz的时钟,数据率是250Mbps/线。眼图裕量计算时按4ns窗口来。
- 内部延时的寄存器值不等于实际延迟量。很多PHY的tap步长是50ps左右,但温度和电压下可能偏差±20%。最好做一下回环测试验证。
- 如果芯片支持的话,优先调时钟延时而不是数据延时。因为时钟只走一根线,调起来简单。数据延时需要调8根线(RGMII数据线加控制信号),工作量大。
这一章把时钟与数据的底层关系讲清楚了。你有了这个基础,后面学idelay配置、眼图扫描、自动校准算法的时候,就不会觉得那是一堆黑盒子操作了。别急,我们一章一章来。