ARTICLE DETAIL

资讯详情

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

FPGA实现EtherCAT从站通信链路:帧驻留时间与CRC重算实战

FPGA实现EtherCAT从站通信链路:帧驻留时间与CRC重算实战 做工业以太网的朋友应该都有体会EtherCAT从站通信链路这个词看着高大上翻译成人话就是主站发一个报文下来你的从站能不能在极短时间窗口内把属于自己的数据取出来、把要上传的数据塞进去再把整个帧准确无误地送到下一个节点。最近我基于FPGA把这条链路完整实现并做了验证既有仿真层面的数据也有实机联调的结果整个过程正好适合对FPGA和EtherCAT都感兴趣的朋友参考。这篇就当一次项目复盘把链路拆解、逻辑实现、验证方法和踩坑点一次说透。需要提前说明的是EtherCAT从站通常有两类做法一是直接用ET1100、LAN9252这类专用ESC芯片省事但灵活性受限二是在FPGA内部把ESC核心逻辑自己写出来再做外围电路和验证。我这次选的是后者主要目的是为了论文里对“通信链路”进行可控的底层分析另外也想把多端口定制、延迟测量这些能力握在自己手里。如果你也在纠结用芯片还是FPGA或者已经选型FPGA但不知道链路验证从哪里下手这篇文章应该能帮你少走不少弯路。1. 链路到底长什么样——设计之前的全局拆解1.1 从站通信链路的五段式结构EtherCAT从站通信链路从物理信号到最后的应用接口可以拆成五段PHY物理层、MII接口、ESC核心EtherCAT Slave Controller、过程数据接口、应用层寄存器。常见资料里喜欢画那种层层嵌套的协议栈图但实际做FPGA时脑子里更要紧的是一条数据流主站的以太网帧从网口进来PHY把差分信号转成数字信号通过MII接口送进FPGAFPGA里的ESC核心识别出EtherCAT帧找到发给本站的数据报把需要的数据写入寄存器或DPRAM同时把本地上报的数据替换或插入到帧的正确位置最后帧再从FPGA出去经MII和PHY转发到下一个从站。这条数据流最关键的约束是“帧驻留时间”。EtherCAT的卖点就是极低的从站转发延迟理论上一个从站只产生纳秒到微秒级的延迟所以FPGA内部绝对不能把整个帧缓存完再处理必须边接收、边解析、边修改、边转发。很多人第一次写ESC逻辑时习惯性把整个帧收进FIFO再慢慢分析结果转发延迟一下子涨到几十微秒这种设计在EtherCAT里是不达标的。牢记这一点整个链路的设计方向就不会跑偏。1.2 为什么用FPGA而不是专用ESC芯片这个问题在项目开题时就被问过很多次。专用ESC芯片的优势是协议栈固化、支持脚本语言、通过配置文件就能快速投产LAN9252甚至内部集成了CANopen和EtherCAT两种模式。但它的黑盒属性太强你只能看到寄存器看不到底层帧在什么时刻被抽头、什么时刻被插入这对我做“通信链路分析与验证”的论文目标来说远远不够。FPGA方案允许我在MII层插入探针精确测量帧头到达时间、数据报抽取时间、FCS重算时间这些底层数据是专用芯片给不了的。FPGA还能灵活定制从站端口数。很多高端伺服驱动器需要双端口甚至四端口级联专用芯片虽然也有多端口版本但端口间延迟抖动、旁路逻辑都由芯片决定。用FPGA时端口切换逻辑完全自己控制甚至可以在设计中预留测试接口。代价也很明显ESC核心的任意一个状态位出错就可能导致主站显示从站丢失调试难度直线上升需要有足够耐心抓波形、对协议。2. 硬件平台与接口规划——画板子之前要想清楚的事2.1 PHY芯片选型与MII接口设计EtherCAT从站不像普通以太网那样要求高带宽百兆全双工已经足够所以PHY选型并不复杂。我这次用的是Microchip KSZ8081RNA兼容MII和RMII模式单路3.3V供电工业温区批量也好买。如果你手头有YT8512、IP101GRI也可以重点是PHY的模式必须配置成MII时钟频率25MHz而不是RMII的50MHz。这里有一个非常容易踩的坑EtherCAT要求从站PHY在链路建立后尽快上报“链路状态”所以很多从站设计会关闭自动协商将PHY强制为100Mbps全双工。这样比用自动协商省去几百毫秒的建链时间也让延迟更稳定。配置方式一般是上电后用MDIO写PHY控制寄存器比如KSZ8081的寄存器0写入0x2100或类似值把速度为100M、全双工强制。如果你在调试时发现主站能识别链路但扫描不到从站先检查PHY是不是还在自适应模式。MII接口信号来说接收侧有RXD[3:0]、RX_DV、RX_ER、RX_CLK发送侧有TXD[3:0]、TX_EN、TX_CLK。RX_CLK是PHY从接收线路恢复的25MHz时钟TX_CLK可以由PHY提供也可以由FPGA提供。我的做法是让PHY提供TX_CLKFPGA内部以该时钟为发送路径基准避免FPGA产生的高频时钟与PHY时钟不同源。如果你的PHY允许从FPGA侧输入TX_CLK需要额外考虑时钟偏斜建议不到万不得已不用。2.2 跨时钟域与复位顺序从站内部至少有两个时钟域接收时钟域RX_CLK和发送时钟域TX_CLK。实际测试中这两个时钟虽然都是25MHz但来自不同PHY芯片或不同晶振时会有几ppm的频率偏差。处理不好会出现偶发丢帧或错位。我的做法是在接收和发送之间插入一个异步FIFO专门缓冲控制信息和待修改的数据报标签。但需要注意EtherCAT帧是从一个端口进来从另一个端口出去两个端口实际上共享同一个物理PHY的时钟时反而省事如果是两个独立PHY端口级联那么跨时钟域几乎不可避免务必在中间加异步FIFO且FIFO深度只要够缓存一个FIFO的“控制块”即可不需要缓存整帧。复位顺序也要遵守先让PHY芯片上电等电源稳定后拉低PHY复位引脚延迟至少1ms然后FPGA内部向PHY发起MDIO配置配置完成后等RX_CLK稳定且RX_DV多次为低才开始释放MAC接收逻辑复位。如果反过来接收逻辑在时钟还不稳定时就开始采样仿真器里看不出问题上板后会随机出现CRC错误。2.3 双端口级联的端口切换逻辑如果从站板卡需要两个物理端口EtherCAT的转发链路通常是端口0接收、端口1发送如果是从站内部应用需要额外数据再通过ESC逻辑复制一份。端口切换在MII层实现时我使用一个2选1数据流开关同时旁路帧时钟与同步信号。这里的核心是保证帧在从端口0进入、完成ESC处理后、从端口1离开时字节流中间没有latch过深的缓存。推荐采用“流水线直通”结构——每个字节的MII半字节进来后经过组合逻辑判断再同步打拍输出。这样即使插入了本地上报数据占用的时间也只是溢出/插入字节数量乘以半字节周期整体延迟可控制在几百纳秒级别。3. ESC核心逻辑链路分析和处理的真正心脏3.1 数据报文格式识别与处理流程EtherCAT帧本质是Ethernet II帧EtherType固定为0x88A4MAC地址不是重点因为从站不关心目的MAC在直连拓扑中通常使用广播地址。进入ESC核心的数据帧先判断EtherType如果不是0x88A4直接按标准以太网转发或丢弃如果是则进入EtherCAT头解析。EtherCAT头有两字节长度字段和一个字节保留字段随后是一串数据报Datagram每个数据报都有10字节命令头含命令类型、索引、地址、长度、M位、CIR状态、可能的数据段和2字节的Working Counter。从站链路验证的一个重要动作是判断当前数据报是否与本从站相关。EtherCAT有位置寻址和节点寻址两种位置寻址用得最多主站开始时发送一个“位置寻址读/写”命令从站在帧经过时把自己的位置计数器通常由前导寄存器自动加1与数据报地址字段比较匹配则执行读写。实现时需要用组合逻辑比较地址同时注意位置计数器本身的累加动作要在数据报的“地址字段”读取完成后立即发生不能用时序逻辑延后一拍否则在级联第一个站点时往往会错位。3.2 CRC32校验的重算时机EtherCAT使用和标准以太网相同的CRC32多项式0x04C11DB7从站的难点在于你修改了数据报文内容后必须重新计算整个帧的FCS并在帧结束前发送出去。这个重算窗口相当紧——数据报最后一个字节从MII接口经过后后面还跟着最多几个字节的剩余帧内容重算的CRC必须在那之前完成并排到输出序列里。我最初的实现是收到整个帧后再回放发现转发延迟大了10倍。后来改成流水线CRC在数据进入ESC核心时同时并行计算“原始CRC”和“增量CRC”。原始CRC用于检测链路误码增量CRC则基于数据报中修改字段的位置和值提前计算差量并修正。这个方法听起来复杂但对FPGA来说反而简单因为CRC是一个线性运算两次连续CRC计算可以叠加。最终实现后重算CRC的时间只占1个时钟周期实测转发延迟小于1微秒。3.3 过程数据对象PDO的插入与抽取Op模式下主站每个周期发送过程数据帧从站需要从数据报中抽取输出主站到从站数据并将输入从站到主站数据插入。我用双口RAM作为过程数据缓存输出数据写入RAM地址A区域输入数据从RAM地址B区域读取。ESC核心在处理到匹配数据报时先读RAM B区的数据作为新的数据报内容同时将帧中原有字段存入RAM A区。这里要注意输出数据的“写使能”信号必须与数据报的处理窗口对齐如果数据报包含8个字节输出那么只在对应字节位置打一拍写脉冲其他任何时刻别动RAM否则可能把下一个数据报的数据污染了。实操上还有一个效率细节有些从站为了降低响应时间会在数据报还没完全进入时就开始判断地址窗这样应用层数据可以从“推测”的地址位置直接读取。但如果前面几个字节有误码地址匹配就会失败导致后续数据被错写。我建议宁可把判断窗口从数据报的第4个字节开始留出命令和地址解析时间也不要用组合预测。4. 通信链路验证方法——怎么证明你的链路确实没问题4.1 仿真验证用testbench把链路跑通链路验证第一步不是直接上板而是仿真。FPGA开发中正确写testbench本身就是一门学问。我用Verilog写了完整的MII主站发送模型按EtherCAT格式生成帧经过RTL的ESC核心再检查输出的帧格式和CRC。仿真时不要只仿真“正常数据”还要制造CRC错误、地址不匹配、长度错位三种异常帧确保ESC核心不会误处理。一个容易忽略的点MII是半字节Nibble传输每个字节分两个时钟周期发送因此testbench里写帧时也要按低四位、高四位的顺序发送。直接按字节打包成数组再循环移位是常见的错误仿真时看似对上板后数据顺序全乱。我见过好几个同行卡在这个问题上最后都是靠抓RX_CLK和RXD波形才发现的。4.2 实机联调TwinCAT主站扫描从站实机验证我推荐用倍福TwinCAT做主站原因有三扫描从站方便、可以读所有寄存器、且自带EtherCAT诊断框架。把FPGA板卡和PC用网线直连TwinCAT里选择“EtherCAT”网卡驱动点击扫描后如果从站XML文件配置正确设备树里会出现你的从站名字。这时就可以执行Init - Pre-Op - Safe-Op - Op的状态切换观察状态字寄存器ALStatus地址0x0130是否按预期跳变。如果扫描不到从站优先查三处物理链路是否建立PHY寄存器0的link状态、ESC的DL控制寄存器0x0100是否已经配置成“自动递增位置寻址且允许帧转发”、以及PDI接口寄存器0x0140是否准备好FPGA侧握手。很多时候不是逻辑错误而是某个寄存器初始值不对导致主站认为“从站不存在”。4.3 链路延迟与抖动测量为了论文定量分析链路我还做了通信链路延迟测量。方法不复杂在FPGA内部用计数器/时间戳逻辑在MII接收路径上检测到帧头时记录时间戳T1在发送路径上检测到同一帧帧头时记录时间戳T2T2-T1就是该帧在本站的驻留时间。另外在Op模式下主站用分布式时钟DC同步从站需要维护一个系统时间寄存器我可以把FPGA内部置一个32位自由运行计数器作为系统时间基准对比同步后偏差。实测下来我的流水线转发结构驻留时间稳定在0.5us左右时钟同步后从站与主站的系统时间偏差在100ns以内不加PHY延迟补偿时。这里有一个重要提醒如果测量结果里抖动超过1us多半不是逻辑问题而是MII接口中某个信号没有打拍导致异步信号进入同步逻辑时而产生亚稳态。在FPGA中务必对所有跨时钟域信号做两级同步否则抖动数据没法看。5. 常见问题与排查技巧实录5.1 链路起不来PHY配置和MII连接问题现象TwinCAT扫描不到从站PHY的link灯亮但发送不了数据。排查顺序是先用示波器或逻辑分析仪看PHY的TX_CLK和RX_CLK是否正常两个时钟都要有25MHz缺一个就要查晶振和PHY时钟配置。然后看MII的RX_DV有没有正常的帧活动如果在扫描时RX_DV一直没有高脉冲说明PHY没有把主站帧送到FPGA问题可能出在PHY的RX引脚极性或变压器的抽头接线。最后查FPGA内部有没有把MII引脚约束到正确Bank很多开发板的MII引脚分布在不同的BANK跨BANK可能违反IO标准导致极弱驱动。5.2 CRC一直错误字节序和初始值现象TwinCAT发现从站但总是报CRC错误抓包显示FCS不对。大部分原因是CRC计算在FPGA内按字节展开时没有按照“先低四位后高四位”的MII顺序处理生成的结果是反序。EtherCAT的CRC32虽然多项式与Ethernet一样但帧传输顺序是先计算CRC的初始值0xFFFFFFFF然后按位序处理最后结果取反并随帧发送发送时也是低位先出。如果你把计算结果直接拼接经常出现“FLAG”里少循环移位4位的情况。经验是用MII自带的数据反转逻辑把半字节顺序摆正后再动CRC千万别在计算前先去调位序。5.3 Op状态进不去PDI周期和数据对齐问题现象Init、Pre-Op都能进入Safe-Op可以但切Op时主站报超时或者一进Op就掉线。这通常是过程数据接口PDI的同步信号没有对齐。EtherCAT进入Op前主站会通过邮箱配置同步模式从站需在收到同步信号后在指定周期读取过程数据。FPGA侧需要实现一个周期计数器并与SYNC事件对齐。如果计数周期比主站设定值多一点或少了几个周期就会导致主站认为从站“无响应”。解决办法是在ESC寄存器里根据主站下载的周期值实时配置FPGA定时器并在SYNC0/SYNC1中断标志位产生时锁存过程数据保证每次切换读取都是完整帧。5.4 多端口板卡一个口通另一个口不通如果板卡两个端口一个通一个不通最常见的原因是端口切换逻辑中的IDLE状态没有正确回到初始位置。MII接口在帧之间有大量线路IDLE这时RXD是0RX_DV是0。处理逻辑要保证在RX_DV拉低后发送端口也回到IDLE状态而且不能提前把发送TX_EN拉低否则后半个字节就丢了。另一个原因是FPGA内两个端口共享一套寄存器结果内部地址冲突把所有数据和寄存器都镜像到了两个端口。给每个端口写独立的“旁路FIFO”和控制寄存器别图省事共用一套。6. 从验证数据到论文结论——如何把链路“分析”做扎实6.1 整理实验数据波形图与表格缺一不可论文里如果只有搭建过程没有详细验证数据说服力会大打折扣。我建议把MII接口的仿真波形截成大图标出帧头和数据处理窗口的位置再把实机测得的驻留时间、系统时间偏差、错误帧计数整理成表。比如驻留时间测20次记录平均值、最大最小值、标准差。论文讨论里可以对比专用ESC芯片标称的转发延迟说明FPGA实现的链路具备同等量级的性能。6.2 把“分析”写清楚不只是“能通”而是为什么能通学术论文更看重分析过程这也是我在项目里特别留意的地方。我花时间做了三个层面的分析第一推导了帧在MII上流过时从站处理的关键时间窗口与时钟周期数量的关系第二分析位置寻址递增与数据报地址比较的竞争条件以及为什么组合逻辑优先于时序逻辑第三对CRC增量重算的数学原理做了说明。这些都是论文里“分析与验证”章节的主体。如果你也准备写论文别只写“我实现了什么”要写“为什么这样实现”并用实验数据支撑。6.3 后续扩展多端口DDR、PCIe和实时以太网网关链路验证完成之后我做了一些扩展实验比如在FPGA内加入多端口DDR读写程序配合过程数据缓存把输入数据从高速ADC采集送进DDR再由EtherCAT主站周期读取也尝试过把ESC核心与PCIe接口对接变成一块工业通信卡。这些方向都很适合在FPGA项目实战里继续加深核心链路通了以后扩展只是数据通路宽度和接口协议的问题。我个人做下来的体会是FPGA做EtherCAT从站最值钱的不是“能跑通”而是你真的能看清每一个半字节从PHY进来、穿过组合逻辑、再送到PHY出去的完整轨迹。以前用LAN9252调参数很多现象只能靠猜现在回头看那些问题基本都能从链路时序上找到根因。最后再分享一个小经验调试时最好在FPGA内部留一组计数器——接收帧数、CRC错误数、位置匹配数、转发帧数。这四个计数器在调试和论文数据整理时能救命别省那几十个LUT。希望这篇复盘能帮到正在做FPGAEtherCAT的同路人咱们在链路指标上较真的功夫迟早会体现在系统的稳定性和论文的含金量上。
返回列表