
1. 一块以太网开发板上的PHY到底在干什么拿到一块带以太网口的FPGA开发板很多人第一反应是直接怼MAC层代码调通了UDP或者TCP再回头看硬件结果发现丢包、CRC错误、链路不稳定折腾半天最后发现是PHY这边的硬件设计或者配置有问题。我前后做过几块以RTL8211F为核心的以太网子卡也帮人排查过不少“MAC没问题但就是不通”的案例绝大多数坑都出在PHY芯片的外围电路、时钟方案和电源处理上。RTL8211F这颗片子在FPGA和MCU的以太网设计里出镜率非常高。它是一颗10/100/1000Mbps自协商的以太网PHY支持RGMII和GMII接口RGMII模式下引脚少、走线简单特别适合FPGA的IO资源紧张的场景。但“引脚少”不等于“设计简单”RGMII的时序裕量、PHY的电源域划分、复位时序、MDIO配置每一项都有讲究。这篇文章我就以RTL8211F为例把一块以太网开发板上从网口到FPGA之间这条链路拆开讲清楚包括PHY的选型逻辑、原理图设计要点、PCB布局注意事项、MDIO寄存器配置、以及实际调试中遇到的典型问题和排查方法。适合看这篇内容的人正在做FPGA以太网通信项目的工程师、画过MCU以太网板子但想深入理解PHY硬件设计的硬件工程师、以及调不通RGMII接口正在抓狂的嵌入式开发者。我会尽量把每个设计决策背后的“为什么”讲清楚让你不只是抄参考原理图而是真正理解每一颗电阻电容存在的意义。2. PHY芯片选型与RTL8211F的核心特性拆解2.1 为什么是RTL8211F而不是其他PHY以太网PHY的选择其实就那么几个维度接口类型、速率等级、封装尺寸、功耗、价格、以及供货稳定性。RTL8211F在FPGA开发板上的流行核心原因是它在RGMII接口下的时序表现比较友好而且内部集成了大量的端接电阻和LDO外围元件少。对比一下常见的几颗PHY型号接口支持速率封装特点RTL8211FRGMII/GMII10/100/1000MQFN40集成端接外围简洁LAN8720ARMII10/100MQFN24低成本仅百兆DP83848RMII/MII10/100MLQFP48老牌方案资料多KSZ9031RGMII10/100/1000MQFN48时序可调但配置复杂RTL8211F最大的优势是RGMII模式下不需要外部再挂一堆匹配电阻芯片内部已经做了50欧姆的端接。这一点在PCB面积紧张的时候非常关键。另外它支持1.8V/2.5V/3.3V的IO电压和FPGA的Bank电压匹配很灵活。但要注意RTL8211F有两个版本RTL8211F-CG和RTL8211F-VD。前者是商业级后者是工业级。如果你做的是车载或者工控场景必须选VD版本温度范围不一样。我见过有人用CG版本跑在70度环境里链路反复掉线换了VD就稳了。2.2 RGMII接口的时序逻辑与延时方案RGMII是RTL8211F最常用的接口模式。它把GMII的8位数据线压缩到4位在时钟的上升沿和下降沿都采样数据所以实际速率还是1000Mbps。具体来说TX方向FPGA在GTX_CLK的上升沿发TXD[3:0]下降沿发TXD[7:4]RX方向PHY在RX_CLK的上升沿发RXD[3:0]下降沿发RXD[7:4]控制信号TXC和RXC分别随数据一起传输这里最要命的是时序。RGMII规范里有一个2ns的时钟-数据偏斜要求。如果FPGA和PHY之间的走线延时没有补偿采样窗口就会偏移导致误码。RTL8211F内部有一个“内部延时”功能可以通过MDIO寄存器配置。具体是寄存器0x1C的bit[3:2]和bit[5:4]分别控制RX和TX的延时。通常的做法是如果FPGA侧没有做延时比如直接用IOB输出那就在PHY侧开启内部延时如果FPGA侧用了IDELAY或者ODELAY那PHY侧就关掉内部延时我个人的经验是Xilinx 7系列FPGA配合RTL8211F最稳的方案是PHY侧开启RX内部延时TX侧不开然后在FPGA的约束里加IDELAY对RX做微调。这样时序裕量最大。注意RTL8211F的内部延时值不是固定的不同批次的芯片可能有细微差异。批量生产时建议留出可调的IDELAY/ODELAY资源。2.3 电压型与电流型PHY的驱动差异这是一个容易被忽略但非常关键的点。以太网PHY的MDI接口就是接到RJ45的那一对差分线有两种驱动方式电压型和电流型。RTL8211F是电压型驱动。这意味着它的MDI输出是电压信号中心抽头需要接一个对地的电容通常是通过一个49.9欧姆的电阻连接到中心抽头然后中心抽头再通过0.1uF电容接地。而电流型PHY比如某些老款的DP83848的中心抽头需要接电源。如果你把电压型PHY的中心抽头接了电源或者把电流型的接了地轻则链路不通重则芯片发热甚至损坏。我见过一个案例硬件工程师抄了别人的原理图但没注意PHY型号从电流型换成了电压型结果中心抽头的接法没改板子回来之后PHY烫得能煎鸡蛋。RTL8211F的MDI中心抽头正确接法每对差分线的中心抽头通过一个49.9欧姆电阻连接到一起这个公共点再通过一个0.1uF电容接地不要接任何电源3. 硬件设计要点从原理图到PCB的完整拆解3.1 电源域划分与去耦电容配置RTL8211F的电源引脚分了好几组这是硬件设计里最容易出错的地方。具体来说VDDIOIO电压可以是3.3V、2.5V或1.8V取决于你的FPGA Bank电压AVDD33模拟3.3V给内部模拟电路供电AVDD10模拟1.0V给内部核心模拟电路供电DVDD10数字1.0V给内部数字核心供电这四组电源的滤波要求不一样。AVDD33和AVDD10对噪声非常敏感必须用LC滤波或者磁珠隔离。DVDD10相对宽松但也要保证足够的去耦电容。我的做法是AVDD33用一颗磁珠从3.3V主电源隔离然后配10uF1uF0.1uF三级去耦AVDD10由内部LDO输出外挂10uF0.1uFDVDD10同样由内部LDO输出外挂10uF0.1uFVDDIO直接用主电源配0.1uF去耦提示RTL8211F内部有LDO可以产生1.0V但如果你板子上有更好的1.0V电源也可以外部供电。外部供电时要把内部LDO的使能脚拉低具体看数据手册的电源配置表。去耦电容的布局比选型更重要。0.1uF的电容必须紧贴电源引脚走线长度不要超过2mm。10uF的电容可以稍微远一点但也不要超过5mm。我见过有人把去耦电容放在芯片背面通过过孔连接结果噪声大得链路根本起不来。3.2 时钟方案25MHz晶振还是50MHz时钟RTL8211F需要一个25MHz的参考时钟。这个时钟可以来自外部晶振也可以由FPGA提供。两种方案各有优劣方案一外部25MHz无源晶振这是最常见的方案。晶振直接接到PHY的XI和XO引脚配两个负载电容。优点是独立于FPGAFPGA没配置好之前PHY也能正常工作。缺点是增加了一个BOM元件而且晶振的精度和抖动会影响链路稳定性。方案二FPGA提供25MHz时钟FPGA内部PLL产生25MHz通过一个IO输出到PHY的XI引脚XO悬空。优点是省了一个晶振而且时钟质量由FPGA的PLL保证。缺点是FPGA配置之前PHY没有时钟如果FPGA配置失败PHY也不工作。我一般推荐方案一因为以太网PHY的时钟抖动要求比较严格专用晶振的抖动通常比FPGA PLL输出要低。而且独立晶振可以让PHY在FPGA加载之前就完成自协商节省启动时间。晶振的负载电容计算假设晶振规格书要求负载电容CL12pFPCB走线寄生电容Cs≈3pF芯片引脚电容Ci≈3pF则C1 C2 2 × (CL - Cs) - Ci 2 × (12 - 3) - 3 15pF实际选用15pF或者稍小一点的12pF都可以因为负载电容偏小会让频率偏高偏大则偏低。以太网对频率精度要求是±50ppm一般晶振都能满足。3.3 MDI接口的端接与ESD保护MDI接口就是PHY到RJ45之间的那四对差分线。RTL8211F的MDI接口需要外部端接具体是每对差分线之间跨接一个49.9欧姆电阻不对这里要仔细说。实际上RTL8211F的MDI端接是每对差分线的P和N分别通过一个49.9欧姆电阻连接到中心抽头中心抽头再通过0.1uF电容接地。等等这里容易混淆。让我重新理清楚对于电压型PHYMDI的端接方式是差分线P和N各自通过一个49.9欧姆电阻连接到同一个中心抽头点这个中心抽头点通过一个0.1uF电容接地也就是说每对差分线需要两个49.9欧姆电阻和一个0.1uF电容四对差分线就需要8个49.9欧姆电阻和4个0.1uF电容。这些电阻的精度要求是1%封装用0402或者0603都可以。ESD保护方面MDI接口直接连到RJ45是板子上最容易受静电冲击的地方。建议在RJ45和PHY之间加一颗ESD保护二极管阵列钳位电压要低于PHY的绝对最大额定值。我通常用SRV05-4或者类似型号结电容要小于3pF否则会影响信号完整性。注意ESD保护器件要放在RJ45和端接电阻之间不能放在端接电阻和PHY之间否则端接效果会变差。3.4 PCB布局与走线规则PCB布局这块我踩过的坑最多。总结几条硬性规则规则一PHY芯片尽量靠近RJ45MDI差分线的走线长度不要超过25mm越短越好。走线要等长误差控制在5mil以内。差分阻抗控制在100欧姆±10%。规则二晶振远离MDI和电源晶振是敏感器件要远离MDI差分线和电源电感。晶振下方不要走任何信号线最好挖空铺地。规则三RGMII信号线等长RGMII的TXD[3:0]、TX_CTL、RXD[3:0]、RX_CTL这些信号相对于各自的时钟要等长。TX组相对于GTX_CLK等长RX组相对于RX_CLK等长。误差控制在50mil以内。走线阻抗控制在50欧姆。规则四电源平面完整PHY下方的地平面要完整不要被其他信号线割裂。AVDD33和AVDD10的电源走线要尽量宽至少20mil。规则五散热焊盘接地RTL8211F的QFN封装底部有一个散热焊盘必须接地而且要打足够多的过孔。我一般打9个过孔3x3阵列过孔孔径0.3mm。4. MDIO配置与寄存器调试实战4.1 MDIO接口的时序与上拉电阻MDIO是PHY的管理接口只有两根线MDC和MDIO。MDC是时钟MDIO是双向数据线。FPGA通过MDIO读写PHY的内部寄存器。MDIO接口需要上拉电阻通常是1.5k欧姆到2.2k欧姆上拉到VDDIO。这个电阻不能省否则MDIO总线在空闲时状态不确定可能导致读写失败。MDC的时钟频率不能超过2.5MHz一般用1MHz到2.5MHz之间。FPGA侧可以用一个计数器分频产生。MDIO的数据在MDC的上升沿有效FPGA在下降沿改变数据PHY在上升沿采样。4.2 RTL8211F关键寄存器配置RTL8211F的寄存器很多但实际调试中需要关注的就这么几个寄存器0x00BMCR基本模式控制寄存器bit[15]复位写1复位PHYbit[12]自协商使能bit[9]重启自协商寄存器0x01BMSR基本模式状态寄存器bit[2]链路状态1表示链路建立bit[5]自协商完成寄存器0x1CRGMII延时控制寄存器这是RTL8211F特有的寄存器用来控制RGMII的时序延时。bit[3:2]RX延时00无延时012ns104ns116nsbit[5:4]TX延时同上寄存器0x1EPHY特定状态寄存器bit[2]链路状态和BMSR的bit[2]一致bit[4]全双工/半双工调试时我一般先读0x01确认链路状态如果链路没起来再读0x1C检查延时配置。4.3 自协商流程与常见问题自协商是PHY上电后的默认行为。流程是PHY上电复位等待自协商使能BMCR bit[12]1PHY通过MDI发送FLP快速链路脉冲 burst对端PHY回应FLP双方协商出最高共同速率和双工模式链路建立BMSR bit[2]置1常见问题问题一链路一直不建立先检查MDI的端接电阻有没有焊错再检查晶振有没有起振。用示波器测XI引脚应该有25MHz的正弦波幅度在1V左右。如果晶振没起振检查负载电容和晶振本身。问题二链路建立但丢包严重大概率是RGMII时序问题。先读0x1C寄存器确认延时配置。然后调整FPGA侧的IDELAY值用眼图或者误码率测试来找到最佳采样点。问题三自协商结果不对比如明明是千兆环境协商出来只有百兆。检查MDI差分线有没有接反或者某一对线有没有虚焊。另外如果对端是强制千兆而PHY是自协商模式也可能协商失败。这时候可以把PHY也强制成千兆模式。5. 常见问题与排查技巧实录5.1 链路不通的排查流程我整理了一个排查流程按顺序来基本能覆盖90%的问题步骤检查项工具预期结果1PHY电源电压万用表AVDD333.3VAVDD101.0V2晶振起振示波器XI有25MHz正弦波3复位信号示波器上电后有一个低脉冲4MDIO通信FPGA逻辑分析仪能读到PHY ID5自协商状态MDIO读寄存器BMSR bit[5]16链路状态MDIO读寄存器BMSR bit[2]17RGMII时序示波器/眼图采样窗口居中8数据通路回环测试收发数据一致这个流程的关键是“从电源到时钟到配置到数据”的顺序不要跳步。我见过有人直接跳到第7步调时序结果发现是第1步电源就没对。5.2 RGMII时序问题的独家调试技巧RGMII时序问题是最难调的因为它不像电源问题那样有明确的“对”和“错”。我的经验是技巧一先用低速模式验证把PHY强制成百兆模式RGMII的时钟降到25MHz时序裕量会大很多。如果百兆能通千兆不通那基本可以确定是时序问题。技巧二用IDELAY扫描找最佳点Xilinx FPGA的IDELAY可以以78ps为步进调整延时。写一个状态机从0到31逐步调整IDELAY值每调一次发一批数据统计误码率。误码率最低的那个点就是最佳采样点。技巧三注意PCB走线延时RGMII的走线延时大约是6ps/mm。如果FPGA和PHY之间的走线长度差了几厘米延时差就有几百皮秒必须用IDELAY补偿。技巧四PHY内部延时和FPGA IDELAY不要同时开太大如果PHY开了4ns延时FPGA再开2ns总延时可能超过一个时钟周期导致采样错位。一般PHY开2nsFPGA微调就够了。5.3 电源噪声导致的偶发性丢包这个问题很隐蔽因为链路能建立大部分数据也能通但偶尔丢几个包。用误码仪测可能误码率在10^-9量级看起来还行但跑TCP的时候重传率很高。根源通常是AVDD33的噪声。RTL8211F的模拟电路对电源噪声非常敏感如果AVDD33的纹波超过50mV就可能影响MDI的发送信号质量。解决方法在AVDD33的磁珠后面再加一级LC滤波L用1uHC用10uF检查磁珠的额定电流不要用太小电流的磁珠否则直流电阻大会导致压降在PHY下方铺一层完整的模拟地和数字地单点连接我遇到过一个案例AVDD33的磁珠用了0603封装、额定电流50mA的型号结果PHY工作电流超过50mA磁珠饱和滤波效果全无。换成1206封装、500mA的磁珠之后丢包问题消失。5.4 MDIO读写失败的几种原因MDIO读写失败通常表现为读回来的PHY ID不对或者寄存器值全是0或全是1。原因一上拉电阻缺失或阻值不对MDIO需要1.5k到2.2k的上拉。如果忘了焊或者焊成了10k总线就拉不起来。原因二MDC频率太高MDC超过2.5MHz可能导致PHY采样失败。先用1MHz试试。原因三MDIO方向切换时序不对MDIO是双向线FPGA在读的时候要释放总线设为高阻写的时候才驱动。如果方向切换太慢会出现总线冲突。原因四PHY地址不对RTL8211F的PHY地址由PHYAD[4:0]引脚决定通常是上电时锁存。如果这些引脚悬空或者接错地址就不对。我一般把PHYAD[4:0]都接地地址就是0。6. 从PHY到FPGA的完整链路验证6.1 回环测试的设计与实现回环测试是验证PHY和FPGA之间链路是否正常的最直接方法。RTL8211F支持几种回环模式内部回环PHY内部把TX数据直接环回到RX不经过MDI外部回环需要外部把MDI的TX和RX短接我一般先用内部回环验证RGMII接口和MDIO配置再用外部回环验证MDI和变压器。内部回环的配置方法写BMCR寄存器设置bit[14]1本地回环通过RGMII发送一批已知数据在RGMII接收侧检查数据是否一致如果内部回环能通说明FPGA的RGMII发送和接收逻辑、PHY的RGMII接口、MDIO配置都没问题。剩下的就是MDI和变压器的硬件问题了。6.2 眼图测试与信号完整性评估眼图是评估MDI信号质量的最直观工具。用示波器配合差分探头在RJ45侧测量TX差分信号的眼图。一个健康的千兆以太网眼图应该满足眼高至少500mV眼宽至少0.7UIUI1ns for 1000Mbps抖动RMS抖动小于50ps如果眼图闭合说明信号完整性有问题。常见原因端接电阻不匹配走线阻抗不连续变压器选型不对电源噪声太大我一般会在PCB上预留一个SMA或者U.FL测试点方便接探头。如果没有测试点也可以用近场探头粗略评估。6.3 长时间稳定性测试方案实验室里跑通不代表现场能稳定运行。我一般会做至少24小时的稳定性测试用iperf或者类似工具持续打流记录丢包率和重传率监测PHY温度监测电源纹波如果24小时丢包率为0基本可以放心。如果偶尔丢几个包就要查电源噪声或者时序裕量。提示温度对PHY的影响很大。RTL8211F在高温下内部延时会变化如果时序裕量本来就不大高温下可能就失效了。所以稳定性测试最好在高低温箱里做。7. 一些设计之外的实战体会RTL8211F这颗PHY我用了很多年从最初的照抄参考原理图到后来自己根据实际需求调整设计中间踩过的坑基本都在这篇文章里了。如果只让我说一条最重要的经验那就是PHY的硬件设计电源和时钟占70%的重要性剩下的30%才是信号线。很多人把大量精力花在RGMII的等长绕线上结果电源噪声一大什么时序都白搭。另外MDIO的调试接口一定要引出来。我一般会在板子上留一个2.54mm的排针把MDC、MDIO、GND引出来方便用逻辑分析仪抓波形。没有这个接口调试的时候只能靠猜效率极低。最后说一个容易被忽略的点RTL8211F的复位引脚。这个引脚是低电平复位复位脉冲宽度至少要10ms。如果复位脉冲太短PHY可能没有完成内部初始化导致MDIO读写失败。我一般用FPGA控制复位上电后拉低100ms再释放确保PHY完全复位。这个内容后续还可以扩展的方向包括RTL8211F的节能模式配置、Wake-on-LAN的实现、以及和不同厂商FPGA配合时的时序约束写法。如果有机会我再单独写一篇讲RGMII时序约束的详细步骤。