第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以内,问题才解决。

小提示:RGMII v2.0要求TCLK到TXD的延迟范围是-0.5ns到+0.5ns。如果你的PCB走线太长,可以通过PHY内部的TX_CLK延迟寄存器微调。

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以内。

信号方向关联时钟采样沿典型延迟范围
TCLKMAC→PHY--±50ps(抖动)
TXD[3:0]MAC→PHYTCLK双沿0~0.5ns(相对TCLK)
TX_CTLMAC→PHYTCLK双沿0~0.5ns(相对TCLK)

3.4 RX_CLK – 接收时钟,由PHY恢复

RX_CLK是PHY从线路上恢复出来的时钟,频率和发送端TCLK一致,但相位可能会有偏移。MAC使用RX_CLK的边沿采集RXD和RX_CTL。这里面有个大家容易忽略的点:PHY恢复的RX_CLK和MAC的本地时钟没有固定的相位关系,所以MAC内部必须做跨时钟域处理。

警告:有些PHY允许你通过寄存器选择RX_CLK的极性(上升沿还是下降沿有效)。我曾经遇到一个项目,因为默认极性反了,MAC采到的数据全部错位。后来我习惯在初始化代码里先读一下PHY的极性配置寄存器,再根据实际波形确认。

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_CLKPHY→MAC--抖动≤±100ps
RXD[3:0]PHY→MACRX_CLK双沿0.5~1.5ns(保持时间)
RX_CTLPHY→MACRX_CLK双沿0.5~1.5ns(保持时间)

3.6 时序关系的SVG图

下面这张图把发送侧和接收侧的时钟与数据关系画到了一起。你可以看到TCLK和TXD之间、RX_CLK和RXD之间的对齐方式,以及中间PHY内部的延迟调整点。

RGMII时序参数关系图 MAC PHY (Tx) TCLK TXD + TX_CTL TX Skew 调整寄存器 PHY (Rx) MAC RX_CLK RXD + RX_CTL 虚线表示数据与时钟的 相对延迟关系(skew)

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 寄存器配置的建议顺序

  1. 先读PHY的ID和版本号,确认支持哪些RGMII时序微调功能。
  2. 配置TCLK的输出驱动强度和极性(如果寄存器可选)。
  3. 配置TX Skew寄存器:通常从0开始,逐步增加直到示波器上TXD边沿对齐TCLK。
  4. 配置RX Skew寄存器:先设置RX_CLK的延迟,再调RXD和RX_CTL。
  5. 回环测试:发一个已知数据包,看MAC收到的是否正确。

这里有个小技巧:我习惯在调试时先用低频(比如10M)把眼图调好,再切回1000M。低频下时序容错大,容易定位是延迟问题还是极性问题。

一句话总结:TCLK和RX_CLK是两条“时间基准线”,TXD/RXD和TX_CTL/RX_CTL是沿着这两条线走的“数据流”。所有寄存器配置,都是在调整它们之间的相对位置。你只要抓住“谁采谁”和“延迟够不够”这两个本质,参数再多也不乱。