[X]关闭

【ZYNQ-7000开发之五】PL和PS通过BRAM交互共享数据

文档创建者:RZJM
浏览次数:24708
最后更新:2020-09-10
 
本帖最后由 RZJM 于 2015-12-21 11:29 编辑

本篇文章目的是使用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模块(两个),把number of BRAM interfaces 修改成1

1.12 点击ADD IP,添加Block Memory Generator


11.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. //关于驱动函数,这里先简要介绍一下,将来会详细讲解
  2. #include <stdio.h>
  3. #include "platform.h"
  4. #include "xil_io.h"   //这个头文件下面包含很重要的IO读写函数
  5. #include "xparameters.h"  //这个头文件里把硬件的地址映射等参数都写成了宏定义方便使用
  6. //void print(char *str);
  7. int main()
  8. {
  9.        int num;
  10.        int rev;
  11.     init_platform();
  12.     xil_printf("------The test is start...------\n\r");
  13.     //XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR是axi_bram_ctrl_0的地址,Xil_Out32通过控制axi_bram_ctrl_0,向blk_mem_gen_0写数据
  14.     for( num=0; num<15; num++ )
  15.     {
  16.        Xil_Out32(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + num*4, 0x10000000+num);     //
  17.     }
  18.     //XPAR_AXI_BRAM_CTRL_1_S_AXI_BASEADDR是axi_bram_ctrl_1的地址,Xil_In32 通过控制axi_bram_ctrl_0,把blk_mem_gen_0里的数据读出来
  19.     //PS和PL可以在blk_mem_gen_0里共享数据
  20.    for( num=0; num<15; num++ )
  21.        {
  22.               rev = Xil_In32(XPAR_AXI_BRAM_CTRL_1_S_AXI_BASEADDR + num*4);
  23.               xil_printf( "The data at %x is %x \n\r",XPAR_AXI_BRAM_CTRL_1_S_AXI_BASEADDR + num*4,rev);
  24.        }
  25.     xil_printf("------The test is end!------\n\r");
  26.     cleanup_platform();
  27.     return 0;
  28. }
复制代码
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:在点击Run后出现了这个错误,找了很久没发现问题,最后重启了下电脑解决。
Failed to open Cable Node jsn1 on TCP:127.0.0.1:3121
at com.xilinx.sdk.targetmanager.internal.TM.isFPGAConfigured(TM.java:372)
at com.xilinx.sdk.debug.core.XilinxAppLaunchConfigurationDelegate.isFpgaConfigured(XilinxAppLaunchConfigurationDelegate.java:381)
at com.xilinx.sdk.debug.core.XilinxAppLaunchConfigurationDelegate.launch(XilinxAppLaunchConfigurationDelegate.java:290)
at com.xilinx.sdk.debug.ui.XilinxAppLaunchDelegateWrapper.launch(XilinxAppLaunchDelegateWrapper.java:31)

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









发表评论已发布 11

贾文洋

发表于 2015-12-21 14:20:29 | 显示全部楼层

回复

使用道具 举报

宋桓公

发表于 2015-12-21 22:11:31 | 显示全部楼层

不错~~
学习了~~

SJY0109

发表于 2016-3-9 16:32:37 | 显示全部楼层

本帖最后由 SJY0109 于 2016-3-9 17:25 编辑

你好,我按照教程做了。最后串口终端什么信息都没有显示。
只有在console里显示“Process STDIO not connected to console.
If you'd like to see UART output in this console, please modify STDIO settings in the Run/Debug configuration.”
可以不用SDK中的terminal,用putty来连接开发板吗?具体应该怎么连接?十分感谢

RZJM

发表于 2016-3-9 21:49:35 | 显示全部楼层

SJY0109 发表于 2016-3-9 16:32
你好,我按照教程做了。最后串口终端什么信息都没有显示。
只有在console里显示“Process STDIO not conne ...

可以,把SDK里的串口功能关闭,设置好puty参数就可以了。
我目前使用的是hyper Terminal,挺好用的。

狂羁青马

发表于 2016-3-21 15:19:42 | 显示全部楼层

你好,按照教程做了,不知道为什么出现这样的错误
Cannot access DDR: the controller is held in reset

        at com.xilinx.sdk.targetmanager.internal.TM.downloadELF(TM.java:666)
        at com.xilinx.sdk.debug.core.internal.AppRunner.run(AppRunner.java:129)
        at com.xilinx.sdk.debug.core.XilinxAppLaunchConfigurationDelegate.runApplication(XilinxAppLaunchConfigurationDelegate.java:605)
        at com.xilinx.sdk.debug.core.XilinxAppLaunchConfigurationDelegate.launch(XilinxAppLaunchConfigurationDelegate.java:293)
        at com.xilinx.sdk.debug.ui.XilinxAppLaunchDelegateWrapper.launch(XilinxAppLaunchDelegateWrapper.java:31)

RZJM

发表于 2016-3-21 15:27:52 | 显示全部楼层

狂羁青马 发表于 2016-3-21 15:19
你好,按照教程做了,不知道为什么出现这样的错误
Cannot access DDR: the controller is held in reset
...

不是很清楚,如果SD卡插着,把SD卡拔掉在下载,或者切换下启动方式。

狂羁青马

发表于 2016-3-22 09:04:01 | 显示全部楼层

RZJM 发表于 2016-3-21 15:27
不是很清楚,如果SD卡插着,把SD卡拔掉在下载,或者切换下启动方式。

谢谢  解决了  原来是没有勾选复位ps

lllll

发表于 2017-11-13 16:38:15 | 显示全部楼层

狂羁青马 发表于 2016-3-22 09:04
谢谢  解决了  原来是没有勾选复位ps

在哪勾选?为什么我的没有显示信息

马达

发表于 2018-9-14 16:23:19 | 显示全部楼层

请教一个问题 能不能在linux下用这种方式,用做ps与pl数据共享,之前选用dma在linux做ps与pl数据传输。数据也不用批量传输也不要求速度,后来就想选用BRAM这种方法,不知道能不能在linux下使用。
12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则