作者 :East  FPGA那点事儿

1.PCIe的DMA介绍
在PCIe中需要使用DMA的项目,一定要先看XAPP1052,里面包含一个DMA的参考设计,对初学者有极大的帮助。

XAPP1052中包含FPGA源代码和驱动程序源代码,其中FPGA源代码最主要的文件为:
1、《TX_ENGINE.v》:是产生TLP包的逻辑,包含读TLP请求用于DMA读;写TLP请求用于DMA写;CPLD用于BAR空间读。
2、《RX_ENGINE.v》:是解析TLP包的逻辑,包含读TLP解析用于BAR空间读、写TLP解析用于BAR空间写、CPLD解析用于DMA读。

DMA分为读和写种操作,两种操作在细节上不同。

这里先简单介绍一下DMA读过程:
1、驱动程序向操作系统申请一片物理连续的内存;
2、主机向该地址写入数据;
3、主机将这个内存的物理地址告诉FPGA;
4、FPGA向主机发起读TLP请求—连续发出多个读请求;
5、主机向FPGA返回CPLD包—连续返回多个CPLD;
6、FPGA取出CPLD包中的有效数据;
7、FPGA发送完数据后通过中断等形式通知主机DMA完成;

DMA写过程如下:
1、驱动程序向操作系统申请一片物理连续的内存;
2、主机将这个内存的物理地址告诉FPGA;
3、FPGA向主机发起写TLP请求,并将数据放入TLP包中—连续发出多个写请求;
4、FPGA发送完数据后通过中断等形式通知主机DMA完成;
5、主机从内存中获取数据;

如果是参考XAPP1052,一定要注意几点:

1.1连续内存
申请的内存一定要物理连续。DMA是直接对物理内存—也就是实际的内存条进行读写操作,必须为物理连续的内存;而应用程序和驱动程序一般只能申请到逻辑上连续的内存,在物理上不一定连续。XAPP1052中可以看到申请内存上的一些特殊处理,目的就是获取物理连续的内存,可获取4KB的物理连续内存。但是XAPP1052在内存处理上也存在一些问题,实验尚可,应用则不行。如何获取内存的物理地址在XAPP1052中已经有示范,可直接参考。

1.2将地址告诉FPGA
XAPP1052是在BAR空间开辟了一段专用地址存放DMA读地址、DMA写地址、DMA长度、TLP包大小等参数,可直接参考。

1.3写TLP请求
DMA写的操作相对简单,只需要FPGA单向发起写TLP操作即可完成,至于有没有真正写入内存一般不需要FPGA关心;而驱动程序需要等待一定时间让数据正真写入内存—中断处理的时间已经足够让数据写入内存,所以也不必特别关心。

发起写TLP请求可以连续发送,但是注意《TX_ENGINE.v》中要处理读TLP请求、写TLP请求和CPLD,所以有时会遇到三种请求竞争的情况。如果想要提高DMA的效率可以重新设定三种请求的优先级。

1.4读TLP请求
DMA读的操作相对复杂,需要FPGA向主机发出读请求,主机再返回数据。FPGA控制逻辑必须计算发起了多少个读TLP请求,再计算收到的数据是否足够。

一般来说FPGA可以一次发送所有的读请求,然后按照顺序接收数据即可。但是某些主板并不一定是按照请求的顺序返回数据的情况,可能后发出的请求先返回数据,属于主机乱序执行的现象。要么FPGA一次只发一个读请求,等数据收到了再发现一个读请求—但是效率就对不起了;要么对乱序情况进行特殊处理,XAPP1052还没有解决该问题。

1.5特殊参数
TLP包中有很多参数,例如:TC、ATTR等等,如果不了解的话,千万不要随意修改,与参考设计保持一致即可,否则很容易导致蓝屏。

1.6 DMA通道
XAPP1052中只实现了一个DMA读通道和一个DMA写通道。对于很多应用,例如两路视频采集,需要两路DMA写通道:要么把两路数据按照一定的格式整合为一个流;要么实现两路DMA写通道,XAPP1052不能直接实现。

1.7数据流量
XAPP1052整个方案的效率并不高,数据流量非常有限。数据量较少时倒是够用,数据量大了会发现CPU使用率非常高,占用一个CPU核心,但是还会丢数据。主要原因是XAPP1052一次DMA的总长度为4KB,每一次DMA完成必须以中断形式通知驱动程序,驱动程序再配置下一次DMA。从FPGA角度来说,已经做到“尽力”了,但是数据量一大CPU不停的进入中断,时间全部浪费在处理中断上了,而且CPU使用率非常高。

以上问题怎样解决下回分解!

转载自:http://xilinx.eetrend.com/blog/9829

PCIe调试心得_DMA part1的更多相关文章

  1. PCIe调试心得_DMA part3

    作者: East  FPGA那点事儿 上一章讲述了PCIe总线如何提高DMA的效率. 本章以服务器常用的4通道1000M以太网卡为例讲述如何实现多个虚拟DMA通道. 1.多通道DMA发 4通道以太网卡 ...

  2. PCIe调试心得_DMA part2

    作者:East  FPGA那点事儿 上一章讲述了PCIe总线DMA的原理和XAPP1052存在的问题. 本章以服务器常用的4通道1000M以太网卡为例讲述如何提高DMA的效率. 1.内存重分配Wind ...

  3. LPC2478_调试心得(转)

    1.在调试“E:\htwang\smart2200v201\ARM嵌入式系统实验教程(二)\开发板出厂编程程序\液晶显示程序\LCM_Disp”的程序时,想使用外部RAM进行仿真调试,在将ADS1.2 ...

  4. MIPI接口LCD屏调试心得(转)

    源: MIPI接口LCD屏调试心得

  5. VGA调试心得

    以前自己调试过视频信号,无非就时钟加行场同步加数据线,如果视频信号出问题,第一看现象,第二测频率,反正出问题不是消隐信号出问题,就是时钟频率出问题.通过这种方式也调试成功过几个显示屏,然后就以为自己对 ...

  6. js断点调试心得

    虽然网上已经有多的数不清的调试教程了,但仍然没有发现哪篇文章写的通俗易懂,索性自己尝试写写自己的一些使用习惯或者说是心得,希望对那些还不是很懂得使用断点调试的孩子有一些帮助(大神请无视~). 1.断点 ...

  7. PCI-E调试方式

    PCI-E的调试步骤 1.板子插上去之后正常情况下使用lspci 就能看的一个设备 这个设备上存在几个ID,可以根据ID可以确定设备是否识识别到 2.然后就是加载设备的驱动的时候,设备驱动会有VEND ...

  8. React Native调试心得

    在做React Native开发时,少不了的需要对React Native程序进行调试.调试程序是每一位开发者的基本功,高效的调试不仅能提高开发效率,也能降低Bug率.本文将向大家分享React Na ...

  9. Pycharm Debug调试心得

    1.操作步骤: 1-1.添加断点:直接在标记处点击鼠标左键即可.(删除断点只需再点击断点处即可) 1-2.Debug下运行代码 1-3.按照所需调试进行代码调试.Debug的调试方式如下所示: 分别为 ...

随机推荐

  1. [Gradle] Gradle 简介

    Gradle 是以 Groovy 语言为基础,面向Java应用为主.基于DSL(领域特定语言)语法的自动化构建工具. Ø gradle对多工程的构建支持很出色,工程依赖是gradle的第一公民. Ø ...

  2. Hive安装与配置——深入浅出学Hive

    第一部分:软件准备与环境规划 Hadoop环境介绍 •Hadoop安装路径 •/home/test/Desktop/hadoop-1.0.0/ •Hadoop 元数据存放目录 •/home/test/ ...

  3. 权限项目总结(四) shiro 授权

    概述 Authorization(授权):不难理解,授权就是用来控制当前訪问用户在訪问系统资源权限. 这个词也做证书的解释,从证书这个角度来讲,推断是否拥有对资源訪问的权限时.当前用户须要提供证书. ...

  4. Android宝典入门篇-进阶

    学习Android前后有快有1个月了,本着不耍流氓,谈恋爱就要结婚的信念(其实AD开发也挺有趣的),做了自己的第一个Android小应用.本来准备今天和大家分享的,考虑到在不同屏幕上的效果没测试和本着 ...

  5. CUDA使用Event进行程序计时

    GPGPU是众核设备,包含大量的计算单元,实现超高速的并行. 使用CUDA在nvidia显卡上面编程时,可以使用CUDA提供的Event进行程序计时. 当然,每种编程语言基本都提供了获取系统时间的函数 ...

  6. 十个书写Node.js REST API的最佳实践(上)

    收录待用,修改转载已取得腾讯云授权 原文:10 Best Practices for Writing Node.js REST APIs 我们会通过本文介绍下书写Node.js REST API的最佳 ...

  7. LeetCode 303 Range Sum Query - Immutable(范围总和查询-永久不变)(*)

    翻译 给定一个整型数组nums,找出在索引i到j(i小于等于j)之间(包含i和j)的全部元素之和. 比如: 给定nums = [-2,0,3,-5,2,-1] sumRange(0, 2) -> ...

  8. 非阻塞I/O

    http://blog.163.com/tyw_andy/blog/static/1167902120099163252164/ 套接口缺省是阻塞的.这一点意味着当发出一个不能立即完成的套接口调用时, ...

  9. windows下flv视频网站进度条随意拖放[转]

    网站中视频都转换成flv格式,奈何flv格式无法拖拽,此问题纠结了好久,最终得以解决.现将解决思路记录下来,大多数源于网上找到的. 视频拖拽满足要求 1.播放器要支持 2.flv视频要有关键帧和met ...

  10. I/O复用的应用场合

    I/O复用(select.poll)典型使用在下列网络应用场合: (1)当客户处理多个描述字(通常是交互式输入和网络套接口)时,必须使用I/O复用. (2)一个客户同时处理多个套接口是可能的,不过比较 ...