ZYNQ学习之路4.ZYNQ通过GP口读取PL内部RAM数据
实验环境:window 7 64 bit, vivado 2017.1, ZTURN board.
参考手册:Xilinx Distributed Memory Generator
在ZYNQ开发中,经常需要PS与PL进行数据交互。当数据量比较大时往往需要先缓存一部分然后批量传输到Linux系统,否则中断响应时间无法满足要求,使用双端口RAM或许是一种不错的方法。本文详细描述PS端读写PL端片的双端口RAM数据的实验过程。本次实验使用FPGA内部的Block Memory,PS端通过Master GP0端口向RAM写数据,通过Master GP1端口读出数据,本次实验涉及到AXI BRAM Controller和Block Memory Generator等IP核。
一. SRAM介绍
1.1 双端口RAM结构
Xilinx的ZYNQ7Z010内部FPGA是virtex7系列,内部有32KB的Block Memory,可以用它作为ROM,Single-Port RAM, Dual-Port RAM或Simple Dual-Port RAM, RAM的区别在于读写数据线与地址总线的数量的区别,根据自己的需求进行选择。
RAM类型 |
功能 |
数据总线数量 |
地址总线数量 |
Single-Port |
通过一个端口进行数据的读写操作 |
1 |
1 |
Dual-Port |
通过两个端口读写数据 |
2 |
2 |
Simple Dual-Port |
一个端口进行写操作,另一个端口进行读操作 |
1 |
2 |
双端口RAM示意图如下:
双端口RAM相比其他几种RAM更复杂,所以本文只介绍双端口RAM的使用。
1.2 双端口RAM控制信号
上文中的示意图中只列出了基本且常用的信号,其他特殊信号在次不做介绍。常用控制信号功能定义如下:
信号 |
方向 |
描述 |
din[31:0] |
Input |
数据总线输入,32位宽 |
addr[31:0] |
Input |
地址总线输入,32位宽,地址从0开始,有效至容量大小 |
clk |
Input |
时钟信号输入,1位,写同步时钟 |
en |
Input |
使能读,写,复位选项 |
rst |
Input |
复位或置位读出锁存寄存器,如果要读出需要置置 |
wea[3:0] |
Input |
写使能 |
dout[31:0] |
Output |
数据输出,32位宽 |
双端口RAM的工作模式有三种,写优先、读优先和无变化模式。
写优先模式:数据同时写入到内存并输出到数据端口,时序如图1-2所示:
读优先模式:当要写入内存数据时,先前存储的数据在写地址有效前存储到数据输出总线上。时序图如图1-3所示:
无变化模式: 输出锁存器在写入内存期间不改变值。时序图如图1-4所示:
1.3 字节写操作
在使用32为数据总线时,数据按32位同时变化,如果只写入8,16,24位的数据或者间隔一个字节写入两个不连续的字节,这是可以使用WE信号,首先看看图1-5时序图。
图中第一个上升沿到来之时,数据输入0xFFEEDD,WEA=0x011,写入内容变为0x00FFDD,只有后面两个字节写入成功,可以发现WEA的某个bit位置1时对应数据输入的字节将被写入,其他字节屏蔽写操作,32为数据总线时WEA为4位,从低到高依次对应数据总线低到高的四个字节的掩码,置位可写,复位屏蔽,也就是说写32位数据时WEA[3:0]=b1111.
二. PL端硬件设计
2.1 新建一个vivado工程,选择开发板所对应的芯片型号。
2.2 Add IP, 添加ZYNQ,双击设置属性,保留uart1,选择M AXI GP0 interface和M AXI GP1 interface
2.3 Add IP, 添加一个Block memory Generator,选择true dual Port RAM类型。
2.4 Add IP,添加两个AXI BRAM Controller,把number of BRAM interfaces改成1。
2.5 点击run connection automation,把axi_bram_ctl_0的Master选择为GP0, axi_bram_ctl_1的Master选择为GP1,interconnect ip都选择为 new AXI Interconnect。
2.6 点击重新布局,最后得到如下结构。
2.7 点击Address Editor,可以看到GP0和GP1的地址已经自动分配好。
2.8 在sources下选择block design右击,点击Create HDL wrapper,生成系统的顶层模块,在system_wrapper上右击,选择generate output products...。
2.9 编译综合工程,最后generate bitstream,导出硬件(包含bitstream),launch SDK。
三. PS端软件的编写与测试
3.1 新建一个以helloworld为模板的工程,SDK自动创建了硬件的bsp,设置终端串口为uart1。
3.2 在main函数中编写代码如下:
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include <sleep.h>
#include "xil_io.h"
#include "xparameters.h"int main()
{int a[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};int b[16] = {0};init_platform();print("------The test is start...------\n\r");xil_printf( "Write data:\n\r");memcpy((void *)0x40000000, a, 16*4);for(int i = 0;i<16;i++){xil_printf( "%x ",a[i]);}xil_printf( "\n\r");sleep(1);xil_printf( "Read data:\n\r");memcpy(b, (void*)0x80000000, 4*16);for(int i = 0;i<16;i++){xil_printf( "%x ",b[i]);}xil_printf( "\n\r");xil_printf("------The test is end!------\n\r");cleanup_platform();return 0;
}
程序开始向地址0x40000000处复制数组a的内容,并打印数组a,然后将地址0x80000000开始的64字节(数组a大小)内容复制到数组b中,然后打印数组b。如果不复制到数组b,显然数组b是全零数组,上电启动初始状态内存中全部为为0。0x40000000和0x80000000分别是双端口RAM的两个端口的起始地址,如果写入与读取的内容一致,则说明双端口RAM的两套读写地址操作的是同一个存储空间,说明实验是成功的。
3.3 连接好仿真器和串口终端,先下载FPGA程序,然后运行PS的软件,在终端显示如下:
可以看出读取的与写入的数据完全一样,然而读取的地址不一样,说明实验是成功的。
说明:由于BRAM是连接在GP0和GP1接口上通过AXI总线进行读写操作,在地址空间上寻址可以直接使用指针操作,因此memcpy这样的C基本库函数可以直接对GP0和GP1地址空间进行操作,在访问速度上比使用循环指针操作要快很多。
欢迎关注亦梦云烟的微信公众号: 亦梦智能计算
ZYNQ学习之路4.ZYNQ通过GP口读取PL内部RAM数据相关推荐
- ZYNQ学习之路17.自定义SDSoC硬件平台
前言 在前面的学习中,我们已经学会了使用Vivado及SDK开发环境,熟悉了硬件开发与Linux软件驱动之间的联系及开发流程.本系列教程我们学习SDSoc的开发,在SDSoc IDE中,Xilinx为 ...
- ZYNQ学习之路13.创建PetaLinux工程
在前面的学习中,我们知道如何根据PetaLinux BSP设计去创建一个工程,现在,我们结合Vivado设计我们自己PetaLinux系统. 开发环境:Ubuntu16 64bit, PetaLinu ...
- ZYNQ学习之路(三):自定义IP实现PL处理PS写入BRAM的数据
目录 一.实验简介 二.vivado部分处理 三.SDK编程 四.实验测试 五.总结 一.实验简介 ZYNQ系列嵌入式FPGA可以使PS将数据写入PL部分BRAM,PL可以将数据读取后再重新写入BRA ...
- ZYNQ学习之路16.SDSoC开发环境介绍
本节教程介绍如何使用SDSoC软件创建硬件平台,并且使用它来加速程序函数. 开发环境: 操作系统: windows10 64bit SDSOC:2018.2 串口: USB-TTL, CP210x 开 ...
- ZYNQ学习之路19.在SDx中使用xfOpenCV图像加速处理
简介 Xilinx的reVISION栈包含了一系列开发平台.算法和应用的开发资源,它支持流行的神经网络包括AlexNet, GoogleLeNet, VGG, SSD和FCN等,并且该视觉库提供了用于 ...
- ZYNQ学习之路3. 定制AXI IP核
ZYNQ最大的优点就是硬核A9处理器与FPGA的结合,处理器可以扩展出任何使用者想要的外设(数字逻辑外设),FPGA与处理器通过AXI高速总线进行连接,提供了处理器到FPGA的高速带宽(ZYNQ700 ...
- ZYNQ学习之路11.AXI DMA
一. AXI DMA简介 AXI DMA IP核提供了AXI4内存之间或AXI4-Stream IP之间的内存直接访问,可选为分散收集工作模式,初始化,状态和管理寄存器等通过AXI4-Lite 从机几 ...
- ZYNQ学习之路9.USB总线学习(二)
Linux中USB驱动程序依然遵循标准的设备驱动模型--总线.设备.驱动.和I2C总线设备驱动一样,所有的USB驱动程序都必须创建的主要结构体是struct usb_driver,它们向USB核心代码 ...
- sklearn中lstm_深度学习之路(一):用LSTM网络做时间序列数据预测
简介 问题:有一组1维数据,可能是某商品的销售量,可能是股票的价格等,用深度学习模型来解决对该数据的预测问题,比如用前50个数据,来预测下一个数据. 首先,给出数据集: 前10行数据.png 接下来, ...
最新文章
- 【Windows 逆向】OD 调试器工具 ( 显示模块窗口 | 显示记录窗口 | 显示内存窗口 | 显示线程 | 显示句柄 | 显示 CPU | 多窗口界面 )
- Python爬虫==【openurl】
- python中线条颜色_python中plot用法——线条、点、颜色
- Beanstalkd工作队列
- 计算机基础知识二进制转换,计算机基础知识数制转换
- 【Git】GitHub同名项目实现丰富多彩的README.md
- 年底促销海报还没准备好?电商美工看这里
- 传统软件测试的互联网化改造
- 字符设备驱动笔记——中断方式按键驱动之linux中断处理结构(五)
- 一文详解双目视觉目标检测
- 【2022最新Java面试宝典】—— Linux面试题(50道含答案)
- 使用Advanced Installer打包安装程序
- [daily][device] linux添加打印机
- c语言程序设计小球弹跳,C语言之1 实现弹跳小球
- html在搜索按钮中加放大镜,CSS3 搜索按钮动效 - 放大镜图标变叉叉
- echarts饼图label文字颜色
- Spring Boot 实现定时任务
- 易企秀 背景音乐 下载
- 计算机 基础知识练习题
- AutoCAD快速入门(二十四):修改标注
热门文章
- Linux下非root用户环境变量使用小结
- sublime安装package control
- 史上最全机器学习_深度学习毕设题目汇总——视频
- 【前端系列教程之JavaScript】01_JavaScript概述和引入方式
- OpenCV基础八:OpenCV在各操作系统平台上的使用(陆续更新)
- Delphi中idHttp获取网页源文件
- 《C语言程序设计》 游戏五子棋
- 模拟计算机怎么做,电脑虚拟U盘如何制作 电脑虚拟U盘怎样制作
- Ubuntu18.04运行ORB-SLAM3(Demo+本地Realsense D415运行)
- eclipse import netscape.javascript.JSObject