第3节:RGMII时序参数:TCLK、TXD、RX_CLK、RXD、TX_CTL、RX_CTL归纳总结
RGMII接口的时序参数,说白了就是一组信号之间的“对齐规则”。你调PHY寄存器,调的就是这些规则。我个人习惯先把每个信号的角色搞清楚,再去看延迟值和极性。今天我把TCLK、TXD、RX_CLK、RXD、TX_CTL、RX_CTL这六个参数一次性给你捋清楚。
3.1 先认识这六兄弟
RGMII一共就六根关键信号(不算复位和中断):
- TCLK – 发送参考时钟,由MAC产生,送给PHY。
- TXD[3:0] – 发送数据总线,与TCLK边沿对齐。
- TX_CTL – 发送控制信号,包含TX_EN和TX_ER信息。
- RX_CLK – 接收参考时钟,由PHY恢复,送给MAC。
- RXD[3:0] – 接收数据总线,与RX_CLK边沿对齐。
- RX_CTL – 接收控制信号,包含RX_DV和RX_ER信息。
这里面TXD和RXD是DDR(双沿采样)的,上升沿和下降沿各采半个字节。TX_CTL和RX_CTL也是DDR的。你想想看,每个时钟周期要传两组信息,时序余量自然就紧张。
3.2 TCLK – 发送时钟,也是“节拍器”
TCLK频率等于接口速率:10M、100M或1000M。MAC负责输出,PHY用它来采样TXD和TX_CTL。我在项目里踩过一个坑:TCLK的占空比偏差超过45%~55%,导致PHY在边沿采样时抓到毛刺。后来我强制要求MAC输出的TCLK抖动控制在±50ps以内,问题才解决。
3.3 TXD[3:0] 和 TX_CTL – 发送数据的“双胞胎”
TXD和TX_CTL在TCLK的上下边沿同时输出。上升沿送低半字节,下降沿送高半字节。TX_CTL在上升沿打包TX_EN,下降沿打包TX_ER。注意:数据和控制必须与TCLK保持固定的相位关系。
我记得调试一个百兆方案时,PHY读到的数据总是错位。查了三天,发现TX_CTL的下降沿数据比TXD慢了0.3ns。PHY内部的时钟域同步逻辑刚好卡在亚稳态边界上。后来我把TX_CTL的输出驱动强度调小了一档,延迟差就缩小到0.1ns以内。
| 信号 | 方向 | 关联时钟 | 采样沿 | 典型延迟范围 |
|---|---|---|---|---|
| TCLK | MAC→PHY | - | - | ±50ps(抖动) |
| TXD[3:0] | MAC→PHY | TCLK | 双沿 | 0~0.5ns(相对TCLK) |
| TX_CTL | MAC→PHY | TCLK | 双沿 | 0~0.5ns(相对TCLK) |
3.4 RX_CLK – 接收时钟,由PHY恢复
RX_CLK是PHY从线路上恢复出来的时钟,频率和发送端TCLK一致,但相位可能会有偏移。MAC使用RX_CLK的边沿采集RXD和RX_CTL。这里面有个大家容易忽略的点:PHY恢复的RX_CLK和MAC的本地时钟没有固定的相位关系,所以MAC内部必须做跨时钟域处理。
3.5 RXD[3:0] 和 RX_CTL – 接收数据的搭档
RXD和RX_CTL的时序与发送端完全对称:上升沿送低半字节,下降沿送高半字节。RX_CTL在上升沿打包RX_DV,下降沿打包RX_ER。PHY内部通常会提供一组延迟调节寄存器(比如RGMII RX Skew Adjust),用于补偿PCB走线造成的偏移。
我建议你在调试阶段先用示波器看RX_CLK和RXD的边沿对齐情况。如果发现数据转换发生在时钟边沿附近(setup/hold不满足),就在PHY寄存器里给RX_CLK加一个0.5ns的延迟,或者给RXD加一个负延迟。具体加在哪一侧,要看PHY的手册。
关键参数速查表(接收侧)
| 信号 | 方向 | 关联时钟 | 采样沿 | 典型延迟范围 |
|---|---|---|---|---|
| RX_CLK | PHY→MAC | - | - | 抖动≤±100ps |
| RXD[3:0] | PHY→MAC | RX_CLK | 双沿 | 0.5~1.5ns(保持时间) |
| RX_CTL | PHY→MAC | RX_CLK | 双沿 | 0.5~1.5ns(保持时间) |
3.6 时序关系的SVG图
下面这张图把发送侧和接收侧的时钟与数据关系画到了一起。你可以看到TCLK和TXD之间、RX_CLK和RXD之间的对齐方式,以及中间PHY内部的延迟调整点。
3.7 容易踩的坑(避坑指南)
- 极性搞反:RGMII v2.0中,RX_CLK的上升沿和下降沿采样顺序可能跟v1.3不同。我曾经因为PHY手册没写清楚默认极性,傻傻调了两天。后来发现直接读寄存器0x1C的第2位就解决了。
- 忽略TX_CTL和RX_CTL的抖动:很多人只关注数据线,忘了控制信号。其实控制信号的setup/hold余量更小,因为它在DDR模式下既包使能又包错误。
- 延迟调过头:有些PHY的RGMII延迟寄存器步进是0.125ns,有些是0.25ns。如果你一下子加了2ns,数据可能跑到下一个时钟周期去。
3.8 寄存器配置的建议顺序
- 先读PHY的ID和版本号,确认支持哪些RGMII时序微调功能。
- 配置TCLK的输出驱动强度和极性(如果寄存器可选)。
- 配置TX Skew寄存器:通常从0开始,逐步增加直到示波器上TXD边沿对齐TCLK。
- 配置RX Skew寄存器:先设置RX_CLK的延迟,再调RXD和RX_CTL。
- 回环测试:发一个已知数据包,看MAC收到的是否正确。
这里有个小技巧:我习惯在调试时先用低频(比如10M)把眼图调好,再切回1000M。低频下时序容错大,容易定位是延迟问题还是极性问题。
一句话总结:TCLK和RX_CLK是两条“时间基准线”,TXD/RXD和TX_CTL/RX_CTL是沿着这两条线走的“数据流”。所有寄存器配置,都是在调整它们之间的相对位置。你只要抓住“谁采谁”和“延迟够不够”这两个本质,参数再多也不乱。