0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PCIe的DMA介绍

FPGA设计论坛 来源:FPGA设计论坛 作者:FPGA设计论坛 2022-08-03 14:15 次阅读

在PCIE中有两种数据传输方式:

DMA(Direct Memory Access),直接内存访问,在该模式下,数据传送不是由CPU负责处理,而是由一个特殊的处理器DMA控制器来完成,因此占用极少的CPU资源。

PIO(Programmed Input-Output),可编程输入输出,在该模式下,数据传送由CPU执行I/O端口指令来按照字节或更大的数据单位来处理,占用大量的CPU资源,数据传输速度也大大低于DMA模式。举例老说,在DMA方式下,如果copy文件的同时在播放mp3音乐,则不受丝毫影响;如果在PIO模式下,则会发现音乐声时断时续,这是因为大部分CPU资源被文件传输占用。

所以,总的来说,使用DMA模式时,计算机的运行速度会比使用PIO模式快很多。

在xilinx中生成IP核后,工程文件夹下会有这两个文件夹:

[Xilinx_PCIe_BMD] xilinx FPGA 开发 pcie BMD DMA的verilog HDL源码[example_design] xilinx pcie总线 pio模式下的控制器代码。包含接收发送模块,存储模块,控制模块等。

1.DMA概念

DMA的英文拼写是“Direct Memory Access”,汉语的意思就是直接内存访问。

内存与内存(外设)交换数据不经过CPU。

使用DMA的好处就是它不需要CPU的干预而直接服务外设,这样CPU就可以去处理别的事务,从而提高系统的效率,对于慢速设备,如UART,其作用只是降低CPU的使用率,但对于高速设备,如硬盘,它不只是降低CPU的使用率,而且能大大提高硬件设备的吞吐量。因为对于这种设备,CPU直接供应数据的速度太低。因CPU只能一个总线周期最多存取一次总线,而且对于ARM,它不能把内存中A地址的值直接搬到B地址。它只能先把A地址的值搬到一个寄存器,然后再从这个寄存器搬到B地址。也就是说,对于ARM,要花费两个总线周期才能将A地址的值送到B地址。而DMA就不同了,一般系统中的DMA都有突发(Burst)传输的能力,在这种模式下,DMA能一次传输几个甚至几十个字节的数据,所以使用DMA能使设备的吞吐能力大为增强。

对于任何类型的DMA传输,我们都需要规定数据的起始源和目标地址。对于外设DMA的情况来说,外设的FIFO可以作为数据源或者目标端。当外设作为源端时,某个存储器的位置(内部或外部)则成为目标端地址。当外设作为目标端,存储的位置(内部或者外部)则成为源端地址

2.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使用率非常高。

审核编辑:彭静

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PCIe
    +关注

    关注

    13

    文章

    1088

    浏览量

    80977
  • dma
    dma
    +关注

    关注

    3

    文章

    537

    浏览量

    99165
  • 源代码
    +关注

    关注

    95

    文章

    2929

    浏览量

    66097

原文标题:PCIE之DMA

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    高性能NVMe主机控制器,Xilinx FPGA PCIe 3

    NVMe Host Controller IP1介绍NVMe Host Controller IP可以连接高速存储PCIe SSD,无需CPU和外部存储器,自动加速处理所有的NVMe协议命令,具备
    发表于 04-20 14:41

    基于安路PCIe SGDMA高速数据传输方案

    安路科技提供基于PCIe 硬核控制器开发的SGDMA IP。SGDMA可作为一个PCIe2AXI4系列接口的桥或者一个高性能DMA使用。
    的头像 发表于 04-08 14:29 192次阅读
    基于安路<b class='flag-5'>PCIe</b> SGDMA高速数据传输方案

    8路SDI/HDMI/MIPI/PCIe-DMA音视频采集,V4L2驱动应用介绍

    基于PCIe的多路视频采集与显示子系统1 概述视频采集与显示子系统可以实时采集多路视频信号,并存储到视频采集队列中,借助高效的硬实时视频帧出入队列管理和PCIe C2H DMA引擎,将采集到的视频帧
    发表于 03-13 13:59

    Xilinx FPGA NVMe主机控制器IP,高性能版本介绍应用

    NVMe Host Controller IP1介绍NVMe Host Controller IP可以连接高速存储PCIe SSD,无需CPU和外部存储器,自动加速处理所有的NVMe协议命令,具备
    发表于 03-09 13:56

    Xilinx FPGA 1/4/8通道PCIe-DMA控制器IP,高性能应用介绍

    Multi-ChannelPCIe QDMA&RDMA IP1 介绍基于PCI Express Integrated Block,Multi-Channel PCIe QDMA
    发表于 03-07 13:54

    Xilinx高性能PCIe DMA控制器IP,8个DMA通道

    基于PCI Express Integrated Block,Multi-Channel PCIe QDMA Subsystem实现了使用DMA地址队列的独立多通道、高性能Continous
    的头像 发表于 02-22 11:11 341次阅读
    Xilinx高性能<b class='flag-5'>PCIe</b> <b class='flag-5'>DMA</b>控制器IP,8个<b class='flag-5'>DMA</b>通道

    PCIe控制器(FPGA或ASIC),PCIe-AXI-Controller

    Transaction Layer的所有功能特性,不仅内置DMA控制器,而且具备AXI4用户接口,提供一个高性能,易于使用,可定制化的PCIe-AXI互连解决方案,同时适用于ASIC和FPGA。
    的头像 发表于 02-21 15:15 280次阅读
    <b class='flag-5'>PCIe</b>控制器(FPGA或ASIC),<b class='flag-5'>PCIe</b>-AXI-Controller

    体验紫光PCIEDMA读写/PIO内存读写TLP解析

    为CplD),Byte Count为0x004,TAG为0x00,其他信息对座入号就行了。具体的含义可查询PCIE协议规范。 1.2 DMA读写操作TLP解析 DMA直接内存访问,内存访问的发起者是FPGA
    发表于 11-17 15:08

    体验紫光PCIE之使用官方驱动在Windows下进行DMA读写操作/PIO读写操作

    的PICE驱动是最佳选择。 官方也提供了一个在Windows的驱动例程,该例程能够完成PCIEDMA读写操作和PIO内存读写操作,但是该驱动并未完全适配IP生成的官方例程,官方提供另一份的FPGA的工程与之
    发表于 11-17 14:55

    体验紫光PCIE之使用WinDriver驱动紫光PCIE

    example例程。紫光的PCIE IP虽然没有像xilinx那样可以直接使用Block Design设计,但是仔细读一遍官方例程的DMA模块,进而开发自己的东西,还是能够很好用起来紫光的PCIE
    发表于 11-17 14:35

    SWM341 DMA2D模块介绍

    SWM341 DMA2D模块介绍
    的头像 发表于 11-06 17:11 426次阅读
    SWM341 <b class='flag-5'>DMA</b>2D模块<b class='flag-5'>介绍</b>

    PCIe引脚定义和PCIe协议层介绍

    本文我们将向大家介绍PCIe引脚定义以及PCIe协议层。
    发表于 09-26 11:39 7981次阅读
    <b class='flag-5'>PCIe</b>引脚定义和<b class='flag-5'>PCIe</b>协议层<b class='flag-5'>介绍</b>

    全爱科技Atlas200I A2 AI加速模块-FPGA PCIE接口验证平台

    Xilinx的官方PCIE 2.0 IP核或0 IP核,用来实现PCIE 硬核IP的例化; 使用DMA控制器,实现PCIE DMA操作,
    发表于 09-05 14:39

    基于AMD FPGA的PCIE DMA逻辑实现

    AMD FPGA自带PCIE硬核,实现了PCIE协议,把串行数据转换为并行的用户数据
    的头像 发表于 07-14 15:53 1063次阅读
    基于AMD FPGA的<b class='flag-5'>PCIE</b> <b class='flag-5'>DMA</b>逻辑实现

    基于AMD FPGA的PCIE DMA逻辑实现

    AMD FPGA自带PCIE硬核,实现了PCIE协议,把串行数据转换为并行的用户数据,以UltraScale系列FPGA为例,其支持Gen1.02.03.04.0,1~16 Lanes,如下图所示。
    的头像 发表于 06-09 09:34 997次阅读
    基于AMD FPGA的<b class='flag-5'>PCIE</b> <b class='flag-5'>DMA</b>逻辑实现