基于FPGA状态机设计实现EtherCAT从站_fpga 从站-程序员宅基地

技术标签: fpga开发  ETHERCAT  

0 引言
EtherCAT是由BECKHOFF提出的在工业控制领域获得广泛应用的现场总线之一,该总线具备全双工工作模式,可基于主站(Master)和从站(Slave)连接的模式实现数据传递,且具有低延时、高安全性的特点。EtherCAT从站控制器ESC(EtherCAT Slave Controller)是从站模块实现EtherCAT通信协议的关键,目前国内基于EtherCAT协议的通信功能基本都采用ET1100/ET1200等从站芯片来实现[1-4]。然而,由于这类芯片除基本通信功能外,还具备大量其他功能,而此类额外通信机制并不对我国技术人员公开,造成对此类通信芯片还无法实现完全自主可控,采用有效的安全机制提升系统安全性更是无从谈起。随着工业控制领域的信息安全问题日益突出,此类不可自主可控通信芯片的应用给我国核心控制系统的运行引入一定安全风险。为了实现对控制系统用通信芯片的完全自主可控,基于FPGA实现EtherCAT通信协议的自主化开发显得非常必要,同时也是采用自主安全机制提升通信系统安全能力的重要前提。

基本通信链路是实现收发EtherCAT协议数据的核心,因此,本研究基于EtherCAT协议特征及数据传递机制,设计关键通信节点的FPGA状态机,验证FPGA实现EtherCAT从站控制器基本通信链路功能的可行性,为完善EtherCAT其他通信功能及安全机制奠定重要基础。

1 EtherCAT从站控制器框架
EtherCAT主站与各从站之间的通信链路如图1所示。通信过程中,数据帧遍历所有从站设备,数据帧通过某一从站时,从站设备根据报文命令分析寻址到本机报文并进行读/写数据到指定位置,数据帧到达最后一个从站后,该从站把处理后的数据帧发送给主站。主站收到此上行电报后处理返回数据,一次通信结束[5-6]。

 

EtherCAT从站控制器主要包括数据帧处理单元、EBUS接口编码/解码模块、Auto-forwarder模块、Loop-back funcTIon模块等。以ET1100/ET1200从站控制器为例,其内部框架如图2所示,主要包括MII、EBUS接口,EtherCAT数据帧处理单元,现场总线内存管理单元(FMMU,Fliedbus Memory Management Unit),存储同步管理通道(SM,SyncManager),分布时钟,PDI接口,ESC地址空间(包括寄存器和用户数据存储器),EEPROM控制,以及状态控制、中断、看门狗和物理层管理等部分。

 

其中,帧处理单元(EtherCAT Processing Unit)分析并处理EtherCAT数据流。现场总线内存管理单元(FMMU,Fliedbus Memory Management Unit)是EtherCAT从站控制IP核中的核心模块之一,用于实现主站对从站的逻辑寻址。存储同步管理通道(SM,SyncManager)实现主站和本地应用数据交换。Ethercat帧和PDI接口都必须轮询处理器来判断另一端是否完成访问。PDI接口模块是ESC芯片的应用数据接口。

在FPGA实现EtherCAT从站控制器的过程中,如果能实现数据链路的通路,数据帧能够通过EBUS、MII接口传输到FPGA中,FPGA将数据帧进行识别并进行CRC校验,解包出EtherCAT的帧格式和协议命令,并通过端口连接状态将数据帧发送。那么,可以说明EtherCAT从站控制器是可以在FPGA中进行自主开发实现。在以上的数据链路中,EBUS接口涉及到EBUS模块,EBUS模块主要对EBUS协议进行解析,通过曼彻斯特编码/解码接收或发送数据;FPGA将数据帧进行识别并进行CRC校验是Auto-Forwarder模块;通过Loop-back funcTIon模块将数据帧发送。以下分别介绍上述各模块的实现过程。

2 各模块实现逻辑
2.1 EBUS编码/解码模块
对于EBUS实现方式,EBUS接口的LVDS信号数据率是100 Mb/s,EBUS接口是利用曼彻斯特编码/解码(Manchester encoded)通过LVDS方式实现。

在实现EBUS部分时,根据EBUS协议要求,需要实现曼彻斯特解码和曼彻斯特波编码。其中“0”用“01”表示,“1”用“10”表示。EBUS协议中分为idle标识符、开始帧标识符(SOF)、结束帧标识符(EOF)。Idle标识符为“0”,开始帧标识符为连续3个时钟(200 MHz)连续的1,结束帧标识符为连续3个时钟(200 MHz)连续的0。EBUS协议如图3所示。

曼彻斯特编码状态机如图4所示,曼彻斯特编码的状态机共分为8个状态,分别为初始1状态(IDLE_1C)、初始2状态(IDLE_2C)、帧开始1状态(SOFR_1C)、帧开始2状态(SOFR_2C)、编码1状态(ENCO_1C)、编码2状态(ENCO_2C)、结束帧1状态(EOFR_1C)、结束帧2状态(EOFR_2C),处理时钟为200 MHz。

各状态说明如下:

IDLE_1C为初始1状态,对应发送EBUS协议的idle标识符,发送的数据为‘0’。下一时钟即进入IDLE_2C状态。

IDLE_2C为初始2状态,对应发送EBUS协议的idle标识符,发送的数据为‘1’。当发送数据有效时进入SOFR_1C状态,否则进入IDLE_1C状态。

SOFR_1C为帧开始1状态,对应的发送EBUS协议的开始帧标识符,下一时钟进入SOFR_1C状态。

SOFR_2C为帧开始2状态,对应的发送EBUS协议的开始帧标识符,下一时钟进入ENCO_1C状态。

ENCO_1C为编码1状态,对应发送帧数据,下一时钟进入ENCO_2C。

ENCO_2C为编码2状态,对应发送帧数据,当发送数据无效时进入EOFR_1C状态,否则进入ENCO_1C状态。

EOFR_1C为结束帧1状态,对应发送帧结束标识符,下一时钟进入ENCO_2C状态。

EOFR_2C为结束帧2状态,对应发送帧结束标识符,此时一帧数据发送完毕,下一时钟回到IDLE_1C状态。

曼彻斯特解码状态机如图5所示,曼彻斯特解码的状态机共分为5个状态,分别为初始状态(IDLE)、帧开始状态(SOFR)、编码1状态(ENCO_1C)、编码2状态(ENCO_2C)、结束帧状态(EOFR),处理时钟为200 MHz。

各状态说明如下:

IDLE为初始状态,对应接收EBUS协议的idle标识符,下一时钟即进入SODR状态。

SOFR为帧开始状态,对应的接收EBUS协议的开始帧标识符,当接收到连续3个‘1’即rx_sof_dv为1时,下一时钟进入ENCO_1C状态,否则进入IDLE状态。

ENCO_1C为编码1状态,对应接收帧数据,下一时钟进入ENCO_2C。

ENCO_2C为编码2状态,对应接收帧数据,当接收到连续3个‘0’时,进入EOFR状态,否则进入ENCO_1C状态。

EOFR_1C为结束帧状态,此时已经接收到完整的EtherCAT帧,下一时钟进入IDLE状态。

2.2 Auto-forwarder模块
Auto-forwarder模块是MII和EBUS模块进入IPCORE的第一个处理模块,主要实现MII/EBUS数据缓存、检测帧导码、错误检测、将数据发送到自动回环(Loop-back funcTIon)和帧处理单元(EtherCAT Processing Unit)。Auto-forwarder模块实现MII/EBUS数据缓存功能是将EtherCAT帧数据存到FIFO中,并经过IPCORE处理时钟(25 MHz)数据读出,实现帧数据与IPCORE时钟同步,再进入到下一模块处理。检测帧导码是在数据帧数据有效后,通过检测帧导码(0x55555555555555555D),从而确定此帧为以太网帧。数据检测主要检测3种错误:物理层错误(RX错误)、数据帧错误、CRC错误。在数据经过FIFO同步后,在以太网帧的条件下,进行CRC校验,如果CRC校验正确,把帧数据发送到自动回环或帧处理单元中;如果CRC校验错误,将此帧丢弃。将数据发送到自动回环和帧处理单元是在CRC校验正确和无其他错误的条件下,将帧数据发送到自动回环和帧处理单元中。Auto-forwarder模块的状态机如图6所示。

Auto-forwarder模块的状态机共分为5个状态,分别为初始状态(IDLE)、检测前导码状态(DETECT_PREAM)、检测前导码开始状态(DETECT_START)、帧开始状态(FRAME_START)、帧处理状态(FRAME_PROC)。处理时钟为25 MHz。各状态说明如下:

IDLE为初始状态,当没有帧数据时,状态处于IDLE状态。当检测到帧数据为5时,进入到DETECT_PREAM状态。

DETECT_PREAM 为检测前导码状态,帧接收帧导码5,当检测到D时,进入到DETECT_START状态。

DETECT_START为检测帧导码开始状态,在下一时钟进入到FRAME_START状态。

FRAME_START为帧开始状态,开始接收帧数据,在下一时钟进入到FRAME_PROC状态。

FRAME_PROC为帧处理状态,正式处理帧数据,当没有帧数据时就进入IDLE状态。

2.3 Loop-back function模块
自动回环(Loop-back function)是根据端口打开状态确定数据帧转发状态,IP共有4个端口,如果当前端口处于闭合或未建立连接状态,则回环功能转发EtherCAT帧到下一个逻辑端后,端口0(PORT0)的回环功能会转发帧数据到数据帧处理单元。端口状态分别为:自动闭合、手动打开。不同端口数据帧的处理顺序如下:

(1)0→EtherCAT Processing Unit→0

(2)0→EtherCAT Processing Unit→1 / 1→0

(3)0→EtherCAT Processing Unit→1 / 1→2 / 2→0 (log. ports 0,1, and 2)or0→EtherCATProcessing Unit→3 / 3→1 / 1→0 (log. ports 0,1, and 3)

(4)0→EtherCAT Processing Unit→3 / 3→1 / 1→2 / 2→0

为便于验证及测试,本文重点探讨双端口情况下的数据转发功能及测试。

3 功能测试
为了对基于FPGA的通信链路进行系统测试,搭建如图7所示的测试环境。

其中,EtherCAT主站是指倍福EtherCAT主站,可以将指定EtherCAT帧发送到从站中;EtherCAT从站(ASIC)是指倍福的以ET1100芯片为核心的EtherCAT从站,ETherCAT主站通过MII信号将EtherCAT帧发送到EtherCAT从站(ASIC)中,EtherCAT从站(ASIC)将EtherCAT帧转换成EBUS信号,将数据传输到EtherCAT测试板中;EtherCAT测试板是以FPGA为核心的测试板。

在测试中,测试板通过EBUS接口,将数据帧传输到FPGA中,FPGA通过EBUS解码得到数据帧,数据帧到FPGA将进行识别并进行CRC校验,解包出EtherCAT帧格式和协议命令。通过MII转发到PC上,PC通过wireshark进行抓包验证数据帧的正确性。

3.1 解码状态测试
解码状态测试结果如图8所示,其中rx_data_interal为EBUS差分转单端信号,current_state为状态机信号,rx_dv为数据有效信号,rx_data为接收数据。可以看出,EBUS协议的LVDS信号通过差分转单端后,通过状态机处理,得到帧数据。

3.2 编码状态测试
编码状态测试结果如图9所示,tx_data_interal为单端信号转EBUS差分信号,current_state为状态机信号,tx_dv为数据有效信号,tx_data为接收数据。可以看出,发送数据有效后,通过状态机将数据单端转差分发送出去。

3.3 Auto-forwarder数据状态
经过Auto-forwarder状态的数据如图10所示,其中frame为帧数据,fifo为帧数据通过数据同步后的数据,state为状态机信号,frame_done为数据帧结束信号,frame_start为帧开始信号,frame_data_valid为数据帧有效信号,frame_crc_err为帧错误信号。结果表明,数据帧可以正确识别并进行解析,在帧结束后,可以看到frame_crc_err有一拍为低。

3.4 数据帧验证
用wireshark抓取的数据结果表明,数据帧可以由FPGA正确处理,wireshark抓取报文正确接收到EtherCAT类型的转发报文,说明数据链路已打通。

4 结论
本文通过解析各阶段数据结果,验证了关键通信链路上EBUS编码/解码、Auto-forwarder、Loop-back function模块的FPGA状态机的正确性,说明FPGA实现EtherCAT从站基本通信链路是完全可行的,为开发完善的ESC从站控制器创造了条件。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/YEYUANGEN/article/details/128461175

智能推荐

前端开发之vue-grid-layout的使用和实例-程序员宅基地

文章浏览阅读1.1w次,点赞7次,收藏34次。vue-grid-layout的使用、实例、遇到的问题和解决方案_vue-grid-layout

Power Apps-上传附件控件_powerapps点击按钮上传附件-程序员宅基地

文章浏览阅读218次。然后连接一个数据源,就会在下面自动产生一个添加附件的组件。把这个控件复制粘贴到页面里,就可以单独使用来上传了。插入一个“编辑”窗体。_powerapps点击按钮上传附件

C++ 面向对象(Object-Oriented)的特征 & 构造函数& 析构函数_"object(cnofd[\"ofdrender\"])十条"-程序员宅基地

文章浏览阅读264次。(1) Abstraction (抽象)(2) Polymorphism (多态)(3) Inheritance (继承)(4) Encapsulation (封装)_"object(cnofd[\"ofdrender\"])十条"

修改node_modules源码,并保存,使用patch-package打补丁,git提交代码后,所有人可以用到修改后的_修改 node_modules-程序员宅基地

文章浏览阅读133次。删除node_modules,重新npm install看是否成功。在 package.json 文件中的 scripts 中加入。修改你的第三方库的bug等。然后目录会多出一个目录文件。_修改 node_modules

【】kali--password:su的 Authentication failure问题,&sudo passwd root输入密码时Sorry, try again._password: su: authentication failure-程序员宅基地

文章浏览阅读883次。【代码】【】kali--password:su的 Authentication failure问题,&sudo passwd root输入密码时Sorry, try again._password: su: authentication failure

整理5个优秀的微信小程序开源项目_微信小程序开源模板-程序员宅基地

文章浏览阅读1w次,点赞13次,收藏97次。整理5个优秀的微信小程序开源项目。收集了微信小程序开发过程中会使用到的资料、问题以及第三方组件库。_微信小程序开源模板

随便推点

Centos7最简搭建NFS服务器_centos7 搭建nfs server-程序员宅基地

文章浏览阅读128次。Centos7最简搭建NFS服务器_centos7 搭建nfs server

Springboot整合Mybatis-Plus使用总结(mybatis 坑补充)_mybaitis-plus ruledataobjectattributemapper' and '-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏3次。前言mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过SQL语句操作数据库,很是灵活。但正其操作都要通过SQL语句进行,就必须写大量的xml文件,很是麻烦。mybatis-plus就很好的解决了这个问题。..._mybaitis-plus ruledataobjectattributemapper' and 'com.picc.rule.management.d

EECE 1080C / Programming for ECESummer 2022 Laboratory 4: Global Functions Practice_eece1080c-程序员宅基地

文章浏览阅读325次。EECE 1080C / Programming for ECESummer 2022Laboratory 4: Global Functions PracticePlagiarism will not be tolerated:Topics covered:function creation and call statements (emphasis on global functions)Objective:To practice program development b_eece1080c

洛谷p4777 【模板】扩展中国剩余定理-程序员宅基地

文章浏览阅读53次。被同机房早就1年前就学过的东西我现在才学,wtcl。设要求的数为\(x\)。设当前处理到第\(k\)个同余式,设\(M = LCM ^ {k - 1} _ {i - 1}\) ,前\(k - 1\)个的通解就是\(x + i * M\)。那么其实第\(k\)个来说,其实就是求一个\(y\)使得\(x + y * M ≡ a_k(mod b_k)\)转化一下就是\(y * M ...

android 退出应用没有走ondestory方法,[Android基础论]为何Activity退出之后,系统没有调用onDestroy方法?...-程序员宅基地

文章浏览阅读1.3k次。首先,问题是如何出现的?晚上复查代码,发现一个activity没有调用自己的ondestroy方法我表示非常的费解,于是我检查了下代码。发现再finish代码之后接了如下代码finish();System.exit(0);//这就是罪魁祸首为什么这样写会出现问题System.exit(0);////看一下函数的原型public static void exit (int code)//Added ..._android 手动杀死app,activity不执行ondestroy

SylixOS快问快答_select函数 导致堆栈溢出 sylixos-程序员宅基地

文章浏览阅读894次。Q: SylixOS 版权是什么形式, 是否分为<开发版税>和<运行时版税>.A: SylixOS 是开源并免费的操作系统, 支持 BSD/GPL 协议(GPL 版本暂未确定). 没有任何的运行时版税. 您可以用她来做任何 您喜欢做的项目. 也可以修改 SylixOS 的源代码, 不需要支付任何费用. 当然笔者希望您可以将使用 SylixOS 开发的项目 (不需要开源)或对 SylixOS 源码的修改及时告知笔者.需要指出: SylixOS 本身仅是笔者用来提升自己水平而开发的_select函数 导致堆栈溢出 sylixos

推荐文章

热门文章

相关标签