作者: 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. 关闭ubuntu终端的BELL声音

    在shell提示符下面操作时有时会用到Tab来自动补全,这个时候系统就会发出BELL的声音,听了让人挺烦的. 有个方法能解决:编辑 /etc/inputrc,找到#set bell-style non ...

  2. component和bean区别

    @Component and @Bean do two quite different things, and shouldn't be confused. @Component (and @Serv ...

  3. 深入浅出Java垃圾回收机制(一)(转载)

    转载来做笔记的:原文地址:http://www.importnew.com/1993.html. 对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲 ...

  4. AIX查看系统安装时间和运行时长

    $ lslpp -h bos.mp* --AIX系统的安装时间,可以通过bos.mp和bos.mp64文件集的安装时间得知 Fileset Level Action Status Date Time ...

  5. VC++6.0 IDE的工程用Code::Blocks来打开、编译、调试终极配置方案

    本篇文章转自 CSDN blog,转载请注明出处! 原文地址: http://blog.csdn.net/liquanhai/article/details/6618300 引子:竟然可以用Code: ...

  6. Android学习系列(5)--App布局初探之简单模型

    人类科技的进步源自探索,探索来自于发现本原,当然App布局没这么先进,本文也只是一个归类总结.这篇文章是Android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. Androi ...

  7. 非IE内核浏览器如何支持activex插件

    原文地址:https://blog.csdn.net/johnson2008t/article/details/46126605 之前在一个B/S项目中遇到一个需求,就是客户需要在页面上对报表的布局以 ...

  8. python学习笔记——multiprocessing 多进程中的重构方法__init__

    重构: import multiprocessing import time class ClockProcesses(multiprocessing.Process): def __init__(s ...

  9. php 文件上传,下载

    文件下载: html: <html> <body> <a href="1.rar">下载1.rar</a> <br /> ...

  10. Linux内存初始化(一)

    一.前言 一直以来,我都非常着迷于两种电影拍摄手法:一种是慢镜头,将每一个细节全方位的展现给观众.另外一种就是快镜头,多半是反应一个时代的变迁,从非常长的时间段中,截取几个典型的snapshot,合成 ...