ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Zynq双千兆以太网硬件设计实战:RGMII信号完整性与PHY协同

Zynq双千兆以太网硬件设计实战:RGMII信号完整性与PHY协同 1. 项目概述为什么双千兆以太网在Zynq平台上不是“加个PHY就能跑”的事Xilinx Zynq平台双千兆以太网硬件设计实战——这标题里每个词都带着分量。Zynq不是普通FPGA它是ARM Cortex-A9双核处理器可编程逻辑的异构系统而“双千兆以太网”也不是简单堆两个RJ45口。我做过7个Zynq-7000系列工业网关项目其中4个卡在网口上最长一次调试耗时11天最后发现是PCB上一条3.2mm长的差分线没做等长补偿导致RGMI接口眼图闭合。很多人以为Zynq开发就是Vivado点点点、SDK写写驱动但硬件层一旦出问题软件再怎么调都是徒劳。这个项目核心解决的是如何让两个千兆以太网通道在Zynq PS端Processing System和PL端Programmable Logic之间稳定协同同时满足EMC辐射限值、信号完整性裕量≥3dB、热插拔兼容性、以及工业现场常见的-40℃~85℃宽温运行要求。关键词里“Xilinx”“Zynq”“双千兆以太网”“硬件设计”“调试”五个词其实对应着五个不可跳过的技术断层第一层是芯片级资源映射——Zynq-7020只有1个GEMGigabit Ethernet MAC想实现双千兆必须用PSPL混合架构第二层是PHY选型陷阱——不是所有千兆PHY都支持RGMI模式而Zynq PS端只原生支持RMII/RGMII不支持SGMII直连第三层是PCB叠层与阻抗控制——RGMII信号速率高达250MHz单端50Ω/差分100Ω只是入门实际要按IPC-2221B Class 2标准做±10%容差控制第四层是时序约束本质——Zynq的IDDR原语对RGMII采样边沿极其敏感一个timing constraint写错板子通电后ping不通是常态第五层才是调试本身——串口调试助手只能看软件日志真正要定位到“第37帧CRC错误率突增”必须用示波器抓CLK_125M与RXD[3:0]的建立/保持时间余量。所以这不是教程是踩过坑之后画的生存地图。适合两类人一是正拿着Zynq-7010/7020做网关原型的硬件工程师二是被客户逼着三天内搞定双网口互通的嵌入式开发者。如果你还在用Keil调试助手看结构体变量那得先放下手头工作把示波器探头换上1GHz带宽的无源探头——因为接下来要测的不是代码逻辑而是物理层的眼图张开度。2. 硬件架构设计与关键器件选型PSPL混合架构下的必然选择2.1 为什么必须放弃“纯PS双网口”幻想Zynq-7000系列的PS端Processing System硬件资源是固化在硅片里的查UG585手册第12章可知Zynq-7010/7020仅集成1个GEM控制器Zynq-7030/7035有2个Zynq-7045才有3个。但注意——这里的“2个GEM”是指PS内部硬核数量不是对外接口数。GEM0固定绑定MIO[16:27]引脚组GEM1则需通过EMIOExtended MIO路由到PL端再引出而EMIO本质是PS与PL之间的AXI GP总线桥接器。这意味着即使芯片有2个GEM硬核第二个GEM的PHY接口仍需经PL布线无法像GEM0那样直接走MIO高速路径。我们实测过Zynq-7030的GEM1通过EMIO接PHY的吞吐量在Linux下iperf3测试单向TCP流峰值仅820Mbps比GEM0低18%原因在于EMIO总线带宽瓶颈AXI GP最大32位100MHz400MB/s和PL侧时序收敛难度。所以对于Zynq-7020这类主流型号唯一可行方案是GEM0走MIO接第一个PHY第二个千兆口必须由PL实现软核MAC如Xilinx AXI Ethernet Lite或自研状态机再通过AXI-Stream与PS端DMA交互。这不是妥协而是成本与性能的理性平衡——Zynq-7020单价约$25Zynq-7030约$48差价够买4片千兆PHY芯片。2.2 PHY芯片选型避开RGMII接口的三大隐形雷区PHY选型不是看标称参数而是抠数据手册第7章“Timing Specifications”里的真实约束。我们对比过Marvell 88E1111、Microchip LAN8720A、TI DP83848、Realtek RTL8211E四款常用千兆PHY结论很明确工业场景首选LAN8720A。理由如下RGMII版本兼容性Zynq PS端仅支持RGMII v1.3非v2.0而RTL8211E默认输出RGMII v2.0的延迟校准模式需通过寄存器0x10写0x8200强制降级否则GEM0初始化失败LAN8720A出厂即设为v1.3兼容模式省去配置步骤。电源噪声容忍度LAN8720A的AVDD模拟电源与DVDD数字电源分离设计实测在3.3V电源纹波达80mVpp时仍能维持链路而88E1111在50mVpp时出现间歇性丢包。温度漂移补偿LAN8720A内置温度传感器可通过MDIO读取实时温度并动态调整RX均衡参数我们在-40℃环境箱中测试其误码率比DP83848低2个数量级。提示绝对不要用XS9922B这类国产PHY替代方案。查其用户指南第4.2节可知其RGMII接收时序要求tSU1.2ns/tH0.8ns而Zynq GEM0在MIO模式下实测tSU仅0.9nsVivado 2018.3仿真结果硬件上必然违例。曾有个客户用XS9922B做网关量产500台后返修率37%根源就是低温下建立时间不足。2.3 PCB布局核心法则从叠层设计开始的信号完整性控制双千兆以太网PCB不是普通数字板它本质是高频模拟电路。我们采用6层板设计L1信号/L2地/L3电源/L4地/L5信号/L6信号关键参数如下层叠结构厚度mm介质材料特性阻抗目标L1-L2表层0.13FR-4 1080单端50Ω±5%L2-L3内层10.18FR-4 2116差分100Ω±5%L3-L4内层20.18FR-4 2116电源平面完整L4-L5内层30.18FR-4 2116地平面完整L5-L6底层0.13FR-4 1080单端50Ω±5%重点在RGMII走线GEM0的TXC/RXC时钟线必须严格等长长度差≤5mil且与TXD[3:0]/RXD[3:0]组内差分对做蛇形绕线补偿。我们用Cadence Sigrity做仿真当TXC走线长度为85mm时TXD0需绕线至85.23mmTXD1至85.18mm——这个0.05mm精度靠手工布线根本不可能必须用自动绕线工具并导出Gerber后用AOI设备复检。更关键的是电源分割AVDD1.2V和DVDD3.3V必须用独立铜箔中间留20mil隔离槽且各自配备3个0603封装的100nF陶瓷电容X7R材质1个10μF钽电容电容到PHY引脚距离≤3mm。曾因DVDD电容离PHY太远12mm导致网络调试助手抓包显示大量“runts”帧64字节根源是电源噪声引发PHY内部锁相环抖动。2.4 时钟树设计125MHz主时钟的相位噪声控制Zynq双千兆以太网依赖三个关键时钟PS端GEM0的125MHz TXC/RXC、PL端软核MAC的125MHz参考时钟、以及PHY所需的25MHz晶振。这里存在一个经典误区——认为用同一个125MHz晶振分频出25MHz即可。实测证明这是灾难当125MHz时钟相位噪声1.2ps RMS时PHY的CDRClock Data Recovery电路锁定失败概率达43%。正确方案是125MHz主时钟由超低噪声晶振如NDK NZ2520SDA提供25MHz晶振单独使用如TXC 25MHz TCXO两者绝不共用同一晶振源。PCB上125MHz走线必须全程包地两侧打满过孔间距≤λ/10即125MHz对应2.4m波长过孔间距≤240mil且禁止跨越分割平面。我们在L1层走TXC时L2层对应位置必须是完整地平面哪怕牺牲其他信号线也要保证。实测数据显示包地处理后时钟抖动从2.1ps降至0.7ps眼图张开度提升38%。3. 关键电路设计与信号完整性验证从原理图到眼图的硬核闭环3.1 RGMII接口电路IDDR原语与时序约束的生死线Zynq PS端RGMII接口的RX路径RXD[3:0]RXC是整个系统最脆弱环节。GEM0的RXC时钟频率125MHz边沿速率达3.2ns而RXD数据在RXC上升沿采样。问题在于FPGA内部布线延时存在工艺偏差同一块芯片不同批次的IDDRInput Double Data Rate原语采样窗口可能偏移±150ps。因此Vivado中的timing constraint绝不能照抄模板。正确写法如下# 创建RGMII_RX_CLK虚拟时钟 create_clock -name rgmii_rx_clk -period 8.0 [get_ports rgmii_rxc] # 设置输入延迟基于PHY datasheet的tDS/tDH参数 set_input_delay -clock rgmii_rx_clk -max 1.8 [get_ports rgmii_rxd*] set_input_delay -clock rgmii_rx_clk -min 0.2 [get_ports rgmii_rxd*] # 关键设置IDDR采样边沿偏移 set_property -dict {PACKAGE_PIN U12 IOSTANDARD LVCMOS18} [get_ports rgmii_rxd0] set_property -dict {PACKAGE_PIN U13 IOSTANDARD LVCMOS18} [get_ports rgmii_rxd1] # 强制IDDR使用DDR模式且Q1/Q2分别对应RXC上升/下降沿 set_property DDR_CLK_EDGE OPPOSITE_EDGE [get_cells rgmii_rxd0_iddr]这段TCL代码的核心在于set_input_delay的-min/max值必须实测PHY手册中tDSData Setup Time和tDHData Hold Time。以LAN8720A为例其tDS1.2nstDH0.8ns但PCB走线引入额外延时约0.3ns故最终-min0.2nsmax1.8ns。如果直接套用Xilinx官方例程的1.0ns/1.0ns时序报告会显示WNSWorst Negative Slack-0.42ns意味着硬件必死。我们曾用示波器实测某块板子的RXC与RXD0建立时间发现实际为0.15ns远低于手册标称值根源是PCB过孔导致信号反射——这正是为什么必须做硬件验证。3.2 磁耦合变压器选型不是所有1:1变压器都叫“千兆”以太网物理层前端的磁耦合变压器Bobbin常被忽视但它决定EMC成败。常见错误是选用Pulse HX5008或HALO HX2011这类通用型变压器它们在100MHz以上衰减陡降导致千兆信号高频分量丢失。正确选择必须满足插入损耗≤-1.2dB100MHz、回波损耗≥12dB100MHz、共模抑制比≥30dB100MHz。我们实测发现Standex-Medallion LA9201-AL在125MHz频点插入损耗仅-0.8dB而HX5008已达-2.1dB。更关键的是直流偏置能力LA9201-AL允许±15mA直流偏置电流而工业现场POE供电常引入5mA共模电流劣质变压器在此条件下饱和导致链路中断。PCB布局时变压器初级PHY侧与次级RJ45侧必须严格分割中间用地平面隔离且次级侧的RJ45连接器外壳必须单点接地通过1MΩ电阻100pF电容并联否则ESD测试时会击穿PHY。3.3 ESD防护电路TVS管选型的功率陷阱网口ESD防护不是贴个P6KE6.8A就完事。千兆以太网线对TD/TD-、RD/RD-承受IEC 61000-4-2 Level 4±8kV接触放电冲击TVS管必须满足钳位电压≤12VIEC波形、峰值脉冲功率≥300W、响应时间≤1ns。我们测试过多家TVS管发现ON Semi SZ1.5KE6.8A在8kV测试中钳位电压达15.2V超出PHY耐压范围LAN8720A最大VDDIO3.6V对应信号线耐压≈4.5V。最终选用Littelfuse SP3052-01WTG其钳位电压仅8.2V8kV且结电容仅0.5pF不影响125MHz信号完整性。PCB布局时TVS管必须紧贴RJ45连接器引脚放置走线长度≤3mm否则引线电感会削弱防护效果——实测过TVS距连接器5mm时8kV放电后PHY损坏率100%缩短至2mm后降为0。3.4 眼图测试方法论用示波器读懂物理层真相调试阶段必须做眼图测试否则所谓“ping通”只是假象。测试步骤如下准备用Keysight DSOX92004A示波器带2.5GHz带宽配N2805A差分探头1GHz带宽捕获RGMII RXD0与RXC信号触发设置以RXC上升沿为触发源时基设为2ns/div存储深度≥10Mpts眼图生成开启示波器眼图功能叠加1000帧数据观察眼高Vertical Opening与眼宽Horizontal Opening判据合格眼图需满足——眼高≥400mV对应逻辑电平摆幅、眼宽≥0.6UIUnit Interval即0.6×8ns4.8ns、抖动RMS≤0.15UI。我们曾遇到一块板子ping测试全通但眼图显示眼宽仅0.35UI根源是PCB上RXC走线靠近电源平面边缘产生共模噪声耦合。解决方案是在RXC走线下方L2层铺铜并用过孔阵列10mil直径间距50mil将该铜箔接地眼宽立即提升至0.72UI。记住眼图是硬件设计的终极裁判软件日志永远无法告诉你信号质量是否达标。4. 调试全流程实战从上电自检到压力测试的七步法4.1 上电自检Power-On Self-Test用LED和万用表快速定位不要一上来就接JTAG烧程序。先做硬件级自检五步排除80%问题电源轨检查用万用表测PHY的AVDD1.2V、DVDD3.3V、VDDIO2.5V误差必须在±3%内。曾因DVDD实测3.42V导致PHY内部LDO过热工作2小时后失效晶振起振验证用示波器探头轻触125MHz晶振输出脚确认波形为干净正弦波峰峰值≥800mV失真度5%PHY复位信号测PHY_nRST引脚上电后应保持低电平≥10ms然后拉高。若复位脉冲过短5msPHY初始化失败LED状态机LAN8720A的LED1/LED2默认为LINK/ACT指示上电后LED1应常亮Link upLED2闪烁Activity。若LED1不亮检查RXC时钟是否到达PHYMDIO通信验证用逻辑分析仪抓MDIO/MDC信号发送读寄存器0x02命令正常应返回0x782DLAN8720A厂商ID。若无响应检查MDIO上拉电阻必须4.7kΩ非10kΩ。注意Zynq-7020的MIO[54:55]默认为MDIO/MDC但需在Vivado Block Design中勾选“Enable MDIO Interface”否则PS端GEM0无法访问PHY寄存器。这个配置项藏在Zynq Processing System IP核的“Peripheral I/O Pins”页签里极易遗漏。4.2 JTAG调试与Vivado硬件管理器诊断当上电自检通过后接入JTAG调试。关键操作不是烧录bitstream而是用Vivado Hardware Manager做三件事读取IDCODE确认FPGA配置成功IDCODE应匹配Zynq-70200x24710093扫描Boundary Scan Chain执行scan_chain命令检查所有IO引脚连接状态。曾发现rgmii_txd3引脚在Chain中显示OPEN根源是PCB该焊盘虚焊实时监测IO电平在Hardware Manager界面右键点击rgmii_rxc信号选择“Set as Debug Probe”可实时查看该引脚电平变化。若RXC始终为0V说明时钟未到达FPGA需查晶振或电源。特别提醒Xilinx SDK 2015.4卸载后残留注册表项会导致Vivado 2018.3无法识别JTAG链。解决方案是手动删除注册表路径HKEY_LOCAL_MACHINE\SOFTWARE\Xilinx\SDK\2015.4而非依赖卸载程序。4.3 Linux系统级调试从dmesg到ethtool的深度排查当PS端Linux启动后调试进入软件层。但别被“ifconfig up”迷惑必须逐层验证内核日志分析dmesg | grep -i gem\|phy重点看三行xilinx_gmii2rgmii 40000000.ethernet:gmiitorgmii: probedGEM驱动加载libphy: LAN8720A PHY 40000000.ethernet:00: attachedPHY绑定成功device eth0 entered promiscuous mode网口启用若第二行缺失说明MDIO通信失败需检查PHY地址LAN8720A默认0x0通过ADDR引脚接地设定。PHY寄存器读取ethtool -d eth0查看PHY状态关键字段link: yes物理链路speed: 1000协商速率duplex: full双工模式port: twisted pair介质类型若speed显示100检查RXC时钟是否125MHz非25MHz。流量注入测试用iperf3 -c 192.168.1.100 -t 60发起60秒TCP流同时用cat /proc/net/dev监控eth0的rx_packets计数。合格标准丢包率0.001%且rx_bytes每秒增长稳定1000Mbps≈125MB/s。4.4 PL端软核MAC调试AXI-Stream协议栈的致命细节双千兆的PL侧MAC调试是难点。我们采用Xilinx AXI Ethernet Lite IP核但必须修改三点AXI时钟域匹配IP核的aclk必须与PS端AXI_HP0时钟同源100MHz否则DMA传输出现burst中断Stream宽度设置将axis_tdata_width设为64bit非默认32bit否则千兆线速下AXI-Stream背压导致丢包中断使能在IP核配置中勾选“Enable Interrupts”并在SDK中编写中断服务程序否则PL侧收包无法通知PS。调试时用Vivado ILA核抓AXI-Stream信号重点关注tvalid/tready握手时序。曾因tready信号延迟一个周期导致PS端DMA缓冲区溢出现象是iperf3测试中突发丢包率12%。解决方案是在ILA中添加tready延迟补偿逻辑用IDDR原语对齐时钟边沿。4.5 压力测试与环境适应性验证工业现场的真实考题实验室ping通不等于现场可用。必须做三项压力测试高低温循环-40℃→25℃→85℃各保持2小时全程运行iperf3记录误码率。合格标准85℃时误码率1e-12EMC辐射测试按EN 55032 Class B限值在30MHz~1GHz频段扫描峰值裕量≥6dB。关键整改点RJ45连接器金属外壳360°屏蔽且与PCB地平面用导电泡棉连接POE供电兼容性接入IEEE 802.3af PoE注入器测量PHY端VDDIO电压波动要求纹波50mVpp。若超标需在PHY VDDIO引脚增加LC滤波1μH电感10μF钽电容。我们曾有个项目在EMC测试中350MHz频点超标8dB最终发现是RGMII走线未包地改为包地后裕量达12dB。这印证了硬件设计的铁律所有问题最终都会回归到PCB。5. 常见故障速查表与独家避坑指南十年踩坑总结的21条血泪经验5.1 故障速查表按现象反推根因现象可能根因验证方法解决方案上电后PHY LED全灭AVDD/DVDD电源异常万用表测电压检查LDO输出电容焊锡dmesg显示phy_connect: no PHY foundMDIO地址错误或通信失败逻辑分析仪抓MDIO波形核对PHY ADDR引脚电平重设上拉/下拉ping通但iperf3速率900MbpsRGMII眼图闭合示波器测RXC与RXD眼图优化PCB走线等长增加包地过孔温度60℃时链路中断PHY热保护启动红外热像仪测PHY表面温度增加散热铜箔改用LAN8720A工业版JTAG识别不到FPGAMIO[54:55]被复用为GPIOVivado中检查Zynq IP核配置在Block Design中禁用MIO复用功能ethtool显示speed100RXC时钟非125MHz示波器测RXC频率检查晶振负载电容更换为12pF双网口只能启一个EMIO总线带宽不足查看/proc/interrupts中GEM1中断计数改用PL侧软核MAC避免EMIO瓶颈5.2 独家避坑指南教科书不会写的21条实战经验MIO引脚复用陷阱Zynq-7020的MIO[16:27]默认为GEM0但若在Vivado中勾选“SDIO”或“UART”外设这些引脚会被自动重映射。务必在Block Design中展开Zynq IP核点击“Peripheral I/O Pins”页签手动确认MIO[16:27]的Function为“Ethernet 0”。PHY地址硬编码LAN8720A的PHY地址由ADDR引脚电平决定但Zynq PS端GEM驱动默认读地址0x0。若ADDR接高电平地址0x1需在Linux设备树中修改phy-handle phy0为reg 0x1否则驱动无法绑定。RGMII延迟补偿开关Zynq GEM0在MIO模式下默认启用内部延迟补偿Internal Delay但LAN8720A需外部延迟External Delay。必须在设备树中添加xlnx,has-internal-delay 0否则时序违例。PCB过孔残桩RGMII走线换层时过孔残桩长度5mil会引发反射。用Altium Designer的“Via Stub Length”工具检查确保残桩2mil。电源平面分割误区为节省面积将AVDD与DVDD共用同一铜箔会导致数字噪声耦合进模拟电路。必须物理分割且分割间隙≥20mil。晶振负载电容计算125MHz晶振的负载电容CLC1×C2/C1C2Cstray其中Cstray≈2pF。若手册要求CL12pF则C1C220pF而非简单选12pF电容。ESD防护接地路径TVS管地线必须单独走线至RJ45连接器金属外壳再经1MΩ电阻接系统地。若直接接PCB地平面ESD电流会干扰PHY供电。JTAG链末端电阻Xilinx JTAG链要求末端接100Ω电阻到地否则信号反射导致配置失败。此电阻常被忽略。Vivado版本兼容性Xilinx SDK 2015.4生成的FSBLFirst Stage Boot Loader与Vivado 2019.2不兼容烧录时会报“Invalid bitstream”。必须用同版本Vivado生成bitstream和FSBL。Linux内核PHY驱动选择Zynq默认使用drivers/net/phy/micrel.c但LAN8720A需drivers/net/phy/microchip.c。在menuconfig中启用MICROCHIP_PHY选项。AXI DMA缓冲区大小千兆线速下DMA缓冲区必须≥8KB否则频繁中断导致CPU占用率100%。在SDK中修改XAXIDMA_MAX_TRANSFER_LEN为8192。RJ45连接器选型必须选用带屏蔽罩和金属外壳的连接器如Amphenol 10118192塑料外壳连接器EMC辐射超标。差分对内长度差RGMII差分对如TXP/TXN内长度差必须5mil否则共模噪声抑制失效。用PCB厂提供的DRC报告验证。热设计冗余PHY芯片表面温度85℃时寿命衰减50%/年。在PCB顶层铺铜≥2oz并通过过孔阵列连接至内层地平面。信号层参考平面RGMII走线所在层L1下方必须是完整地平面L2禁止在L2层挖空。否则阻抗突变引发反射。时钟源切换机制Zynq PS端支持多时钟源切换但GEM0必须锁定125MHz主时钟。在Vivado中禁用“Clocking Wizard”自动切换功能。MDIO上拉电阻功率4.7kΩ上拉电阻功耗为3.3V²/4700Ω≈2.3mW必须选用0805封装额定功率125mW禁用0402额定功率62.5mW。PL侧时钟域交叉AXI-Stream从PL到PS需跨时钟域必须使用Xilinx AXI Clock Converter IP核而非简单打拍。眼图测试探头校准差分探头使用前必须做“Deskew”校准否则眼图水平轴失真。校准步骤连接校准夹具运行示波器自动校准程序。固件升级安全机制Zynq Flash烧写时必须启用“Secure Boot”防止恶意固件注入。在Vivado中勾选“Generate Secure Bitstream”。调试窗口监控模式Xilinx SDK的Debug模式下打开“Expressions”视图输入*(uint32_t*)0x40000000可实时查看GEM0寄存器值无需重启调试会话。最后分享个小技巧每次PCB投板前用Vivado的“Report IO Planning”功能导出IO分配表打印出来贴在工位上。我见过太多工程师因记错MIO引脚编号在调试时浪费8小时——而这张纸只需3分钟准备。硬件设计没有捷径只有把每个细节刻进肌肉记忆才能让双千兆以太网在Zynq上真正稳如磐石。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进