FPGA以太网调试手记:搞定RGMII时序,让1Gbps网口稳定跑起来

张开发
2026/4/13 15:26:23 15 分钟阅读

分享文章

FPGA以太网调试手记:搞定RGMII时序,让1Gbps网口稳定跑起来
FPGA千兆以太网实战RGMII时序调试全攻略当你在Zynq平台上调试千兆以太网时是否遇到过这样的场景硬件连接一切正常PHY芯片也检测到了但网络就是无法稳定工作在1Gbps模式上周我在调试一块自定义的K7板卡时就遇到了这个经典问题——PHY链路指示灯显示1Gbps连接成功但实际传输速率始终卡在100Mbps且丢包率高达30%。经过三天的问题追踪最终发现是RGMII接口的时钟偏移配置不当导致的。本文将分享从现象分析到问题解决的完整过程涵盖Vivado IP配置、设备树参数调整以及PHY寄存器调试的实战细节。1. RGMII接口的时序本质RGMIIReduced Gigabit Media Independent Interface作为千兆以太网的物理层接口标准其最大特点是通过DDR双倍数据速率机制将数据线从8位压缩到4位。这种设计虽然节省了引脚资源却带来了严格的时序要求时钟与数据的对齐关系标准RGMII规定发送端TX时钟边沿必须与数据边沿严格对齐零延迟而接收端RX则需要约2ns的时钟偏移用于数据采样三处可能的延迟调整点FPGA内部通过IP核配置PCB走线通过长度匹配设计PHY芯片内部通过寄存器配置关键提示整个系统中必须且只能在一处添加RX延迟如果多处同时添加会导致时序混乱。这就是为什么我们需要清楚知道每个环节的默认行为。典型的故障现象往往表现为链路协商显示1Gbps但实际无法通信只能工作在10/100Mbps模式单向通信只能发送或只能接收高丢包率5%2. 硬件环境构建与检查在开始调试前需要确认硬件基础配置是否正确。以Xilinx K7 FPGA搭配Marvell 88E1512 PHY的典型方案为例2.1 原理图设计要点电源滤波PHY的1.2V内核电源纹波需50mV时钟电路25MHz参考时钟的jitter应50ps电阻网络RGMII信号线需串联33Ω匹配电阻MDIO上拉电阻通常为2.2kΩ2.2 PCB布局检查清单1. 差分对长度匹配≤5mil偏差 2. 单端信号长度匹配TX_CLK与TX_CTRL长度差≤100mil 3. 阻抗控制50Ω单端阻抗100Ω差分阻抗 4. 过孔数量每条信号线≤2个过孔使用Sigrity PowerSI进行阻抗仿真时要特别关注TX_CLK与相关数据线的时延差。下图是某次问题板卡的仿真结果信号线长度(mm)时延(ps)TX_CLK42.3282TXD041.8279TXD142.1281TX_CTRL42.5284注意如果PCB走线已经人为添加了延迟如时钟线比数据线长1500mil则必须禁用FPGA和PHY中的延迟补偿。3. Vivado IP核关键配置Xilinx提供三种主要的以太网IP实现方式其时钟处理机制各有特点3.1 AXI Ethernet Subsystem配置这是最常用的方案适用于PS和PL协同工作的场景。在IP配置界面中勾选Enable 1Gbps support设置PHY类型为RGMII隐藏的时钟特性TX路径IP核固定添加90度相位偏移相当于1.25GHz时钟下的2ns延迟RX路径不添加任何延迟对应的设备树配置应为phy-mode rgmii-rxid; /* 仅启用PHY的RX延迟 */3.2 GMII-to-RGMII Converter配置当通过EMIO连接Zynq的GEM时需要使用此IP其特殊选项在于Add skew to PHY选项勾选TX时钟无延迟需PHY添加延迟不勾选TX时钟添加2ns延迟需禁用PHY延迟典型配置组合IP添加TX延迟方案phy-mode rgmii-rxid;PHY添加TX延迟方案phy-mode rgmii-id;3.3 时钟约束关键点在XDC文件中必须添加以下约束create_generated_clock -name rgmii_tx_clk -source [get_pins eth_clk_gen/CLKIN] \ -edges {1 2 3} -edge_shift {0 2.5 0} [get_ports rgmii_txc] set_input_delay -clock [get_clocks rgmii_rx_clk] -max 2.0 [get_ports rgmii_rxd*]4. PHY寄存器级调试技巧当Linux设备树配置无法解决问题时需要直接操作PHY寄存器。Marvell 88E151x系列的关键寄存器如下4.1 寄存器映射表寄存器页面地址关键位Control00x00Speed selectionStatus00x01Link statusRGMII Control20x15Delay enable4.2 调试命令示例通过mdio-tool工具进行寄存器读写# 读取当前延迟配置 mdio-tool -v -p /dev/mdio0 -r 0x15 -w 2 # 启用RX延迟 mdio-tool -v -p /dev/mdio0 -w 0x15 -w 2 -d 0x20 # 同时启用TX/RX延迟 mdio-tool -v -p /dev/mdio0 -w 0x15 -w 2 -d 0x30在独立系统中可以使用以下C代码片段void configure_phy_delays(XAxiEthernet *instance, u16 phyAddr, bool txDelay, bool rxDelay) { u16 control; // 切换到寄存器页2 XAxiEthernet_PhyWrite(instance, phyAddr, 22, 2); // 读取当前配置 XAxiEthernet_PhyRead(instance, phyAddr, 21, control); // 更新延迟配置 control ~(0x10 | 0x20); if(txDelay) control | 0x10; if(rxDelay) control | 0x20; // 写回新配置 XAxiEthernet_PhyWrite(instance, phyAddr, 21, control); }5. 系统级验证方法完成所有配置后需要通过多维度测试验证稳定性5.1 硬件信号质量检测使用示波器检查关键信号时钟抖动峰峰值200ps建立/保持时间TX路径数据相对时钟建立时间1nsRX路径时钟边沿位于数据眼图中央±0.5ns5.2 软件压力测试# 双向带宽测试 iperf3 -c 192.168.1.100 -t 60 -d # 错误包统计 ethtool -S eth0 | grep -E errors|drop # 实时延迟监测 ping -f -c 1000 192.168.1.1 | awk -F/ END{print Avg latency:, $5,ms}5.3 眼图测试结果解读某次调试后的眼图参数眼高650mV标准500mV眼宽0.8UI标准0.6UI抖动0.15UI标准0.25UI当所有测试通过后建议将最终配置写入PHY的EEPROM防止上电配置丢失mdio-tool -p /dev/mdio0 -w 0x1F -w 0 -d 0x8000

更多文章