在所从事的项目中需要用到PCIE和DMA,经过再三研究,反复查看相关资料,终于弄懂了**alon_MM DMA Interface for PCIe的使用方法。

PCIE在fpga和上位机之间起着中间桥梁的作用,具有双向传输数据的功能。以下是**alon_MM DMA Interface for PCIe结构图,后面再分别详细介绍。

该ip可以使用Internal Descriptor Controller和External Descriptor Controller,下文所做介绍以Internal Descriptor Controller为基础。

接口介绍

Read DMA **alon-MM Master Port:主要完成两方面的工作:1、该模块发送读请求从host memory中取descriptor table,并将descriptor table通过**alon-MM Master 写入Descriptor Controller FIFO

2、从source address读取诗句之后,将数据写入**alon-MM 地址映射的外部DDR中。

Write DMA **alon-MM Master Port:该模块向**alon-MM 地址映射的外部DDR发送读请求,将读取的数据写入系统内存中。

RX Master Module:将从pcie接收到的读和写信号发送给**alon-MM ,request给连接在internnect的component.当Descriptor Controller在内部建立时,BAR0在内部使用,不能用作外部使用。上位机通过RXM给Descriptor Controller的寄存器进行编程,包括descriptor table的地址和大小。

descriptor controller 指示Read Data Mover 取descriptor table,并存在fifo中,controller取table并指导DMA在**alon-MM 和 PCIe之间传输数据。

TX Sl**e Module:将**alon-MM Master的读和写请求发送给PCI Express TLPs;当DMA完成时,descriptor controller利用此接口向上位机中的descriptor data写DMA status,并发送MSIinterrupts.

DMA Descriptor Controller Registers

上位机通过bar0来配置DMA Descriptor Controller Registers,read controller的地址偏置为0x0000,write controller的地址偏置为0x1000

DMA Descriptor Controller Registers for Read DMAs

RD_RC_LOW_SRC_ADDR = 0x0000 (The base address for the read descriptor table in the Root    Port

RD_RC_HIGH_SRC_ADDR = 0x0004

以上寄存器的值表示将descriptor table和status存在系统内存中的地址
 
 RD_CTLR_LOW_DEST_ADDR 0x0008
d. RD_CTLR_HIGH_DEST_ADDR = 0x000C
以上寄存器的值表示将descriptor table和status存在fpga 中onchip memory中的地址
 
RD_DMA_LAST_PTR = 0x0010
以上寄存器的值表示将最后一个descriptor table的ID,当配置该寄存器时,用来触发DMA工作。
 

WR_TABLE_SIZE=0x0014

该寄存器表示一共有多少个descriptor table

WR_CONTROL =0x0018

该寄存器[0]表示done ,当dma完成时,向descriptor table中的status写done bit。

DMA Descriptor Controller Registers for Write DMAs

同上
Read DMA and Write DMA Descriptor Table Format
 

0x00,0x04:源地址

0x08,0x0c:目的地址

0x10:[24:18],对应descriptor的ID号,[17:0],DMA发送的数据量。

完成一次DMA操作的步骤

1、计算需要分配的内存大小:描述一个descriptor 的status需要的内存为32bit,即4bytes,描述一个descriptor table需要的内存32bytes。一共最多有128个descriptor,存放status需要的内存为512bytes,存放descriptor  table 需要32bytes*128 (针对 read DMA,write DMA同样),分配内存起始地址base_address。

2、给存放数据分配内存,

3、descriptor table存在descriptor status之后,存放第一个descriptor table的起始地址为base_address+0x200

4、创建descriptor table,按照Descriptor Table Format的格式

5、通过编程配置DMA Descriptor Controller  register,配置status and descriptor table地址的寄存器,0x0,0x4

6、配置存放status and descriptor table的on_chip fifo address,对应的是**alon-MM address,internal on-chip FIFO是Descriptor Controller的一部分,就是RX Master看到的大小。

7、编程配置RD_DMA_LAST_PTR register,用来触发DMA。

如果只需要得到所有的descriptor 都完成后得到done的信号,只需要写最后一个descriptor id给0x10;

如果每一个descriptor完成后都返回done,需要对每一个descriptor都配置0x10。

8、软件可以监测到done信号。

转载自:http://www.eefocus.com/zh880813/blog/16-06/385376_89d9c.html

**alon_MM DMA Interface for PCIe使用详解的更多相关文章

  1. go语言之行--接口(interface)、反射(reflect)详解

    一.interface简介 interface(接口)是golang最重要的特性之一,Interface类型可以定义一组方法,但是这些不需要实现.并且interface不能包含任何变量. 简单的说: ...

  2. interface Part1(接口详解)

    1. 在日常生活中,手机.笔记本电脑.平板电脑等电子产品提供了不同类型的接口用于充电或者连接不同的设备. 不同类型接口的标准不一样,例如电压.尺寸等. 2. 在C#语言中,接口也会定义一种标准,如果需 ...

  3. LWIP network interface 即 LWIP 的 硬件 数据 接口 移植 首先 详解 STM32 以太网数据 到达 的第一站: ETH DMA 中断函数

    要 运行  LWIP  不光 要实现  OS  的 一些 接口  ,还要 有 硬件 数据 接口 移植 ,即 网线上 来的 数据 怎么个形式 传递给  LWIP ,去解析 做出相应的 应答  ,2017 ...

  4. Kotlin——中级篇(五):枚举类(Enum)、接口类(Interface)详解

    在上一章节中,详细的类(class)做了一个实例讲解,提到了类(class)的实例化.构造函数.声明.实现方式.和Java中类的区别等.但是对于Kotlin中的类的使用还远远不止那些.并且在上文中提到 ...

  5. linux 中/proc 详解

    proc 文件系统 在Linux中有额外的机制可以为内核和内核模块将信息发送给进程-- /proc 文件系统.最初设计的目的是允许更方便的对进程信息进行访问(因此得名),现在它被每一个有有趣的东西报告 ...

  6. linux dmesg命令参数及用法详解(linux显示开机信息命令)

    linux dmesg命令参数及用法详解(linux显示开机信息命令) http://blog.csdn.net/zhongyhc/article/details/8909905 功能说明:显示开机信 ...

  7. 21.Linux-写USB键盘驱动(详解)

    本节目的: 根据上节写的USB鼠标驱动,来依葫芦画瓢写出键盘驱动 1.首先我们通过上节的代码中修改,来打印下键盘驱动的数据到底是怎样的 先来回忆下,我们之前写的鼠标驱动的id_table是这样: 所以 ...

  8. STM32固件库详解

    STM32固件库详解   emouse原创文章,转载请注明出处http://www.cnblogs.com/emouse/ 应部分网友要求,最新加入固件库以及开发环境使用入门视频教程,同时提供例程模板 ...

  9. ipconfig/all详解

    Ipconfig/all(win+R-->cmd-->ipconfig/all)最常用的就是显示自己主机的ip了,可以让我们了解自己的计算机是否成功的租用到一个IP地址.但是ipconfi ...

随机推荐

  1. Android 获得view的宽和高

    转自:http://blog.csdn.net/yangdeli888/article/details/25405263 在oncreate()中利用view.getWidth()或是view.get ...

  2. maven编译错误,警告: BASE64Decoder是内部专用 API, 可能会在未来发行版中删除

    修改红色部分版本号为2.3.2              <plugin>                 <groupId>org.apache.maven.plugins& ...

  3. 7.volatile关键字

    volatile:一个线程修改了某一个共享变量的值,其他线程也是否能够立即知道这个修改的 1.主要是让该“变量”在多个线程中可见,在java中每一个线程都有一块自己的工作区,其中就存放着所有线程“共享 ...

  4. pidera安装node.js(树莓派)

    1. 下载node.js wget http://nodejs.org/dist/v0.10.5/node-v0.10.5-linux-arm-pi.tar.gz tar -xzvf node-v0. ...

  5. PowerDesigner概念设计模型(CDM)中的3种实体关系

    CDM 是大多数开发者使用PD时最先创建的模型,也是整个数据库设计最高层的抽象.CDM是建立在传统的ER图模型理论之上的,ER图中有三大主要元素: 实体型,属性和联系.其中实体型对应到CDM中的Ent ...

  6. go语言基础之格式化输出

    1.fmt包的格式化输出输入 格式说明 格式 含义 %% 一个%字面量 %b 一个二进制整数值(基数为2),或者是一个(高级的)用科学计数法表示的指数为2的浮点数 %c 字符型.可以把输入的数字按照A ...

  7. mysql之子查询

    所谓子查询,就是指在一个查询之中嵌套了其他的若干查询,通过子查询可以实现多表查询,该查询语句中可能包含IN,ANY,ALL和EXISTS等关键字,除此之外还可以包含比较运算符,子查询经常出现在WHER ...

  8. 怎样获取shell函数的返回值及shell命令的返回值?

    1.获取shell函数调用的返回值: #!/bin/sh info() { cat jlb.sh } res=`info` echo "state: "$? echo " ...

  9. itext处理pdf

    http://www.java2s.com/Tutorial/Java/0419__PDF/DecryptPdffile.htm

  10. 算法笔记_016:凸包问题(Java)

    目录 1 问题描述 2 解决方案 2.1 蛮力法 1 问题描述 给定一个平面上n个点的集合,它的凸包就是包含所有这些点的最小凸多边形,求取满足此条件的所有点. 另外,形象生动的描述: (1)我们可以把 ...