PS和PL交互的话采用的是AXI协议,其中又可以分为:AXI-full(完整的AXI协议)、AXI-Stream(流式协议)和AXI-Lite(精简版,一次只能读写一个字,32位的寄存器)。
一、原理说明
1.在PL端创建IP核,用于向PS发送数据。这一过程通过AXI-Lite协议发送数据到GP接口,GP接口将会把数据放到该IP对应的内存中(已经同一编址)
2.在AXI-Lite协议下,与GP接口交互是一个字一个字的读写。
3.然后在PS部分通过ARM核上执行访问内存的C语言代码就可以把他对应的数据拿出来(可以用指针的方式,拿到对应的数据)。
4.IP对应的地址有3个方法获得:
-
在PL设计的时候,在Block design中是可以看到该地址的,在内存助手中;
-
用sdk打开该工程时,该地址也会自动生成对应的driver文件夹里;
-
sdk中头文件:<xparameters.h>中也可以找到IP核的相关信息,包括IP地址
二 .实现的目标
- PL端向PS端发送数据
- PS端读取PL端的数据
三. 打开vivado创建工程
创建源文件
module generrate_data(
output wire [31:0] data1,
output wire [31:0] data2,
output wire [31:0] data3,
output wire [31:0] data4
);
assign data1 = 32'd1123 ;
assign data2 = 32'd456 ;
assign data3 = 32'd789 ;
assign data4 = 32'd987 ;
endmodule
然后将这个文件添加到block design中.
如果找不到add module to block design 这个选项,那么有几个原因,具体可以参考传送门
最后得到data_make这个ip核,zynq7这个是PS端,如何创建可以查看上一篇博客.
input [31:0] data1,
input [31:0] data2,
input [31:0] data3,
input [31:0] data4,
.data1(data1),
.data2(data2),
.data3(data3),
.data4(data4),
input [31:0] data1,
input [31:0] data2,
input [31:0] data3,
input [31:0] data4
// Address decoding for reading registers
case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
3'h0 : reg_data_out <= data1;
3'h1 : reg_data_out <= data2;
3'h2 : reg_data_out <= data3;
3'h3 : reg_data_out <= data4;
3'h4 : reg_data_out <= slv_reg4;
3'h5 : reg_data_out <= slv_reg5;
3'h6 : reg_data_out <= slv_reg6;
3'h7 : reg_data_out <= slv_reg7;
default : reg_data_out <= 0;
生成比特流
#include <stdio.h>
#include <xparameters.h>
#define IP_ADDR XPAR_PL_PS_LITE_0_S00_AXI_BASEADDR //宏定义
int main(){
//1B = 8bit
//1reg=32bit=4B
unsigned int data1 = (*(volatile unsigned int*)(IP_ADDR + 0));
unsigned int data2 = (*(volatile unsigned int*)(IP_ADDR + 4));
unsigned int data3 = (*(volatile unsigned int*)(IP_ADDR + 8));
unsigned int data4 = (*(volatile unsigned int*)(IP_ADDR + 12));
/*******
assign data1 = 32'd1123 ;
assign data2 = 32'd456 ;
assign data3 = 32'd789 ;
assign data4 = 32'd987 ;
***********/
printf("data1:%d",data1);
printf("data1:%d",data2);
printf("data1:%d",data3);
printf("data1:%d",data4);
}
到此就完成了PL端发布数据,然后PS端通过AXI-Lite协议接受PL端的数据,并打印出来
---晓凡 于2022年3月19日桂林书