`
软核级系统设计
本节工作是整个系统设计的基础,只有正确合理的设计通信管理机的软核系统,才能够在后期编程时方便高效的实现各种功能。以下为我们之前使用STM32+FPGA方案设计系统时编写的自定义串口IP,与其说是串口,其实算得上是介于MODBUS协议和UART协议之间的一个功能模块。该模块实现了底层的UART串口收发协议,数据流的CRC16实时校验,并能够自动的在发送的数据包末尾添加CRC校验字。为了控制数据的收发,模块内部设计了一个RAM和一系列控制和状态寄存器,通过读写RAM或状态寄存器,通过读写控制和状态寄存器,让数据能够正确高效的传输。在之前的设计时,本模块对于处理器,提供了一个纯异步的存储器接口,当希望对某个串口发送数据时,只需要使用类似于SRAM接口的时序,来对本模块进行数据读写即可。
MicroBlaze处理器使用的高效的AXI总线接口,因此,可以对本设计稍作修改,将对处理器接口从异步SRAM接口修改为AXI接口,就可以在Vivado中封装为自定义IP,然后我们就可以使用MicroBlaze直接操作我们的模块,进行数据的收发了。
自定义IP设计流程
AXI IP核是Vivado中十分常用的自定义IP核,使用AXI接口的IP,能够方便的连接到软核(MicroBlaze)或硬核(Zynq)的总线上,方便软核或硬核对其进行读写操作。本设计的重点是使用FPGA逻辑设计独立的MODBUS 协议处理IP,而要使我们的MODBUS IP能够灵活方便的进行数据收发并和处理器进行通信,必须为IP设计AXI接口,所以,因此掌握AXI IP核的创建流程及通信机制显得尤为重要。要正确的封装AXI IP核,就必须先了解AXI接口。先介绍如下:
1) AXI(Advanced eXtensibleInterface)协议主要描述了主设备(Master)和从设备(Slave)之间的数据传输方式,主设备和从设备之间通过握手信号建立连接。当主设备的数据准备好时,会发出和维持VALID信号,表示数据有效;当从设备准备好接收数据时,会发出READY信号。数据只有在这两个信号都有效时才开始传输。
2) AXI协议(又称AXI4.0),包括3种接口标准:AXI4、AXI-Stream、AXI-lite。
AXI4:适用于要求数据高速传输的场合。
AXI-Stream:如FIFO,数据传输不需要地址,而是主从设备间直接进行数据的读写,主要用于高速数据传输的场合,如视频、高速AD等。
AXI-lite:可用于单个数据传输,主要用于访问一些低速外设。
3) AXI接口具有5个独立通道:WriteAddress通道、Write Data通道、Write Response通道、Read Address通道、Read Address通道、Read Data通道。
本设计本身数据量并不是很大,因此考虑采用AXI-lite接口。(主要原因还是AXI4接口相对复杂一些,咱暂时还玩儿不转)。
这是之前设计的纯异步接口,采用的是16位总线模式,方便与外界进行数据的收发。而由于AXI总线是高效的同步总线,而且同步总线效率本身比异步的要好一些,因此将模块的异步接口以及内部的总线读写逻辑进行改写,更改为AXI同步接口。同时将总线位宽调整为32bit,以获得更高的读写效率。
改写后的接口代码如下所示:
每个MODBUS IP内部设置了7个寄存器和1个256字节的RAM,7个寄存器实现MODBUS 模块的数据发送、接受控制以及状态的指示。MicroBlaze处理器只要通过读写这些寄存器,就能实现数据的发送和接收。以下为每个寄存器的名字和对应功能描述。
这里,MODBUS 的发送缓存使用了寄存器来实现,且只提供了6个寄存器,因此仅能实现单一位置的数据发送和接收。这与我们的应用有关,本应用是一个数据采集型设备,大部分时间是使用MODBUS 协议读取设备中的数据。因此在第一版设计上做了简化。
同时,内部定义了一些相关的信号,这些信号最终映射到这6个寄存器上,例如,Start_Rx映射到了MDCR[2]上,En映射到了MDCR[1],Frame_Tx映射到了MDCR[0]。这样,当对MDCR寄存器进行读写时,就可以实现对Start_Rx、En、Frame_Tx信号的读写控制。
`
|