第二章 RGMII 信号时序要求:时钟、数据、控制信号的关系
好,咱们正式开始第二章节。前一章我简单介绍了RGMII接口是个什么东西,以及为什么我们要费劲去调那个IDELAY。这一章,咱们得把最核心的时序关系彻底捋清楚。你想想看,如果连时钟和数据的“约定”都不懂,那后面调延迟就完全是在“盲调”。
我个人习惯,在动手调任何参数之前,先把数据手册里的时序图打印出来,拿红笔圈出关键参数。这一步看懂了,后面至少能少走一半弯路。
2.1 信号分类与基本框架
RGMII接口的引脚不多,咱们先把它分个类,心里有个谱:
- 时钟信号: TX_CLK (发送时钟), RX_CLK (接收时钟)。这是整个接口的“心跳”。
- 数据信号: TXD[3:0] (发送数据), RXD[3:0] (接收数据)。真正要传的数据就在这上面跑。
- 控制信号: TX_CTL (发送控制), RX_CTL (接收控制)。这个信号要特别注意,它在一个时钟周期里,既携带了“使能”(EN)信号,又携带了“错误”(ER)信号。
说白了,RGMII就是在时钟的上升沿和下降沿各采样一次数据,这样用4位数据线就能达到千兆速率。为什么能做到?因为它在时钟的单边沿传输了2比特信息。
2.2 关键时序参数:建立时间、保持时间与skew
咱们搞硬件的,整天和建立时间、保持时间打交道。但在RGMII里,它们有非常具体的数值要求。我根据IEEE 802.3标准以及常见的PHY芯片手册,给你总结了下面这个表:
| 参数 | 符号 | 最小值 (ns) | 典型值 (ns) | 最大值 (ns) | 说明 |
|---|---|---|---|---|---|
| 时钟周期 | Tcyc | 7.2 | 8.0 | 8.8 | 125MHz 对应 8ns,允许一定抖动 |
| 时钟高/低脉冲宽度 | Thigh/Tlow | 3.6 | 4.0 | 4.4 | 占空比应尽量接近 50% |
| 数据/控制信号建立时间 | Setup | 1.0 | - | - | 这是核心参数 |
| 数据/控制信号保持时间 | Hold | 1.0 | - | - | 这是核心参数 |
| 时钟到数据输出延迟 | Td | 0.5 | - | 2.0 | 发送端内部延迟,决定了数据相对于时钟的位置 |
| 数据/控制信号到时钟的skew | Skew | -0.5 | 0 | 0.5 | 理想情况是0,但我们允许有微小偏差 |
核心观点: RGMII的时序核心是 “源同步”。接收端(比如FPGA)需要根据发送端(比如PHY)送来的时钟去采样数据。数据不是在时钟沿上对齐的,而是在时钟沿两侧的 “窗口” 内稳定。
为什么我特意把建立时间和保持时间标成核心参数?因为我见过太多人只关心建立时间,忽略保持时间。在RGMII里,如果保持时间不够,寄存器在时钟沿之后没来得及锁住数据,信号就变了,这叫“保持时间违例”。
2.3 SDR与DDR模式的本质区别
这里必须要说清楚一个容易混淆的概念。RGMII工作在 DDR (Double Data Rate) 模式下,但很多PHY芯片内部和MAC连接时,也会用到 SDR (Single Data Rate) 的中间模式。咱们在FPGA里看到的RGMII接口,通常是DDR的。
- SDR模式下: 时钟的上升沿采集数据。你只要保证数据在上升沿附近稳定就行。时序分析只需要看Tsu和Th。
- DDR模式下: 时钟的上升沿和下降沿都会采集数据。这意味着,时钟的占空比、上升/下降沿的对称性都会影响采样点。你想想看,如果占空比不是50%,那么上升沿和下降沿之间的时间窗口就是不等长的。
我记得刚开始学这个的时候,总觉得DDR不就是采样频率加倍吗?其实没那么简单。它带来的是更严格的时序对称性要求。在RGMII协议里,发送端(PHY)会自动在时钟的上升沿发送低位数据(如同步头),在下降沿发送高位数据(如数据本身)。接收端(FPGA)必须用这两个沿去锁存数据。
2.4 建立/保持时间在RGMII中的具体体现
好,咱们用个更具体的例子来说明。假设PHY芯片在发送数据。根据IEEE 802.3-2015标准,PHY内部会做这样一个操作:
- 在TX_CLK的上升沿,发送TXD[0]和TX_CTL的EN部分。
- 在TX_CLK的下降沿,发送TXD[1]和TX_CTL的ER部分。
但是,实际传输到FPGA管脚上的信号,并不是正好对齐在时钟边沿的。因为PHY内部有 Td (时钟到数据输出延迟)。这个Td使得数据相对于时钟有一个固定的偏移(skew)。为了能让接收端正确采样,协议要求这个skew要尽量小,并且接收端(FPGA)必须用 IDELAY 来补偿走线延迟和PVT变化带来的额外skew。
说白了,建立时间和保持时间定义了接收端寄存器的“眼睛”能睁开多大。我们需要通过调整IDELAY,把这个“眼睛”放在数据最稳定的区域。
2.5 知识结构可视化
理论说了这么多,咱们用一张图来把整个逻辑串起来。这张图展示了RGMII时序的三个核心要素:时钟源、数据采样时序、以及建立/保持时间窗口的关系。
这张图从左到右、从上到下,把我们这一章的核心逻辑画清楚了。你看,先有稳定的时钟源,然后通过DDR机制收发数据,再严格约定建立/保持时间和skew,最后才需要我们通过IDELAY去动手调整。后面几章,我们就会一步步告诉你,如何通过代码和实测去实现图中第四步的“IDELAY精细调整”。
2.6 避坑指南:常见的时序误区
理论懂了,图也看了,最后聊聊几个我实际踩过的坑:
- 误区一:认为建立时间重要,保持时间无所谓。 我在项目里见过,一个同事调好了建立时间,但保持时间裕量只有0.1ns,结果板子冬天调试没问题,夏天高温下频繁丢包。这就是保持时间随PVT漂移导致的。
- 误区二:忽略时钟占空比。 有次我们用的晶振质量一般,时钟占空比是60%/40%,导致上升沿和下降沿之间的时间窗口偏差了0.8ns。这一下就把数据位的有效窗口缩小了,很难调。
- 误区三:以为走线等长就万事大吉。 做等长是基础,但FPGA内部的延迟(比如IBUF、BUFG、IDELAY2本身的相位差)也会引入skew。我建议你在约束文件中,把走线skew和内部延迟skew分开算,不要只盯着PCB尺子量。
嗯,这一章的内容就到这里。从理论到实战,我希望你记住最关键的一句话:RGMII的时序,就是一场在时钟沿两侧争夺稳定窗口的游戏。理解了这个窗口的长度(1.0ns + 1.0ns = 2.0ns的最小稳定时间),你后面调IDELAY时就知道往哪个方向推了。