Zynq 7000 PL和PS通信——使用BRAM

  • 介绍
  • 1 准备工作
  • 2 PL搭建BRAM
  • 3 下载PL程序
  • 4 编写Linux应用程序
  • 5 问题
    • 5.1 BRAM的寻址的问题
    • 5.2 PS地址映射

介绍

Xilinx公司的Zynq 7000系列SoC除了有功能强大的FPGA,还集成了带有双核ARM Cortex A9的PS。在协同使用PS和PL时,就不免需要在PS和PL之间进行数据交互。本文主要讲述安装了linux操作系统的PS如何与PL进行数据交互。

1 准备工作

PC环境:win10
vivado版本:2015.4
开发板:ZC706(已安装从SD卡启动的Linux系统)

系统的总体框架如下图所示。利用AXI接口实现PS和PL的通信,PS作为主机,PL作为从机,通过AXI Interconnect分别和两个BRAM的控制器相连。BRAM部分有两个端口,这两个端口都可对这块BRAM进行读写操作。AXI的通信接口由AXI Interconnect和AXI BRAM Controller IP核完成,在PS端,可以将AXI BRAM Controller当做字符设备进行读写操作,在PL端,可以直接对BRAM进行读写操作。其中AXI接口的具体通信过程由IP核完成,在进行应用开发时可以不用太关心。下图这块BRAM的两个端口都连到了PS,没有端口供PL进行操作了,在实际应用中,可以一个端口连到PS,另一个端口由PL控制,然后商量好PS和PL的读写规则即可使用BRAM实现PL和PS的数据传输。

2 PL搭建BRAM

打开vivado,新建一个工程,在选择器件时,选择ZC706评估板(如果不是此评估板,应该根据实际芯片型号选择)。

建好工程后,新建一个bd文件。

在Block Design文件中,添加一个ZYNQ7 Processing System IP核。

双击这个IP核对其进行配置,由于本文所用是官方提供的开发板,可以直接点击Presets -> ZC706使用默认的配置。如果是其他型号,应该按照实际情况进行配置。

然后点击PS-PLConfiguration里,把GP0选择,然后点击ok保存配置。

继续添加IP核,选择AXI BRAM Controller。

添加AXI BRAM Controller后,双击并对齐进行配置,将接口选择为1个。配置完成后以同样的方法再添加一个AXI BRAM Controller。

添加BRAM,并对齐进行配置,将其配置成双端口。


然后把AXI接口的时钟线连上,并选择自动连线。

最终的Block Design如下图所示。

接下来右击bd文件,选择Create HDL Wrapper,并选择Let Vivado manage wrapper and auto-update。


然后点击Address Editor,可以看到两个外设的地址分别为0x40000000和0x42000000。这个地址是给PS使用的,可以按照自己的喜好进行修改(当然地址不可随心所欲的修改,有些地址是不能给它们使用的!)。BRAM的容量大小也可在此处修改,只不过修改之后需要再运行一下Create HDL Wrapper重新进行打包,本文就使用默认的8K大小。

然后直接点击Generate Bitstream,等待其一步到位。

3 下载PL程序

给开发板上电。前期已经制作了从SD卡启动的linux操作系统,上电后,系统启动,可以从串口进入系统进行命令行操作。连接PL后,点击Program Device下载bitstream文件。

4 编写Linux应用程序

下载完成后,在linux系统下编写一个测试读写的C语言程序,测试代码如下所示。

#include<stdio.h>
#include<unistd.h>
#include<sys/mman.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>#define BRAM_CTRL_0  0x40000000  //AXI_bram_ctrl_0的物理地址
#define BRAM_CTRL_1 0x42000000  //AXI_bram_ctrl_1的物理地址
#define DATA_LEN        10          //写入和读取的数据长度int main(){unsigned int * map_base0;unsigned int * map_base1;int fd = open("/dev/mem", O_RDWR|O_SYNC);if (fd == -1){   printf("can't open /dev/mem !\n");return (-1);}printf("/dev/mem is opened !\n");map_base0 = mmap(NULL, DATA_LEN * 4, PROT_READ|PROT_WRITE, MAP_SHARED, fd, BRAM_CTRL_0);map_base1 = mmap(NULL, DATA_LEN * 4, PROT_READ|PROT_WRITE, MAP_SHARED, fd, BRAM_CTRL_1);if (map_base0 == 0 || map_base1 == 0){printf("NULL pointer!\n");}else{printf("mmap successfull!\n");}unsigned long addr;unsigned int content;int i = 0;//写数据到BRAMprintf("\nWrite data to BRAM via AXI_bram_ctrl_0\n");for (i= 0; i < DATA_LEN; i++){addr = (unsigned long)(map_base0 + i);content = i + 2;map_base0[i] = content;printf("%2dth data, address: 0x%lx data_write: 0x%x\t\t\n", i, addr, content);}//从BRAM读数据printf("\nRead data from BRAM via AXI_bram_ctrl_1\n");for (i= 0; i < DATA_LEN; i++){addr = (unsigned long)(map_base1 + i);content = map_base1[i];printf("%2dth data, address: 0x%lx data_write: 0x%x\t\t\n", i, addr, content);}close(fd);munmap(map_base0, DATA_LEN);munmap(map_base1, DATA_LEN);return 0;
}

在linux下使用GCC进行编译,然后运行,运行结果如下图所示。

这里对测试的C语言程序进行简单的分析。首先打开/dev/mem字符设备节点,然后将BRAM的两个控制器AXI_bram_ctrl_0和AXI_bram_ctrl_1的物理地址进行地址映射,这两个控制器在linux看来就相当于两个外设。先向AXI_bram_ctrl_0写入10个数据,然后从AXI_bram_ctrl_1读出10个数据,由于这两个控制器所连接的是同一块BRAM存储空间,所以读出来的数据应该和写入的数据是一致的。如此便实现了PL和PS的数据交互。

5 问题

5.1 BRAM的寻址的问题

如果将BRAM的一端交给PL来操作,如果选择BRAM的容量为8K。如果查看BRAM,会发现其深度竟然只有2048,并非8192,如下图所示。

其实这是因为BRAM的地址是以8位为单位的,BRAM容量设置成8K是指8KB,即8K×8bits。换算成32位宽时为8K×8bits = 2K×32bits,也就是说只有2048个32位地址。PL在对BRAM进行寻址时,也是使用的8位位宽寻址,也就是说地址会从0~1FFF,会有13根地址线,而并非11根地址线32位位宽。这是PL对BRAM进行操作时需要注意的。

5.2 PS地址映射

在PL这边搭好工程之后,会分配两个地址0x40000000和0x42000000。这两个地址是真实的物理地址,在Linux系统下不能直接访问,需要进行地址映射,然后才能对其进行操作。关于地址映射可是个麻烦的事情,还需仔细学习和谨慎使用。

Zynq 7000 PL和PS通信——使用BRAM相关推荐

  1. ZYNQ的PL控制PS的DDR

    本次工程是用PL端控制PS的DDR,下面是一些过程 1. 创建一个ZYNQ核 选择高速互联总线,因为DDR速率比较快,所以PS与PL端的交互,我们选择HP,高速AXI连接,位宽选择32,和DDR位宽保 ...

  2. 基于xilinx zynq7000平台(zynq7030),使用 github上的axi_dma驱动操作dma(PL与PS通信)

    前言 最近公司项目中使用到了赛灵思Xilinx zynq7000系列(7030)平台,产品中需要在arm(PS)与fpga(PL)之间进行大批量数据传输,还要考虑效率问题,因此使用了axi_dma模块 ...

  3. 【Zynq UltraScale+ MPSoC】基于LWIP模板的udp通信与测试(二):PL与PS基于BRAM的UDP通信

    文章目录 前言 一.PL端准备 二.PS端程序 1.BD文件和模块连接 2.PS端的程序: 三.测试与总结 前言 承接上一篇文章 一.PL端准备 这部分主要是加入BRAM来向PS端传输数据,主要是需要 ...

  4. Linux下pl与ps端的通信,zedboard通过BRAM实现PS和PL的简单通信

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

  5. ZYNQ中AXI4-Lite实现PS与PL通信

    ZYNQ中AXI4-Lite实现PS与PL通信 0 前言 1 Vivado部分 2 Vitis部分 0 前言   ZYNQ开发中需要使用PS向PL发控制信号,PL将数据发给PL端处理,可以使用AXI4 ...

  6. zynq sdk 开发之通过 BRAM 进行 PL 与 PS 的数据交互

    如何在 zynq 中进行 PL 端与 PS 端的数据交互? 在zynq的使用中,高效的进行 BRAM 与 zynq 硬核的数据交换至关重要,当我们需要进行小批量的数据交换时,可以考虑采用 BRAM 作 ...

  7. ZYNQ 7000 PS和PL 信号、接口、管脚分布

    1.ZYNQ 7000 PS端和PL端都有自己独立的电源引脚(Power Pin) 2.PS端接口和信号: PS_CLK(System reference clock) POR_RST_N(Power ...

  8. 【ZYNQ Ultrascale+ MPSOC FPGA教程】第三十二章 PL读写PS端DDR数据

    本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处. 适用于板卡型号: AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E/AXU4E ...

  9. vivado中ZYNQ详解(主要用于PS和PL之间的工作衔接)

    可进qq群进行相关Verilog知识交流:1073030956 AXI的理解 AXI(Advanced extensible Interface)协议主要描述了Master设备和Slave设备之间的数 ...

最新文章

  1. C程序演示产生僵死进程的过程
  2. keras 与tensorflow绑定在一起用的,何以见得
  3. 关于Hinton团队无监督新作SimCLR的所思所想
  4. JQuery 和JavaScript的区别
  5. [转载]项目经理必备工具包:项目管理中的22个思维导图
  6. excel打开空白_PDF转成Excel后,打开表格却是空白的?
  7. [网络安全提高篇] 一〇四.网络渗透靶场Oracle+phpStudy本地搭建万字详解(SQL注入、XSS攻击、文件上传漏洞)
  8. 开箱即用~基于.NET Core的统一应用逻辑分层框架设计
  9. EDA实验课课程笔记(八 )——PT(Prime Time)简介(附录静态时序分析)
  10. asp.net 通过IHttpHandler开发接口
  11. Atitti knn实现的具体四个距离算法 欧氏距离、余弦距离、汉明距离、曼哈顿距离
  12. 【大数据干货】基于Hadoop的大数据平台实施——整体架构设计
  13. 2017年多校联合训练 第五场(吉如一)
  14. android使用百度地图SDK 去掉百度Logo的小技巧
  15. DirectShow连接Crossbar
  16. 2020中央财经大学901c语言大纲,2017年中央财经大学信息学院901C语言程序设计考研导师圈点必考题汇编...
  17. Typora主题下载
  18. PHP打包下载zip文件
  19. 虚拟机网卡(NAT模式)设置连接外网
  20. 画出优秀手绘线稿的必备条件,首先要满足和避免这些线条

热门文章

  1. java+sql企业进销存管理系统分权限
  2. 时间复杂度On和空间复杂度O1是什么意思?
  3. android Lollipop勿扰模式
  4. 海运到美国整柜多少钱?
  5. 四舍五入函数matlab,matlab中round函数具体用法
  6. 辽宁科技大学计算机拟录取,辽宁科技大学2019年法律硕士研究生拟录取名单
  7. 远东传动收购机器人_一只机械新晋公司被盯上,复制艾迪规模短期翻番,又收购国内机器人减速机唯一供应商...
  8. 量化交易 第五课 策略评估指标
  9. 个人计算机和手机软件的异同,在线考试手机端和电脑端有什么区别
  10. elasticsearch 东八区问题