当前位置:   article > 正文

ethercat 主站 FPGA verilog 代码 一份基于FPGA的EtherCAT主站的Verilog代码实现_fpga ethercat

fpga ethercat

一份EtherCAT主站的FPGA Verilog代码
ethercat 主站 FPGA verilog 代码

EtherCAT是一种高性能实时控制网络协议,它在工业自动化、机器视觉、智能电力等领域得到越来越广泛的应用。作为EtherCAT网络的核心,主站需要实现高速数据帧的发送和接收,以及各种EtherCAT从站的管理。为了满足高性能和高可靠性的需求,许多主站的实现采用了FPGA技术。

本文将介绍一份基于FPGA的EtherCAT主站的Verilog代码实现。该代码实现了全部EtherCAT主站的核心功能,包括物理层的接口、帧的发送与接收、以及从站的管理。其中,采用了多路DMA技术和FIFO缓存技术,使得以太网MAC层的数据处理效率得到了显著提高。

在物理层接口部分,我们采用了 industry standard GMAC10/100Mbps ethernet MAC芯片,实现了MAC和PHY之间的连接。在帧的发送和接收部分,我们采用了FPGA硬件实现的TCP/IP协议栈,实现了高速的数据帧处理。同时,为了提高数据处理的效率,我们采用了多路DMA技术,在数据传输过程中,通过多条DMA通道同时传输数据,减少了数据传输的等待时间。

在从站的管理方面,我们实现了自动识别从站的功能,并向所有从站发送广播消息,以初始化各从站。同时,我们还实现了从站配置信息的读取和设置功能,可以通过主站对从站进行灵活的配置,以适应不同场景下的需求。

总体而言,我们的EtherCAT主站FPGA Verilog代码实现了EtherCAT网络的核心功能,具有高效、高性能和高可靠性的特点。通过该代码,可以为工业自动化、智能电力等领域的系统提供高性能和高效的数据通信支持。

ECAT运动控制器ARM软件设计

一、ARM向FPGA发送目标位置

1、对应的操作地址

`define  CUR_POS_SERVO 1

`define  TARGET_CUR_POSL 2

`define  TARGET_CUR_POSH     3

2、操作步骤

  1. 下发每个轴的位置时,先通过写地址1,告知FPGA接下来要发送目标位置的伺服;
  2. 再通过写地址2向FPGA写目标位置的低16bit;
  3. 再通过写地址3向FPGA写目标位置的高16bit。

3、注意

通过地址1,向FPGA写接下来要操作的伺服,写0表示第一个伺服,写31表示第32个伺服,以此类推。

在读写操作完成之前,不要改变指定的伺服。也就是说指定伺服+读写数据,是一整套。

二、ARM向FPGA读取当前位置

1、对应的操作地址,与目标位置共享一套地址

`define  CUR_POS_SERVO 1

`define  TARGET_CUR_POSL 2

`define  TARGET_CUR_POSH     3

2、操作步骤

  1. 下发每个轴的位置时,先通过写地址1,告知FPGA接下来要读取当前位置的伺服;
  2. 再通过读地址“2”向FPGA读取当前位置的低16bit;
  3. 再通过读地址“3”向FPGA读取当前位置的高16bit。

三、ARM向FPGA发送控制字

1、对应的操作地址

`define  CUR_POS_SERVO 1

`define  STS_SERVO     4

2、操作步骤

  1. 下发每个轴的控制字时,先通过写地址1,告知FPGA接下来要发送控制字的伺服;
  2. 再通过写地址4向FPGA写伺服的控制字;FPGA会根据第一步的伺服去对应该控制字是给哪个伺服的。

当ARM通过地址58检测到所有伺服进入OP状态后,可以通过控制字来控制各个伺服进入伺服使能状态,具体的操作流程为:顺序发送控制字6、7、15。每发送一个控制字,伺服对应的状态字就会发生变化。通过检测状态字的变化来确定发送下一个控制字。

回零的控制字为15到31,回零完成后,控制字要返回15。

四、ARM向FPGA读取状态字

1、对应的操作地址

`define  CUR_POS_SERVO 1

`define  STS_SERVO     4

2、操作步骤

  1. 下发每个轴的控制字时,先通过写地址1,告知FPGA接下来要读取控制字的伺服;
  2. 再通过读地址4向FPGA读取对应伺服的控制字。

五、ARM读取轴的位置缓存数据的个数

1、对应的操作地址

`define   CUR_POS_SERVO 1

`define   ECAT_POS_FIFO_CNT 65

2、操作步骤

FPGA为每个轴的目标位置都对应设计了一个32深度的缓存,ARM根据缓存和需要将目标位置发送到这个缓存,供FPGA的ECAT刷新。

  1. 先通过写地址1,告知FPGA接下来要读取数据个数的伺服;
  2. 再通过读地址65来读取对应伺服的轴数据缓存中数据个数。

六、ARM在启动FPGA的ECAT之前需要配置的内容

1、配置FPGA内容的相关写地址

`define   SM0_PHYADDR 49

`define   SM1_PHYADDR 50

`define   SM2_PHYADDR 51

`define   SM3_PHYADDR 52

`define   WATCHDOG_SUPPORT 53

`define   LOOP_PERIOD_H 55

`define   LOOP_PERIOD_L 56

2、具体含义

  1. SM0_PHYADDR,SM0的地址,16bit,xml文件中的高低8bit交换后,下发给FPGA。
  2. SM1_PHYADDR,SM1的地址,16bit,xml文件中的高低8bit交换后,下发给FPGA。
  3. SM2_PHYADDR,SM2的地址,16bit,xml文件中的高低8bit交换后,下发给FPGA。
  4. SM3_PHYADDR,SM3的地址,16bit,xml文件中的高低8bit交换后,下发给FPGA。
  5. WATCHDOG_SUPPORT,伺服是否支持看门狗,写1表示支持,写0表示不支持,从测试的5家伺服来看,除久同外,其他家均支持。
  6. LOOP_PERIOD_H ,为循环周期的高16bit。
  7. LOOP_PERIOD_L ,为循环周期的低16bit。

七、控制和状态寄存器

1、相关操作地址

`define   ECAT_RSTN 57

`define SERVO_INIT_DONE_ALL 58

2、具体含义

  1. ECAT_RSTN ,ARM向该地址写1,启动FPGA的ECAT运行。
  2. SERVO_INIT_DONE_ALL,ARM通过该地址读取所有伺服是否初始化完毕,1表示完毕。

  • 伺服参数配置功能寄存器

1、相关操作地址

`define PARA_INDEX 77

`define PARA_SUB_INDEX 78

`define PARA_DATA_H 79

`define PARA_DATA_L 80

`define PARA_DATA_LEN 81

`define PARA_DATA_UpLOAD     82

`define PARA_DATA_UpLOAD_H   83

`define PARA_DATA_UpLOAD_L   84

`define PARAM_SET 85

`define PARAM_SET_RST    86

`define PARAM_SET_SERVO    87

九、伺服回零功能

多个伺服同时回零的流程:

通过参数设置端口,依次将各个伺服设置成模式6,再依次发送控制字31,再依次去读取状态字,如果读到某个轴的状态字是回零完成,就将该轴的控制字写回15,并然后通过参数设置接口将其模式设置为8。

十、伺服IO读取与写入

在启动ECAT之前,通过如下两个地址,分别配置伺服IO的地址:

`define   M2S_IO_PHYADDR 47  //master output

`define   S2M_IO_PHYADDR 48  //master input

地址47为运动控制器输出到伺服的IO指令;

地址48为运动控制器从伺服获取的IO状态。

启动ECAT后,通过地址99来输出IO指令到伺服,或者从伺服获取IO状态。

`define SERVO_IO 99

同理,通过地址4来指定所要操作的伺服。

初定为8输入8输出,16位数据线的低8bit有效。

十一、其他标志

轴数据缓存的空满标志、ECAT断线等等标志

相关代码,程序地址:http://lanzouw.top/652098268519.html
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/470068
推荐阅读
相关标签
  

闽ICP备14008679号