实验环境: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示意图如下:

图1-1.双端口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-2: Write First Mode Example

读优先模式:当要写入内存数据时,先前存储的数据在写地址有效前存储到数据输出总线上。时序图如图1-3所示:

图1-3:Read First Mode Example

无变化模式: 输出锁存器在写入内存期间不改变值。时序图如图1-4所示:

图1-4:No Change Mode Example

1.3 字节写操作

在使用32为数据总线时,数据按32位同时变化,如果只写入8,16,24位的数据或者间隔一个字节写入两个不连续的字节,这是可以使用WE信号,首先看看图1-5时序图。

图1-5: Byte-write Example标题

图中第一个上升沿到来之时,数据输入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-1: ZYNQ IP核GP端口设置

2.3 Add IP, 添加一个Block memory Generator,选择true dual Port RAM类型。

图2-2: Block Ram设置

2.4 Add IP,添加两个AXI BRAM Controller,把number of BRAM interfaces改成1。

图2-3: AXI BRAM Controler设置

2.5 点击run connection automation,把axi_bram_ctl_0的Master选择为GP0, axi_bram_ctl_1的Master选择为GP1,interconnect ip都选择为 new AXI Interconnect。

图2-4: 设置AXI连接

2.6 点击重新布局,最后得到如下结构。

图2-5: 双端口RAM系统结构

2.7 点击Address Editor,可以看到GP0和GP1的地址已经自动分配好。

图2-6: RAM地址分配

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数据相关推荐

  1. ZYNQ学习之路17.自定义SDSoC硬件平台

    前言 在前面的学习中,我们已经学会了使用Vivado及SDK开发环境,熟悉了硬件开发与Linux软件驱动之间的联系及开发流程.本系列教程我们学习SDSoc的开发,在SDSoc IDE中,Xilinx为 ...

  2. ZYNQ学习之路13.创建PetaLinux工程

    在前面的学习中,我们知道如何根据PetaLinux BSP设计去创建一个工程,现在,我们结合Vivado设计我们自己PetaLinux系统. 开发环境:Ubuntu16 64bit, PetaLinu ...

  3. ZYNQ学习之路(三):自定义IP实现PL处理PS写入BRAM的数据

    目录 一.实验简介 二.vivado部分处理 三.SDK编程 四.实验测试 五.总结 一.实验简介 ZYNQ系列嵌入式FPGA可以使PS将数据写入PL部分BRAM,PL可以将数据读取后再重新写入BRA ...

  4. ZYNQ学习之路16.SDSoC开发环境介绍

    本节教程介绍如何使用SDSoC软件创建硬件平台,并且使用它来加速程序函数. 开发环境: 操作系统: windows10 64bit SDSOC:2018.2 串口: USB-TTL, CP210x 开 ...

  5. ZYNQ学习之路19.在SDx中使用xfOpenCV图像加速处理

    简介 Xilinx的reVISION栈包含了一系列开发平台.算法和应用的开发资源,它支持流行的神经网络包括AlexNet, GoogleLeNet, VGG, SSD和FCN等,并且该视觉库提供了用于 ...

  6. ZYNQ学习之路3. 定制AXI IP核

    ZYNQ最大的优点就是硬核A9处理器与FPGA的结合,处理器可以扩展出任何使用者想要的外设(数字逻辑外设),FPGA与处理器通过AXI高速总线进行连接,提供了处理器到FPGA的高速带宽(ZYNQ700 ...

  7. ZYNQ学习之路11.AXI DMA

    一. AXI DMA简介 AXI DMA IP核提供了AXI4内存之间或AXI4-Stream IP之间的内存直接访问,可选为分散收集工作模式,初始化,状态和管理寄存器等通过AXI4-Lite 从机几 ...

  8. ZYNQ学习之路9.USB总线学习(二)

    Linux中USB驱动程序依然遵循标准的设备驱动模型--总线.设备.驱动.和I2C总线设备驱动一样,所有的USB驱动程序都必须创建的主要结构体是struct usb_driver,它们向USB核心代码 ...

  9. sklearn中lstm_深度学习之路(一):用LSTM网络做时间序列数据预测

    简介 问题:有一组1维数据,可能是某商品的销售量,可能是股票的价格等,用深度学习模型来解决对该数据的预测问题,比如用前50个数据,来预测下一个数据. 首先,给出数据集: 前10行数据.png 接下来, ...

最新文章

  1. 【Windows 逆向】OD 调试器工具 ( 显示模块窗口 | 显示记录窗口 | 显示内存窗口 | 显示线程 | 显示句柄 | 显示 CPU | 多窗口界面 )
  2. Python爬虫==【openurl】
  3. python中线条颜色_python中plot用法——线条、点、颜色
  4. Beanstalkd工作队列
  5. 计算机基础知识二进制转换,计算机基础知识数制转换
  6. 【Git】GitHub同名项目实现丰富多彩的README.md
  7. 年底促销海报还没准备好?电商美工看这里
  8. 传统软件测试的互联网化改造
  9. 字符设备驱动笔记——中断方式按键驱动之linux中断处理结构(五)
  10. 一文详解双目视觉目标检测
  11. 【2022最新Java面试宝典】—— Linux面试题(50道含答案)
  12. 使用Advanced Installer打包安装程序
  13. [daily][device] linux添加打印机
  14. c语言程序设计小球弹跳,C语言之1 实现弹跳小球
  15. html在搜索按钮中加放大镜,CSS3 搜索按钮动效 - 放大镜图标变叉叉
  16. echarts饼图label文字颜色
  17. Spring Boot 实现定时任务
  18. 易企秀 背景音乐 下载
  19. 计算机 基础知识练习题
  20. AutoCAD快速入门(二十四):修改标注

热门文章

  1. Linux下非root用户环境变量使用小结
  2. sublime安装package control
  3. 史上最全机器学习_深度学习毕设题目汇总——视频
  4. 【前端系列教程之JavaScript】01_JavaScript概述和引入方式
  5. OpenCV基础八:OpenCV在各操作系统平台上的使用(陆续更新)
  6. Delphi中idHttp获取网页源文件
  7. 《C语言程序设计》 游戏五子棋
  8. 模拟计算机怎么做,电脑虚拟U盘如何制作 电脑虚拟U盘怎样制作
  9. Ubuntu18.04运行ORB-SLAM3(Demo+本地Realsense D415运行)
  10. eclipse import netscape.javascript.JSObject