微波EDA网,见证研发工程师的成长!
首页 > 射频和无线通信 > 射频无线通信文库 > Modbus通信协议的FPGA实现

Modbus通信协议的FPGA实现

时间:08-11 来源:互联网 点击:

3.3 发送模块
发送模块包括发送控制模块,发送机模块,发送状态寄存器模块等。
发送机模块是基于普通UART发送原理设计,其发送过程如下:
(1)等待TDRE=‘1’,即等待发送数据寄存器(TDR)为空,随后TDR中载入一个字节数据,并把TDRE清零。
(2)根据波特率设置Sel_baud[1..0]对TDR里的数据进行奇偶校验计算。
(3)把TDR里的数据放入发送移位寄存器TSR的1~8位,TSR第O位放起始位(‘O’),TSR第9位放入奇偶校验位或者停止位(‘1’)。
(4)通过对TSR右移,一位一位地发送出9位数据比特,最后发送停止位(‘1’)。
3.4 CRC模块
CRC模块包括接收CRC控制模块,发送CRC控制模块,CRC产生模块三部分。

生成CRC的过程为:
(1)将一个16位寄存器装入十六进制FFFF(全1),将之称作CRC寄存器。
(2)将报文的第一个8位字节与16位CRC寄存器的低字节异或,结果置于CRC寄存器。
(3)将CRC寄存器右移1位(向LSB方向),MSB充零,提取并检测LSB。
(4)如果LSB为0:重复步骤(3)(另一次移位);如果LSB为1:对CRC寄存器异或多项式值0xA00l(1010000000000001)。
(5)重复步骤(3)和(4),直到完成8次移位。当做完此操作后,将完成对8位字节的完整操作。
(6)对报文中的下一个字节重复步骤(2)~(5),继续此操作直至所有报文被处理完毕。
(7)CRC寄存器中的最终内容为CRC值。

这种方式计算CRC值的时间比其他方式计算CRC(比如查表法等)的时间稍微要长,但是它节省了资源,比如查表法计算CRC需要一个数组来存放所有可能的CRC结果值。图5为对数据串“010300000001”(十六进制)CRC-16运算的仿真时序图,时钟周期为50 MHz,由图可见,整个计算时间在2.5 μs内,估算一个含有240个字符的消息,CRC校验总时间约为2.5μs×(240/6)=100μs,这样长的校验计算时间对于Modbus协议来说是完全可以接受的。

4 基于该接口的MODBUS从站协处理器实现
协处理器框图如图6所示。

从站协处理器控制模块程序控制过程如下:
(1)置CE_Modbus为‘1’,把MAX485芯片信号输出置低,即控制RS 485接口芯片处于接收状态。
(2)等待一段延迟时间(RS 485接口芯片稳定时间),使能Modbus协议接口模块即置CE_Modbus为‘1’,并置接收Modbus协议帧模式。
(3)如果接收到一个完整的帧(消息),则转到步骤(4),如果没接收到一个完整的消息,一直处于等待状态。
(4)先置CE_Modbus为‘O’,再解释接收缓冲寄存器里消息,等待消息处理完毕,如果消息不是发往该从站或者为广播消息,则转到步骤(2);否则把信号输出置高,转到步骤(5)。
(5)等待一段延迟时间,使能Modbus协议接口模块即置CE_Modbus为‘1’,并置发送Modbus协议帧模式。
(6)等待发送完成,转到步骤(1)。
解释模块主要由解释控制模块、分析模块、各功能码解释模块、错误功能码处理模块组成。分析模块首先分析接收消息起始两个字节,即地址码和功能码。如果地址为广播消息地址(地址为0)或者地址码和本从站地址不相等,则不处理本消息,解释控制模块发出解释完毕并置不响应信号为“1”,顶层控制模块继续处于等待接收消息状态。如果功能码为非支持功能码,则选择错误功能代码处理模块;如果为某一支持的功能码,则选择相应的功能模块解释接收消息,按照功能码要求解码(例如读/写某一指定寄存器或者线圈)。处理完之后把相应的异常码响应消息或者正常响应消息写入Modbus协议接口模块里的发送缓冲寄存器里,完毕之后通过Ld_TbNCE信号把发送缓冲寄存器锁存消息的末地址(不带CRC校验位)Trbuf_add[7..O](保证在Ld_TbNCE有效时它为末地址)存入Modbus协议接口模块,发出解释完毕信号,不响应信号置“O”,之后由顶层控制模块控制接口模块发送响应消息。对于某些功能码,比如01码和02码,03码和04码,由于对它们的解释差别很小,可以共用一个模块,达到节省资源的目的。对于特定的系统,完全可以选择某一些功能码甚至某一个功能码,而达到需求,故这里采用这种模块化方式,可以很容易在不改变其他功能模块的情况下删除不需要的功能码模块或者增加新需要的功能码模块。
该协处理器与从设备其他部分接口仅仅为双口RAM,从设备完全被映射为寄存器组的抽象,这比启用寄存器直接实现要节省逻辑资源。由于这些双口RAM是完全透明的,用户可以根据整个Modbus系统需要自定义各个寄存器的实际含义。Modbus主设备可以在任何时候随机地访问这些寄存器组。Modbus从设备控制、执行模块对这些寄存器组的访问需要寻求一种较好的方式,由于FPGA的高速度及并行机制,一般情况下可以采取轮询的机制即可满足工业实时性需求。对于某些特殊情况需要更高优先级的控制方式,也可以采取中断方式。如图7所示,可以通过双口RAM的地址线和写使能信号线进行中断检测和冲突检测:当从站协处理模块对某些特定寄存器读/写完毕之后,产生一个中断信号,对某些可能存在从站协处理器模块和从设备控制执行模块都要对其进行写操作的寄存器,如果有写操作同时发生,则从设备控制执行模块应该等待从站协处理器写完再写,以保证写操作是原子的。图8为03码应答的完整仿真时序。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top