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映射到相应的虚拟基地址

  1. if( ( fd(fd =open( "/d / " ( O RDWR | O SYNC ) ) )"/dev/mem" , (O_ RDWR|O_ SYNC))) == -1 ) {){
  2. printf( "ERROR: could not open "/dev/mem"...\n" );
  3. return( 1 );1);
  4. }
  5. virtual_base =mmap( NULL, HW_REGS_SPAN, ( PROT_READ |
  6. 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)

  1. h2_lw_led_addr= virtual_base +  ( ( unsigned long)(
  2. ALT_LWFPGASLVS_OFST+PIO_LED_BASE) & ( unsigned
  3. long)(HW_REGS_MASK) )
 
 

HPS—虚拟地址映射的更多相关文章

  1. linux下c通过虚拟地址映射读写文件的代码

    在代码过程中中,把开发过程中比较好的一些代码片段记录起来,如下的代码内容是关于 linux下c通过虚拟地址映射读写文件的代码,应该对小伙伴有些好处.#include<stdio.h>#in ...

  2. 通过HPS控制FPGA端的GPIO

    该笔记主要记录HPS端如何通过AXI Bridge控制FPGA端口的GPIO,主要是如何操作FPGA侧的Led 1.AXI Bridge         AXIB主要包括H2FB.F2HB.LWH2F ...

  3. HPS端如何通过AXI Bridge控制FPGA端口的GPIO

    该笔记主要记录HPS端如何通过AXI Bridge控制FPGA端口的GPIO,主要是如何操作FPGA侧的Led 1.AXI Bridge         AXIB主要包括H2FB.F2HB.LWH2F ...

  4. Linux内存管理之地址映射

    写在前面:由于地址映射涉及到各种寄存器的设置访问,Linux对于不同体系结构处理器的地址映射采用不同的方法,例如对于i386及后来的32位的Intel的处理器在页式映射时采用的是2级页表映射,而对于I ...

  5. 内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现

    http://blog.csdn.net/pi9nc/article/details/23334659 注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料 ...

  6. linux 内核源代码情景分析——地址映射的全过程

    linux 内核采用页式存储管理.虚拟地址空间划分成固定大小的"页面",由MMU在运行时将虚拟地址映射成某个物理内存页面中的地址.页式内存管理比段式内存管理有很多好处,但是由于In ...

  7. ARM-汇编指令集(总结)

    ARM汇编指令集 指令.伪指令 (汇编)指令:   是机器码的助记符,经过汇编器编译后,由CPU执行. (汇编)伪指令:用来指导指令执行,是汇编器的产物,最终不会生成机器码. 有两种不同风格的ARM指 ...

  8. MIT 6.828 JOS学习笔记10. Lab 1 Part 3: The kernel

    Lab 1 Part 3: The kernel 现在我们将开始具体讨论一下JOS内核了.就像boot loader一样,内核开始的时候也是一些汇编语句,用于设置一些东西,来保证C语言的程序能够正确的 ...

  9. 【转载】64 位 Windows 内核虚拟地址空间布局(基于 X64 CPU)

    原文链接:http://shayi1983.blog.51cto.com/4681835/1734822 本文为原创翻译,原文出处为 http://www.codemachine.com/articl ...

随机推荐

  1. Invalid Native Object

    发现是因为没有addChild到父节点上引起的

  2. 曼孚科技:AI领域3种典型的深度学习算法

    ​深度学习(Deep Learning)是机器学习(Machine Learning)领域中一个新的研究方向,引领了第三次人工智能的浪潮. 本文整理了深度学习领域3种典型的算法,希望可以帮助大家更好地 ...

  3. vjudge I - Vladik and fractions 一道小学生的提。

    原题链接:https://vjudge.net/contest/331993#problem/I Vladik and Chloe decided to determine who of them i ...

  4. meet in the middle 折半搜索 刷题记录

    复杂度分析 假设本来是n层,本来复杂度是O(2^n),如果meet in middle那就是n/2层,那复杂度变为O( 2^(n/2) ),跟原来的复杂度相比就相当于开了个方 比如如果n=40那爆搜2 ...

  5. 如来十三掌-关于不断解密的密码学,佛语解密,rot-13(根据13掌),base64

    得到MzkuM3gvMUAwnzuvn3cgozMlMTuvqzAenJchMUAeqzWenzEmLJW9 然后尝试嘛 base64不太行 那根据十三掌??rot-13 得到ZmxhZ3tiZHNj ...

  6. python调用HEG工具批量处理MODIS数据

    下面的代码主要用于使用python语言调用NASA官方的MODIS处理工具HEG进行投影坐标转换与重采样批量处理 主要参考 HEG的用户手册:https://newsroom.gsfc.nasa.go ...

  7. 高级特征工程II

    以下是Coursera上的How to Win a Data Science Competition: Learn from Top Kagglers课程笔记. Statistics and dist ...

  8. 洛谷P1603 斯诺登的密码

    https://www.luogu.org/problem/P1603 #include<bits/stdc++.h> using namespace std; struct s { st ...

  9. matplotlib 做图通过弹出窗口展示 spyder

    tools =>preferences=>Ipython console=>Graphics Graphics backend 中Backend 由Inline改为 Automati ...

  10. 如何修改C# winform程序图标

    以Visual Studio 2012 C# Winform程序为例 一.程序内部显示图标的修改方法 在窗体的属性窗口找到icon属性,设置成已经准备好的ico格式的文件,效果如下 二.程序外部显示图 ...