作者: East  FPGA那点事儿

上一章讲述了PCIe总线如何提高DMA的效率。

本章以服务器常用的4通道1000M以太网卡为例讲述如何实现多个虚拟DMA通道。

1.多通道DMA发

4通道以太网卡的数据相互独立,需要4个虚拟DMA发通道实现4路数据独立传输。4个虚拟DMA发通道如下:

多通道DMA发比较简单,因为TLP包中已经包含了具体的物理地址,4个虚拟通道可以向4个不同的物理内存位置写数据。所以DMA发逻辑与单通道DMA发逻辑没有什么不同,关键点在增加的总线仲裁逻辑。

4个网口都有数据要进行DMA发,发起TLP写请求,需要占用PCIe总线;4个网口还要进行DMA收,发起TLD读请求;主机的BAR读操作要占用PCIe总线。但是PCIe总线只有1个逻辑通道(即使PCIe总线物理层为x4或更高宽度,但逻辑通道数是1),所以各通道必须分时复用PCIe总线。

总线仲裁逻辑正是进行分时复用调度的功能。各种数据包有各自的特点:BAR读操作较少,为了提高上位机的处理效率,一般希望BAR读操尽快完成;TLP写请求包较大,会占用较长的总线时间;TLP读请求包小,但是包数量多,占用的总线带宽不可忽视。

所以总线仲裁逻辑可以设置优先级:仲裁逻辑以TLP包为单位,总线采用抢占式调度,即必须一个TLP包传输完成再判断下次给哪个通道使用总线;高优先级的通道可以优先占用PCIe总线,直到TLP包传输完成后才能给低优先级的通道使用;相同优先级的通道采用轮询方式调度,这样每个通道占用总线的机会相同。

一般会将BAR读放在最高优先级,这样可以让FPGA以最快的速度响应,减少上位机等待时间;在本案例中4个DMA发通道和4个DMA收通道需要相同的优先级,放在第二优先级。在一些特殊的应用中也可以将各DMA通道放在不同的优先级,实现重要数据优先传输,普通数据空闲时传输的功能。

2.多通道DMA收

DMA收的过程本身就比DMA发复杂,需要FPGA先发起读请求,主机再返回数据才能完成DMA收的过程。4个虚拟DMA收通道框图如下:

多个DMA收通道可以对多个内存地址就行读操作。多通道DMA收逻辑发起TLP读请求的方式与单通道DMA读相同。读请求也要通过总线仲裁逻辑分时复用PCIe总线。

这里增加了数据判别逻辑。DMA发的过程只需要FPGA发起TLP写请求,请求中已经包含了物理地址,不会引起数据错乱;而DMA收的过程中,FPGA发起TLP读请求包含了物理地址,但是主机返回的CPLD包中只有低6bit物理地址,不能通过物理地址判断是哪一个通道的数据包。所以需要在TLP读请求包中对每一个虚拟通道做上特殊标记,这样才能分辨主机返回的CPLD包是哪个通道读请求返回的数据包。

转载:http://xilinx.eetrend.com/blog/9836

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

  1. PCIe调试心得_DMA part2

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

  2. PCIe调试心得_DMA part1

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

  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. C#.NET常见问题(FAQ)-如何把函数名作为参数传递给另一个函数

    在主窗体中使用的还是普通的函数,但是test函数有一个新的参数,就是method   这个method所指向的就是前面委托定义的method     更多教学视频和资料下载,欢迎关注以下信息: 我的优 ...

  2. Python标记去重

    预逻辑脚本代码: uniqueList = [] def isDuplicate(inValue): if inValue in uniqueList: return 1 else: uniqueLi ...

  3. Java中执行存储过程和函数(web基础学习笔记十四)

    一.概述 如果想要执行存储过程,我们应该使用 CallableStatement 接口. CallableStatement 接口继承自PreparedStatement 接口.所以CallableS ...

  4. 解决document.location.href下载文件时中文乱码

    1:tomcat 安装路径下 找到 conf文件下的server.xml 2:<Connector port="8080" URIEncoding="utf-8&q ...

  5. linux - 文件夹、文件默认属性: umask使用

    一 权限掩码umask umask是chmod配套的.总共为4位(gid/uid,属主.组权,其他用户的权限),只是通经常使用到的是后3个.比如你用chmod 755 file(此时这文件的权限是属主 ...

  6. js-知识集锦

      CreateTime--2016年9月22日14:37:51Author:Marydonjs小知识点集锦1. JSON.stringify(Obj);//将Object对象转换成json格式的st ...

  7. 使用String 的 intern做锁提高并发能力

    一个场景: 某段代码只对同一个ip过来的请求同步处理: 比如ip为a的请求进入了同步代码块,那么后续的ip为a的请求则在代码块外边等着,这时来了一个ip为b的请求,那么这个请求也可以进去,也就是a的所 ...

  8. redis编译

    简介: Redis是Nosql中比较出名的,分布式数据库缓存,提升相应的速度,降低对数据库的访问! Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,(永久 ...

  9. 微信小程序信息展示

    概述 使用第三方在线API模拟数据,进行微信小程序开发.不会后端开发也可以体验微信小程序. 详细 代码下载:http://www.demodashi.com/demo/10719.html 一.准备工 ...

  10. 社区类 App 如何引导用户发帖和产生内容?

    作者:Pmer在路上链接:http://www.zhihu.com/question/25502904/answer/31342246来源:知乎著作权归作者所有,转载请联系作者获得授权. ugc的产出 ...