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);