HPS—虚拟地址映射
HPS 如何对FPGA外设进行操作?
hardware:在Qsys中将外设连接到AXI bridge上
software:映射外设物理地址到到应用程序可以操作的虚拟地址,应用程序通过得到的虚拟地址入口控制外设。

也就是说hps访问FPGA中的外设时,可以使用MPU来进行虚拟地址的分配

MPU将以有的外设分配一段地址,若HPS需要控制哪一个外设,只需要访问虚拟地址即可。
为什么要进行地址映射?
内存映射就是讲内核空间的一部分区域映射到用户空间,用户对这段内存空间的修改可以反映到内核空间。可以将内核空间的一段地址映射到多个进程,以实现线程间的内存通信。系统调用mmap()就是进行地址映射。mmap是将一个文件(linux下设备也被看做是文件)或其他对象映射进内存。munmap执行相反的操作,删除特定地址区域的对象映射。
采用共享内存进行通信的优点是效率高,直接读写内存不需要进行数据拷贝。
通常使用mmap有三种情况,1、提高I/O效率 2、匿名内存映射 3、共享内存进程通信。
mmap用于内存映射的一种方式是打开或创建一个文件,然后调用mmap().(另一种方式如下:进程A和进程B都将该页映射到自己的地址空间,当进程A第一次访问该页中的数据时产生一个缺页中断,内核此时读入这一页到内存并更新页表使之指向它,当进程B访问同一页发生缺页中断时,该页已经在内存中,内核只需要将进程B的页表登记项指向此页即可)
实际例软件程序可以直接从de1_soc_training\de1_soc_training\lab\SW\de1_soc_sw_lab2中找到
下面简要介绍一下重要原理
- open:打开内存映射设备驱动。
- mmap:映射物理地址到用户空间。
- alt_read_word:从指定寄存器读取一个值。
- alt_write_word:写一个值到指定寄存器。
- munmap:清除内存映射。
下面是相关寄存器定义和配置程序:
|
1
2
3
|
#define USER_IO_DIR (0x01000000)#define BIT_LED (0x01000000)#define BUTTON_MASK (0x02000000) |
下列程序用来配置LED为输出引脚:
|
1
|
alt_setbits_word( ( virtual_base + ( ( uint32_t )( ALT_GPIO1_SWPORTA_DDR_ADDR ) & ( uint32_t )( HW_REGS_MASK ) ) ), USER_IO_DIR ); |
下列语句可以点亮LED
|
1
|
alt_setbits_word( ( virtual_base +( ( uint32_t )( ALT_GPIO1_SWPORTA_DR_ADDR ) &( uint32_t )( HW_REGS_MASK ) ) ), BIT_LED ); |
如下语句可以用来读取
| 1 | alt_read_word( ( virtual_base + ( ( uint32_t )( ALT_GPIO1_EXT_PORTA_ADDR ) & ( uint32_t )( HW_REGS_MASK ) ) ) ); |
通过open 和mmap映射到相应的虚拟基地址
- if( ( fd(fd =open( "/d / " ( O RDWR | O SYNC ) ) )"/dev/mem" , (O_ RDWR|O_ SYNC))) == -1 ) {){
- printf( "ERROR: could not open "/dev/mem"...\n" );
- return( 1 );1);
- }
- virtual_base =mmap( NULL, HW_REGS_SPAN, ( PROT_READ |
- PROT WRITE_ ), MAP SHARED_, , fd, HW REGS BASE_ _ );
LWAXI总线(light weight AXI)相对于其虚拟基地址的偏移(ALT_LWFPGASLVS_OFST&(unsigned long)(HW_REGS_MASK))
FPGA外设相对于LWAXI的地址(PIO_LED_BASE)
- h2_lw_led_addr= virtual_base + ( ( unsigned long)(
- ALT_LWFPGASLVS_OFST+PIO_LED_BASE) & ( unsigned
- long)(HW_REGS_MASK) )
HPS—虚拟地址映射的更多相关文章
- linux下c通过虚拟地址映射读写文件的代码
在代码过程中中,把开发过程中比较好的一些代码片段记录起来,如下的代码内容是关于 linux下c通过虚拟地址映射读写文件的代码,应该对小伙伴有些好处.#include<stdio.h>#in ...
- 通过HPS控制FPGA端的GPIO
该笔记主要记录HPS端如何通过AXI Bridge控制FPGA端口的GPIO,主要是如何操作FPGA侧的Led 1.AXI Bridge AXIB主要包括H2FB.F2HB.LWH2F ...
- HPS端如何通过AXI Bridge控制FPGA端口的GPIO
该笔记主要记录HPS端如何通过AXI Bridge控制FPGA端口的GPIO,主要是如何操作FPGA侧的Led 1.AXI Bridge AXIB主要包括H2FB.F2HB.LWH2F ...
- Linux内存管理之地址映射
写在前面:由于地址映射涉及到各种寄存器的设置访问,Linux对于不同体系结构处理器的地址映射采用不同的方法,例如对于i386及后来的32位的Intel的处理器在页式映射时采用的是2级页表映射,而对于I ...
- 内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现
http://blog.csdn.net/pi9nc/article/details/23334659 注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料 ...
- linux 内核源代码情景分析——地址映射的全过程
linux 内核采用页式存储管理.虚拟地址空间划分成固定大小的"页面",由MMU在运行时将虚拟地址映射成某个物理内存页面中的地址.页式内存管理比段式内存管理有很多好处,但是由于In ...
- ARM-汇编指令集(总结)
ARM汇编指令集 指令.伪指令 (汇编)指令: 是机器码的助记符,经过汇编器编译后,由CPU执行. (汇编)伪指令:用来指导指令执行,是汇编器的产物,最终不会生成机器码. 有两种不同风格的ARM指 ...
- MIT 6.828 JOS学习笔记10. Lab 1 Part 3: The kernel
Lab 1 Part 3: The kernel 现在我们将开始具体讨论一下JOS内核了.就像boot loader一样,内核开始的时候也是一些汇编语句,用于设置一些东西,来保证C语言的程序能够正确的 ...
- 【转载】64 位 Windows 内核虚拟地址空间布局(基于 X64 CPU)
原文链接:http://shayi1983.blog.51cto.com/4681835/1734822 本文为原创翻译,原文出处为 http://www.codemachine.com/articl ...
随机推荐
- Python之五:函数
函数会给一段语句块命名,我们可以在任何时候调用它,运行其中的代码 它的一班语法: def fun_name(x): 函数语句体 return a def :说明这是一个函数,我们定义了一个函数: fu ...
- 求a^b的约数对mod取模
+; int prime[maxn]; void marktable(int n){ memset(prime,,sizeof(prime)); ;i<=n;i++){ ]]=i; ;j< ...
- “公文流转系统 v1.0”
1.项目需求: 河北金力集团是我省机械加工的龙头企业,主要从事矿山机械制造及各种机械零部件加工.企业有3个厂区,主厂区位于省高新技术开发区,3个分厂分别在保定.邢台和唐山.为增加企业的核心竞争力和加强 ...
- vlan划分、本征vlan配置、中继
命令部分: vlan划分(全局模式) vlan name v10 no shu no shu switchport access vlan vlan name v20 inter vlan no sh ...
- [ZJOI2008] 生日聚会 - dp
共有\(n\)个男孩与\(m\)个女孩打算坐成一排.对于任意连续的一段,男孩与女孩的数目之差不超过 \(k\).求方案数. \(n,m \leq 150, k \leq 20\) Solution 设 ...
- BK: How to read a book 第一篇
第一章 阅读的活力与艺术 主动阅读 VS 被动阅读(新闻媒体) 作者与读者:投手与捕手的关系. 阅读的目标: 为获得资讯而读,以及为求得理解而读. 为获得咨讯而读,不会增加我们的理解力.比如阅读报纸, ...
- jfinal 拦截器中判断是否为pjax请求
个人博客 地址:http://www.wenhaofan.com/article/20180926013919 public class PjaxInterceptor implements Inte ...
- Docker最全教程——从理论到实战(十一)
前言 容器教程的路还很长,笔者尽量根据实践来不断地完善.由于在编写的过程中还会有完善和补充,后续可能会以番外来补充. 接下来会分享TeamCity.树莓派等内容,节奏可能会有点跳脱. 另外,长沙.NE ...
- 使用在react hooks+antd ListView简单实现移动端长列表功能
import React, { useState, useEffect } from "react" import { ListView } from "antd-mob ...
- C++-POJ1995-Raising Modulo Numbers[快速幂]
#include <cstdio> typedef long long ll; int quick_pow(ll a,ll b,ll mod){ ll ans=; ))ans=(ans*a ...