【二 zedboard】PS和PL之间的交互


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中是可以看到该地址的,在内存助手中;
    【二 zedboard】PS和PL之间的交互_第1张图片

  • 用sdk打开该工程时,该地址也会自动生成对应的driver文件夹里;

  • sdk中头文件:中也可以找到IP核的相关信息,包括IP地址
    【二 zedboard】PS和PL之间的交互_第2张图片

二 .实现的目标

  • 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中.
【二 zedboard】PS和PL之间的交互_第3张图片
如果找不到add module to block design 这个选项,那么有几个原因,具体可以参考传送门
【二 zedboard】PS和PL之间的交互_第4张图片
最后得到data_make这个ip核,zynq7这个是PS端,如何创建可以查看上一篇博客.
【二 zedboard】PS和PL之间的交互_第5张图片
【二 zedboard】PS和PL之间的交互_第6张图片
【二 zedboard】PS和PL之间的交互_第7张图片
【二 zedboard】PS和PL之间的交互_第8张图片
【二 zedboard】PS和PL之间的交互_第9张图片
【二 zedboard】PS和PL之间的交互_第10张图片
【二 zedboard】PS和PL之间的交互_第11张图片
【二 zedboard】PS和PL之间的交互_第12张图片

		input [31:0]    data1,
        input [31:0]    data2,
        input [31:0]    data3,
        input [31:0]    data4,

【二 zedboard】PS和PL之间的交互_第13张图片

		.data1(data1),
	    .data2(data2),
	    .data3(data3),
	    .data4(data4),

【二 zedboard】PS和PL之间的交互_第14张图片

		input   [31:0]  data1,
        input   [31:0]  data2,
        input   [31:0]  data3,
        input   [31:0]  data4

【二 zedboard】PS和PL之间的交互_第15张图片

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

【二 zedboard】PS和PL之间的交互_第16张图片
【二 zedboard】PS和PL之间的交互_第17张图片
【二 zedboard】PS和PL之间的交互_第18张图片
【二 zedboard】PS和PL之间的交互_第19张图片
【二 zedboard】PS和PL之间的交互_第20张图片
【二 zedboard】PS和PL之间的交互_第21张图片
【二 zedboard】PS和PL之间的交互_第22张图片
【二 zedboard】PS和PL之间的交互_第23张图片
【二 zedboard】PS和PL之间的交互_第24张图片
【二 zedboard】PS和PL之间的交互_第25张图片
【二 zedboard】PS和PL之间的交互_第26张图片
【二 zedboard】PS和PL之间的交互_第27张图片
【二 zedboard】PS和PL之间的交互_第28张图片
【二 zedboard】PS和PL之间的交互_第29张图片
生成比特流
【二 zedboard】PS和PL之间的交互_第30张图片
【二 zedboard】PS和PL之间的交互_第31张图片
【二 zedboard】PS和PL之间的交互_第32张图片
【二 zedboard】PS和PL之间的交互_第33张图片
【二 zedboard】PS和PL之间的交互_第34张图片
【二 zedboard】PS和PL之间的交互_第35张图片
【二 zedboard】PS和PL之间的交互_第36张图片
【二 zedboard】PS和PL之间的交互_第37张图片
【二 zedboard】PS和PL之间的交互_第38张图片
【二 zedboard】PS和PL之间的交互_第39张图片
【二 zedboard】PS和PL之间的交互_第40张图片

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



}

【二 zedboard】PS和PL之间的交互_第41张图片
【二 zedboard】PS和PL之间的交互_第42张图片
【二 zedboard】PS和PL之间的交互_第43张图片
【二 zedboard】PS和PL之间的交互_第44张图片

到此就完成了PL端发布数据,然后PS端通过AXI-Lite协议接受PL端的数据,并打印出来

									---晓凡  于2022319日桂林书

你可能感兴趣的:(FPGA学习之路,zedboard)