ARTICLE DETAIL

资讯详情

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

FPGA以太网IP核实战:从选型配置到调试避坑的完整指南

FPGA以太网IP核实战:从选型配置到调试避坑的完整指南 1. 项目缘起与整体设计思路1.1 为什么要在FPGA里死磕以太网IP核搞FPGA的兄弟大多有个共识逻辑设计本身不难难的是跟各种IP核打交道尤其是以太网这块。我最早接触FPGA以太网是在一个数据采集项目上当时的需求很简单——把ADC采到的数据通过网口传到上位机。心想这还不简单调个MAC IP核配个PHY芯片数据往里一灌就完事了。结果从拿到板子到数据稳定跑通整整耗了三个礼拜踩的坑能写满两页A4纸。以太网IP核之所以让人头疼核心原因在于它处在FPGA逻辑和外部模拟世界的交界处。往内看它要跟你的用户逻辑做握手AXI-Stream或者Avalon-ST的时序得对得上往外看它要驱动PHY芯片RGMII、SGMII、GMII这些接口的时序约束一个比一个讲究。中间还夹着时钟域切换、复位同步、FIFO缓冲这些容易出幺蛾子的事。任何一个环节没吃透现象就是“链路能起来但丢包”或者“偶尔通一下然后死掉”排查起来极其痛苦。这篇内容就是把我这些年用Xilinx现在叫AMD了但大家还是习惯叫Xilinx的1G/2.5G Ethernet PCS/PMA或SGMII IP核以及Tri Mode Ethernet MAC IP核的经验做个系统梳理。从选型逻辑到配置细节从时钟方案到调试手段尽量把每个“为什么”讲清楚。适合正在做FPGA以太网项目、被IP核配置和调试折磨的工程师参考也适合刚入门想少走弯路的同学。1.2 1G/2.5G PCS/PMA与Tri Mode MAC到底怎么选Xilinx的以太网IP核有好几个最容易混淆的就是1G/2.5G Ethernet PCS/PMA或SGMII和Tri Mode Ethernet MAC这两个。我刚开始也搞不清什么时候用哪个后来用多了才明白它们的分工。1G/2.5G Ethernet PCS/PMA或SGMII这个IP核本质上处理的是物理编码子层PCS和物理介质附加子层PMA的功能。它负责把MAC层过来的GMII信号转换成适合在背板或SFP光模块上传输的串行信号。简单说它管的是“怎么把比特流可靠地送出去”。这个IP核支持SGMII接口可以直接连光模块或者通过SGMII连PHY芯片也支持1000BASE-X模式直连背板。Tri Mode Ethernet MAC则是完整的MAC控制器支持10/100/1000M三种速率。它实现了以太网MAC层的全部功能帧封装/解封装、CRC校验、地址过滤、流量控制、统计计数等等。用户逻辑通过AXI-Stream接口跟它交互发数据就往TX Stream里写收数据就从RX Stream里读。那什么时候两个都要用典型场景是这样的你的FPGA通过SFP光模块或者SGMII接口连接外部网络这时候需要Tri Mode MAC来做MAC层处理同时需要1G/2.5G PCS/PMA来做物理层编码。两个IP核通过GMII接口对接MAC输出GMII信号给PCS/PMAPCS/PMA再输出高速串行信号给GT收发器或者直接驱动SGMII接口。如果只是通过RGMII接口连普通的千兆PHY芯片那通常只需要Tri Mode MAC就够了因为RGMII本身就是GMII的简化版本PHY芯片内部已经集成了PCS/PMA功能。这时候MAC直接输出RGMII信号给PHY不需要额外的PCS/PMA IP核。我个人的选型原则很简单看你的硬件接口。如果是SFP光口或者SGMII接口两个IP核都要如果是RGMII接口的普通PHY一个MAC就够了。另外要注意1G/2.5G PCS/PMA这个IP核在2.5G模式下需要GT收发器支持2.5Gbps线速率不是所有FPGA型号都支持选型时要查清楚。1.3 整体数据通路设计一个典型的FPGA以太网数据通路是这样的用户逻辑产生数据通过AXI-Stream接口写入Tri Mode MAC的TX通道MAC完成帧封装和CRC计算后通过GMII接口把并行数据送给1G/2.5G PCS/PMAPCS/PMA做8b/10b编码1000BASE-X模式或者SGMII编码后通过高速串行接口送给GT收发器GT收发器驱动SFP光模块或者背板走线最终到达对端设备。接收方向反过来外部信号经过GT收发器恢复出串行数据PCS/PMA做解码和时钟恢复输出GMII信号给MACMAC做帧解析和CRC校验通过AXI-Stream接口把有效数据送给用户逻辑。这个通路里最关键的几个点时钟方案、复位方案、数据位宽匹配。时钟方案决定了整个系统能不能稳定工作复位方案决定了上电后能不能正常启动数据位宽匹配决定了吞吐量能不能达到预期。后面会逐一展开。2. 核心细节解析与实操要点2.1 时钟方案整个系统的心脏以太网IP核的时钟方案是第一个要搞清楚的东西也是最容易出问题的地方。我见过太多项目因为时钟没配对导致链路时通时断排查了好几天才发现是时钟频率或者相位不对。先理清几个关键时钟GT参考时钟对于1G/2.5G PCS/PMA如果使用GT收发器需要提供一个参考时钟。1000BASE-X模式下GT线速率是1.25Gbps参考时钟通常是125MHz。SGMII模式下也是1.25Gbps线速率参考时钟同样是125MHz。2.5G模式下线速率是3.125Gbps参考时钟可以是125MHz或者156.25MHz具体看IP核配置。这个时钟必须由外部晶振或者时钟芯片提供抖动要求比较严格一般要求RMS抖动在1ps以下。GMII时钟GMII接口的时钟是125MHz千兆模式或者25MHz百兆模式或者2.5MHz十兆模式。在1000BASE-X模式下PCS/PMA的GMII时钟是从接收数据中恢复出来的不需要外部提供。但在SGMII模式下GMII时钟需要由MAC或者外部时钟源提供。这里有个坑Tri Mode MAC的GMII接口时钟方向取决于配置。如果MAC配置为PHY模式MAC提供时钟那MAC需要输出GTX_CLK给PCS/PMA如果配置为MAC模式PHY提供时钟那PCS/PMA需要输出时钟给MAC。我一般建议把MAC配置为PHY模式让MAC输出时钟这样时钟关系更清晰。AXI-Stream时钟用户逻辑跟MAC交互的时钟可以是独立的时钟域。Tri Mode MAC内部有FIFO做时钟域切换所以AXI-Stream时钟频率不需要跟GMII时钟一样。但要注意如果AXI-Stream时钟太慢可能达不到线速吞吐量。千兆线速下每个时钟周期需要处理1个字节8bit位宽或者半个字节4bit位宽。如果AXI-Stream位宽是8bit时钟至少125MHz才能跑满千兆如果是32bit位宽时钟至少31.25MHz就够了。时钟域切换的坑Tri Mode MAC内部有TX和RX两个FIFO做时钟域切换。TX方向用户逻辑按AXI-Stream时钟写入MAC按GMII时钟读出RX方向反过来。这两个FIFO的深度是有限的如果两边时钟频率差异太大或者有突发流量FIFO可能溢出。我遇到过AXI-Stream时钟比GMII时钟慢很多的情况发送大包时TX FIFO溢出导致帧被截断。解决办法是提高AXI-Stream时钟频率或者用更大的位宽。注意GT参考时钟的抖动指标一定要看PHY芯片或者光模块的datasheet要求不是随便找个125MHz晶振就能用的。我吃过亏用了一个普通晶振链路能起来但误码率很高换了专用时钟芯片才解决。2.2 复位方案别让亚稳态毁了你复位设计是FPGA设计的基本功但在以太网IP核这里尤其重要。因为以太网IP核涉及多个时钟域复位信号如果处理不好轻则链路起不来重则IP核内部状态机跑飞。复位类型Xilinx的以太网IP核通常有几种复位输入。以Tri Mode MAC为例有全局复位reset、TX复位tx_reset、RX复位rx_reset。全局复位影响整个IP核TX和RX复位只影响对应方向。1G/2.5G PCS/PMA也有类似的复位结构还有GT收发器的复位。复位同步所有复位信号都必须同步到对应的时钟域。比如GMII时钟域的复位信号必须用GMII时钟打两拍再送给IP核。AXI-Stream时钟域的复位信号必须用AXI-Stream时钟打两拍。GT收发器的复位信号必须同步到GT参考时钟域。这一步千万不能省否则亚稳态会导致IP核内部状态机进入非法状态。复位顺序上电后的复位顺序也有讲究。一般建议先复位GT收发器等GT收发器锁定并输出稳定的时钟后再复位PCS/PMA最后复位MAC。如果顺序反了MAC可能在PCS/PMA还没准备好的时候就开始发送数据导致链路协商失败。我通常用一个简单的状态机来控制复位顺序上电后先等GT参考时钟稳定然后释放GT复位等GT锁定信号拉高后再释放PCS/PMA复位最后释放MAC复位。整个过程大概几百毫秒。复位脉冲宽度复位信号不能太短否则IP核内部可能还没完成初始化就被释放了。一般建议复位脉冲宽度至少100个对应时钟周期。对于GMII时钟125MHz100个周期是800ns对于AXI-Stream时钟比如50MHz100个周期是2us。我一般统一用1ms的复位脉冲简单省事。提示如果你用的是Xilinx的示例设计Example Design它里面已经包含了复位同步逻辑可以直接参考。但要注意示例设计的复位顺序可能跟你的系统需求不一样需要根据实际情况调整。2.3 数据位宽与接口匹配数据位宽匹配是另一个容易出问题的地方。Tri Mode MAC的AXI-Stream接口支持8bit和32bit两种位宽实际上还支持更宽的但常用的是这两种。GMII接口固定是8bit。PCS/PMA的GMII接口也是8bit。如果你用8bit的AXI-Stream接口那MAC内部不需要做位宽转换直接透传。但8bit125MHz才能跑满千兆如果你的AXI-Stream时钟达不到125MHz吞吐量就会打折扣。这时候可以考虑用32bit的AXI-Stream接口32bit31.25MHz就能跑满千兆对时钟频率要求低很多。但用32bit接口有个坑MAC内部会把32bit数据拆成4个8bit字节依次发送接收方向反过来。这个转换过程是自动的不需要用户干预。但要注意字节顺序Endianness。Xilinx的MAC默认是大端模式即32bit数据的最高字节先发送。如果你的用户逻辑是小端模式需要在发送前做字节交换接收后也要做交换。我刚开始没注意这个发出去的数据在上位机看全是乱的查了半天才发现是字节序问题。GMII到PCS/PMA的连接Tri Mode MAC的GMII接口和1G/2.5G PCS/PMA的GMII接口可以直接对接信号名字可能略有不同但功能一一对应。需要注意的是GMII接口的时钟方向要匹配。如果MAC配置为PHY模式MAC输出GTX_CLKPCS/PMA接收这个时钟作为GMII_TX_CLK如果MAC配置为MAC模式PCS/PMA输出GMII_RX_CLK给MAC。我一般建议MAC配置为PHY模式这样时钟关系更简单。SGMII模式下的特殊处理如果PCS/PMA配置为SGMII模式GMII接口的时钟不是从数据中恢复的而是由外部提供的。这时候需要确保MAC和PCS/PMA使用同一个GMII时钟源。另外SGMII模式下PCS/PMA会自动在数据中插入/删除控制字符用户逻辑不需要关心。3. 实操过程与核心环节实现3.1 Vivado中IP核的配置步骤以Vivado 2020.2为例详细走一遍配置流程。第一步创建工程并添加IP核。打开Vivado创建新工程选择目标FPGA型号。在IP Catalog中搜索“1G/2.5G Ethernet PCS/PMA or SGMII”双击打开配置界面。第二步配置PCS/PMA IP核。在“Core Configuration”页面选择“Ethernet PCS/PMA or SGMII”模式。在“Standard”下拉框中选择“SGMII”或者“1000BASE-X”取决于你的硬件接口。如果连SFP光模块选1000BASE-X如果连SGMII接口的PHY芯片选SGMII。在“Physical Interface”中选择“GTX”或者“GTH”取决于你的FPGA型号。在“Line Rate”中选择“1G”或者“2.5G”。注意2.5G模式需要GT收发器支持3.125Gbps线速率。在“Clocking”页面设置GT参考时钟频率。1000BASE-X和SGMII模式下1G线速率对应125MHz参考时钟2.5G线速率对应125MHz或156.25MHz参考时钟。在“GT Refclk”中选择正确的频率。在“Management”页面可以选择是否使用MDIO接口。如果需要对端PHY芯片进行寄存器配置需要勾选MDIO接口。如果只是直连光模块不需要MDIO。第三步配置Tri Mode MAC IP核。在IP Catalog中搜索“Tri Mode Ethernet MAC”双击打开配置界面。在“MAC Speed”中选择“1000 Mbps”。在“Interface”中选择“GMII”。在“AXI-Stream Data Width”中选择“8”或者“32”。在“Address Filter”中配置MAC地址可以设置为固定值或者通过寄存器动态配置。在“Flow Control”页面可以选择是否使能流量控制。如果对端支持PAUSE帧建议使能。在“Statistics”页面可以选择是否使能统计计数器。如果不需要统计信息可以关闭以节省资源。第四步连接IP核。在Block Design中把Tri Mode MAC的GMII接口连接到1G/2.5G PCS/PMA的GMII接口。注意信号对应关系MAC的gmii_txd[7:0]连到PCS/PMA的gmii_txd[7:0]MAC的gmii_tx_en连到PCS/PMA的gmii_tx_enMAC的gmii_tx_er连到PCS/PMA的gmii_tx_erMAC的gtx_clk连到PCS/PMA的gmii_tx_clk。接收方向类似。第五步添加时钟和复位逻辑。添加时钟向导Clocking Wizard生成GT参考时钟和AXI-Stream时钟。添加处理器系统复位Processor System ResetIP核生成同步复位。注意复位同步要针对每个时钟域单独做。第六步生成比特流并下载。完成连接后生成比特流下载到FPGA。用示波器或者逻辑分析仪观察GT收发器的输出信号确认有正确的串行数据输出。3.2 关键参数计算与选择GT参考时钟频率计算1000BASE-X模式下线速率是1.25Gbps。GT收发器的参考时钟频率和线速率的关系是线速率 参考时钟频率 × 20因为8b/10b编码每10bit对应8bit有效数据但GT内部是20倍频。所以参考时钟频率 1.25Gbps / 20 62.5MHz。但Xilinx的IP核通常要求125MHz参考时钟因为GT内部有二分频。具体看IP核配置界面的提示。AXI-Stream时钟频率计算假设AXI-Stream位宽是8bit要跑满千兆线速需要每秒传输125M字节。每个时钟周期传输1字节所以时钟频率至少125MHz。如果位宽是32bit每个时钟周期传输4字节时钟频率至少31.25MHz。实际设计中要留一定余量建议AXI-Stream时钟频率比理论值高20%左右。FIFO深度计算Tri Mode MAC内部TX FIFO的深度是有限的。如果用户逻辑发送数据的速率不稳定有突发流量FIFO可能溢出。FIFO深度需求 突发数据量 - 持续传输量。比如用户逻辑以200MHz时钟突发发送1000字节然后停顿100个周期那FIFO至少需要能缓存1000字节。Xilinx MAC的内部FIFO深度一般是4KB左右对于大多数应用够用。如果不够需要在用户逻辑侧加外部FIFO。3.3 上板调试与链路建立第一步检查时钟。上板后第一件事是用示波器或者逻辑分析仪检查GT参考时钟、GMII时钟、AXI-Stream时钟是否正常。频率对不对幅度够不够抖动大不大。我习惯用示波器的高带宽探头直接测时钟输出引脚确认频率和幅度。第二步检查GT锁定状态。GT收发器有一个锁定信号gt_powergood或者gt_pll_lock确认这个信号拉高了说明GT参考时钟正常GT内部PLL锁定。如果没拉高检查参考时钟频率和抖动。第三步检查链路状态。1G/2.5G PCS/PMA IP核有一个链路状态信号link_status确认这个信号拉高了说明PCS层已经同步链路建立成功。如果没拉高检查SFP光模块是否插好光纤是否连接正常对端设备是否上电。第四步发送测试数据。在用户逻辑中生成简单的测试数据比如递增数或者固定模式通过AXI-Stream接口写入MAC的TX通道。用逻辑分析仪抓取GMII接口的信号确认有数据输出。然后用Wireshark在上位机抓包确认能收到正确的以太网帧。第五步接收测试。从上位机发送ping包或者UDP包用逻辑分析仪抓取GMII接口的接收信号确认有数据输入。然后在用户逻辑中检查AXI-Stream接口的RX通道确认能正确解析出数据。第六步压力测试。用iperf或者类似工具进行长时间大流量测试观察是否有丢包或者误码。如果丢包检查FIFO是否溢出时钟是否稳定复位是否干净。实操心得调试以太网链路时我习惯先用一个简单的回环测试。把TX和RX在用户逻辑侧短接发什么收什么。这样能快速验证MAC和PCS/PMA的基本功能是否正常。如果回环测试通过再连外部设备。如果回环测试都不通过那问题肯定在FPGA内部不用去查外部硬件。4. 常见问题与排查技巧实录4.1 链路起不来怎么办链路起不来是最常见的问题现象是link_status一直为低或者偶尔拉高一下又掉下去。排查思路如下先查时钟。用示波器测GT参考时钟确认频率正确、幅度足够、抖动小。我遇到过用了一个劣质晶振频率偏差太大GT根本锁不住。换了个好晶振就好了。再查GT锁定。如果GT锁定信号没拉高说明GT参考时钟有问题或者GT配置不对。检查IP核配置中的线速率和参考时钟频率是否匹配。然后查SFP光模块。如果是光口确认光模块插好了光纤连接正常对端设备上电了。可以用光功率计测一下光模块的发送光功率和接收光功率确认在正常范围内。最后查复位。确认复位信号已经释放而且释放顺序正确。用逻辑分析仪抓复位信号和link_status信号看复位释放后link_status多久拉高。如果一直不拉高可能是复位顺序不对或者复位脉冲太短。常见坑SGMII模式下PCS/PMA需要跟对端PHY芯片进行自协商。如果对端PHY芯片没有使能自协商或者自协商参数不匹配链路起不来。解决办法是检查对端PHY芯片的配置寄存器确保自协商使能且参数一致。4.2 丢包和误码怎么排查链路起来了但丢包或者误码这个问题比链路起不来更隐蔽。排查思路如下先看统计计数器。Tri Mode MAC内部有丰富的统计计数器包括发送帧数、接收帧数、CRC错误数、溢出错误数等等。通过AXI-Lite接口读取这些计数器能快速定位问题方向。如果CRC错误多说明物理层有问题如果溢出错误多说明FIFO不够或者时钟不匹配。再查时钟域切换。如果AXI-Stream时钟和GMII时钟频率差异大或者相位关系不稳定FIFO可能溢出。用逻辑分析仪抓FIFO的满信号和空信号看是否有溢出。如果有提高AXI-Stream时钟频率或者加大FIFO深度。然后查数据位宽匹配。如果用32bit AXI-Stream接口确认字节序是否正确。我遇到过发送的数据在上位机看全是乱的查了半天发现是字节序反了。Xilinx MAC默认大端用户逻辑如果是小端需要做字节交换。最后查物理层信号质量。用示波器测GT收发器的输出信号看眼图是否张开。如果眼图闭合说明信号完整性有问题可能是PCB走线阻抗不匹配或者连接器接触不良。我遇到过SFP连接器没插紧导致误码率很高重新插拔就好了。常见坑如果用的是RGMII接口连PHY芯片RGMII的时序约束非常关键。TX方向需要设置输出延迟RX方向需要设置输入延迟。如果延迟设置不对数据采样错误导致丢包。Xilinx的IP核通常会自动生成时序约束但需要根据PCB走线长度调整延迟值。4.3 常见问题速查表问题现象可能原因排查方法解决办法link_status一直为低GT参考时钟异常示波器测参考时钟频率和抖动更换合格晶振或时钟芯片link_status一直为低SFP光模块未插好检查光模块和光纤连接重新插拔光模块link_status一直为低复位顺序错误逻辑分析仪抓复位和link_status调整复位顺序先GT后PCS再MAC链路偶尔通一下时钟抖动太大示波器测时钟相位噪声更换低抖动时钟源丢包严重FIFO溢出逻辑分析仪抓FIFO满信号提高AXI-Stream时钟或加大FIFO丢包严重字节序错误对比发送和接收数据做字节交换CRC错误多物理层信号质量差示波器测眼图检查PCB走线和连接器吞吐量上不去AXI-Stream时钟太慢计算理论吞吐量提高时钟频率或加大位宽接收不到数据RX通道未使能检查MAC配置使能RX通道发送数据无输出TX通道未使能检查MAC配置使能TX通道4.4 独家避坑技巧技巧一用ILA抓内部信号。Vivado的ILAIntegrated Logic Analyzer是调试以太网IP核的利器。把GMII接口的信号、AXI-Stream接口的信号、FIFO的满空信号都接到ILA上触发条件设置为“FIFO满”或者“CRC错误”能快速定位问题。我习惯在调试阶段把ILA的采样深度设到最大抓一次完整的帧传输过程。技巧二用回环测试快速验证。在用户逻辑侧把TX和RX短接发什么收什么。这个测试能快速验证MAC和PCS/PMA的基本功能。如果回环测试通过说明FPGA内部逻辑没问题问题在外部硬件或者对端设备。如果回环测试不通过问题肯定在FPGA内部。技巧三用Wireshark抓包分析。在上位机用Wireshark抓包能看到完整的以太网帧内容。如果帧内容不对比如源MAC地址错了、帧长度不对、CRC错误Wireshark会直接标出来。我习惯先用Wireshark确认帧格式正确再查FPGA内部逻辑。技巧四注意GT收发器的极性。GT收发器的TX和RX极性可以配置如果PCB走线的时候TX和RX交叉了需要在IP核配置中反转极性。我遇到过PCB设计把TX和RX接反了链路死活起不来后来在IP核里把极性反转就好了。技巧五注意SGMII自协商。SGMII模式下PCS/PMA需要跟对端PHY芯片进行自协商。如果对端PHY芯片没有使能自协商或者自协商参数不匹配链路起不来。解决办法是检查对端PHY芯片的配置寄存器确保自协商使能且参数一致。如果对端不支持自协商可以把PCS/PMA配置为强制模式不进行自协商。技巧六注意温度影响。GT收发器的性能受温度影响较大。如果板子温度过高GT的误码率会上升。我遇到过夏天调试的时候链路正常冬天再调试就丢包后来发现是温度太低导致GT性能下降。解决办法是加散热片或者调整GT的预加重和均衡参数。技巧七注意电源噪声。GT收发器对电源噪声非常敏感。如果电源纹波太大GT的抖动会增加误码率上升。我习惯在GT的电源引脚旁边加足够的去耦电容并且用低噪声的LDO供电。如果条件允许用示波器测一下GT电源的纹波确认在datasheet要求的范围内。技巧八注意PCB走线阻抗。GT收发器的高速信号走线必须做阻抗控制通常要求100欧姆差分阻抗。如果阻抗不匹配信号反射会导致眼图闭合。我遇到过PCB走线阻抗没控制好眼图几乎闭合后来重新做板才解决。所以PCB设计阶段一定要跟PCB工程师确认阻抗控制。技巧九注意参考时钟的相位噪声。GT参考时钟的相位噪声直接影响GT的输出抖动。如果相位噪声太大眼图会变差。我习惯用相位噪声分析仪测一下参考时钟的相位噪声确认在datasheet要求的范围内。如果超标更换低相位噪声的晶振或者时钟芯片。技巧十注意IP核版本。Xilinx的以太网IP核在不同Vivado版本中可能有差异。我遇到过在Vivado 2018.3中正常的配置升级到2020.2后链路起不来了后来发现是IP核的默认配置变了。解决办法是仔细对比IP核的配置界面确保所有参数跟之前一致。如果实在找不到原因可以尝试回退到之前的Vivado版本。5. 进阶话题与扩展思路5.1 2.5G模式的实际应用2.5G以太网在车载和工业领域越来越常见。Xilinx的1G/2.5G PCS/PMA IP核支持2.5G线速率但需要GT收发器支持3.125Gbps。不是所有FPGA型号都支持选型时要查清楚。2.5G模式下GT参考时钟可以是125MHz或者156.25MHz具体看IP核配置。数据位宽和时钟频率的关系跟1G模式类似但吞吐量是2.5倍对FIFO深度和时钟频率的要求更高。我做过一个车载数据采集项目用的就是2.5G模式。当时选的是Zynq UltraScale MPSoCGT收发器支持3.125Gbps。配置的时候要注意2.5G模式下PCS/PMA的GMII接口时钟是312.5MHz8bit位宽或者78.125MHz32bit位宽。312.5MHz的时钟在FPGA内部走线比较困难建议用32bit位宽降低时钟频率。5.2 与MicroBlaze软核的配合如果项目里用了MicroBlaze软核可以通过AXI-Lite接口配置Tri Mode MAC的寄存器读取统计计数器动态修改MAC地址。MicroBlaze还可以跑轻量级的TCP/IP协议栈比如lwIP实现完整的网络通信功能。我做过一个项目用MicroBlazelwIPTri Mode MAC实现了Web服务器可以通过浏览器查看FPGA内部的状态数据。MicroBlaze跟MAC的配合要注意几点一是AXI-Lite接口的时钟域要匹配MicroBlaze的时钟和MAC的AXI-Lite时钟可以是同一个时钟域二是中断处理MAC的中断信号要接到MicroBlaze的中断控制器三是DMA如果数据量大建议用AXI DMA在MAC和DDR之间搬数据减轻MicroBlaze的负担。5.3 时间敏感网络TSN的扩展时间敏感网络是工业以太网的热门方向要求在标准以太网的基础上增加时间同步和流量调度功能。Xilinx有专门的TSN IP核但也可以基于Tri Mode MAC自己实现简单的TSN功能。比如在MAC前面加一个时间戳单元记录每个帧的发送和接收时间在MAC后面加一个流量整形器按照时间片调度不同优先级的流量。我做过一个简单的TSN原型基于Tri Mode MAC实现了IEEE 802.1Qbv的时间感知整形。核心思路是在MAC的TX通道前面加一个门控逻辑根据全局时间决定哪个队列的数据可以发送。全局时间通过IEEE 1588协议同步用FPGA内部的定时器实现。这个原型跑在千兆链路上时间同步精度能达到亚微秒级。5.4 资源优化与面积权衡以太网IP核占用的FPGA资源不少尤其是GT收发器和Block RAM。如果资源紧张可以考虑以下优化一是用8bit AXI-Stream接口代替32bit减少逻辑资源二是关闭不需要的统计计数器节省寄存器资源三是用共享的GT收发器多个以太网口复用同一个GT Quad四是降低FIFO深度节省Block RAM。但要注意资源优化不能牺牲功能。比如FIFO深度太小会导致丢包统计计数器关掉后调试困难。我一般建议在原型阶段保留所有功能等系统稳定后再做资源优化。优化的时候要逐步进行每做一次优化就做一次压力测试确认没有引入新问题。6. 个人经验总结与建议折腾FPGA以太网IP核这些年最大的体会是时钟和复位是根基根基不牢地动山摇。我见过太多项目因为时钟方案没设计好导致链路时通时断排查了好几天才发现是时钟频率或者相位不对。也见过因为复位顺序不对上电后IP核状态机跑飞怎么都起不来。所以我的建议是在项目初期就把时钟方案和复位方案设计好画个详细的时钟树和复位树确认每个时钟域和复位域都覆盖到了。第二个体会是调试手段要丰富。光靠看代码和猜是没用的必须用工具。ILA、示波器、逻辑分析仪、Wireshark这些工具要熟练使用。我习惯在调试阶段把关键信号都接到ILA上触发条件设置好抓一次完整的帧传输过程然后慢慢分析。很多时候问题就藏在某个信号的时序细节里光看代码是看不出来的。第三个体会是参考示例设计。Xilinx的示例设计Example Design是很好的起点里面包含了完整的时钟方案、复位方案、数据通路。我一般先跑通示例设计确认硬件没问题然后再基于示例设计改自己的逻辑。这样能避免很多低级错误。第四个体会是注意细节。以太网IP核的配置项很多每个配置项都有它的作用。比如字节序、极性反转、自协商使能这些细节如果搞错了现象可能很诡异。我习惯在配置IP核的时候把每个配置项都查一遍文档确认理解它的含义。如果文档看不懂就去Xilinx的论坛搜或者看示例设计里是怎么配的。第五个体会是耐心。以太网调试是个磨人的活有时候一个问题卡好几天。我的经验是卡住的时候不要硬扛出去走走换个思路。很多时候问题其实很简单只是自己钻牛角尖了。另外多跟同行交流别人可能遇到过类似的问题一句话就能点醒你。最后再分享一个小技巧如果你用的是Xilinx的板子比如ZC706或者ZCU102Xilinx提供了完整的以太网参考设计包括原理图、PCB、FPGA设计。这些参考设计是经过验证的可以直接拿来用。我刚开始做以太网的时候就是照着ZC706的参考设计一步步来的省了很多事。如果你用的是第三方板子也可以找板子厂商要参考设计一般都会提供。这个内容后续还可以这样扩展一是加入IEEE 1588时间同步的实现细节二是加入TSN流量调度的具体方案三是加入多网口交换的设计思路。这些方向都是工业以太网的热点有实际项目需求的朋友可以深入研究。
返回列表