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

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

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

本文所使用的开发板是Miz702 PC 开发环境版本:Vivado 2015.4 Xilinx SDK 2015.4

1.0本章难度系数★★☆☆☆☆☆

1.1 搭建硬件工程

Step1:新建一个名为为Miz701_sys的工程

Step2:选择RTL Project 勾选Do not specify source at this time

Step3:选择xc7z010clg400-1为开发器件。

Step4:单击Finish

1.2使用IP Integrator创建硬件系统

Step1:单击Create Block Design

Step2:输入system

Step3:单击下图中添加IP按钮

Step4:搜素单词z选择ZYNQ7 Processing System,然后双击

Step5:添加进来了ZYNQ CPU IP,然后双击对其进行配置。

Step6:修改输入时钟为50MHZ,PL端频率FCLK_CLK0为100MHZ。

Step7:修改内存型号为MT41K256M16 RE-125。

Step8:在MIO configuration选项中,勾选添加UART1接口。

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

Step10:单击Run Block Automation进行智能布线。

Step11:直接单击OK

Step12:在你点击了OK后,你会发现DDR以及FICED_IO自动的延伸出来。

Step13:连线的作用就是把PS的时钟可以接入PL部分,当然这里我们暂时用不到PL部分的资源。在Block文件中,我们迚行连线,将鼠标放在引脚处,鼠标变成铅笔后迚行拖拽,连线如下图所示:

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

Step15:分别双击AXI BRAM Controller模块,把number of BRAM interfaces 全部修改成1

Step16:点击ADD IP,添加Block Memory Generator

Step17:双击Block Memory Generator ,修改Memory Type。

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

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

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

Step21: 右击 system.bd, 单击Generate Output Products

Step22:支部操作会产生执行、仿真、综合的文件

Step23:右击system.bd 选择 Create HDL Wrapper 这步的作用是产生顶层的HDL文件

Step24:选择Leave Let Vivado manager wrapper and auto-update 然后单击OK

Step25:执行->产生bit文件

1.3导出SOC硬件到SDK

Step1:File->Export->Export Hardware

Step2:勾选Include bitstream 直接单击OK

Step3:File->Launch SDK加载到SDK

Step4:单击OK

1.4软件工程

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

Step2: 新建一个名为BRAM_Test的空的工程,并且新建一个main.c文件,添加如下代码。/*

* mai.c

*

*  Created on: 2016年6月26日

*      Author: Administrator

*/

#include

#include "xil_io.h"   //这个头文件下面包含很重要的IO读写函数

#include "xparameters.h"  //这个头文件里把硬件的地址映射等参数都写成了宏定义方便使用

//void print(char *str);

int main()

{

int num;

int rev;

xil_printf("------The test is start...------\n\r");

//XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR是axi_bram_ctrl_0的地址,Xil_Out32通过控制axi_bram_ctrl_0,向blk_mem_gen_0写数据

for( num=0; num<15; num++ )

{

Xil_Out32(XPAR_BRAM_0_BASEADDR + num*4, 0x10000000+num);     //

}

//XPAR_AXI_BRAM_CTRL_1_S_AXI_BASEADDR是axi_bram_ctrl_1的地址,Xil_In32 通过控制axi_bram_ctrl_0,把blk_mem_gen_0里的数据读出来

//PS和PL可以在blk_mem_gen_0里共享数据

for( num=0; num<15; num++ )

{

rev = Xil_In32(XPAR_BRAM_0_BASEADDR + num*4);

xil_printf( "The data at %x is %x \n\r",XPAR_BRAM_0_BASEADDR + num*4,rev);

}

xil_printf("------The test is end!------\n\r");

return 0;

}

1.5测试结果

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

------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!------

1.6本章小结

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

zynqpl端时钟_第十一章 ZYNQ-MIZ701 PS读写PL端BRAM相关推荐

  1. (124)FPGA面试题-ZYNQ的PS和PL端怎么交互的?

    1.1 FPGA面试题-ZYNQ的PS和PL端怎么交互的? 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-ZYNQ的PS和PL端怎么交互的: 5)结束语 ...

  2. P2中ZYNQ的PS控制PL端LED

    第一个ZYNQ的实验,用于熟悉开发环境和板卡,通过GPIO控制LED,由于P2在ps端没有LED,所以需要通过axi总线控制PL端LED. 1.参考设计 参考的是黑金的<PL 端和 PS 端的协 ...

  3. zynqpl端时钟_第十二章 ZYNQ-MIZ702 PS读写PL端BRAM

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

  4. zynqpl端时钟_基于ZC706,ZYNQ学习手记(2):用PL端点亮流水灯

    --------------------------------------------------分割线----------------------------------------------- ...

  5. java语言仅支持单重继承_java语言程序设计基础篇习题_复习题_第十一章

    java语言程序设计基础篇习题_复习题_第十一章 11.1 下面说法是真是假?一个子类是父类的子集. 11.2 使用什么关键字来定义一个子类 11.3 什么是单一继承?什么是多重继承?java支持多重 ...

  6. 品达物流TMS项目_第11章 TMS司机端、快递员端开发

    品达物流TMS项目_第11章 TMS司机端.快递员端开发 文章目录 品达物流TMS项目_第11章 TMS司机端.快递员端开发 第11章 TMS司机端.快递员端开发 1. 导入功能代码 2. 分布式事务 ...

  7. java程序设计基础_陈国君版第五版_第十一章例题

    java程序设计基础_陈国君版第五版_第十一章习题 class MyThread extends Thread { private String who;public MyThread(String ...

  8. java程序设计基础_陈国君版第五版_第十一章习题

    java程序设计基础_陈国君版第五版_第十一章习题 /*** 题目:假设某家银行可接受顾客的汇款,每进行一次汇款,便可计算出汇款的总额.现有两名顾客,每人分三次,每次一百元将钱汇入.试编程来模拟顾客的 ...

  9. zynqpl端时钟_已解决: Zynq7020 PL侧时钟是50M,实测是49.5M - Community Forums

    参考这篇AR56156和pg082 p93,从PS引出到PL的这个FCLK时钟抖动一般在3%,也就是20ns的时钟抖动一般在0.6ns左右,而PL的clock wizard生成的时钟抖动一般在0.1n ...

最新文章

  1. 5亿整数的大文件,怎么排?
  2. matlab GM(2,1)模型
  3. 按次计费接口的简单实现思路
  4. 工业用微型计算机(18)-指令系统(13)
  5. 您的JVM是否泄漏文件描述符-像我的一样?
  6. table偏见和HTML仇外心理
  7. 计算机应用技术专业全国排名,计算机应用技术专业全国排名
  8. php unset函数_PHP | 使用unset()函数从数组中删除元素
  9. 梯度下降、牛顿法、拟牛顿法详细介绍
  10. 通过官方查看springCloud,springBoot版本对应关系
  11. 做本地杂志如何赚钱?
  12. 目标管理 督查督办系统
  13. VB.NET 保留2位小数
  14. 北京外国语大学计算机考研,北京外国语大学考研难吗?一般要什么水平才可以进入?...
  15. Windows Azure HDInsight 支持预览版 Hadoop 2.2 群集
  16. influxDB 常用聚合函数整理
  17. 【go-zero】go-zero开发环境 如何聚合所有api? caddy反向代理服务分发 微服务设计api聚合方法 best practice
  18. JAVA中的CAS算法
  19. 深入理解面向对象,面向对象3个特性7个原则6种关系
  20. 不朽凡人 第五百四十一章 再见温连汐

热门文章

  1. 在Ubuntu 14.04 64bit上安装python-pyqt5软件包(python 2.7)
  2. PBR游戏3D模型合集包 PBR Game 3D-Models Bundle February 2022
  3. 动画产业基础学习教程 Rad How to Class – Animation Industry Fundamentals
  4. ceph osd 由于“No space left on device” 异常down,通过扩容文件系统或者显式运行osd进程解决
  5. Mycat分片规则详解
  6. svn 提交信息模板
  7. MyEclipse快捷键
  8. 浅析对象访问属性的.和[]方法区别
  9. jsp中如何判断el表达式中的BigDecimal==0
  10. 工厂方法模式与抽象工厂模式的区别