2. RGMII信号定义及时序:从引脚到数据流的全解析
好,咱们正式开始聊RGMII的信号定义。这部分我建议你别跳过去,它好比建筑的钢筋,看似基础,但地下部分要是糊了,上面盖再漂亮也拿不到实测波形。
RGMII全称是Reduced Gigabit Media Independent Interface,相比传统的GMII,接口信号从24根锐减到12根。少了整整一半,PCB布线舒服多了。但代价呢?就是时序要求更严苛了——说白了,就是用时间换空间。
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根
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的时间就少了。
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:同上
2.5 小结
RGMII的信号定义说到底,就三组六根线+两个控制信号。但每根线背后都有DDR双沿采样、内部延迟、编码复用这些门道。搞懂了这些,你后面看RGMII原理图、写时序约束、测眼图才心里有底。
嗯,这一章内容不少,但不急,消化掉之后再往下走,实战环节会很顺畅。