78.PL和PS通过BRAM交互共享数据

本篇文章目的是使用Block Memory进行PS和PL的数据交互或者数据共享,通过zynq PS端的Master GP0端口向BRAM写数据,然后再通过PS端的Mater GP1把数据读出来,将结果打印输出到串口终端显示。

涉及到AXI BRAM Controller 和 Block Memery Generator等IP的使用。

本系列文章尽可能的让每一个实验都相对独立,过程尽可能保证完整性,保证实验的可重现性。 但是用到的模块或者IP的具体作用和用法不保证都重复详细的介绍。

本文所使用的开发板是Miz702(兼容zedboard)

PC 开发环境版本:Vivado 2015.2 Xilinx SDK 2015.2

要实现的结构简图如图所示:

一、PL端硬件架构的搭建

1.1 新建工程

1.2 一路next,选择Zedboard

1.3 新建一个Block Design

1.4 点击Add IP ,双击ZYNQ Processing System

1.5 点击Run Block Automation,在弹出的对话框选择OK

1.6 双击ZYNQ 模块,在Peripheral 下,保留UART0,其余全部去掉

1.7 在PL-PS Configuration下,选中 GP0和GP1然后 点击ok

1.8 配置完成后如图所示(本次试验没有用到DDR和IO):

1.9 点击,Add IP,连续添加两个 AXI BRAM Controller

1.10 小技巧----重复IP模块添加可以用TCL的方式,修改下名字就可以了

1.11 双击AXI BRAM Controller模块(l两个),把number of BRAM interfaces 修改成1

1.12 点击ADD IP,添加Block Memory Generator

1.13 双击Block Memory Generator ,修改Memory Type。

1.14 点击run Connection  Automation,把axi_bram_ctrl_1的S_AXI端口的连接目标修改为如图所示

1.15 点击重新布局,生成好的硬件框架如下

1.16 点击Address Editor 可以看到系统已经为我们自动分配好了正确的地址

1.17 在Block design 上右击,点击Creater HDL Wrapper,这一步生成整个硬件工程的顶层模块

1.18 点击ok

1.19 点击Generate Output Products,这一步把IP Core的源码加载到工程下面(貌似)

1.20 点击Generate

1.21 点击Generate bit,然后需要耐心等待一下

1.22 完成,可以选择需要查看的信息,也可以点击Cancel

1.23 点击File,选择Export Hardware

1.24 选中Include bitstream,方便在SDK里直接可以烧写FPGA的配置文件

1.25 选择   然后点击OK,至此硬件环境搭建完成

二、PS端软件实现数据共享

2.1 打开的SDK界面如下,这里的信息是和硬件相关的,例如在Address Map 这一栏下可以看到axi_bram_ctrl_0和刚刚在vavado Address Editor下的地址是一致的

2.2 新建工程

2.3 输入工程名字,点击next

2.4 选择Hello World,Finish

2.5 把src路径下,把helloworld.c里的代码修改如下

 1 #include <stdio.h>
 2 #include "platform.h"
 3 #include "xil_io.h"   //这个头文件下面包含很重要的IO读写函数
 4 #include "xparameters.h"  //这个头文件里把硬件的地址映射等参数都写成了宏定义方便使用
 5
 6 //void print(char *str);
 7
 8 int main()
 9 {
10        int num;
11        int rev;
12     init_platform();
13
14     xil_printf("------The test is start...------\n\r");
15
16
17     //XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR是axi_bram_ctrl_0的地址,Xil_Out32通过控制axi_bram_ctrl_0,向blk_mem_gen_0写数据
18     for( num=0; num<15; num++ )
19     {
20        Xil_Out32(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + num*4, 0x10000000+num);     //
21     }
22
23
24     //XPAR_AXI_BRAM_CTRL_1_S_AXI_BASEADDR是axi_bram_ctrl_1的地址,Xil_In32 通过控制axi_bram_ctrl_0,把blk_mem_gen_0里的数据读出来
25     //PS和PL可以在blk_mem_gen_0里共享数据
26    for( num=0; num<15; num++ )
27        {
28               rev = Xil_In32(XPAR_AXI_BRAM_CTRL_1_S_AXI_BASEADDR + num*4);
29               xil_printf( "The data at %x is %x \n\r",XPAR_AXI_BRAM_CTRL_1_S_AXI_BASEADDR + num*4,rev);
30        }
31
32     xil_printf("------The test is end!------\n\r");
33
34     cleanup_platform();
35     return 0;
36 }

2.6 设置串口终端

2.7 把bit文件烧写到FPGA

2.8 配置软件烧写文件

2.9 如图所示配置

2.10 如图所示配置

2.11 串口终端打印输出信息如下:

------The test is start...------
The data at 80000000 is 10000000
The data at 80000004 is 10000001
The data at 80000008 is 10000002
The data at 8000000C is 10000003
The data at 80000010 is 10000004
The data at 80000014 is 10000005
The data at 80000018 is 10000006
The data at 8000001C is 10000007
The data at 80000020 is 10000008
The data at 80000024 is 10000009
The data at 80000028 is 1000000A
The data at 8000002C is 1000000B
The data at 80000030 is 1000000C
The data at 80000034 is 1000000D
The data at 80000038 is 1000000E

------The test is end!------

三、总结

本文通过PS端把数据写入到PL端的BRAM,然后从而又把数据从PL端读到PS端,从而简单的实现了PL和PS的数据交互和共享。

时间: 2024-08-05 19:42:46

78.PL和PS通过BRAM交互共享数据的相关文章

详解 Qt 线程间共享数据(用信号槽方式)

使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享数据主要有两种方式: 使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的: 使用singal/slot机制,把数据从一个线程传递到另外一个线程. 第一种办法在各个编程语言都使用普遍,而第二种方式倒是QT的特有方式,下面主要学习一

ContentProvider共享数据

  1.ContentProvider 一般服务端设置共享数据, 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据:采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据.而使用ContentProvider共享数据的好处是统一了数据访问方式. 当应用需

详解 Qt 线程间共享数据(使用signal/slot传递数据,线程间传递信号会立刻返回,但也可通过connect改变)

使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享数据主要有两种方式: 使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的: 使用singal/slot机制,把数据从一个线程传递到另外一个线程. 第一种办法在各个编程语言都使用普遍,而第二种方式倒是QT的特有方式,下面主要学习一

内容提供者(Content Provider)--跨程序共享数据

内容提供者简介 访问其他应用中的数据 ContentResolver 的基本用法 实例读取系统联系人 创建自己的内容提供器 创建内容提供器的步骤 创建新类继承ContentProvider并且重写其中6个方法 内容URI参数 使用UriMatcher实现匹配内容URI的功能 getType函数介绍 实现跨程序数据共享 内容提供者 访问自己创建的内容提供者数据 遇到的问题 内容提供者简介 使用场景: 比如:电话薄,短信,媒体库 简介 主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整

7.多个线程之间共享数据的方式探讨-JDK5多线程

1 /** 2 * 多个线程之间共享数据的方式探讨 3 * @author LiTaiQing 4 * 5 * ************************************************* 6 * 如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,有 7 * 如下两种方式来实现这些Runnble对象之间的数据共享: 8 * 1.将共享数据封装在另外一个对象中,然后将这个对象逐一传递给 9 * 各个Runnble对象.每个线程对共享数据的操作方法也分配到那个

多租户实现之基于Mybatis,Mycat的共享数据库,共享数据架构

前言 SaaS模式是什么? 传统的软件模式是在开发出软件产品后,需要去客户现场进行实施,通常部署在局域网,这样开发.部署及维护的成本都是比较高的. 现在随着云服务技术的蓬勃发展,就出现了SaaS模式. 所谓SaaS模式即是把产品部署在云服务器上,从前的客户变成了"租户",我们按照功能和租用时间对租户进行收费. 这样的好处是,用户可以按自己的需求来购买功能和时间,同时自己不需要维护服务器,而我们作为SaaS提供商也免去了跑到客户现场实施的麻烦,运维的风险则主要由IaaS提供商来承担. S

多个Activity之间共享数据的方式

现在要做一个项目,多个Activity之间要共享数据,所以要考虑共享数据的方式. 其实有如下5种方式: 1.基于消息的通信机制  Intent ---bundle ,extra 数据类型有限,比如遇到不可序列化的数据Bitmap,InputStream, 或者LinkList链表等等数据类型就不太好用. 2. 利用static静态数据,public static成员变量: 3.基于外部存储的传输,  File/Preference/ Sqlite ,如果要针对第三方应用需要Content Pro

线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁

线程(from threading import Thread):CPU调度的最小单位 线程的两种创建方式:方式一: 1 from threading import Thread 2 def f1(i): 3 print(i) 4 if __name__ == '__main__': 5 for i in range(10): 6 t = Thread(target=f1,args=(i,)) 7 t.start() 8 print('主线程') 方式二: 1 from threading im

iOS应用程序间共享数据(转)

我们知道iOS由于沙盒的存在,应用程序不能越过自己的区域去访问别的存储空间的内容,不过可能有许多场景我们需要在应用程序之间共享数据,比如多个应用共用用户名密码进行登录等.虽然我们不能直接通过文件系统来分享数据,不过还是有些方法可以实现,为了方便说明,这里同时创建了两个工程Example1和Example2,实现这两个app之间的信息共享,Example1负责写数据,Example2负责读数据,具体的demo代码可以到这里获取 UIPasteboard 剪贴板是应用程序之间传递数据的简单方式,建议