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(1'b0), .INIT_Q2(1'b0), .SRTYPE("SYNC") ) iddr_rxd0 ( .Q1(rxd_low[0]), .Q2(rxd_high[0]), .C(rgmii_rxc), .CE(1'b1), .D(rgmii_rxd[0]), .R(1'b0), .S(1'b0) );这段代码只是示意,实际项目中要对 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 位)、 turnaround(2 位)、数据(16 位)。FPGA 侧需要实现一个状态机来产生和解析这些帧。
4.2 RTL8211F 关键寄存器配置
RTL8211F 的寄存器很多,但实际项目中需要配置的没几个。以下几个是关键:
| 寄存器地址 | 功能 | 典型配置值 | 说明 |
|---|---|---|---|
| 0x00 | 基本控制 | 0x1140 | 自动协商使能,重启自动协商 |
| 0x09 | 千兆控制 | 0x0300 | 使能千兆模式,主从模式配置 |
| 0x1F | PHY 特定 | 0x0000 | 扩展寄存器页选择 |
| 0x1C | 延迟配置 | 0x0000 | RGMII 延迟模式配置 |
延迟配置寄存器(扩展页 0xA43 的 0x1C)是 RGMII 调试的重点。这个寄存器的 bit1 和 bit2 分别控制 TX 和 RX 的延迟。具体配置值要结合 FPGA 侧的约束来定,没有一刀切的方案。
4.3 MDIO 控制器的 FPGA 实现
MDIO 控制器的实现不算复杂,但有几个细节要注意。MDC 时钟的分频系数要算对,确保频率在 PHY 支持的范围内。状态机的状态划分要清晰,读写操作的切换要处理好 MDIO 线的方向控制。
// MDIO 写操作状态机片段 localparam IDLE = 3'd0; localparam PREAMBLE = 3'd1; localparam START = 3'd2; localparam OPCODE = 3'd3; localparam PHY_ADDR = 3'd4; localparam REG_ADDR = 3'd5; localparam TURNAROUND = 3'd6; localparam DATA = 3'd7; // 状态转移逻辑根据 MDC 时钟节拍推进 // 每个状态输出对应的 MDIO 位实际调试时,我习惯先用一个简单的测试逻辑读 PHY 的 ID 寄存器(地址 0x02 和 0x03),确认 MDIO 通信正常后再做其他配置。PHY ID 是固定的,读出来不对就说明 MDIO 时序或地址配置有问题。
5. 上板调试与常见问题排查
5.1 链路建立的基本检查
板子打回来第一次上电,先别急着跑数据。按以下顺序检查:
- 电源电压:用万用表量每一路电源的电压值,确认在允许范围内。纹波用示波器看,峰峰值不要超过手册要求。
- 时钟信号:用示波器量 25MHz 晶振输出,确认频率和幅度正常。如果用的是有源晶振,还要看输出波形是否干净。
- 复位信号:确认复位脉冲宽度满足要求,复位释放的时机是否在时钟稳定之后。
- MDIO 通信:读 PHY ID,确认能正常读写寄存器。
- 链路状态:读 PHY 的状态寄存器,看链路是否建立。如果没建立,检查网线、变压器和 RJ45 的连接。
5.2 常见问题速查表
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 链路灯不亮 | 变压器或 RJ45 焊接不良 | 检查差分对通断,量变压器绕组 |
| MDIO 读不到 ID | PHY 地址错误或 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 的延迟配置没有万能值,每块板子都要根据实际走线和时序报告来调,别人的参数只能参考,不能照搬。