ZYNQ linux下AXI_BRAM的使用方法,PS与PL端数据交互

2023-11-01 02:40

本文主要是介绍ZYNQ linux下AXI_BRAM的使用方法,PS与PL端数据交互,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、AXI总线、AXI接口、AXI协议
总线是一组传输通道,是各种逻辑器件构成的传输数据的通道;接口是一种连接标准,又常被称为物理接口;协议是数据传输的规则。

PS与PL连接方式主要是通过AXI总线进行的。ZYNQ上的总线协议有AXI4, AXI4-Lite, AXI4-Stream三种总线协议。而PS与PL之间的接口(AXI-GP、AXI-HP、AXI-ACP)只支持AXI4与AXI4-Lite这两种总线协议。

2、BRAM简介
Block RAM是PL部分的存储器阵列,就相当于在PL中开辟一片空间来存储数据,通过端口来进行读写。
BRAM设置模式:
1、单端口:通过一个端口对BRAM进行读写。
2、简单双端口:有两个端口连接到BRAM,一个端口只读,一个端口只写
3、真双端口:两个端口都可以对BRAM进行读写。

3、vivado设计
前提:创建好了工程并导入了ZYNQ核

打开AXI GP0 和 AXI GP1的接口
在这里插入图片描述
在这里插入图片描述

将M_AXI_GP0_ACLK连接到FCLK_CLK0
在这里插入图片描述

导入两个BRAM 控制器
在这里插入图片描述

在这里插入图片描述
设置为单端口

在这里插入图片描述

导入一个BRAM
在这里插入图片描述

设置为真双端口模式

在这里插入图片描述
进行设计连接
在这里插入图片描述
进行1的时候需要修改主机从GP0 改为GP1
在这里插入图片描述
最终的生成图
在这里插入图片描述
可以在address editor中查看自动分配的BRAM控制器的地址,不要随意更改地址,因为其他地址可能被其他设备占用了。
axi_bram_ctrl_0 0x40000000
axi_bram_ctrl_1 0x80000000

在这里插入图片描述

接下来生成bit流,将硬件资源导入petlainux中,生成BOOT.BIN 和image.ub

将生成的BOOT.BIN和内核放到板子上,启动系统。

进行编程:


#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
#define BRAM_CTRL_1 0x80000000
#define DATA_LEN    10int main(int argc, char **argv)
{unsigned int *map_base0;unsigned int *map_base1;int fd = open("/dev/mem", O_RDWR | O_SYNC);if (fd < 0) {printf("can not open /dev/mem \n");return (-1);}   printf("/dev/mem is open \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 successful\n");}   unsigned long addr;unsigned int content;int i = 0;printf("\nwrite data to bram\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);}   printf("\nread data from bram\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_read: 0x%x\t\t\n", i, addr, content);}   close(fd);munmap(map_base0, DATA_LEN);munmap(map_base1, DATA_LEN);return 0;
}

运行效果
在这里插入图片描述

也可以将BRAM与socket进行联合使用,将PC端的数据发到PS端,PS端放在PL端,PL端再发给PS端,PS端发回PC端。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <fcntl.h>
#define PORT 3333#define BRAM_CTRL0 0x40000000
#define BRAM_CTRL1 0x80000000
#define DATA_LEN   100unsigned int *map_base0;
unsigned int *map_base1;void udp_server(int sockfd)
{socklen_t len;struct sockaddr_in server_addr;int n;int opt = 1;len = sizeof(server_addr);server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = htonl(INADDR_ANY);server_addr.sin_port = htons(PORT);setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {printf("can not bind\n");exit(1);}   while (1) {printf("\n========wait for client's request========\n");n = recvfrom(sockfd, map_base0, 1024, 0, (struct sockaddr *)&server_addr, &len);char buf[1024];memcpy(buf, map_base0, 1024);printf("\nreceive client's data: %s\n", buf);sendto(sockfd, map_base0, n, 0, (struct sockaddr *)&server_addr, len);memcpy(buf, map_base1, 1024);printf("\nsend data to client: %s\n", buf);}close(sockfd);
}int main(int argc, char **argv)
{int sockfd, devfd;if ((sockfd = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {printf("create socket false\n");exit(1);}if ((devfd = open("/dev/mem", O_RDWR | O_SYNC)) < 0) {printf("can not open /dev/mem \n");return (-1);}printf("\nopen /dev/mem successful\n");map_base0 = mmap(NULL, DATA_LEN * 4, PROT_READ | PROT_WRITE, MAP_SHARED, devfd, BRAM_CTRL0);map_base1 = mmap(NULL, DATA_LEN * 4, PROT_READ | PROT_WRITE, MAP_SHARED, devfd, BRAM_CTRL1);if (map_base0 ==0 || map_base1 == 0) {printf("NULL pointer \n");}else {printf("mmap successful\n");}udp_server(sockfd);exit(0);
}

最终实现相关效果

在这里插入图片描述

这篇关于ZYNQ linux下AXI_BRAM的使用方法,PS与PL端数据交互的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/319908

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件