第二章 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比特信息。

注意: 很多新手容易忽略控制信号 RX_CTL/TX_CTL 的双沿采样特性。我曾经调试过一个板子,数据通了但网络不通,查了半天才发现是 RX_CTL 的建立时间不够,导致交换机认为链路状态一直不对。“控制信号”的时序裕量往往比数据信号更紧张,因为它包含了使能和错误两个状态,一旦跳变沿采错,整个数据包会被丢弃。

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。

实战经验: 我建议你用一个数字示波器,同时抓取FPGA管脚上的RGMII时钟和对应数据线。正常情况下,你应该能看到数据信号的跳变沿正好位于时钟信号的高电平或低电平中央位置。如果看到数据跳变沿离时钟沿很近(比如小于2ns),那就说明你的IDELAY设置可能需要调整,或者PCB走线有问题。

说白了,建立时间和保持时间定义了接收端寄存器的“眼睛”能睁开多大。我们需要通过调整IDELAY,把这个“眼睛”放在数据最稳定的区域。

2.5 知识结构可视化

理论说了这么多,咱们用一张图来把整个逻辑串起来。这张图展示了RGMII时序的三个核心要素:时钟源、数据采样时序、以及建立/保持时间窗口的关系。

RGMII 信号时序核心关系 1. 时钟源 (TX_CLK / RX_CLK) 频率 125MHz (±50ppm),周期 8ns 占空比要求 45% ~ 55%(越接近50%越好) 2. 双沿采样 (DDR) 机制 上升沿: 采样低字节数据 / TX_CTL[EN] 下降沿: 采样高字节数据 / TX_CTL[ER] 4位数据线 TXD[3:0] 完成千兆传输 3. 建立时间 / 保持时间约束 建立时间: 数据必须在时钟沿前 1.0ns 稳定 保持时间: 数据必须在时钟沿后 1.0ns 保持稳定 Skew 要求: ±0.5ns(PCB走线 + IDELAY补偿) 4. 实战手段:IDELAY 精细调整 skew 知识 需用IDELAY补偿 常见问题 保持时间不足

这张图从左到右、从上到下,把我们这一章的核心逻辑画清楚了。你看,先有稳定的时钟源,然后通过DDR机制收发数据,再严格约定建立/保持时间和skew,最后才需要我们通过IDELAY去动手调整。后面几章,我们就会一步步告诉你,如何通过代码和实测去实现图中第四步的“IDELAY精细调整”。

2.6 避坑指南:常见的时序误区

理论懂了,图也看了,最后聊聊几个我实际踩过的坑:

  • 误区一:认为建立时间重要,保持时间无所谓。 我在项目里见过,一个同事调好了建立时间,但保持时间裕量只有0.1ns,结果板子冬天调试没问题,夏天高温下频繁丢包。这就是保持时间随PVT漂移导致的。
  • 误区二:忽略时钟占空比。 有次我们用的晶振质量一般,时钟占空比是60%/40%,导致上升沿和下降沿之间的时间窗口偏差了0.8ns。这一下就把数据位的有效窗口缩小了,很难调。
  • 误区三:以为走线等长就万事大吉。 做等长是基础,但FPGA内部的延迟(比如IBUF、BUFG、IDELAY2本身的相位差)也会引入skew。我建议你在约束文件中,把走线skew和内部延迟skew分开算,不要只盯着PCB尺子量。
特别警告: 如果你发现无论怎么调整IDELAY,都不能同时满足建立时间和保持时间,那多半是PCB走线长度差太多了,或者时钟抖动过大。这个时候不要硬调FPGA,先回去检查硬件。我曾经为一个现象研究了整整一周,最后发现是原理图上把RX_CLK和RX_CTL的差分对接反了。

嗯,这一章的内容就到这里。从理论到实战,我希望你记住最关键的一句话:RGMII的时序,就是一场在时钟沿两侧争夺稳定窗口的游戏。理解了这个窗口的长度(1.0ns + 1.0ns = 2.0ns的最小稳定时间),你后面调IDELAY时就知道往哪个方向推了。