基于 FPGA verilog 的 Ethercat 主站工程代码
Posted judaima801
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于 FPGA verilog 的 Ethercat 主站工程代码相关的知识,希望对你有一定的参考价值。
![](https://image.cha138.com/20230331/c65863e526204807b60b9de885b76c50.jpg)
![](https://image.cha138.com/20230331/05c6d0d06aa24a43a216d76c85d139a2.jpg)
EtherCAT 总线 demo 板介绍
一、测试架构介绍
- 总线部分包括 EtherCAT 协议、Canopen 协议、1588 同步协议,全部在 FPGA上实现,纯 Verilog 实现,无软核,时间精准。
- FPGA 挂百兆网口串接伺服,布线简单。
- 支持驱动 1-32 轴,自动侦测。
- CPU 和FPGA 的接口,根据 CPU 的不同而不同,常用的如 FSMC 接口、GPMC 接口、PCI/PCIE 接口等等。
- 运动控制部分用户可以选择在 STM32、ARM、X86 等 CPU 上实现 (此部分代码 demo 板不包含)
- DEMO 板具备参数固定自动运行模式,可测试总线的通讯和驱动器侦测运行正常。
- 图中 User design 部分为用户自行设计。
- 图中 IP include 部分为 demo 或 IP 提供的。
二、具体性能参数
1、循环周期和抖动
- 循环周期支持 31.25us、62.5us、125us、250us、500us、1ms、2ms 等。
- 主站在循环周期 2ms 时抖动为 50us,循环周期越短,抖动越小,从站抖动10ns。
2、支持轴数与FPGA 资源消耗量
- 支持 1-32 轴,消耗资源 12K 逻辑 Slice 左右,如用户有自己的 IP 或功能模块需要集成,则建议采用 30K 资源的 FPGA,这样才有足够冗余以备所需。某些运动控制器需要添加手轮,IO 开关量,其他用户自定义功能。
三、用户接口
该 DEMO 中接口分为 4 个部分:系统部分,过程数据部分,伺服参数配置部分,回零部分,具备与外部处理器交互的接口为过程数据部分,伺服参数配置部分,具体信号如下图所示。
标号 | 信号部分 | 功能 |
1 | 系统部分 | 时钟域复位信号,用于复位 Ethercat master 主
站 |
2 | 过程数据部分 | 用于处理器与驱动器之间的指令和状态交互,包
括位置,状态及其对应的有效信号 |
3 | 伺服参数配置部分 | 用于处理器配置主站参数,包括数据的地
址,数据的长度,数据以及设置启动和复位信号 |
4 | 测试接口 | 测试接口包括回零的启动和复位等信号,用户无
需使用 |
注:自测试模式为以上端口固定数字量自运行模式,驱动器将持续运转。
ECAT运动控制器ARM软件设计
一、ARM向FPGA发送目标位置
1、对应的操作地址
`define CUR_POS_SERVO 1
`define TARGET_CUR_POSL 2
`define TARGET_CUR_POSH 3
2、操作步骤
- 下发每个轴的位置时,先通过写地址1,告知FPGA接下来要发送目标位置的伺服;
- 再通过写地址2向FPGA写目标位置的低16bit;
- 再通过写地址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,告知FPGA接下来要读取当前位置的伺服;
- 再通过读地址“2”向FPGA读取当前位置的低16bit;
- 再通过读地址“3”向FPGA读取当前位置的高16bit。
三、ARM向FPGA发送控制字
1、对应的操作地址
`define CUR_POS_SERVO 1
`define STS_SERVO 4
2、操作步骤
- 下发每个轴的控制字时,先通过写地址1,告知FPGA接下来要发送控制字的伺服;
- 再通过写地址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,告知FPGA接下来要读取控制字的伺服;
- 再通过读地址4向FPGA读取对应伺服的控制字。
五、ARM读取轴的位置缓存数据的个数
1、对应的操作地址
`define CUR_POS_SERVO 1
`define ECAT_POS_FIFO_CNT 65
2、操作步骤
FPGA为每个轴的目标位置都对应设计了一个32深度的缓存,ARM根据缓存和需要将目标位置发送到这个缓存,供FPGA的ECAT刷新。
- 先通过写地址1,告知FPGA接下来要读取数据个数的伺服;
- 再通过读地址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、具体含义
- SM0_PHYADDR,SM0的地址,16bit,xml文件中的高低8bit交换后,下发给FPGA。
- SM1_PHYADDR,SM1的地址,16bit,xml文件中的高低8bit交换后,下发给FPGA。
- SM2_PHYADDR,SM2的地址,16bit,xml文件中的高低8bit交换后,下发给FPGA。
- SM3_PHYADDR,SM3的地址,16bit,xml文件中的高低8bit交换后,下发给FPGA。
- WATCHDOG_SUPPORT,伺服是否支持看门狗,写1表示支持,写0表示不支持,从测试的5家伺服来看,除久同外,其他家均支持。
- LOOP_PERIOD_H ,为循环周期的高16bit。
- LOOP_PERIOD_L ,为循环周期的低16bit。
七、控制和状态寄存器
1、相关操作地址
`define ECAT_RSTN 57
`define SERVO_INIT_DONE_ALL 58
2、具体含义
- ECAT_RSTN ,ARM向该地址写1,启动FPGA的ECAT运行。
- 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断线等等标志
基于vivado(语言Verilog)的FPGA学习——FPGA理论知识
基于vivado(语言Verilog)的FPGA学习(3)——FPGA理论知识
文章目录
1. FPGA介绍
1.1.FPGA内部结构
FPGA主要是采用SRAM工艺的查找表(LUT,Look-up Table)结构,LUT 本质上就是一个 RAM
内部结构有:
(1). 可编程逻辑块CLB
如果输入芯片型号,进行仿真综合时,可以看到FPGA内部资源,其中占地面积最多的就是CLB,CLB内部时有2个或4个slice构成。每个slice中又含有几个查找表LUT、多路选择器MUX、超前进位链CARRY4、存储单元FF(触发器,通常被配置成D触发器,被用于时序逻辑中)
SLICE根据LUT功能被分为:
SLICEM(memory):可读可写,可以实现移位寄存器和DRAM等存储功能
SLICEL:内部LUT只读,只能实现基本查找表逻辑
(2).可编程输入/输出单元(IOB)
为了适配多种电气标准,I/O单元根据接口电压VCCO被划分成若干组
(3).时钟管理模块(CMT)
DCM(数字管理时钟)的核心是DLL(Delay Locked Loop),可以产生不同相位的时钟、分频、倍频和相位动态调整。
PLL使用了电压控制延迟,用VCO来实现和DLL中类试的延迟功能。又称模拟锁相环。功能上都可以实现倍频、分频、占空比调整,但是PLL调节范围更大,比如说:XILINX使用DLL,只能够2、4倍频;ALTERA的PLL可以实现的倍频范围就更大毕竟一个是模拟的、一个是数字的。
两者之间的对比:对于PLL(Phase Locked Loop,相位锁定环),用的晶振存在不稳定性,而且会累加相位错误,而DLL在这点上做的好一些,抗噪声的能力强些;但PLL在时钟的综合方面做得更好些。总的来说PLL的应用多,DLL则在jitter power precision等方面优于PLL。
(4).嵌入式块RAM(BRAM)
DRAM和 BRAM 区别
1、BRAM的输出需要时钟,DRAM 在给出地址后即可输出数据。
2、BRAM有较大的存储空间,FPGA定制的RAM资源;而DRAM是逻辑单元拼出来的,浪费LUT 资源
3、DRAM 使用更灵活方便些
4、较大的存储应用,建议用BRAM;零星的小应用,可以用DRAM。
(5).丰富的布线资源
布线资源连通 FPGA 内部的所有单元,而连线的长度和工艺决定着信号在连线上的驱动能力和传输速度。FPGA芯片内部有着丰富的布线资源,根据工艺、长度、宽度和分布位置的不同而划分为4类不同的类别。
1、全局布线资源,用于芯片内部全局时钟和全局复位/置位的布线;
2、长线资源,用以完成芯片 Bank 间的高速信号和第二全局时钟信号的布线;
3、短线资源,用于完成基本逻辑单元之间的逻辑互连和布线;
4、分布式的布线资源,用于专有时钟、复位等控制信号线。
但应用中设计者不需要选择用哪个布线资源,布局布线器可以根据输入逻辑网表的拓扑结构和约束条件进行自动连接。
(6).底层内嵌功能单元
内嵌功能模块主要指DLL(Delay Locked Loop)、PLL(Phase Locked Loop)、DSP(嵌入式乘法单元)和CPU等软核(Soft Core)。现在越来越丰富的内嵌功能单元,使得单片 FPGA 成为了系统级的设计工具,使其具备了软硬件联合设计的能力,逐步向SOC平台过渡。
(7).内嵌专用硬核
相对于底层嵌入的软核而言,指的是FPGA当中处理能力强大的硬核,等效于ASIC电路。
1.2.常用的可编程逻辑器件
可编程逻辑器件有:FPGA、PAL、GAL、EPLD、CPLD、FPLA、GDS
1.3.FPGA资源报告
1、 LUT:查找表(Look-Up-Table),是FPGA实现组合逻辑的硬件单元。资源利用率中的 LUT 是指设计中消耗的所有LUT,包括用做逻辑函数发生器的LUT和用做存储单元的LUTRAM。
2、 LUTRAM:分布式存储器(Look-Up-Table RAM),指设计消耗的 LUT 被用作了存储单元或移位寄存器
3、FF:触发器(Flip-Flop)边沿敏感的存储硬件单元,可以存储1bit 数据。
4、BRAM:(Block RAM)各种块存储功能的硬件单元。如Xilinx公司的结构中每个BRAM有 36Kbit 的容量。
5、DSP:乘法器。不管是调用IP核,还是直接写代码“*”,综合之后都是占用 DSP48E1 的资源。功能包括乘法、乘法累加(MACC)、乘法加法、三输入加法、桶形移位、宽总线多路复用、幅度比较器、按位逻辑功能、模式检测和宽计数器。
1.4.FPGA时序优化方式
1、插入寄存器,缩短组合逻辑延时;
2、并行化设计,缩短关键路径的延时;
3、逻辑展平,包括逻辑复制、消除代码中的优先级;
4、寄存器均衡设计,缩短关键逻辑的延时;
5、路径重组。
1.5.FPGA功耗报告
在 Vivado 下,有两种功耗估计模式。
一种是向量模式,需要提供SAIF(Switching Activity Interchange Format)或VCD文件,SAIF 文件通过仿真生成,因此需要在Simulation Settings中进行设置。Xilinx建议在向量模式下选择 SAIF 文件,因其估计速度要比 VCD 快。
一种是非向量模式,只需要提供简单的参数即可,但估计结果不够准确。
采用向量模式结果的confidence level为high,非向量模式为low。
1.6.FPGA开发流程
这一点在前两部分都提过:
1、电路功能设计,但在此之前,需要结合FPGA芯片资源进行资源分配与权衡
2、设计输入:一般以硬件描述语言和原理图输入位置,对于结合了ARM的FPGA开发板,也可以结合PL和PS一同设计。
3、功能仿真:此时没有延时
4、综合:用FPGA的基本逻辑单元去完成仿真
5、综合仿真:会考虑门延时
6、实现与布局布线:将逻辑网表配置到具体FPGA上
7、时序仿真与验证:最为精密的延时计算,模拟具体FPGA上的延时情况
8、板级仿真与验证:板级仿真与验证主要应用于高速电路设计中,对信号完整性和电子干扰等特性进行分析,使用第三方工具完成。
9、芯片编程与调试:生成比特流文件,然后下载至FPGA芯片中。
2. ZYNQ
2.1.ZYNQ介绍
ZYNQ中包含两大功能块:PS部分和 PL 部分。
1、PS部分指Processing System,一个基于双 ARM Cortex A9内核的处理系统,其中集成了内存存储器和外部存储器接口,以及如GPIO、UART 接口等大量的外设。
2、PL部分指Programmable Logic,基于Xilinx 7系列架构的可编程逻辑单元,通过PL部分可以为 ARM 定制很多外设,这也是ZYNQ 的一大优点。
2.2.内部结构
1、应用处理单元
2、PS与PL连接方式:AXI通用接口、加速一致性端口、高性能端口
3、EMIO接口:EMIO是扩展的MIO,是PS和PL之间的一个接口,当PS的引脚不够用的时候,可以通过 EMIO 来扩展,从而使用PL的引脚(SMC静态存储器控制器(Memory Interfaces)、Quad-SPI、USB 不可以连接)
也就是说当ARM的MIO接口(复用性输入输出端)不够用时,可以调用PL部分(FPGA)的IO接口,该接口称为EMIO接口。
2.3.ZYNQ开发流程
这里就体现出PS(ARM)和PL(FPGA)部分结合的特点,PS部分用软件开发工具SDK,PL部分用硬件开发工具VIVADO。
2.4.基于高层次综合的SOC FPGA设计流程
题目的意思就是利用FPGA的虚拟化,将功能实现转换成C语言,再利用FPGA将C语言自动转换成软硬件语言,分配给PL和PS:
3.MPSOC
升级版ZYQN:Zynq UltraScale+ MPSoC系列
以上是关于基于 FPGA verilog 的 Ethercat 主站工程代码的主要内容,如果未能解决你的问题,请参考以下文章
FPGA教程案例45图像案例5——基于FPGA的图像均值滤波verilog实现,通过MATLAB进行辅助验证
FPGA教程案例40通信案例10——基于FPGA的简易OFDM系统verilog实现
FPGA教程案例51控制案例3——基于FPGA的PWM波形产生verilog实现