第十一章 ZYNQ-MIZ701 PS读写PL端BRAM
本篇文章目的是使用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
11.0本章难度系数★★☆☆☆☆☆
11.1 搭建硬件工程
Step1:新建一个名为为Miz701_sys的工程
Step2:选择RTL Project 勾选Do not specify source at this time
Step3:选择xc7z010clg400-1为开发器件。
Step4:单击Finish
11.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文件
11.3导出SOC硬件到SDK
Step1:File->Export->Export Hardware
Step2:勾选Include bitstream 直接单击OK
Step3:File->Launch SDK加载到SDK
Step4:单击OK
11.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 <stdio.h> #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; } |
11.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!------
11.6 本章小结
本文通过PS端把数据写入到PL端的BRAM,然后从而又把数据从PL端读到PS端,从而简单的实现了PL和PS的数据交互和共享。
第十一章 ZYNQ-MIZ701 PS读写PL端BRAM的更多相关文章
- 第十二章 ZYNQ-MIZ702 PS读写PL端BRAM
本篇文章目的是使用Block Memory进行PS和PL的数据交互或者数据共享,通过zynq PS端的Master GP0端口向BRAM写数据,然后再通过PS端的Mater GP1把数据读出来,将 ...
- 第十一章 ZYNQ-MIZ702 DDR3 PS读写操作方案
本编文章的目的主要用简明的方法在纯PS里对DDR3进行读写. 本文所使用的开发板是Miz702 PC 开发环境版本:Vivado 2015.4 Xilinx SDK 2015.4 11.0本章难度 ...
- Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)
1.建立工程 首先和Vivado设计一中一样,先建立工程(这部分就忽略了) 2.create block design 同样,Add IP 同样,也添加配置文件,这些都和设计一是一样的,没什么区别. ...
- ZYNQ笔记(1):PL端——led灯
ZYNQ分为PS和PL,此博客实际上是FPGA中一个完整的FPGA工程的创建. PS:处理系统 (Processing System) 即ARM的Soc部分 PL:可编程逻辑(Programable ...
- [原创]基于Zynq PS与PL之间寄存器映射 Standalone & Linux 例程
基于Zynq PS与PL之间寄存器映射 Standalone & Linux 例程 待添加完善中
- 使用axi_datamover完成ZYNQ片内PS与PL间的数据传输
分享下PS与PL之间数据传输比较另类的实现方式,实现目标是: 1.传输时数据不能滞留在一端,无论是1个字节还是1K字节都能立即发送: 2.PL端接口为FIFO接口: PS到PL的数据传输流程: PS到 ...
- Zynq PS和PL间的连接
跨越PS和PL的信号 AXI总线.EMIO.其他(看门狗.重启信号.中断信号.DMA接口信号) AXI标准 AXI(高级可扩展接口)是ARM AMBA的一部分.AMBA总线主要用于片上系统.AXI总线 ...
- 第十章 ZYNQ-MIZ701 DDR3 PS读写操作方案
本编文章的目的主要用简明的方法在纯PS里对DDR3进行读写. 本文所使用的开发板是Miz701 PC 开发环境版本:Vivado 2015.4 Xilinx SDK 2015.4 10.0本章难度 ...
- zedboard如何从PL端控制DDR读写(七)
前面已经详细介绍了从PL端如何用AXI总线去控制DDR的读写,并且从AXI_BRESP的返回值来看,我们也是成功写入了的.但是没有通过别的方式来验证写入的数据的话,总是感觉差了点什么. 今天试了一把从 ...
随机推荐
- mybatis中foreach参数过多效率很慢的优化
foreach 后面in 传入的参数有1万条,#和$是有效率区别的,$的效率远高于#,上篇文章做了比较. 但没达到我的理想结果. 1. 更改方式,把foreach 去掉,改成拼装方式, 参数直接拼装成 ...
- Flutter移动电商实战 --(37)路由_Fluro引入和商品详细页建立
https://github.com/theyakka/fluro pages/details_page.dart新建页面 使用路由 先添加路由插件的引用 fluro: ^1.4.0 如果网络上下载不 ...
- SQL-W3School-高级:SQL LIKE 操作符
ylbtech-SQL-W3School-高级:SQL LIKE 操作符 1.返回顶部 1. LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式. LIKE 操作符 LIKE 操作符用于在 ...
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_21-页面静态化-静态化测试-静态化程序编写
public String getPageHtml(String pageId){ /** * 静态化程序获取页面的DataUrl * * 静态化程序远程请求DataUrl获取数据模型 * * 静态化 ...
- easy-mock 本地部署
前言 为什么要本地部署 easy-mock呢? easy-mock官网经常挂,太浪费时间了: 公司突然不给上外网,太垃圾了: 就是想要折腾自己,太爱学习了(哈哈哈): Easy-mock 官网 安装需 ...
- 自然语言处理(NLP)之个人小结
一 概述 1.1 自然语言处理四大任务 序列标注 分词 词性标注 命名实体识别 分类任务 文本分类 情感分析 判断句子关系 问答系统 对话系统 阅读理解 生成任务 机器翻译 自动文摘 图像描述生成 1 ...
- Navicat连接MySQL 8出现2059 - authentication plugin 'caching_sha2_password'的解决办法
进入MySQL控制台,执行如下命令: use mysql; ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY ...
- Flutter dio伪造请求头获取数据
在很多时候,后端为了安全都会有一些请求头的限制,只有请求头对了,才能正确返回数据.这虽然限制了一些人恶意请求数据,但是对于我们聪明的程序员来说,就是形同虚设.下面就以极客时间为例,讲一下通过伪造请求头 ...
- Python-OpenCV实现二值图像孔洞填充
代码如下: import cv2 import numpy as np def FillHole(mask): contours, hierarchy = cv2.findContours(mask, ...
- C语言tips_2 关于scanf 读取规则小结以及与getchar 的区别
第一点:scanf默认回车和空格是输入不同组之间的间隔和结束符号. 也就是说他不会读取 空格 和 换行符.而是把他们当作一个 数据被读取完成的标志!他的停止标志则为,当%d之类的数据输入结束之后,自动 ...