ARTICLE DETAIL

资讯详情

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

FPGA与PHY之间SGMII接口设计调试指南:从原理到实战

FPGA与PHY之间SGMII接口设计调试指南:从原理到实战 做网口项目的人应该都遇到过这种怪事FPGA程序烧进去了PHY芯片的Link灯也亮了但设备就是ping不通。翻开原理图一条条查SGMII这对差分线在芯片之间明明只有几厘米看上去也平平无奇可问题偏偏就藏在这“几厘米”里。SGMII全称Serial Gigabit Media Independent Interface串行千兆媒体独立接口是FPGA和PHY芯片之间最常见的高速链路之一。它在FPGA板卡上承担着MAC和PHY之间的数据搬运工作速率固定跑在1.25Gbps使用8B/10B编码信号形态是一对发送差分线加一对接收差分线。很多工程师只把它当成普通差分对来布线结果实际调试的时候Link能建立、自动协商能完成数据却一直错包重传最后折腾好几天才发现问题出在AC耦合电容摆错位置、或者参考时钟没同源这种看似不起眼的细节上。这篇就顺着信号走的路径从FPGA引脚一路讲到RJ45网口把每个环节的原理、设计要点、调试方法一次说清楚。适合正在做FPGA板卡网口设计的人也适合刚接触SGMII但没系统梳理过这条链路的人。下面我按实际项目里的调试思路来拆解。1. 整体设计与链路拆解1.1 SGMII到底是个什么接口SGMII是Cisco主导定义的一种串行接口用于连接以太网MAC在FPGA里通常是一个IP核和外部PHY芯片。它用一对差分线发送、一对差分线接收工作速率固定为1.25Gbps这个速率不会因为以太网工作在10M、100M还是1000M而改变。低速模式下PHY会通过重复发送相同数据帧来匹配较低的线速这个机制叫“速率适配”。你可能要问为什么不用更经典的GMII接口GMII需要8位数据线加时钟收发加起来二十多根信号加上控制信号几十根在FPGA引脚资源紧张的时候非常不划算。SGMII只需要4根高速线TX_P/TX_N/RX_P/RX_N加上MDC/MDIO管理总线引脚数量大幅减少。而且GMII时钟要跑到125MHz源同步时序约束在PCB上很敏感SGMII的时钟是嵌在串行数据流里的由收发器内部的CDR恢复时序上省心很多。对比一下目前常见的几种MAC-PHY接口接口类型数据位宽时钟频率引脚数量适用场景GMII8bit125MHz24以上早期设计引脚充足但不是推荐RGMII4bit DDR125MHz12左右低成本对时序约束敏感SGMII串行1.25Gbps嵌在数据中4管理引脚少速率高适合FPGA从表格能明显看出在FPGA板卡上SGMII几乎是平衡速度和引脚资源的最优解。这也是为什么现在的交换芯片、FPGA开发板、嵌入式ARM平台普遍采用SGMII作为MAC和PHY之间的标准接口。1.2 整条链路的地图先说结论SGMII信号从FPGA到网口要经过六个环节。FPGA内部以太网IP核的MAC部分产生数据进入SGMII IP核的PCS层完成8B/10B编码然后经过SerDes发送器把并行数据转成1.25Gbps的高速串行差分信号从FPGA的专用引脚输出。信号离开FPGA引脚后先经过一小段PCB走线再穿过AC耦合电容然后到达PHY芯片的SGMII接口。PHY芯片内部完成串并转换、10B/8B解码再把数据交给PMA层调制成模拟信号通过MDI接口驱动网络变压器最后由RJ45插座和网线连接对端设备。值得强调的是这条链路上FPGA设计工程师、原理图工程师、PCB工程师各管一段最容易出现“各扫门前雪”的情况。FPGA工程师认为PHY寄存器配置是硬件的事硬件工程师认为差分走线是PCB的事PCB工程师只保证阻抗和等长结果整体联调时谁都说不清问题出在哪。所以做这个项目最好从头到尾把链路地图刻在脑子里。1.3 为什么SGMII链路容易翻车SGMII速率1.25Gbps在整个高速接口里并不算特别快但它的风险恰恰在于“看起来不难”。很多团队对待SGMII就像对待普通LVDS一样布局布线不够讲究实际测试时就暴露了问题。SGMII的可靠性取决于四件事PCB差分阻抗是否接近100欧姆、AC耦合电容的位置和取值是否合理、参考时钟是否干净同源、PHY寄存器配置是否正确。这四个因素任何一个出问题都可能导致Link不稳定、误码率高甚至完全不通。而SGMII的信号又不像是模拟视频信号那样可以直观看到画面模糊它的故障表现往往很“软”——ping偶尔丢包、百兆正常千兆不通、长时间运行后断链这类问题排查起来特别耗时。2. FPGA与PHY之间的SGMII接口设计2.1 引脚分配与关键信号FPGA和PHY之间的SGMII接口核心信号并不复杂。信号名称方向作用设计要点SGMII_TX_P/NFPGA - PHY发送差分对100欧姆差分阻抗等长控制SGMII_RX_P/NPHY - FPGA接收差分对100欧姆差分阻抗等长控制MDCFPGA - PHY管理时钟频率建议不超过12.5MHzMDIOFPGA - PHY管理数据需要上拉电阻典型4.7kPHY_125M_CLKPHY - FPGASGMII参考时钟必须与PHY同源多用于FPGA侧IP核PHY_RESET_NFPGA - PHY复位控制上电时序需满足PHY手册要求引脚分配时优先选择FPGA器件上专用的高速串行引脚组在Xilinx器件中通常标记为MGTP/MGTY在Intel器件中标记为Native Transceiver引脚这些引脚内部直接连接到收发器硬核不要随便接到普通IO上不然就白白浪费了SerDes能力。2.2 阻抗、等长与PCB叠层SGMII标准的差分阻抗要求是100欧姆。这个100欧姆是由PCB层叠和线宽线距共同决定的。以常见的4层板、板厚1.6毫米、FR4材质为例表层微带线如果要做到100欧姆差分阻抗线宽大约在5到6mil、线距大约在8到10mil但具体数值必须用阻抗计算工具结合实际叠层参数去算不能照抄别人板子上的数字。我在项目里习惯用Polar Si8000或者Saturn PCB Design Toolkit做阻抗预估然后让板厂用他们的叠层数据复算确认。设计阶段就把阻抗要求写进PCB工艺文件里要求板厂对SGMII差分对做阻抗测试并出报告这一点千万别省省了后面调试时候的返工成本更大。等长方面SGMII差分对内P/N等长要控制在5mil以内两个方向的差分对之间总长差控制在50mil以内比较稳妥。1.25Gbps的信号对应的波长大约在120毫米左右理论上等长要求没那么极端但留出裕量总没坏处。我见过一个项目SGMII对内做了严格等长但忽略了对间等长接收端时钟恢复模块工作不稳定随机丢包最后重新改板才解决。2.3 AC耦合电容与回流路径SGMII链路必须串联AC耦合电容这是SGMII规范明确规定的。电容的作用是隔离PHY和FPGA两端的直流电平差异。SGMII接口的共模电平和FPGA收发器输出的共模电平并不完全一致直接直流耦合可能导致共模不匹配轻则信号畸形重则烧毁PHY的输入级。电容取值常见0.1uF封装0402或0603都可以推荐0402以减小焊盘寄生电容。最关键的一点是AC耦合电容要靠近发送端放置也就是FPGA发出信号时电容尽量靠近FPGA一侧PHY发出信号时电容尽量靠近PHY一侧。原因是发送端的高速信号经过电容后会产生一个轻微的阻抗突变把这个突变放在链路靠近驱动器的地方对信号质量影响最小。另外两条差分线上的耦合电容位置要保持对称不要一个靠前一个靠后。回流路径方面SGMII差分对下方必须保证完整的参考地平面不要在信号路径上跨过电源分割槽。如果需要换层在换层过孔旁边补一个接地过孔给返回电流提供最短路径。这个原则几乎所有高速信号都适用但SGMII板卡上经常因为BGA扇出布线空间紧张工程师顺手让差分对跨了个分割结果就成了误码源。2.4 参考时钟的同源设计SGMII的时钟方案是调试中最容易被忽略的环节。很多PHY芯片有CLK125输出引脚可以从PHY产生一个125MHz参考时钟送给FPGAFPGA侧的SGMII IP核用这个时钟作为参考时钟。这种做法的好处是保证整条SGMII链路时钟同源避免FPGA和PHY各自用自己的晶振频率偏差导致CDR失锁。以Marvell 88E1512为例它的CLK125_KD引脚可以通过strap电阻配置为输出125MHz参考时钟。这个125MHz并不是SGMII的数据时钟本身而是发送端PCS逻辑的参考时钟但FPGA和PHY用同一个参考时钟对整个系统的稳定性有很大帮助。实际项目里我会检查PHY的参考时钟是否干净用示波器看时钟沿的抖动情况。如果时钟信号上叠加了明显的电源噪声SGMII的误码率会明显上升。3. PHY芯片的配置与SGMII链路建立3.1 PHY工作模式的strap配置PHY芯片通常支持多种MAC接口模式比如RGMII、GMII、SGMII、1000BASE-X等芯片型号的具体模式由硬件strap引脚在复位释放时采样决定。以常用的88E1512为例它的CONFIG0到CONFIG5引脚通过上拉或下拉电阻设置工作模式、PHY地址、LED行为等参数。这里特别容易踩坑。有的工程师画原理图时直接从参考设计复制strap配置但没有对照自己的实际需求检查。比如参考设计用的是RGMII模式而你FPGA这边想做SGMIIstrap没改PHY复位之后根本不会在SGMII接口上输出信号FPGA侧SGMII IP核一直显示信号丢失排查半天也不知道问题在哪。建议原理图阶段就把PHY的strap引脚状态整理成表格逐项确认接口模式是否为SGMII、PHY地址是多少、是否启用CLK125输出、是否禁用休眠模式等。这些细节在芯片数据手册里都有明确的表格说明不同型号引脚数量和作用可能不同务必以对应型号手册为准。3.2 MDIO总线与寄存器读写MDIO是管理SGMII和PHY的“控制通道”。MDC是FPGA输出的时钟MDIO是双向数据线。MDIO需要接上拉电阻一般4.7k到10k欧姆上拉到PHY的VDDIO。如果多个PHY挂在同一条MDIO总线上每个PHY必须设置不同的地址通过PHYAD引脚的高低电平区分。MDIO读写过程并不复杂每个访问周期由起始码、操作码、PHY地址、寄存器地址、数据和前导码组成。但实际调试时我不会直接对着时序写代码而是先确认FPGA的MDIO控制器能读到PHY的ID寄存器。比如88E1512的寄存器0x02和0x03里存放芯片ID读出来是0x0141和0x0E10之类如果读到0xFFFF或者全零先别急着怀疑MDIO控制器很可能是PHY没上电、复位没释放、或者PHY地址不对。3.3 复位时序与IP核初始化顺序PHY的复位时序非常讲究。绝大多数PHY芯片要求所有电源稳定之后复位信号再保持一段低电平时间常见10毫秒以上然后释放复位。释放复位后内部strap引脚采样、寄存器默认值加载、时钟稳定等还需要时间一般建议释放复位后再等100毫秒以上才开始通过MDIO访问PHY。FPGA侧SGMII IP核的初始化顺序也要注意。以Xilinx的1G/2.5G Ethernet PCS/PMA or SGMII IP核为例标准操作是先复位整个IP核然后等待复位完成再观察SGMII自动协商状态。如果FPGA IP核的复位和PHY的复位释放同时进行两边可能都在初始化过程中互相等待表现为链路状态一直起不来。工程上我习惯软件上先释放PHY复位延时足够时间再释放FPGA IP核复位这两个复位的先后顺序写死在程序里保证每次上电时序一致。3.4 SGMII自动协商的逻辑SGMII接口上有一种特殊的自动协商机制它和网线上那种传统自动协商不是一回事。传统以太网自协商是PHY通过对端PHY在线缆上完成的协商的是双工模式和速率。而SGMII的自协商是MAC侧FPGA和PHY之间的内部协商作用是把MAC侧希望的速率1000M、100M还是10M通过SGMII接口告诉PHY。很多工程师不理解这一点看到FPGA的SGMII IP核配置里有个auto-negotiation选项就总是犹豫要不要打开。实际上如果FPGA要自适应连接对端设备的速度SGMII的自协商就要开启。PHY会把自己在对端协商到的速率通过SGMII链路反馈给FPGAFPGA侧IP核解析后调整MAC侧速率。如果SGMII自动协商没完成PHY是无法正确转达对端速率的MAC和PHY的速率不一致数据通信就会失败。4. 从PHY到RJ45的模拟侧传输4.1 PHY到网络变压器这一段SGMII信号在PHY内部经过PCS和PMA处理之后在PHY的MDI引脚上输出的是模拟信号已经不是数字逻辑电平了。MDI引脚连接到网络变压器变压器再连接到RJ45。网络变压器的作用有三个一是电气隔离把PHY芯片和外部网线隔开防止雷击浪涌和共模干扰损坏PHY二是阻抗匹配让PHY的模拟前端和网线的特性阻抗匹配三是提供共模抑制变压器本身对差分信号透明但对共模干扰有衰减作用。实际选型时选择1:1变比的网络变压器即可但要关注隔离耐压等级一般要求1.5kV以上。很多开发板直接使用带变压器的RJ45连接器比如HR911105A或者B88269X1这类集成元件外部只需一个RJ45座就能完成PHY到网线的连接省去了独立变压器和共模电感的布线空间非常适合FPGA板卡这种对面积敏感的设计。4.2 RJ45引脚定义与接线顺序RJ45是8P8C插座不同速率下使用的线对不同。引脚100BASE-TX用途1000BASE-T用途568B色序1TX线对BBI_DA白橙2TX-线对BBI_DA-橙3RX线对CBI_DB白绿4未用线对DBI_DC蓝5未用线对DBI_DC-白蓝6RX-线对CBI_DB-绿7未用线对ABI_DD白棕8未用线对ABI_DD-棕做FPGA板卡网口设计时要注意1000BASE-T的4对线全部参与收发同时双向传输所以MDI引脚的方向不再是简单的TX和RX。PCB布线时这4对线从PHY出来后到RJ45之间的等长、阻抗要求都比1000BASE-TX要高不过速率本身也只有125MHz的4D-PAM5信号只要按100欧姆差分对布好问题不大。4.3 共模电感、ESD与地处理网络变压器和RJ45之间很多参考设计会加共模电感。共模电感的作用是抑制网线上传来的共模EMI噪声防止它们通过变压器耦合进PHY芯片。选型时关注100MHz下的共模阻抗常见几十欧姆到几百欧姆。但我经历过一次教训某个项目中选了一颗600欧姆100MHz的共模电感结果网线稍长一点就频繁断链。原因就是共模电感阻抗过大对正常工作信号的非理想效应也被放大了导致信号质量恶化。后来换成100欧姆左右的型号问题消失。所以共模电感不是越大越好要结合PHY手册推荐选型。地处理上建议把RJ45的屏蔽壳通过一个高压电容常见1nF到4.7nF耐压2kV连接到系统地让高频噪声有泄放路径同时直流上仍然隔离。PHY侧的参考地很多PHY手册会推荐使用“PHY隔离地”通过磁珠或0欧电阻连接数字地具体按手册方案来。不要自作主张把所有地都直连浪涌测试时会很痛苦。4.4 设计复查清单画完原理图、布完线我会拿着一张自己整理的设计复查清单逐项过一遍SGMII差分对阻抗是否控制在100欧姆左右板厂阻抗报告是否提供AC耦合电容是否放在发送端附近取值是否0.1uF封装是否0402SGMII对内等长是否小于5mil对间等长是否小于50mil参考时钟是否由PHY输出给FPGA时钟走线是否远离干扰源PHY strap脚是否按需要配置成SGMII模式MDIO上拉电阻、PHY地址是否设置正确网络变压器选型是否1:1隔离耐压是否满足要求RJ45连接器是否集成变压器屏蔽壳接地方案是否明确共模电感阻抗是否在合理范围是否与PHY手册推荐一致这张清单帮我挡下了不少后期调试事故。5. 调试、实测与排查实录5.1 用回环测试快速定位问题SGMII链路出问题时第一件事不是拿示波器到处量而是做回环测试把问题范围一点点缩小。先在FPGA侧做内部回环。Xilinx SGMII IP核里通常有PCS loopback选项开启后数据从FPGA发送PCS直接回到接收PCS不经过外部引脚。这个测试能验证FPGA内部的PCS和SerDes工作是否正常。配置好回环后在FPGA内部发包、收包看统计计数器全绿说明FPGA侧没问题。然后在PHY侧做回环。88E1512这类PHY的寄存器里通常有digital loopback或者SGMII loopback控制位。开启后PHY会把从FPGA收到的数据直接返回给FPGA数据不经过模拟前端也不经过网线。这个测试能验证PHY的SGMII接口和MAC侧链路是否正常。如果FPGA回环正常、PHY回环也正常问题基本锁定在PHY的模拟侧和外部网口电路。再用一根已知好的网线直连交换机逐个环节排查。这种分层排查的思路比拿示波器瞎点几千个点高效得多。5.2 用示波器实测SGMII眼图回环测试能定位功能性问题但信号质量类问题必须用示波器看眼图。SGMII的速率是1.25Gbps带宽需求不算特别夸张但为了看准眼图示波器带宽至少2GHz以上探头最好是差分探头。我在项目中用4GHz带宽的示波器测SGMII眼图效果完全够用。测点位置选在接收端附近也就是PHY芯片的SGMII输入引脚处对应FPGA输出直接到PHY的方向。正常的SGMII眼图应该是开口清晰、交叉点居中、抖动较小的一个“眼睛”。如果眼睛明显闭合优先检查AC耦合电容是否放错位置、阻抗是否匹配、回流路径是否被破坏。眼图上还能看到信号幅度。SGMII差分信号幅度一般在几百毫伏级别不同PHY略有差异。如果你测到幅度异常低检查一下是不是端接电阻的问题。有些PHY芯片的SGMII接收端在内部已经集成了端接外部不需要再加如果你额外加了一个100欧姆差分电阻就会造成信号衰减。这一点一定要以PHY手册为准。5.3 常见问题速查表问题现象可能原因定位方法MDIO读不到PHY IDPHY电源没起来、复位没释放、MDIO上拉缺失量PHY电源、复位、MDIO电平SGMII Link一直建立不起来PHY strap配置错误、SGMII自动协商未开启检查strap状态、FPGA IP核配置Link灯亮但数据不通参考时钟不同源、MAC和PHY速率协商不一致检查参考时钟来源、SGMII AN状态寄存器1000M不通但100M正常AC耦合电容位置不对、共模电感阻抗过大检查信号链路上元件看眼图偶发丢包、长时间运行断链回流路径被破坏、电源纹波过大检查PCB平面完整性、量电源纹波网线长短不同表现差异大变压器选型或共模电感参数不合适对比PHY手册参考设计这张表未必覆盖所有场景但大部分SGMII链路问题都可以从这张表入手快速定位。5.4 几个值得记下的设计经验最后说几个我在多个项目里反复踩过的坑。第一AC耦合电容一定要放在发送端一侧。这句说三遍都不嫌多因为原理图上一个电容的位置到PCB上可能就决定了整个链路的信号完整性。曾经有块板卡的SGMII信号质量怎么测都不达标最后发现AC电容被放在了接近PHY的一端FPGA发送端的阻抗突变没有被控制好挪到FPGA引脚附近后眼图立刻改善。第二不要在SGMII差分对上串测试点或排针。有的工程师为了调试方便在差分对上预留了0欧电阻测试点结果这个焊盘带来的寄生电容和阻抗不连续直接导致链路余量不足。如果非要预留调试手段宁可引一小段短Stub用焊盘测试也比串联在通路中间要强。第三PHY输出的125MHz参考时钟不要在PCB上拉到很远的地方。这个时钟虽然是参考时钟但它的质量直接决定SGMII收发数据是否稳定。如果FPGA离PHY较远时钟线在BGA区域穿来穿去等于给噪声制造了一个耦合天线。第四网络变压器的中心抽头处理方式必须严格参考PHY手册。有的PHY要求中心抽头接电源有的要求接电容到地有的要求直接接地处理错一个信号要么完全不通要么勉强Link但误码率极高。我见过一个项目就是因为变压器中心抽头少接了一个电容1000M一直不通补上之后立竿见影。结尾做这类高速接口最大的体会是它从来不是单一学科的战场。SGMII链路从FPGA的IP核配置、PHY的寄存器操作到PCB的信号完整性每个环节都是短板效应里的那一块板。一个项目做完最值得的投资就是把这条链路从头到尾自己完整调一遍不要只看FPGA侧也不要只盯着PHY寄存器。个人经验是SGMII的调试有条特别管用的顺序先分层回环排除功能问题再量时钟、看眼图排除信号质量问题最后才是对着寄存器表格细查配置。这个顺序能把你从“到处乱试”的状态里拽出来省下不少熬夜时间。最后再分享一个小技巧新板卡回来以后别急着把PHY的自动协商打开先在固定千兆全双工的模式下把回环和数据收发调通再切换到自适应模式。固定模式下链路特征简单问题容易暴露和定位等确认整条链路稳定了再打开自动协商适配各种对端设备。这个方法帮我顺利搞定过好几块FPGA网口板卡希望对你有用。
返回列表