ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

RTL8211F千兆以太网PHY与FPGA RGMII接口设计调试全攻略

RTL8211F千兆以太网PHY与FPGA RGMII接口设计调试全攻略 1. 项目缘起与整体设计思路RTL8211F 这颗 PHY 芯片做 FPGA 以太网通信的兄弟应该都不陌生。它属于 Realtek 家的千兆以太网收发器支持 RGMII 接口10/100/1000Mbps 自适应在国产 FPGA 开发板和工业控制板上出镜率极高。我最早接触它是在一块 Zynq 板子上当时需要把 PL 端的以太网跑通选来选去发现 RTL8211F 的性价比和资料完整度都比较合适。后来陆续在纯 FPGA 项目里也用了好几次积累了一些硬件设计和接口调试方面的经验这里系统整理一下。这个项目的核心目标很明确用 RTL8211F 作为 PHY 层芯片通过 RGMII 接口与 FPGA 的 MAC 层对接实现千兆以太网通信。涉及的知识点包括 PHY 芯片的硬件电路设计、RGMII 接口的时序要求、FPGA 侧的 IO 约束和时序约束、MDIO 管理接口的配置以及上板后的连通性调试。适合有一定 FPGA 基础、正在做以太网相关项目的工程师参考也适合刚接触 RGMII 接口、想搞清楚 PHY 和 MAC 之间到底怎么配合的初学者。为什么选 RGMII 而不是 SGMII 或者 GMII这是第一个需要想清楚的问题。GMII 接口需要 8 位数据线加一堆控制信号引脚数量太多PCB 布线压力大SGMII 是串行接口速率高但对 FPGA 的 SerDes 资源有要求不是所有 FPGA 都方便用。RGMII 本质上是 GMII 的简化版数据位宽从 8 位降到 4 位通过双边沿采样DDR把速率补回来引脚数量大幅减少同时 FPGA 侧用普通 IO 就能实现不需要高速收发器。对于大多数中小规模 FPGA 项目来说RGMII 是性价比最高的选择。整体设计思路可以拆成三层来看。第一层是硬件层包括 RTL8211F 的供电、时钟、复位、网络变压器和 RJ45 接口的电路设计第二层是接口层即 RGMII 接口的信号定义、时序关系和 FPGA 侧的 IO 约束第三层是控制层通过 MDIO 接口对 PHY 芯片进行寄存器配置和状态读取。这三层缺一不可硬件层是基础接口层是核心控制层是保障。注意很多初学者容易把注意力全放在 FPGA 逻辑上忽略了 PHY 芯片外围电路的设计细节结果板子打回来发现链路都起不来。硬件设计阶段多花时间检查比上板后debug省事得多。2. RTL8211F 硬件电路设计要点2.1 供电与去耦设计RTL8211F 的供电轨比较多典型设计需要 3.3V、1.8V或 2.5V和 1.05V 三路电源。其中 3.3V 主要给 IO 和部分模拟电路1.05V 给内核1.8V 给 RGMII 接口的 IO 电平。具体电压值要参考最新数据手册不同封装和版本可能有差异。去耦电容的布置是硬件设计里最容易被忽视的环节。我的经验是每个电源引脚旁边都要放一个 0.1uF 的陶瓷电容距离引脚不超过 2mm同时在芯片电源入口处放一个 10uF 的钽电容或 MLCC 做储能。1.05V 内核电源的去耦尤其重要因为内核电流较大纹波控制不好会直接影响 PHY 的误码率。PCB 布局上去耦电容的接地端要就近打过孔到地平面不要用长走线绕来绕去。我见过一块板子因为 1.05V 的去耦电容地回路太长导致千兆模式下丢包率偏高后来重新布局才解决。这种问题在百兆模式下可能看不出来但千兆对电源质量敏感得多。2.2 时钟电路设计RTL8211F 需要外部提供一个 25MHz 的参考时钟。这个时钟的来源有两种方案一种是用无源晶振直接接在 PHY 的晶振引脚上另一种是用有源晶振输出 25MHz 给 PHY。两种方案各有优劣。无源晶振方案成本低但需要匹配电容而且晶振的精度和温漂要满足以太网协议的要求通常要求 ±50ppm 以内。有源晶振方案成本稍高但信号质量好驱动能力强调试起来更省心。我在工业级项目里一般优先选有源晶振因为温度范围宽可靠性更高。如果 FPGA 侧有富余的时钟资源也可以考虑用 FPGA 输出 25MHz 给 PHY。但这种方案有个隐患FPGA 配置完成之前PHY 没有参考时钟链路无法建立。如果系统要求上电后快速联网还是独立晶振更稳妥。2.3 网络变压器与 RJ45 接口RTL8211F 的 MDI 接口输出需要经过网络变压器再接到 RJ45。网络变压器的作用是电气隔离、阻抗匹配和共模抑制。选型时要注意几个参数匝数比通常是 1:1电感量要满足千兆以太网的要求共模抑制比越高越好。RJ45 接口的选型也有讲究。带集成变压器的 RJ45 可以省掉独立变压器简化布局但散热和隔离性能可能不如分离方案。带 PoE 功能的 RJ45 还要考虑供电引脚的处理。如果项目不需要 PoE选普通带变压器的 RJ45 即可。差分对的走线是硬件设计的关键。MDI 差分对要走 100 欧姆差分阻抗等长误差控制在 5mil 以内尽量少打过孔。差分对之间要保持足够的间距避免串扰。如果走线经过连接器或测试点要确保这些环节不会破坏差分阻抗的连续性。2.4 复位与配置引脚RTL8211F 有几个配置引脚需要在硬件设计时确定电平比如 PHY 地址配置、接口模式选择等。这些引脚通常在复位期间被采样所以复位信号的时序很重要。复位脉冲宽度要满足数据手册的要求一般至少 10ms。PHY 地址的配置直接影响 MDIO 通信。如果总线上挂了多个 PHY每个 PHY 的地址必须不同。单 PHY 系统里地址可以随意设但建议避开 0 和 31 这两个地址有些工具或驱动会保留这两个地址做特殊用途。3. RGMII 接口时序与 FPGA 约束3.1 RGMII 接口信号定义RGMII 接口的信号不算多但每一根都有明确的时序要求。发送方向FPGA 到 PHY包括 TXD[3:0]、TX_CTL 和 TX_CLK接收方向PHY 到 FPGA包括 RXD[3:0]、RX_CTL 和 RX_CLK。另外还有 MDC 和 MDIO 用于管理接口。TX_CTL 和 RX_CTL 是复用信号在时钟上升沿传递数据有效信号TXEN/RXDV在下降沿传递错误信号TXER/RXER。这种复用方式是 RGMII 协议规定的FPGA 侧的逻辑需要按照这个规则生成和解析。时钟频率方面千兆模式下 RGMII 时钟是 125MHz双边沿采样意味着数据速率是 125M × 2 × 4 1000Mbps。百兆模式下时钟是 25MHz十兆模式下是 2.5MHz。RTL8211F 会自动根据链路速率调整时钟频率FPGA 侧的 MAC 逻辑也需要相应适配。3.2 时序关系与延迟模式RGMII 的时序是这套接口里最需要花心思的地方。协议里定义了两种延迟模式非延迟模式和延迟模式。非延迟模式下时钟和数据基本对齐接收端需要在时钟边沿附近采样数据对建立保持时间要求很苛刻。延迟模式下时钟相对于数据有约 2ns 的延迟采样窗口更宽时序余量更大。RTL8211F 支持通过寄存器配置延迟模式。实际项目中我通常会在 PHY 侧开启延迟这样 FPGA 侧的约束会宽松很多。但要注意PHY 侧的延迟配置是通过 MDIO 写寄存器实现的上电后需要先完成配置才能正常通信。如果 PHY 侧不开启延迟FPGA 侧就需要用 IDELAY 或类似的延迟单元来调整采样点。Xilinx FPGA 的 SelectIO 资源里有 IDELAYE2 原语可以做精细的延迟调整。具体延迟值需要通过时序分析或实测来确定没有万能参数。3.3 FPGA 侧 IO 约束与时序约束FPGA 侧的约束文件是保证 RGMII 正常工作的关键。以 Xilinx Vivado 为例需要做以下几类约束引脚约束把 RGMII 的每根信号分配到正确的 FPGA 引脚上。这一步要和硬件原理图严格对应分配错了轻则不通重则损坏 IO。时序约束对 TX_CLK 和 RX_CLK 创建时钟约束然后设置输入输出延迟。千兆模式下 125MHz 时钟周期是 8ns双边沿采样意味着数据窗口只有 4ns时序余量很紧张。# 创建 RGMII 接收时钟 create_clock -name rgmii_rx_clk -period 8.000 [get_ports rgmii_rxc] # 创建 RGMII 发送时钟 create_clock -name rgmii_tx_clk -period 8.000 [get_ports rgmii_txc] # 设置输入延迟需要根据 PHY 手册和 PCB 走线调整 set_input_delay -clock rgmii_rx_clk -max 2.0 [get_ports rgmii_rxd*] set_input_delay -clock rgmii_rx_clk -min 0.5 [get_ports rgmii_rxd*] # 设置输出延迟 set_output_delay -clock rgmii_tx_clk -max 1.5 [get_ports rgmii_txd*] set_output_delay -clock rgmii_tx_clk -min -0.5 [get_ports rgmii_txd*]上面这些数值只是示例实际值要根据 PHY 芯片的时序参数和 PCB 走线延迟来计算。PCB 走线延迟大约每英寸 150ps 左右如果 TX 和 RX 走线长度差异较大需要在约束里补偿。提示时序约束不是写完就完事了一定要跑时序分析看建立保持时间是否满足。如果时序违例优先调整 PHY 侧的延迟配置其次考虑在 FPGA 侧加 IDELAY。3.4 双边沿数据的处理RGMII 的数据是 DDR 的FPGA 侧需要把双边沿数据转换成单边沿数据才能给 MAC 逻辑使用。Xilinx FPGA 里可以用 IDDR 和 ODDR 原语来实现。接收方向用 IDDR 把 RXD 和 RX_CTL 的双边沿数据拆成两路单边沿数据然后拼成 8 位数据和 2 位控制信号。发送方向用 ODDR 把 8 位数据和 2 位控制信号合成 4 位 DDR 数据输出。// IDDR 示例接收方向 IDDR #( .DDR_CLK_EDGE(SAME_EDGE_PIPELINED), .INIT_Q1(1b0), .INIT_Q2(1b0), .SRTYPE(SYNC) ) iddr_rxd0 ( .Q1(rxd_low[0]), .Q2(rxd_high[0]), .C(rgmii_rxc), .CE(1b1), .D(rgmii_rxd[0]), .R(1b0), .S(1b0) );这段代码只是示意实际项目中要对 4 根数据线和 1 根控制线都做同样处理。注意 DDR_CLK_EDGE 参数的选择不同模式对时序的要求不同要根据综合结果和时序报告来调整。4. MDIO 管理接口与 PHY 配置4.1 MDIO 接口协议MDIO 是管理 PHY 寄存器的串行接口包括 MDC 时钟线和 MDIO 数据线。MDC 频率通常不超过 2.5MHz由 MAC 侧产生。MDIO 是双向线读操作时由 PHY 驱动写操作时由 MAC 驱动。MDIO 帧格式是固定的前导码32 个 1、起始码01、操作码读 10 写 01、PHY 地址5 位、寄存器地址5 位、 turnaround2 位、数据16 位。FPGA 侧需要实现一个状态机来产生和解析这些帧。4.2 RTL8211F 关键寄存器配置RTL8211F 的寄存器很多但实际项目中需要配置的没几个。以下几个是关键寄存器地址功能典型配置值说明0x00基本控制0x1140自动协商使能重启自动协商0x09千兆控制0x0300使能千兆模式主从模式配置0x1FPHY 特定0x0000扩展寄存器页选择0x1C延迟配置0x0000RGMII 延迟模式配置延迟配置寄存器扩展页 0xA43 的 0x1C是 RGMII 调试的重点。这个寄存器的 bit1 和 bit2 分别控制 TX 和 RX 的延迟。具体配置值要结合 FPGA 侧的约束来定没有一刀切的方案。4.3 MDIO 控制器的 FPGA 实现MDIO 控制器的实现不算复杂但有几个细节要注意。MDC 时钟的分频系数要算对确保频率在 PHY 支持的范围内。状态机的状态划分要清晰读写操作的切换要处理好 MDIO 线的方向控制。// MDIO 写操作状态机片段 localparam IDLE 3d0; localparam PREAMBLE 3d1; localparam START 3d2; localparam OPCODE 3d3; localparam PHY_ADDR 3d4; localparam REG_ADDR 3d5; localparam TURNAROUND 3d6; localparam DATA 3d7; // 状态转移逻辑根据 MDC 时钟节拍推进 // 每个状态输出对应的 MDIO 位实际调试时我习惯先用一个简单的测试逻辑读 PHY 的 ID 寄存器地址 0x02 和 0x03确认 MDIO 通信正常后再做其他配置。PHY ID 是固定的读出来不对就说明 MDIO 时序或地址配置有问题。5. 上板调试与常见问题排查5.1 链路建立的基本检查板子打回来第一次上电先别急着跑数据。按以下顺序检查电源电压用万用表量每一路电源的电压值确认在允许范围内。纹波用示波器看峰峰值不要超过手册要求。时钟信号用示波器量 25MHz 晶振输出确认频率和幅度正常。如果用的是有源晶振还要看输出波形是否干净。复位信号确认复位脉冲宽度满足要求复位释放的时机是否在时钟稳定之后。MDIO 通信读 PHY ID确认能正常读写寄存器。链路状态读 PHY 的状态寄存器看链路是否建立。如果没建立检查网线、变压器和 RJ45 的连接。5.2 常见问题速查表现象可能原因排查方法链路灯不亮变压器或 RJ45 焊接不良检查差分对通断量变压器绕组MDIO 读不到 IDPHY 地址错误或 MDC 频率过高确认地址配置引脚降低 MDC 频率百兆能通千兆不通时序余量不足或电源纹波大跑时序分析量 1.05V 纹波丢包严重时钟抖动大或去耦不良量时钟抖动检查去耦电容布局发送正常接收异常RX 延迟配置不对调整 PHY 延迟寄存器或 FPGA IDELAY接收正常发送异常TX 延迟配置不对同上注意 TX 和 RX 要分别调5.3 时序问题的定位技巧RGMII 的时序问题是最难调的因为现象往往是偶发丢包或误码不容易复现。我的经验是先用示波器看时钟和数据的相位关系确认延迟是否在合理范围内。如果示波器带宽不够可以用 FPGA 内部的 ILA 抓数据看误码的规律。如果误码是周期性的通常是时钟和数据之间的固定相位偏差导致的调整延迟值就能解决。如果误码是随机的可能是电源噪声或串扰引起的要从硬件设计上找原因。注意调延迟的时候不要一次调太多每次调一档测一轮。RGMII 的时序窗口只有几个 ns调过头了反而会从能通变成不能通。5.4 实操心得与避坑经验第一PHY 延迟和 FPGA 延迟不要同时开。有些项目里 PHY 侧开了延迟FPGA 侧又加了 IDELAY结果延迟叠加导致采样点偏离。要么 PHY 侧调要么 FPGA 侧调选一个方向调透。第二MDIO 的读写时序要留足余量。MDC 频率不要顶格用留 20% 余量比较稳妥。MDIO 线的上拉电阻不能省否则读操作时数据线可能浮空。第三PCB 走线长度要记录。TX 和 RX 的走线长度差异会影响时序约束的计算。如果走线长度差异超过 0.5 英寸约束里要补偿相应的延迟。第四复位释放后等一等再配置。PHY 复位释放后需要一段时间内部电路才稳定建议等 100ms 以上再开始 MDIO 配置。有些 PHY 在复位后会自动加载配置引脚的设置这个时间也要算进去。第五测试用固定包长的数据。调试阶段用固定长度的数据包比如 64 字节和 1518 字节各测一轮便于对比分析。随机包长会增加排查难度。6. 从 PHY 到 FPGA 的完整数据通路验证6.1 回环测试方案数据通路验证最直接的方法是回环测试。RTL8211F 支持内部回环和外部回环两种模式。内部回环在 PHY 芯片内部把发送数据直接环回到接收端不需要外部网线外部回环需要把 RJ45 的发送和接收差分对短接。内部回环适合验证 FPGA 到 PHY 的接口是否正常外部回环适合验证包括变压器和 RJ45 在内的完整通路。我通常先做内部回环确认 RGMII 接口和 MDIO 配置没问题再做外部回环确认模拟前端正常。6.2 与 PC 端的连通性测试回环测试通过后把板子接到 PC 上做实际通信测试。PC 端可以用 ping 命令做基本连通性测试用 iperf 做吞吐量测试。千兆链路下iperf 的吞吐量应该能跑到 900Mbps 以上如果明显偏低说明数据通路有瓶颈。PC 端网卡的建议配置关闭节能模式关闭流控固定速率和双工模式不要用自动协商这样可以排除 PC 侧的干扰因素。如果 PC 侧是千兆网卡确认网线是超五类或六类线五类线在千兆下可能不稳定。6.3 长时间稳定性测试连通性测试通过后建议做至少 24 小时的连续通信测试观察是否有丢包或误码。工业级项目里我一般会跑 72 小时。测试期间记录环境温度因为温度变化会影响时钟精度和电源纹波进而影响通信质量。如果长时间测试中出现偶发丢包重点检查电源纹波和时钟抖动。这两个因素在短时间测试中可能看不出来但长时间运行后会逐渐暴露。7. 设计扩展与进阶方向7.1 多网口设计如果项目需要多个网口可以在 MDIO 总线上挂多个 RTL8211F通过不同的 PHY 地址区分。MDC 时钟可以共用MDIO 数据线也共用但每个 PHY 的地址配置引脚要设置成不同的值。多网口设计要注意 MDIO 总线的负载。挂的 PHY 越多总线电容越大MDC 频率要相应降低。另外每个 PHY 的复位信号建议独立控制便于单独调试。7.2 与高速接口的配合在一些高性能应用里以太网数据需要和 DDR、PCIe 等高速接口配合。这时候 RGMII 的 125MHz 时钟和高速接口的时钟域交叉就成了设计重点。建议在 RGMII 接口和高速接口之间加一级异步 FIFO做好时钟域隔离。7.3 车载以太网的相关考虑虽然 RTL8211F 主要面向商用级应用但有些车载项目也会用到类似的 PHY 方案。车载环境对温度范围、EMC 性能和振动可靠性要求更高选型时要确认 PHY 的等级是否满足要求。PCB 设计上要加强屏蔽和滤波差分对的保护器件也要选车规级的。我在实际项目中最大的体会是RGMII 接口的调试三分靠逻辑七分靠约束和硬件。逻辑代码写对了只是第一步约束做不好照样跑不通。硬件设计阶段多花时间确认电源和时钟比上板后反复调延迟要高效得多。另外PHY 的延迟配置没有万能值每块板子都要根据实际走线和时序报告来调别人的参数只能参考不能照搬。
返回列表