【二 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中是可以看到该地址的,在内存助手中;
    请添加图片描述

  • 用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端的数据,并打印出来

									---晓凡  于2022319日桂林书
  • 17
    点赞
  • 136
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值