在所从事的项目中需要用到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. [翻译] UIView-draggable 可拖拽的UIView

    UIView-draggable 可拖拽的UIView https://github.com/andreamazz/UIView-draggable UIView category that adds ...

  2. [翻译] TSActivityIndicatorView 自定义指示器

    TSActivityIndicatorView 自定义指示器 https://github.com/tomkowz/TSActivityIndicatorView TSActivityIndicato ...

  3. 为jquery ajax请求增加正在运行提示

    在jquery源码中增加showMask()方法调用: if ( xhrSupported ) { jQuery.ajaxTransport(function( options ) { // Cros ...

  4. linux开机启动的三种方式

    参考:www.cnblogs.com/gzggyy/archive/2012/08/07/2626574.html 一./etc/rc.local 其中的rc.local是在完成所有的系统初始化之后执 ...

  5. 使用ssh向sqlserver2005数据库中保存image类型的二进制图片

    1.首先设计数据库表,其中photo.photo2字段均为image类型的. 2.建立实体bean对象,设置两个字段为byte[]如:private byte[] photo; private byt ...

  6. centos7 selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH

    1.查看安装的chrome浏览器版本 2.查看版本对应的驱动 https://sites.google.com/a/chromium.org/chromedriver/downloads 下载后拷贝到 ...

  7. [Python爬虫] 之一 : Selenium+Phantomjs动态获取网站数据信息

    本人刚才开始学习爬虫,从网上查询资料,写了一个利用Selenium+Phantomjs动态获取网站数据信息的例子,当然首先要安装Selenium+Phantomjs,具体的看 http://www.c ...

  8. Understanding the JavaScript Engine—— two phase

    Understanding the JavaScript Engine — Part 1   I have been a Ruby on Rails developer for the last 2 ...

  9. RS中的关系引用不明确以及行列自动添加了追溯

    问题1:由于在FM模型的物理层是自己新建了查询主题,查询主题采用对已经存在的表进行sql处理然后重命名, 使用的是sql类型的数据源,sql类型设置的查询类型是默认的cognos类型,而语法是本地的结 ...

  10. [译]使用scikit-learn进行机器学习的简介(教程1)

    原文:http://www.cnblogs.com/taceywong/p/4568806.html 原文地址:http://scikit-learn.org/stable/tutorial/basi ...