ZYNQ中AXI4-Lite实现PS与PL通信
0 前言
ZYNQ开发中需要使用PS向PL发控制信号,PL将数据发给PL端处理,可以使用AXI4-Lite协议完成。
本例中通过自定义AXI4-Lite接口IP,配置了4个从寄存器:slv_reg0、slv_reg1,其中slv_reg0负责接收来自PS的指令,slv_reg1负责发送数据给PS,完成PS与PL的交互。因为IP配置中寄存器最少设置4个,所以闲置了2个。
1 Vivado部分
配置好zynq核后开始新建AXI-Lite接口IP,Tools->Create and Package New IP,选择“Creat AXI4 Peripheral”;接着到Peripheral Details,修改IP名字,myip改为axi_lite_test,其它可默认;然后到Add Interfaces,Interface Type:Lite,Interface Mode:Slave,数据位宽32,寄存器个数4;最后Create Peripheral选Edit IP。
打开独立的IP编辑窗口后,在端口声明处添加自定义输入输出端口,并在代码中添加相应程序。
在子文件端口列表添加自定义端口:
这是设置的4个寄存器:
添加PL接收PS数据逻辑:
同时将PL接收数据always块中发送寄存器slv_reg1和闲置寄存器代码注释掉:
添加PS读取PL数据逻辑:
同时将PS读取从寄存器当前值的always块中接收寄存器slv_reg0,闲置寄存器代码注释掉:
在顶层文件添加相应端口:
最后打包IP完成,在block design中添加该ip如下:
pl_num可以接入其它IP中使用,需要发送的数据可以接入ps_num等待PS端读取。连接好线后vivado端便结束了,最后保存生成bit流,导出硬件,打开vitis。
2 Vitis部分
新建应用工程,使用从vivado导出的.xsa文件,可以直接选择Hello World模板C语言工程,也可以选择空白工程。选择空白工程后,需要右键工程src文件夹,选择New->File,接着在File name后输入 main.c结束。
在板级支持包里找到参数头文件xparameters.h,在里面找到自定义IP的基地址(ctrl+F,搜索AXI_BASEADDR,找到包含IP名的),然后在main.c中重命名一下方便使用。在板级支持包里找到自定义IP的头文件,本例为axi_lite_test.h,里面有读写寄存器调用的函数,还有自定义IP中的4个从寄存器在基地址上的偏移量,可以直接在main函数中使用,也可以重定义一下使用。

在main函数中向PL端发送数字5(写reg0地址):
AXI_LITE_TEST_mWriteReg(AXI_BASEADDR,REG0_OFFSET,5);
接收PL端数据(读reg1地址):
AXI_LITE_TEST_mReadReg(AXI_BASEADDR,REG1_OFFSET);
本文详细介绍了如何在ZYNQ平台上利用AXI4-Lite协议设计自定义IP,实现PS(处理器系统)与PL(可编程逻辑)之间的通信。通过创建AXI4-Lite接口IP,配置4个从寄存器,其中两个用于数据传输,两个作为预留。在Vivado中编辑IP,添加输入输出端口并编写逻辑代码。接着在Vitis中创建应用工程,利用.xsa文件导入硬件描述,并在C语言程序中通过头文件获取IP基地址,调用读写函数实现数据交换。









1745

被折叠的 条评论
为什么被折叠?



