
1. 一块以太网开发板上的PHY到底在干什么拿到一块带以太网口的FPGA开发板很多人第一反应是去看FPGA型号、逻辑资源、DDR容量却往往忽略了板子角落里那颗不起眼的PHY芯片。实际上以太网能不能跑通、跑得稳不稳PHY这颗料的选择和外围设计占了很大比重。我见过太多项目FPGA逻辑写得没问题MAC层也调通了结果链路就是起不来最后查来查去发现是PHY的时钟或者变压器中心抽头处理出了岔子。这篇文章就以RTL8211F这颗非常经典的千兆以太网PHY为例把从网卡到FPGA这条链路上PHY的角色、硬件设计要点、以及实际调试中容易踩的坑系统地拆一遍。RTL8211F是Realtek的一款千兆以太网收发器支持RGMII接口在FPGA开发板、工控板、嵌入式设备上用得非常多资料相对齐全适合拿来当教学样本。如果你正在做FPGA以太网通信、或者要自己设计一块带网口的板子这篇内容应该能帮你省下不少查资料和试错的时间。先明确一个基本概念PHY是物理层收发器它负责把MAC层送过来的数字信号转换成适合在双绞线上传输的模拟信号反过来也把线缆上收到的模拟信号恢复成数字信号。你可以把它理解成一个翻译官MAC说的是数字世界的语言网线里跑的是模拟世界的信号PHY就是中间那个既懂数字又懂模拟的角色。RTL8211F支持10/100/1000Mbps三速自适应通过RGMII接口和MAC通信RGMII是精简千兆媒体独立接口数据位宽4bit在125MHz时钟下双边沿采样实现千兆速率。为什么FPGA项目里PHY这么重要因为FPGA本身通常只实现MAC层甚至更上层物理层的活儿全交给PHY芯片。PHY选型不对、外围设计有问题MAC层做得再好也是白搭。而且PHY涉及模拟电路部分很多数字工程师对这块不太熟悉容易忽略一些关键细节比如差分走线阻抗、变压器中心抽头去耦、时钟源选择等。这些细节在低速时可能看不出问题一旦跑到千兆速率各种诡异现象就冒出来了。2. RTL8211F核心特性与接口设计拆解2.1 RTL8211F的关键引脚与功能分区RTL8211F是一颗QFN40封装的千兆PHY引脚密度不算高但每个引脚的功能划分很清晰。大致可以分成几个区域RGMII接口区、MDIO管理接口区、时钟区、模拟差分信号区、电源区、以及配置引脚区。RGMII接口区包含TXD[3:0]、TX_CTL、RXD[3:0]、RX_CTL以及TX_CLK和RX_CLK。这里有个容易搞混的点RTL8211F的RGMII支持延时模式TX_CLK和RX_CLK的相位关系可以通过内部寄存器或者外部引脚配置来调整。很多FPGA工程师第一次调RGMII时发现数据采样不稳定大概率就是时钟和数据之间的相位关系没配对。MDIO管理接口就是MDC和MDIO两根线用来读写PHY内部寄存器。MDC最高频率一般不超过2.5MHz实际用的时候FPGA侧分频出一个1MHz左右的时钟就够了。MDIO是双向线需要上拉电阻典型值1.5k到10k之间具体看总线负载。模拟差分信号区就是四个差分对TX/TX-、RX/RX-分别对应发送和接收。RTL8211F内部已经集成了端接电阻外部不需要再加但变压器和RJ45之间的走线要严格控制差分阻抗100欧姆。配置引脚区包括PHYAD[2:0]、AN[2:0]、SEL等用来设置PHY地址、自协商模式等。这些引脚在上电复位时被采样所以设计时要注意上下拉电阻的配置不能悬空。2.2 RGMII接口的时序模式选择RGMII接口有两种时序模式延时模式和非延时模式。非延时模式下TX_CLK和TXD在FPGA侧同相输出PHY内部会对时钟做延时后再采样数据。延时模式下FPGA侧需要把TX_CLK相对TXD延时约2ns再输出。RTL8211F默认是延时模式还是非延时模式取决于具体型号后缀和配置引脚。我实测下来用Xilinx FPGA的ODDR原语输出RGMII信号时如果PHY配置为延时模式FPGA侧就不需要额外延时直接同相输出即可。如果PHY是非延时模式FPGA侧就要用IDELAY或者相位偏移来调整。这里建议优先让PHY工作在延时模式因为FPGA侧调整相位更灵活而且不同批次的PHY延时特性可能有差异FPGA侧可调的话适配性更好。具体配置方法RTL8211F的EXT引脚或者内部寄存器可以设置RGMII延时。查数据手册确认默认值如果不确定最稳妥的办法是先用MDIO读一下寄存器确认当前模式再决定FPGA侧怎么处理。2.3 时钟方案25MHz晶振还是50MHz时钟源RTL8211F需要一个25MHz的参考时钟这个时钟可以来自外部晶振也可以由FPGA提供。两种方案各有优劣。用外部晶振的方案PHY的时钟独立于FPGA即使FPGA还没配置好PHY也能正常工作和自协商。缺点是增加了一颗晶振和相应的负载电容成本和板面积略增。而且晶振的精度和抖动特性会影响千兆链路的稳定性建议选±50ppm以内、相位抖动小于1ps的晶振。用FPGA提供时钟的方案省掉一颗晶振但要求FPGA在上电后尽快输出25MHz时钟。如果FPGA配置时间较长PHY在这段时间内没有参考时钟链路建立会延迟。另外FPGA输出的时钟抖动通常比专用晶振大千兆速率下可能影响眼图质量。我个人的选择是如果板子空间和成本允许优先用独立晶振。千兆以太网对时钟质量比较敏感独立晶振更稳。如果实在要用FPGA供时钟建议用FPGA的专用时钟输出引脚并且走线尽量短远离其他高速信号。3. 硬件设计要点从原理图到PCB布局3.1 网络变压器与RJ45的连接设计RTL8211F的差分信号不能直接连到RJ45中间必须加网络变压器。变压器的作用有三个一是电气隔离防止不同设备之间的地电位差损坏PHY二是阻抗匹配把PHY的差分阻抗匹配到双绞线的100欧姆三是共模抑制滤除共模噪声。变压器选型时要注意几个参数匝数比通常是1:1电感量在350uH以上插入损耗在100MHz时小于1dB回波损耗在100MHz时大于-18dB。常见的型号有HX1188、H1102等选的时候看数据手册确认支持千兆速率。变压器中心抽头的处理是个经典坑点。RTL8211F的TX侧中心抽头需要接电源典型值是3.3V或者2.5V具体看PHY的供电设计。RX侧中心抽头通常通过一个电容接地或者通过电阻接电源再并联电容。这里的设计意图是TX侧中心抽头接电源为发送驱动提供偏置RX侧中心抽头通过电容接地为接收信号提供交流回路。我见过有设计把TX和RX的中心抽头都接电源结果链路能起来但误码率很高。后来查资料发现RX侧中心抽头接电源会引入额外的共模噪声改成电容接地后误码率明显下降。所以这个细节一定要按PHY数据手册的推荐电路来不要想当然。RJ45连接器方面带集成变压器的RJ45可以省掉独立变压器但集成变压器的质量参差不齐千兆应用建议还是用独立变压器加普通RJ45选型更灵活。RJ45的LED指示灯引脚可以接到PHY的LED输出用来指示链路状态和活动状态RTL8211F支持多种LED闪烁模式通过寄存器配置。3.2 差分走线的阻抗控制与等长要求差分走线是千兆以太网硬件设计的重中之重。TX和RX差分对要求100欧姆差分阻抗这个阻抗由PCB叠层和走线宽度/间距决定。设计前先和PCB厂确认叠层参数算出对应的线宽和间距。等长要求方面同一差分对内的P和N要严格等长误差控制在5mil以内。TX对和RX对之间的长度差异可以放宽但建议控制在50mil以内。差分对之间的间距要大于3倍线宽减少串扰。走线拐弯时要用45度角或者圆弧不要用90度直角。直角会导致阻抗突变在千兆速率下引起反射。过孔方面尽量少打过孔如果必须打要保证差分对的两个过孔对称并且过孔周围要有足够的接地过孔提供回流路径。还有一个容易忽略的点差分走线下面的参考平面要完整不能有跨分割。如果参考平面被分割回流路径被切断差分信号的阻抗会严重失配。我遇到过一块板子差分走线跨了电源分割区百兆能跑千兆死活起不来后来把分割区填上就好了。3.3 电源设计与去耦电容布局RTL8211F需要多路电源1.05V或者1.2V给内核3.3V给IO和模拟部分有些设计还需要2.5V。具体电压值查数据手册确认不同后缀的芯片可能不一样。去耦电容的布局比选值更重要。每个电源引脚旁边都要放一个0.1uF的陶瓷电容尽量靠近引脚回路面积越小越好。另外每个电源域还要放一个10uF的钽电容或者陶瓷电容做 bulk 去耦位置可以稍远但也要在同一电源平面附近。模拟电源的去耦要特别注意。RTL8211F的模拟电源引脚对噪声很敏感建议用磁珠或者电感从数字电源隔离出来再配合LC滤波。磁珠选100MHz时阻抗在60欧姆到120欧姆之间的电感选1uH到4.7uH的。滤波电容用0.1uF和10uF组合。地平面方面建议模拟地和数字地分开布局最后在一点通过0欧姆电阻或者磁珠连接。如果板子层数少做不到完整的分地至少保证模拟部分的回流路径不要经过数字区域。4. 实操调试从链路不通到稳定千兆4.1 上电后链路不起来的排查顺序拿到新板子上电后先看PHY的LED。如果LED完全不亮说明PHY可能没正常工作。排查顺序如下第一步量电源。用万用表逐个量PHY的电源引脚确认电压值和纹波。纹波建议控制在50mV以内如果超过100mV先解决电源问题。第二步量时钟。用示波器看25MHz参考时钟有没有输出频率和幅度是否正常。如果时钟没有检查晶振电路或者FPGA的时钟输出配置。第三步读寄存器。通过MDIO读PHY的BMCR和BMSR寄存器确认PHY是否能正常响应。如果读不到检查MDIO的上拉电阻和MDC时钟频率。MDC太快会导致通信失败先降到100kHz试试。第四步看自协商。如果寄存器能读看BMSR的链路状态位和自协商完成位。如果自协商没完成检查AN引脚配置和变压器连接。第五步量差分信号。用示波器差分探头看TX和RX差分对有没有信号。注意要用差分探头单端探头看差分信号会引入很大误差。4.2 RGMII时序问题的定位与解决RGMII时序问题表现为链路能起来但ping包丢包严重或者大流量传输时误码。定位方法如下先用MDIO读PHY的误码统计寄存器确认是否有CRC错误。如果有说明数据采样有问题。然后用示波器同时抓TX_CLK和TXD看时钟沿和数据的变化沿是否对齐。理想情况下数据的变化沿应该在时钟的稳定区中间。如果发现时序偏了调整方法有两种一是改PHY的RGMII延时配置通过寄存器或者引脚二是改FPGA侧的输出延时用IDELAY或者调整ODDR的相位。我一般优先调FPGA侧因为可调范围大而且不影响PHY的其他配置。Xilinx FPGA用ODDR输出RGMII时可以通过调整ODDR的D1和D2值来微调相位。具体做法是先输出同相时钟和数据然后逐步增加时钟的延时每次增加0.1ns左右直到误码消失。这个过程需要反复测试建议写一个自动扫描的脚本批量测试不同延时下的误码率。4.3 常见问题速查表现象可能原因排查方法解决措施LED不亮电源异常量各路电源电压和纹波修复电源加强去耦LED不亮时钟缺失示波器看25MHz时钟检查晶振或FPGA时钟输出链路不通自协商失败读BMSR寄存器检查AN引脚和变压器百兆通千兆不通差分走线问题检查阻抗和等长重新布线或调整端接丢包严重RGMII时序偏抓时钟和数据相位调整FPGA侧延时误码率高变压器中心抽头检查TX/RX抽头接法按手册推荐电路修改MDIO读不到上拉电阻缺失量MDIO线电平加上拉电阻降MDC频率5. 从PHY到FPGAMAC层对接的注意事项5.1 FPGA侧RGMII接口的实现要点FPGA侧实现RGMII接口核心是用ODDR和IDDR原语处理双边沿采样。以Xilinx 7系列为例TX侧用ODDR把4bit数据在时钟的上升沿和下降沿分别输出实现DDR发送。RX侧用IDDR把接收到的DDR数据恢复成SDR数据。ODDR的配置要注意D1和D2分别对应时钟上升沿和下降沿的数据时钟使能要接常高复位要接系统复位。IDDR的配置要注意要选择正确的模式通常用OPPOSITE_EDGE模式输出Q1和Q2分别对应上升沿和下降沿的数据。时钟方面TX_CLK由FPGA的MMCM或者PLL生成125MHz然后通过ODDR输出到PHY。RX_CLK由PHY提供FPGA侧要把它接到BUFG或者BUFIO上作为接收逻辑的时钟。这里有个坑RX_CLK和FPGA内部时钟域不同跨时钟域处理要做好否则会出现亚稳态。5.2 MDIO控制器的实现与寄存器配置MDIO控制器可以用FPGA逻辑实现也可以用软核处理器。如果只是配置PHY用状态机实现就够了。MDIO的帧格式是32bit前导码2bit起始码2bit操作码5bit PHY地址5bit寄存器地址2bit转向16bit数据。实现时注意MDC的频率不要超过2.5MHz建议用1MHz。MDIO是双向线FPGA侧要控制方向读的时候设为输入写的时候设为输出。读操作时PHY会在转向位之后驱动MDIO线FPGA侧要及时切换方向否则会总线冲突。RTL8211F的关键寄存器BMCR地址0用来设置自协商和重启BMSR地址1用来读链路状态PHYSR地址17用来读具体速率和双工模式。千兆模式下还要配置RGMII延时寄存器具体地址查数据手册。5.3 实际项目中的调试经验我在一个FPGA图像传输项目里用RTL8211F做千兆以太网输出图像数据量大对带宽要求高。调试过程中遇到几个典型问题第一个问题是链路能起来但UDP包丢包严重。查了半天发现是RGMII的TX_CLK相位不对数据在时钟沿附近变化PHY采样到了错误的数据。用示波器抓波形后调整了ODDR的延时丢包率从10%降到了0。第二个问题是长时间运行后链路断开。查温度发现PHY芯片温度偏高接近70度。后来在PHY下面加了散热焊盘并且把模拟电源的滤波加强温度降到50度左右链路稳定了。第三个问题是MDIO偶尔读失败。查波形发现MDC频率太高达到了5MHz超过了PHY的规格。把MDC降到1MHz后问题消失。这个坑很隐蔽因为大部分时候能读成功偶尔失败很难定位。6. 硬件设计检查清单与避坑总结6.1 原理图设计阶段的检查项在画原理图时对照以下清单逐项检查PHY的每个电源引脚都有去耦电容0.1uF靠近引脚10uF在附近模拟电源通过磁珠或电感隔离并有LC滤波25MHz时钟源选择正确负载电容匹配晶振规格RGMII信号线有串联电阻吗通常不需要但如果走线较长可以预留MDIO有上拉电阻典型值4.7k配置引脚有正确的上下拉不悬空变压器中心抽头按手册推荐连接RJ45的LED引脚接到PHY的LED输出复位信号有RC延时保证上电稳定6.2 PCB布局阶段的检查项布局阶段的关键点PHY尽量靠近变压器和RJ45差分走线尽量短晶振靠近PHY的时钟引脚走线短且包地去耦电容靠近电源引脚回路面积小差分走线100欧姆阻抗P/N等长少过孔差分走线参考平面完整不跨分割模拟地和数字地分开单点连接MDIO和MDC走线远离差分对减少串扰6.3 调试阶段的避坑经验最后分享几个我踩过的坑第一个坑以为PHY的RGMII延时是固定的结果不同批次的芯片延时不一样。后来每次打样都重新测时序把延时配置做成可调的。第二个坑忽略了变压器的中心抽头电压。有一批板子TX中心抽头接了2.5V但PHY的IO是3.3V导致发送幅度不够千兆链路不稳定。改成3.3V后正常。第三个坑MDIO总线上挂了多个PHY地址没配好导致通信冲突。后来用PHYAD引脚给每个PHY分配了不同地址。第四个坑复位信号没有做同步处理FPGA复位释放时PHY还没准备好导致配置失败。后来加了复位同步器等PHY时钟稳定后再释放复位。这些经验在数据手册里通常不会写但实际项目中很容易遇到。硬件设计就是这样理论是一回事实际调试又是另一回事。多测、多看波形、多读寄存器大部分问题都能定位到。