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. 第十周 11.28 psp0

    课堂测试总结 学生:马小心                                              日期:2017.11.28 作业号 日期 过程 估计数据 实际数据 累计数据 时间 ...

  2. UnicodeDecodeError: 'gbk' codec can't decode byte 0xfe in position 45: illegal multibyte sequence

    常见的一种解码错误如题目所示,下面介绍该错误的解决方法 (1).首先在打开文本的时候,设置其编码格式,如:open(‘1.txt’, encoding=’gbk’): (2).若(1)不能解决,可能是 ...

  3. abp demo运行1

    1.从官方网站下载demo 如下: https://aspnetboilerplate.com/Templates 填写响应的信息,下载demo 2.vs2017打开demo,如下图: 3.安装.ne ...

  4. 安装postman时遇到“无法定位程序输入点 SetDefaultDllDirectories于动态链接库KERNEL32.dll 上.”的问题

    安装postman时遇到“无法定位程序输入点 SetDefaultDllDirectories于动态链接库KERNEL32.dll 上.”的问题 解决办法: 1.安装系统更新补丁KB2533623,下 ...

  5. python之路正则补充模块

    match(从头匹配) 无分组  有分组=====================有括号 ======================================================= ...

  6. HttpApplication处理管道处理过程简单描述

    HttpApplication对象是由Asp.net帮助我们创建的,它是asp.net中处理请求的重要对象.为了便于扩展,HttpApplication采用处理管道的方式进行处理,将处理的步骤分为多个 ...

  7. 【C语言】思维导图

    长按图片或右键另存为保存哦(´-ω-`)

  8. oracle 数据库手动备份和恢复

    一.备份命令: 1.cmd  : exp 2.cmd  :用户名/密码@ip地址/数据库名  如:     yyj/yyj@172.12.5.5/orcl    要导出的数据库 3.回车:输入要输出的 ...

  9. Postgresql 教程

    Official 教程 关闭postgresql服务 PostgreSQL帐号 1. PostgreSQL 用户帐号和操作系统用户帐号是不同的,系统用户帐号是postgres. sudo -u pos ...

  10. Tomcat 加载外部dll时如何配置

    1.在myeclipse环境下配置 先将dll放置在c:\windows\system32中,然后在myEclipse中,window->Preferences->MyEclipse-&g ...