ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯

ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯

  • 导语
  • 配置PS端
    • 新建工程
    • 按照如下步骤配置PS端
  • 自定义AXI-FULL IP
    • 自定义AXI-Lite Slave 代码,加入之前章节中我们使用的串口接收模块
    • 修改AXI-FULL Master代码
    • 修改IP顶层代码
  • 添加AXI 互联模块,完成Block Design
  • 生成bit文件,导入SDK,开始软件编程
  • 下载到平台验证
  • 结束语

导语

之前一段时间博主事情实在太多没能实现博客一周一更新的梦想,哎,梦想总是会被现实打败!可能以后都不能保持一周一更新了,但是一旦有时间一定会继续更新,给大家带来优质的博客内容(自己认为还是比较优质的,哈哈哈)。好了进入正题,之前的章节中我们讲解了如何自定义AXI-Lite IP实现PWM,AXI4-Lite是一个轻量级的,适用于吞吐量较小的地址映射通信总线,本章节中我们讲解如何通过自定义AXI-FULL IP实现PL端写数据到DDR3中并和CPU共享内存数据,实现数据的高吞吐量传输。但是苦于博主手上没有高速的外设设备可以使用,所以我们用低速的串口来验证总线通讯的真确性。虽然用的是串口实现,但是也会充分反映开发的流程和高速通讯的正确性。根据官方数据手册说明AXI4-Lite的理论带宽能达到600MB/s,而AXI-FULL/AXI-Stream能达到其两倍以上,但是因为AXI-GP接口只能单数据传输,而AXI-HP接口能批量传输数据,所以实际运行时的带宽可能是AXI4-Lite的好几倍甚至更高。
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第1张图片

配置PS端

新建工程

首先新建工程如下:
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第2张图片

按照如下步骤配置PS端

选通AXI-GP和AXI-HP接口:
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第3张图片
选通QSPI接口和UART1接口
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第4张图片
设置PL时钟频率为100MHz
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第5张图片
设置DDR型号
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第6张图片
设置PL到PS端的中断接口
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第7张图片

自定义AXI-FULL IP

添加AXI-FULL Master接口用于高速通讯
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第8张图片
添加AXI-Lite Slave接口用于串口波特率配置
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第9张图片

自定义AXI-Lite Slave 代码,加入之前章节中我们使用的串口接收模块

首先修改之前串口接收模块,将波特率参数改为输入,并将位宽改为11:
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第10张图片
在Slave中加入串口模块
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第11张图片
增加简单逻辑让数据能够缓冲16字节
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第12张图片
slave中增加串口数据的输入输出口
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第13张图片

修改AXI-FULL Master代码

将burast长度修改为4,这样每次突发数据只会发送4个words数据,并添加串口数据输入信号
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第14张图片
将以下参数修改为4,这样就可以将burst的次数设置为1次,具体如何计算可以查看代码注释和博主下载资料中的书籍《zynq-7000 嵌入式系统设计与实现》
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第15张图片
在官方生成的IP中是通过一个一段状态机来实现读写DDR的逻辑的,在这里我们只需要往DDR3写数据,所以修改状态机如下
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第16张图片
修改发送数据逻辑
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第17张图片
将写完成信号输出到模块外
在这里插入图片描述

修改IP顶层代码

ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第18张图片
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第19张图片
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第20张图片
最后生成IP,添加IP到工程中
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第21张图片
设置IP参数
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第22张图片

添加AXI 互联模块,完成Block Design

添加互联模块:
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第23张图片
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第24张图片

将写完成信号连接到PS端的中断接口上

ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第25张图片
将串口RX接口接到外部IO上
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第26张图片
将初始化接口连接到复位上
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第27张图片
这里完成了block design的设计,接下来将串口RX绑定引脚;

在这里插入图片描述

生成bit文件,导入SDK,开始软件编程

导入SDK如下所示
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第28张图片
创建helloword工程:
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第29张图片
写入如下代码:
ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第30张图片
上图中:1、地址项其中第一个为配置波特率的基地址,第二个为DDR3中共享数据的地址
2、数据的联合体
3、将串口波特率设置为9600
4、PL端数据发送完成中断服务函数,在这里面实现将PL从PC接收到的串口数据通过PS端的串口发送到PC上,其中Xil_DCacheFlushRange函数功能为维护L1、L2缓存和DDR指定地址的数据一致性,该函数至关重要,没有他就不能正确的读取到PL发送到DDR的数据。
5、中断的初始化函数,IRQ模式,上升沿中断使能。

下载到平台验证

		将工程编译后,下载到板子上,打开两个串口窗口,将一个串口连接到PL端,另一个连接到PS端,往PL端发送16byte的数据(注意必须发送16byte,如需要其他长度可自行修改PL工程或者添加FIFO缓存数据),PL端会收到相同的数据,如下所示

ZYNQ进阶之路12--自定义AXI-FULL IP实现PL端向DDR3写数据和PS端实现高速通讯_第31张图片

结束语

好了,到这里本章节就结束了,如有疑问或者其他好的想法可以私信联系博主或者给博主发邮箱多多交流,博主邮箱:[email protected],在下一章节中我们将讲解如何使用的AXI_full总线协议去读取PS端写到DDR3中的数据哦,感兴趣的同志可以持续关注博主博客哦。

你可能感兴趣的:(zynq,FPGA,ZYNQ进阶之路,xilinx,zynq,axi_full,gic,axi)