Xilinx PCIE DMA--Sparten6/Kintex-7 BMD 搭建
目录
前言
1、DMA数据流简介
1.1 FPGA发DMA数据到PC
1.2 数据从PC搬到FPGA
2、PCIE 软件开发环境
3、Xapp1052下载
4、Kintex-7 BMD工程搭建
5、Sparten6 BMD工程搭建
参考文献
前言
本文主要以xapp1052作为学习材料,以Sparten6/Kintex-7芯片作为搭建BMD工程举例。
关于BMD工程的仿真环境的搭建,可以参考“Xilinx PCIE DMA 仿真环境搭建”。
相关博客可以参考:
五、Xilinx PCIE CORE学习;
六、Xilinx PCIE DMA--Sparten6/Kintex-7 BMD
七、Xilinx PCIE DMA 仿真环境搭建
八、 win10 jungo windriver
本文仅是基于xapp1052,搭建两种芯片的BMD工程。
关于xapp1052有几点说明:
(1)首先,官方提供的xapp1052工程,主要用于测试DMA收发数据的效率,
官方提供完整的DMA收发示例、PIO仿真文件、示例工程可以板级调试;
(2)其次,该xapp1052工程没有将PC发送的FPGA的数据存储下来,而仅是与一个固定数值做比较,测试DMA传输效率;
(3)以及,该xapp1052工程发送的数据,仅是发送 通过PIO配置WDMATLPP寄存器里的数据,即用于测试DMA传输效率;
(4)最后,鉴于本人是初学者,整理的比较浅显,还是请读者多看看参考文献吧!
软件:ISE14.4/14.7
官网:xapp1052
1、DMA数据流简介
简述PIO与DMA的区别:
PIO操作:通常,PIO传输的数据仅有一个,即MWr、CPLD这类TLP报文里,仅包含一个有效数据。
DMA操作:通常,DMA传输的数据有多个,即MWr、CPLD这类TLP报文里, 包含多个有效数据。
只不过,为了进行DMA的操作,需要提前配置一些控制寄存器;这些配置控制寄存器的过程,是PIO操作。
当MWr、CPLD开始传输多个有效数据时,才是DMA操作。所以,显的复杂一点。
DMA数据传输概述:
首先需要说明:
下面介绍的传输类型,是FPGA作为master主动发起读写请求,PC作为从机进行响应;
实际使用中,FPGA、PC谁都可以作为master,下面的介绍仅是一种参考。
(1)FPGA发DMA数据到PC
首先,PC通过下文figure3配置步骤1-7,该过程是PIO操作,每次配置一个寄存器;
然后,DMA发送模块,发起 存储器写访问事务(MWr),给PC 发送包含数据的写TLP数据包,举例如下图7-5所示。
即这个TLP数据包,包含 1个头标 +n个DW数据,实现DMA数据的传输!
最后,待数据传输完毕,FPGA应该会发送一个中断信号,提示PC数据传输结束;
(2)PC发DMA数据到FPGA
首先,PC通过下文figure4配置步骤1-6,该过程是PIO操作,每次配置一个寄存器;
然后,FPGA的DMA发送模块,发起存储器读请求事务(MRd),给PC发送一个存储器 读请求TLPs,该过程是PIO操作;
再然后,PC返回带数据的完成报文CPLD,FPGA的DMA接收模块、接收该数据流,该过程是DMA操作;
PC返回的CPLD报文如下图所示,下图仅是个举例,可能不完全正确。
该CPLD数据包,包含:一个头标 + n个数据,实现数据的DMA传输!应该类似于下图吧,下图可能不完全正确!
仅是方便理解,才贴上下图的 ....... =。=
最后,带数据传输完毕,FPGA应该会发送一个中断信号,提示PC数据传输结束;
详细传输流程,见下文吧。
1.1 FPGA发DMA数据到PC
有一点需要说明一下,
在上面的步骤4中,组织PCIe Memory Write TLPs时,发送模块发送的是写MEM数据包,即存储器写访问事务(MWr)类型,将待发送的DMA数据发送给PC;
这里FPGA发送模块并不是通过CPLD完成报文的形式将数据发送给PC的。
读者可以细细品味一下两者的区别。
下图是官方提供的xapp1052中,测试FPGA发DMA数据到PC的步骤。
关于下图步骤6有一点需要说明,
PC通过PIO操作配置WDMATLPP寄存器,将测试数据data写入WDMATLPP寄存器;
然后,当启动DMA操作时,发送引擎将WDMATLPP中的数据data重复发送给PC,用以测试DMA写MEM(指PC内存)的效率。
下图是官方提供xapp1052中发送模块对应的几种事务类型,这里引用博主CLGo 的博客里的相关介绍。
值得注意的是:
(1)BMD_64_CPLD_FMT_TYPE:是PIO模式,
标志着发送一个带数据的完成包,这个使用在PC端向FPGA发送一个存储器读请求后,FPGA通过这个报文将存储器信息返回到PC端;
(2)BMD_64_MWR_FMT_TYPE、BMD_64_MWR64_FMT_TYPE:是DMA模式,
标志着FPGA发送存储器 写请求TLPs(MWr),这个使用在启动DMA写时,发送引擎组建存储器写请求包将数据发送到PC上;
(3)BMD_64_MRD_FMT_TYPE、BMD_64_MRD64_FMT_TYPE :是DMA模式,
标志着FPGA发送存储器 读请求TLPs(MRd),
这个使用在PC配置启动DMA读时,发送引擎组建存储器读请求包,PC发送带数据的完成包到FPGA上,被接收引擎接收。
1.2 数据从PC搬到FPGA
大概过程如下:
(1)首先电脑申请一片连续内存,
(2)接着电脑通过PIO模式配置FPGA上的控制状态寄存器(就是表格中的Step1~Step6),
(3)然后FPGA检测到读DMA请求后,发送引擎组装 存储器 读请求报文(MRd) 并发送,
(4)接收引擎接收电脑反馈的完成包CPLD,
(5)最后,FPGA发送中断结束传输。
下图是官方提供的Xapp1052中,测试PC发DMA数据到FPGA的步骤。
关于Xapp1052提供的BMD接收引擎,并结合上面的步骤(4)和下面的步骤1-8有一点需要说明一下:
在接收引擎开始接收来自PC返回的CPLD数据包时,接收引擎并没有将该DMA数据存入FPGA内部缓存MEM,
而是将接收到的数据与RDMATLPP寄存器中的数据进行数据比较,但配置RDMATLPP寄存器的过程,却没有在下面的步骤1-8中体现。在xapp1052的PDF中,相关描述如下:
下图是官方提供xapp1052中接收模块对应的几种事务类型,这里引用博主CLGo 的博客里的相关介绍。
值得注意的是:
(1)BMD_MEM_RD32_FMT_TYPE 、BMD_MEM_WR32_FMT_TYPE :是PIO事务,
两种标头对应的TLP是以PIO的模式传输,其作用是上位机读写DMA控制状态寄存器,就是上文的DMA体系结构中的Control and Status Registers。
(2)BMD_CPL_FMT_TYPE 、BMD_CPLD_FMT_TYPE :是DMA事务,
是FPGA发送 DMA读请求(MRd)后,PC端反馈的完成包CPLD是DMA模式。
下图是PIO配置一些寄存器的整理:
2、PCIE 软件开发环境
目前对PCIe 部分的上位机驱动开发的软件比较常用的是windriver 和DDK 这2 款开发工具。DDK 是Device Development Kit,设备开发包的意思。为windows 设备驱动程序开发包。一般是在VC 或者VS 软件环境下进行开发。相对于Windriver,DDK 需要开发人员对驱动更加深入的了解。
Windriver 是jungo 公司为驱动程序开发提供的一个工具,特别适合初学者使用。它把PC 硬件系统的驱动程序开发进行了高度的集成和封装,开发者甚至不需要设计驱动程序,所需要做的工作几乎仅仅是保证设备的硬件和相应固件设计正确,然后进行
应用程序的设计,而应用程序的设计也可以通过对Windriver 产生的debug 程序进行修改而得到。
WinDriver™ PCI / ISA User's Manual
软件驱动开发
安装好Windriver后,即可完成PCIe驱动的开发了。首先你需要安装VS2008,用来打开Windriver的驱动源码,并进行修改和测试。下面我们来详细的了解整个软件
开发和测试的流程。
Step1 : 我们首先找到Windriver的安装目录,如图所示,在安装目录下有各个公司的开发工程以及开发软件包。这里我们找到xilinx文件夹,进入下一步。
打开Windriver 软件,并新建工程项目,用户可以为自己的设备生成相关的INF 驱动文件,这里如果用户下载了我们板卡所提供的PCIE 文件至开发板,则可在如图8-2-4 中找到我们的XILINX PCIe 设备,点击Gneratate .INF file。
如图8-2-5所示,用户可以自定义厂商的ID,设备ID以及设备类型,修改相关属性后,勾选上automatically install the INF file,即可完成PCIE的驱动安装。
安装完成后,用户即可在设备管理器中找到自定义的设备
软件驱动开发
Step1 : 我们首先找到Windriver的安装目录,如图8-2-7所示,在安装目录下有各个公司的开发工程以及开发软件包。这里我们找到xilinx文件夹,进入下一步。
Step2 : 使用VS2008 打开“安装路径\xilinx\virtex5\bmd\diag\x86\msdev_2008”里的工程,如图8-2-8所示。本工程虽然是Virtex5型号的FPGA PCI驱动代码,但也同样适用于大部分Xilinx公司的PCIE的驱动代码的开发。
Step3 :此时如果你确定已经下载好了PCIE DMA的FPGA文件,我们可以点击菜单栏下的“启动调试(F5)”,来进行工程调试。
这里我们更加关注DMA的相关测试,我们选择测试项7,即Direct memoryaccess(DMA)-Interrupts completion method,按照操作步骤选择open dma,并选择From device或者to device,来确定数据的传输方向,填入TLP的个数,以及TLP的测试数据。
OK,现在我们大致已经知道如何通过Windriver所提供的开发工具在VS2008的测试与开发,那么接下来我们再来分析下VS2008下的驱动代码。
VS2008驱动代码分析
1.通过VS2008打开Virtex5的BMD工程,如图8-2-11所示,包含6个c文件。图8-2-11 BMD 驱动文件
实际上用户几乎不需要做大量的修改,如果用户只需要进行DMA方面开发的话,只需要通过MenuDMAOpen函数
将需要配置的DMA数据大小,数据缓存,以及完成方式配置到该函数中,并启动DMA即可。
static void MenuDMAOpen(WDC_DEVICE_HANDLE hDev, PDIAG_DMA pDma, BOOL fPolling)
{
DWORD dwStatus, dwOptions, dwTotalCount, i;
UINT32 u32Pattern;
WORD wSize, wCount;
BOOL fIsRead;
BOOL fEnable64bit;
BYTE bTrafficClass;
/* Get input for user */
if (!MenuDMAOpenGetInput(&wCount, &u32Pattern, &dwOptions))
return;
fIsRead = dwOptions & DMA_FROM_DEVICE ? FALSE : TRUE;
pcie_opratetype = dwOptions & DMA_FROM_DEVICE ? FALSE : TRUE;
/* The BMD reference design does not support s/g DMA, so we use contiguous
*/
dwOptions |= DMA_KERNEL_BUFFER_ALLOC;
/* Get the max payload size from the device */
wSize = VIRTEX5_DMAGetMaxPacketSize(hDev, fIsRead) / sizeof(UINT32);
dwTotalCount = (DWORD)wCount * (DWORD)wSize;
/* Open DMA handle */
dwStatus = VIRTEX5_DMAOpen(hDev, &pDma->pBuf, dwOptions,dwTotalCount * sizeof(UINT32),
&pDma->hDma);
if (WD_STATUS_SUCCESS != dwStatus)
{
printf("\nFailed to open DMA handle. Error 0x%lx - %s\n", dwStatus,
Stat2Str(dwStatus));
return;
}
printf("\nDMA handle was opened successfully (handle 0x%lx)\n", pDma->hDma);
printf("Payload packet size in dwords 0x%hx\n", wSize);
/* Prepare the device registers for DMA transfer */
fEnable64bit = FALSE;
bTrafficClass = 0;
VIRTEX5_DMADevicePrepare(pDma->hDma, fIsRead, wSize, wCount, u32Pattern,fEnable64bit,
bTrafficClass);
if (!fPolling) /* Enable DMA interrupts (if not polling) */
{
VIRTEX5_DmaIntEnable(hDev, fIsRead);
if (!VIRTEX5_IntIsEnabled(hDev))
{
dwStatus = VIRTEX5_IntEnable(hDev, DiagDmaIntHandler);
if (WD_STATUS_SUCCESS != dwStatus)
{
printf("\nFailed enabling DMA interrupts. Error 0x%lx - %s\n",
dwStatus, Stat2Str(dwStatus));
goto Error;
}
printf("\nDMA interrupts enabled\n");
}
}
else /* Disable interrupts (polling) */
VIRTEX5_DmaIntDisable(hDev, fIsRead);/*
在下面代码中
我们可以将所需要dma写入的数据填入pDma->pBuf,
该试验我们填入的是一串递增数据i,然后PCIE DMA将会按照用户设置的TLP包的个数,
当前TLP所支持的最大TLP的数据大小wSize,以及本次操作的读写类型fIsRead设置为0
选择DMA写。*//* Initialize the DMA buffer with user defined pattern */
for (i = 0; i < dwTotalCount; i++)
{
if (fIsRead)
((UINT32 *)(pDma->pBuf))[i] = i;
else ((UINT32 *)(pDma->pBuf))[i] = 0xdeadbeaf; /* to be overwritten by
WRITE dma */
}
/* Start DMA */
printf("Start DMA transfer\n");
VIRTEX5_DMAStart(pDma->hDma, fIsRead);
TimeStart();
/* Poll for completion (if polling selected) */
if (fPolling)
{
if (VIRTEX5_DMAPollCompletion(pDma->hDma, fIsRead))
{
DmaTransferVerify(hDev, pDma->pBuf, dwTotalCount, u32Pattern,
fIsRead);
}
else
printf("timeout\n");
}
return;Error:
DIAG_DMAClose(hDev, pDma);
}
如果用户需要读取从PCIE的设备端返回的数据,则从中断处理函DiagDmaIntHandler中读取pIntResult->pBuf即可,如下表代码所示。
static BOOL DIAG_DMAVerifyPattern(WDC_DEVICE_HANDLE hDev, PVOID pBuf,
DWORD dwTotalCount, UINT32 u32Pattern, BOOL fIsRead)
{
DWORD i;
/* Transfer to device, check HW error bit */
if (fIsRead)
return VIRTEX5_DmaIsReadSucceed(hDev);
//Transfer from device, check DMA buffer
for (i = 0; i < dwTotalCount; i++)
{
if (((UINT32 *)(pBuf))[i] != i)
{
VIRTEX5_ERR("Data mismatch, pBuf[%ld] = %08X, u32Pattern = %08X\n",i, ((UINT32
*)(pBuf))[i], u32Pattern);
return FALSE;
}
}
return TRUE;
}
3、Xapp1052下载
Step1:登录www.xilinx.com官网,在搜索栏中输入xapp1052,xapp1052是xilinx专为用户PCIe DMA开发应用的demo,里面包含有PCIE DMA开发与应用的硬件代码与上位机的驱动代码。如图8-3-1所示,用户需要下载图中的xapp1052.pdfxapp1052.zip。
Step2:将xapp1052.zip解压后我们即可发现以下文
4、Kintex-7 BMD工程搭建
4.1 Generate PCIE DMA IP CORE
4.2 DMA_64工程搭建
在下图的代码中,有几个.V文件需要说明一下,
(1)xilinx_pcie_2_1_ep_7x.v :来自IPCore的 example 的 顶层。
在该文件里,例化的app pcie_app_7x 可能一些管脚比较多,而这些多出来的管脚,在pcie_app_7x_bmd.v文件里不存在,这样会导致PIO仿真报错。因此注意对比删除。
(2)pcie_app_7x_bmd.v :来自xapp1052里的128事例工程,复制过来后,需要将128修改为64即可。
(3)axi_trn_top.v等 :来自xapp1052里的128事例工程,直接复制过来即可。
(4)其他所有文件 :从xapp1052里复制即可。
代码层次如下:
将BMD_PCIE_20.V如下图所示,设置为全局的文件。这样我们的工程就基本建立完成。
5、Sparten6 BMD工程搭建
暂不更新
>>点击这里返回导航页<<
参考文献
作者 | 博客 |
1、CLGo | PCIe学习(三):PCIe DMA关键模块分析之二 |
PCIe学习(二):PCIe DMA关键模块分析之一 | |
2、鹿天斐 | Virtex6 PCIe 超简版基础概念学习(二)--CSDN |
Virtex6 PCIe 超简版基础概念学习(二)--简书 | |
Virtex6 PCIe 超简版基础概念学习(一)--简书 | |
3、俞则人 | PCIE_DMA实例一:xapp1052详细使用说明 |
4、Shaliew | FPGA-PCIe开发 |
5、wbh_water | Vivado vc707 pcie传输实验(超详细) |
vivado pcie DMA传输实战 | |
6、渝雪柒柒 | PCIE_DMA:xapp1052学习笔记 |
Xilinx PCIE DMA--Sparten6/Kintex-7 BMD 搭建相关推荐
- xilinx官方pcie dma例程 -xapp859仿真环境搭建
软件版本 win 10 系统 ISE 10.1 modelsim 10.1a win32 注:xapp859官方文档说明了xapp859的编译环境为ISE10.1版本, 然后modelsim 必须是3 ...
- XILINX PCIE DMA/Bridge Subsystem for PCI Express (XDMA)笔记
前段时间在公司项目中调试了PCIE,正好做一个总结,那些介绍XDMA.PCIE之类的多余的东西网上能搜到很多,我这里就不多说.我写的只是自己的一些想法,以及自己的设计思路. 同每一个刚开始调试PCIE ...
- Xilinx PCIE CORE学习
目录 前言 1.概述 1.1PCIE 学习入门概述 1.2 本文内容概述 2.IP CORE user interface接口说明 3.TLP包格式 3.1 .3DW/4DW相关说明 3.2 .TLP ...
- LabVIEW FPGA PCIe开发讲解-7.2节:目前主流的4大Xilinx FPGA PCIe DMA通信IP核讲解
1.要开发一个带PCIe或者PXIe接口的FPGA板卡出来,除了硬件本身外,最重要的就是FPGA芯片里面的PCIe通信代码编写,俗称下位机FPGA编程:还有中间层的驱动文件编写以及上位机PC端的应用程 ...
- pcie dma 相关知识整理(xilinx平台)
PCIE的DMA和PIO介绍 DMA数据传输方式 DMA(Direct Memory Access),直接内存访问,在该模式下,数据传送不是由CPU负责处理,而是由一个特殊的处理器DMA控制器来完成, ...
- PCIe学习(二):PCIe DMA关键模块分析之一
简介 经过一段时间的学习,这里将PCIe DMA模式的学习结果做一个总结,由于手里没有包含PCIe的板子,因此和学习PIO一样对DMA模式中的关键模块的代码进行逐条分析,希望对和我一样的初学者 ...
- 转载 PCIe学习(二):PCIe DMA关键模块分析之一
版权声明:本文为CSDN博主「CLGo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/cllovexyh/a ...
- altera/xlinx pcie dma应用
altera: 1. PCIe DMA应用屏蔽了复杂的PCIE协议,例如A10 pcie DMA控制器可以例化在IP核内部,DMA的寄存器端口被接到BAR0上,pc通过对BAR0地址的读写就可以操作D ...
- Xilinx PCIE IP核接口介绍
1.1 Xilinx PCIE IP核接口介绍 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)Xilinx PCIE IP核接口介绍: 5)结束语. 1.1.2 本节引 ...
最新文章
- Matlab人脸检测算法详解
- 开源 免费 java CMS - FreeCMS1.5-信息管理
- java Date.getTime()返回负数异常情况分析
- mongodb的增、删、改、插的一个实例
- Oracle条件查询语句-where
- VS Code,请还我文件!!!
- javafx基础教程_JavaFX教程–基础
- 保驾护航金三银四,使用指南
- Kotlin 1.2 新特性
- 在英特尔® 架构平台上开发和优化基于 NDK 的 Android 游戏应用
- 【Webcam设计】视频的采集和动态显示
- 181103每日一句
- 阿里专家与你分享:你必须了解的Java多线程技术
- 服务器位置不可用,服务器的MSDTC不可用解决办法
- matlab符号运算转置出现conj的解决办法
- java导出文件名乱码
- 计算机共享wf,电脑怎么共享wifi网络
- 南邮NOJ2029节奏大师
- 七日杀服务器直连教程,七日杀IP直连的方法
- 在java中重写方法应遵循规则的包括_蘑菇街2017校园招聘笔试题
热门文章
- [演讲]北大鄂维南院士:智能时代意味着什么?
- PIM-DM协议原理
- 普通高中课程标准实验教科书(必修)数学1_学习笔记
- 维密超模也来学编程?你想象得到吗,这些明星也曾是程序员!
- python slice start比end小_Python入门
- 刷步恢复使用Unv0ver6.0.1工具已签名,附在线安装地址!
- Vue全家桶系列之Vuex(二)
- MATLAB数学建模:数据图形可视化-三维绘图函数
- 从 PC 解锁 Android 手机的 6 种有效方法
- N型电池将成为下一代主流方向