zynq linux调用HLS IP核的虚拟地址和物理地址问题
2023-09-14 09:10:01 时间
上一节zynq linux调用HLS IP核
中讲了如何通过UIO在zynq linux开发中调用HLS IP核,但是那个例子中只涉及到了AXI Lite接口,没有内存中虚拟地址和物理地址的问题,本节讲述如何在linux上解决该问题。
我们知道,在PL端访问ARM的DDR时,采用的是物理地址,然而在Linux上的应用程序,一般采用虚拟地址,因此zynq上linux的开发就必须解决这一问题。
本次实验,在HLS中实现了一个采用m_axi接口的向量加法IP核:
该m_axi接口与AXI HP口相连,直接读取PS端的DDR,具体功能为
读取100个a数组元素,读取100个b数组元素,然后对应元素相加,得到的100个和再写回DDR中指定的位置。
整个开发过程与上一节类似,唯一的不同就是最后的应用程序,代码如下:
/*
* Copyright (c) 2012 Xilinx, Inc. All rights reserved.
*
* Xilinx, Inc.
* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
* COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
* ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
* STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
* IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
* FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
* XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
* THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
* ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
* FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE.
*
*/
#include<stdio.h>
#include<unistd.h>
#include<sys/mman.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include"xadder.h"
#define A_BASE_ADDR 0x05000000
#define B_BASE_ADDR 0x06000000
#define C_BASE_ADDR 0X07000000
#define SIZE 4096
int main()
{
XAdder add_inst;
int i;
int devmem;
int *a_addr;
int *b_addr;
int *c_addr;
devmem = open("/dev/mem", O_RDWR | O_SYNC);
if(devmem==-1)
printf("open /dev/mem failed\n");
a_addr=(int*)mmap(0,SIZE*sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,devmem,A_BASE_ADDR);
if(a_addr == MAP_FAILED)
printf("a_addr map failed\n");
b_addr=(int*)mmap(0,SIZE*sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,devmem,B_BASE_ADDR);
if(b_addr == MAP_FAILED)
printf("b_addr map failed\n");
c_addr=(int*)mmap(0,SIZE*sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,devmem,C_BASE_ADDR);
if(c_addr == MAP_FAILED)
printf("c_addr map failed\n");
for(i=0;i<100;i++)
{
*(a_addr+i)=2*i;
*(b_addr+i)=100-i;
*(c_addr+i)=0;
}
printf("test start\n");
if(XST_SUCCESS!=XAdder_Initialize(&add_inst,"adder")){
printf("adder init error\n");
return -1;
}
XAdder_Set_a_r(&add_inst,(u32)A_BASE_ADDR);
XAdder_Set_b_r(&add_inst,(u32)B_BASE_ADDR);
XAdder_Set_c_r(&add_inst,(u32)C_BASE_ADDR);
XAdder_Start(&add_inst);
while(!XAdder_IsDone(&add_inst));
XAdder_Release(&add_inst);
printf("PL compute finished\n");
for(i=0;i<100;i++)
printf("%d+%d=%d\n",*(a_addr+i),*(b_addr+i),*(c_addr+i));
printf("end\n");
return 0;
}
相关文章
- linux中怎么查看ip地址
- Linux命令行修改IP、网关、DNS、主机名 的方法
- linux - redis-trib.rb 命令详解
- 每天一个linux命令(18):locate 命令
- Linux下的tar压缩解压缩命令详解
- Linux_CentOS-服务器搭建 <七>
- Linux动态库(.so)搜索路径
- 【刷题】面筋-linux-如何查找出现频率最高的100个ip地址
- linux代理上网5分钟搞定
- 又一款linux提权辅助工具
- 【Linux基础】Linux更改系统IP
- 什么是 IP 隧道,Linux 怎么实现隧道通信?
- 【刷题】面筋-linux-如何查找出现频率最高的100个ip地址
- linux下rz/sz安装及使用方法
- linux(centos8):firewalld使用ipset管理ip地址的集合
- Linux svn checkout命令使用示例
- Linux tar将分割的小文件进行合并
- Linux中基于hadoop安装hive(CentOS7+hadoop2.8.0+hive2.1.1)
- 使用 rtcwake 定时唤醒休眠的linux
- Linux 展示 IP 命令行
- Linux- 系统随你玩之--grep查找文件内容
- Linux-系统随你玩之--谁在使用我系统
- Linux静态IP的配置,图文结合你值得拥有