2. RGMII信号定义及时序:从引脚到数据流的全解析

好,咱们正式开始聊RGMII的信号定义。这部分我建议你别跳过去,它好比建筑的钢筋,看似基础,但地下部分要是糊了,上面盖再漂亮也拿不到实测波形。

RGMII全称是Reduced Gigabit Media Independent Interface,相比传统的GMII,接口信号从24根锐减到12根。少了整整一半,PCB布线舒服多了。但代价呢?就是时序要求更严苛了——说白了,就是用时间换空间。

RGMII信号定义层级图 RGMII 接口(12根信号线) 数据域:TXD[3:0] / RXD[3:0] 控制域:TX_CTL / RX_CTL 时钟域:TX_CLK / RX_CLK TXD0~TXD3:发送数据(DDR边沿) RXD0~RXD3:接收数据(DDR边沿) TX_CTL:发送控制(DDR边沿) RX_CTL:接收控制(DDR边沿) TX_CLK:125MHz / 2.5MHz / 25MHz RX_CLK:由 PHY 恢复,同步接收数据 RGMII DDR采样核心规则 数据线与控制线在 TX_CLK/RX_CLK 的上升沿与下降沿各采样一次 Tdelay (1.5ns ~ 2.0ns) Tsetup / Thold (≥1.0ns) Tskew (≤0.5ns) ⚠️ 布线核心:同组数据线 + 对应时钟,等长 ≤ ±50mil

2.1 先从RGMII接口结构说起

我最初接触RGMII时,第一反应是:哦?时钟竟然跟数据同频?

GMII用的是125MHz时钟 + 8位并行数据总线。RGMII还是125MHz,但数据宽度砍到4位,靠双时钟沿采样来补带宽。换句话说,一个时钟周期内,上升沿送低4位,下降沿送高4位——这才是DDR的精髓。

RGMII信号分三组。理解这三组,后面时序就好办了:

  • 数据线:TXD[3:0](发送) / RXD[3:0](接收)—— DDR采样,共8根
  • 控制线:TX_CTL(发送) / RX_CTL(接收)—— 编码后包含TX_EN和TX_ER信息,共2根
  • 时钟线:TX_CLK(发送) / RX_CLK(接收)—— 参考时钟,共2根
一个小技巧: 我在查看原理图时,会先把这3组线用不同颜色的高亮笔标出来。数据线一种颜色,控制线和时钟线各一种。布线完成后扫一眼颜色分组,长这样基本不会差到哪去。

2.2 每个信号的值、功能和时序关系

咱们一个一个拆开看。我习惯按「功能定义 → 电平标准 → 采样关系」的顺序走。

2.2.1 TX_CLK 与 RX_CLK —— 心跳线

这两根线是RGMII的节拍器。没有它们,数据和控制都是废的。

  • TX_CLK:由MAC侧输出给PHY。1000Mbps下是125MHz ±50ppm。
  • RX_CLK:由PHY侧恢复并输出给MAC。频率同样为125MHz,但相位取决于链路质量。

关于极性和占空比:

TX_CLK的占空比要求是45%~55%。我曾遇到过一次选型踩坑——某国产PHY的TX_CLK占空比只有43%,导致数据采样窗几乎消失。你想想看,125MHz下一个周期才8ns,占空比偏差2%就意味着边沿漂移160ps,留给setup/hold的时间就少了。

避坑指南: 我曾经在一款FPGA + PHY的板子上,TX_CLK走线绕了2500mil才到PHY。fpga内部PLL输出抖动本身就大,再经这么长走线反射,PHY根本锁不住时钟。后来我养成习惯:TX_CLK走线总长不超过2000mil,且串接33Ω电阻靠近源端。

2.2.2 TXD[3:0] 与 RXD[3:0] —— 数据线,DDR是关键

数据线总共4根发送+4根接收,全部以TX_CLK / RX_CLK为参考进行DDR采样。

发送数据时序(TXD[3:0] vs TX_CLK):

1000Mbps模式下,每个TX_CLK周期传送8位数据:上升沿送TXD[3:0](低4位),下降沿送下一个TXD[3:0](高4位)。这是RGMII最核心的DDR方式,后文所有建立时间、保持时间、布线等长都围绕着这8ns周期展开。

  • Setup time (Tsetup):数据(或控制)在时钟边沿前有效的时间。RGMII标准要求≥1.0ns。
  • Hold time (Thold):数据(或控制)在时钟边沿后保持有效的时间。同样要求≥1.0ns。

说白了,数据窗口只有约4ns(8ns周期/2),扣掉setup和hold各1ns,你还有2ns的余量给PCB走线延迟和抖动。听起来还行,但一旦板级噪声大或布线不等长,2ns根本不够用。

接收数据时序(RXD[3:0] vs RX_CLK):

接收方向由PHY驱动,MAC被动接收。PHY内部会对RX_CLK做内部延迟(通常1.5ns~2.0ns),让时钟边沿落在数据眼图的中心。这是RGMII v2.0引入的「内部延迟模式」——你不用在PCB上塞外部延迟线了。

我个人的设计偏好: 内部延迟虽然方便,但不同PHY的内部延迟偏差可达±500ps。如果你PCB空间允许,我建议在MAC侧保留可调延迟(如FPGA IDELAY或PHY的寄存器配置),实测时做眼图扫描。

2.2.3 TX_CTL 与 RX_CTL —— 控制线,编码使能与错误

RGMII v2.0之后,TX_CTL/RX_CTL不再是单纯的TX_EN,而是TX_EN 与 TX_ER的异或编码信号。

编码规则很简单:

  • 上升沿采样:TX_EN(发送使能)
  • 下降沿采样:TX_EN XOR TX_ER(发送错误指示)

为什么这么设计? 为了省一根线。原来GMII里使能和错误是分开的,RGMII砍掉一半信号后,不得不在时域上复用。这就是工程上的trade-off——用更精细的时序约束来换更少的引脚。

接收端(RX_CTL)同理:

  • 上升沿采样:RX_DV(接收数据有效)
  • 下降沿采样:RX_DV XOR RX_ER(接收错误指示)

解码时注意:MAC内部是根据上升沿和下降沿的结果做异或还原的,不能直接把TX_CTL当使能信号去接。我之前看过一个同事的代码,他把TX_CTL直接当TX_EN用,结果PHY死活不link up——因为TX_CTL在下降沿送的异或值被当成了错误使能。

2.3 时序关系全貌:一个T周期里的数据流

咱把上面所有信息收拢到一起。假设当前为1000Mbps模式,一个完整的TX_CLK周期(8ns)内,数据流如下:

时钟边沿 数据信号 控制信号 采样内容
TX_CLK上升沿 TXD[3:0] Nibble0 TX_CTL 低4位数据 + TX_EN
TX_CLK下降沿 TXD[3:0] Nibble1 TX_CTL 高4位数据 + TX_EN XOR TX_ER
RX_CLK上升沿 RXD[3:0] Nibble0 RX_CTL 低4位数据 + RX_DV
RX_CLK下降沿 RXD[3:0] Nibble1 RX_CTL 高4位数据 + RX_DV XOR RX_ER

关键点: 这个表你打印出来贴在工位上都不为过。我当年调试FPGA RGMII接口时,就是拿着它跟示波器信号一个个对的。

2.4 避坑指南:布线等长要求

最后给你一个实训中的硬指标。RGMII布线时,同一方向的组内等长要求如下:

  • TXD[3:0] 与 TX_CLK:等长偏差 ≤ ±50mil(约1.27mm)
  • RXD[3:0] 与 RX_CLK:等长偏差 ≤ ±50mil
  • TX_CTL 与上述数据组:优先保持等长,偏差可放宽至 ±100mil
  • RX_CTL:同上
注意: 50mil在125MHz下对应的延迟约为8ps。我实测过,当等长超过±100mil时,上千兆链路大概率link fail或者频繁丢包。所以设计阶段多花10分钟绕等长,省去后续3天的排查时间。

2.5 小结

RGMII的信号定义说到底,就三组六根线+两个控制信号。但每根线背后都有DDR双沿采样、内部延迟、编码复用这些门道。搞懂了这些,你后面看RGMII原理图、写时序约束、测眼图才心里有底。

嗯,这一章内容不少,但不急,消化掉之后再往下走,实战环节会很顺畅。