PCIE_DMA实例四:xapp1052在Xilinx 7系列(KC705/VC709)FPGA上的移植

一:前言

这段时间有个朋友加微信请求帮忙调试一块PCIe采集卡。该采集卡使用xilinx xc7k410t做控制器,上位机为XP系统,原有的驱动和测试软件都是基于xapp1052写的。众所周知,Xilinx升级到7系列后,原来的pcie ip核trn接口统统转换成了axis接口,这可愁坏了之前用xapp1052的朋友,一下子不好用了,如何把xapp1052移植到K7系列FPGA上,貌似很有市场。博主搜了以下XILINX官网,发现V3.3版本的xapp1052已经能够在K7上使用了。但毕竟只是一个示例工程,数传接口并不友好。针对专门做采集卡的朋友,博主提供了一个由FIFO作为用户接口的BMD工程。

二:前期准备

1、pcie基础还是要有,尤其是协议部分。推荐一本电子书,很经典,请耐心读它(Addison.Wesley.PCI.Express.System.Architecture.eBook-LiB.chm)下载地址:http://download.csdn.net/download/yuzeren48/7723815

2、pg054

3、Vivado2018.2套件

4、Windriver

5、Visual studio 2010

三:移植步骤

1、在vivado中创建一个K7 pcie ipcore的example工程。

2、在xilinx官网下载xapp1052.pdf与xapp1052.zip

3、将1和2两个工程的代码融合并稍作修改,形成BMD工程,可选择64位宽(4x 2.5G )或128位宽(4x 5G),代码层级如下:

4,关键代码分析

1)、BMD_EP_MEM-Control/Status Registers 所有的用户状态寄存器在模块BMD_EP_MEM中。我们一切的DMA传输首先是要控制这 些寄存器,然后进行DMA传输,传输完成后在读取状态寄存器的值获取传输状态。

2)、EP_RX_ENGINE-Target 这个模块的功能在EP_RX_ENGINE里面实现,负责接收读写TLP命令,并且提交完成读 写内存的完成响应。EP_RX_ENGINE里面,Target接收PC发过来的32bit不带数据的存储 器读请求和带1个DW字的32bit 存储器写请求。控制状态寄存器就是通过Target读写。

3)、EP_RX_ENGINE-Rx引擎 Rx引擎除了负责接PC读写存储器请求,也要完成开发板发出的读内存请求的完成响应 (DMA传输)。

4)、BMD_EP_MEM-Tx引擎 Tx引擎除了负责接发送DMA数据到PC,也要发送PC发送的读写TLP包的完成响应。

5)、BMD_EP_MEM-Control/Status Registers 所有的用户状态寄存器在模块BMD_EP_MEM中。我们一切的DMA传输首先是要控制这 些寄存器,然后进行DMA传输,传输完成后在读取状态寄存器的值获取传输状态。

6)、Interface 总线接口,pcie-app_7x就是包含了BMD所有的总线接口。

7)、AXI4-Stream转BMD协议接口 axi_trn_rx模块和axi_trn_tx实现了最新的AXI4-Stream协议转BMD协议。有读者可能 会怀疑转换的协议可能影响传输效率,实际上不会有任何效率的牺牲,因为这里是FPGA直 接完成了协议的转换,没有任何的延迟。

笔者对关键逻辑部分代码做了非常详细的注释,读者可在文末根据需求自行购买。

5,上位机软件代码分析

装好windriver后,我们可以在windriver安装目录下找到BMD工程对应的驱动文件

使用VS2010打开后,文件目录如下,如需获取每个C文件中函数的功能定义,请在文末购买相应资料。

运行该测试程序,并打开VIVADO工程抓包,看上去是V5的测试代码,但可以通过输入VendorID和DeviceID来找到我们自己的板卡。

在4x GEN1(2.5G)的情况下,做连续读写测试,实测PCIe写带宽约为840MB/s,PCIe读带宽约为761MB/s,基本上接近满带宽了。

四、工程化范例

以上工程就是xapp1052在K7上的移植测试,但对于做工程应用的朋友来说,这个工程并不实用,所有DMA读写的数据都是根据我们用户自己配置的一个patten寄存器固定死的,如果要把FIFO中的数据通过xapp1052 DMA传输到系统内存,则需要修改部分源代码。这里,博主有偿为大家提供了一个FIFO接口的BMD工程。

用户接口如下:

module  pcie_app_7x#(
parameter C_DATA_WIDTH = , // RX/TX interface data width
// Do not override parameters below this line
parameter KEEP_WIDTH = C_DATA_WIDTH / , // TKEEP width
parameter REM_WIDTH = (C_DATA_WIDTH == ) ? : // trem/rrem width )( input user_clk,
input user_reset,
input user_lnk_up, // Tx
input [:] tx_buf_av,
input tx_cfg_req,
input tx_err_drop,
output tx_cfg_gnt, input s_axis_tx_tready,
output [C_DATA_WIDTH-:] s_axis_tx_tdata,
output [KEEP_WIDTH-:] s_axis_tx_tkeep,
output [:] s_axis_tx_tuser,
output s_axis_tx_tlast,
output s_axis_tx_tvalid, // Rx
output rx_np_ok,
output rx_np_req,
input [C_DATA_WIDTH-:] m_axis_rx_tdata,
input [KEEP_WIDTH-:] m_axis_rx_tkeep,
input m_axis_rx_tlast,
input m_axis_rx_tvalid,
output m_axis_rx_tready,
input [:] m_axis_rx_tuser, // Flow Control
input [:] fc_cpld,
input [:] fc_cplh,
input [:] fc_npd,
input [:] fc_nph,
input [:] fc_pd,
input [:] fc_ph,
output [:] fc_sel, // CFG
input [:] cfg_do,
input cfg_rd_wr_done,
output [:] cfg_di,
output [:] cfg_byte_en,
output [:] cfg_dwaddr,
output cfg_wr_en,
output cfg_rd_en, output cfg_err_cor,
output cfg_err_ur,
output cfg_err_ecrc,
output cfg_err_cpl_timeout,
output cfg_err_cpl_abort,
output cfg_err_cpl_unexpect,
output cfg_err_posted,
output cfg_err_locked,
output [:] cfg_err_tlp_cpl_header,
input cfg_err_cpl_rdy,
output cfg_interrupt,
input cfg_interrupt_rdy,
output cfg_interrupt_assert,
output [:] cfg_interrupt_di,
input [:] cfg_interrupt_do,
input [:] cfg_interrupt_mmenable,
input cfg_interrupt_msienable,
input cfg_interrupt_msixenable,
input cfg_interrupt_msixfm,
output cfg_turnoff_ok,
input cfg_to_turnoff,
output cfg_trn_pending,
output cfg_pm_wake,
input [:] cfg_bus_number,
input [:] cfg_device_number,
input [:] cfg_function_number,
input [:] cfg_status,
input [:] cfg_command,
input [:] cfg_dstatus,
input [:] cfg_dcommand,
input [:] cfg_lstatus,
input [:] cfg_lcommand,
input [:] cfg_dcommand2,
input [:] cfg_pcie_link_state, output [:] pl_directed_link_change,
input [:] pl_ltssm_state,
output [:] pl_directed_link_width,
output pl_directed_link_speed,
output pl_directed_link_auton,
output pl_upstream_prefer_deemph,
input [:] pl_sel_link_width,
input pl_sel_link_rate,
input pl_link_gen2_capable,
input pl_link_partner_gen2_supported,
input [:] pl_initial_link_width,
input pl_link_upcfg_capable,
input [:] pl_lane_reversal_mode,
input pl_received_hot_rst, output [:] cfg_dsn,
//user port
output [:] RX_FIFO_DATA_o,
output RX_FIFO_WR_o,
input [:] TX_FIFO_DATA_i,
output TX_FIFO_RD_o,
output [:] pcie_tap
)

这个接口可以直接连在xilinx的PCIe IP核接口上,用户接口对于做数据采集卡的朋友非常友好。这里做一个利用XAPP1052 通过FIFO采集数据的例子。为了验证数据的方便,我们在开发板上通过一个计数器计数,把计数的值发送到上位机上。测试结果如下:

另外需要补充一点,这个工程在DMA写数据,也就是FPGA写数据到PC的时候,没有任何问题。但是在DMA读数据的时候,也就是FPGA从PC端读大量数据的时候,会出现返回的数据包乱序的现象。这是xapp1052的通病,对于做采集卡的朋友,这个问题并无影响,因为不需要从PC端读数据。如果有朋友需要读写都正确无误的PCIe DMA工程,可单独联系我,本人有全套PCIe DMA源代码,可用于各种系列的FPGA,但源码价格不菲哦。

五、附件

1、xapp1052 K7移植工程,附硬件代码注释和windows驱动说明(50元一份)

2、xapp1052 K7移植工程(FIFO接口),附硬件代码注释和windows驱动说明以及测试程序(500元一份)

3、支持XILINX全系列的多通道PCIe DMA IP核(价格详谈)

有需要请微信(330853172)联系

PCIE_DMA实例四:xapp1052在Xilinx 7系列(KC705/VC709)FPGA上的移植的更多相关文章

  1. PCIE_DMA实例三:Xilinx 7系列(KC705/VC709)FPGA的EDK仿真

    一:前言 好久没写博客了,前段时间有个朋友加微信请教关于PCIe的一些学习方法.本人也不是专家,只是略知一些皮毛.对于大家反馈的问题未必能一一解答,但一定知无不言.以后我会常来博客园看看,大家可以把问 ...

  2. PCIE_DMA实例五:基于XILINX XDMA的PCIE高速采集卡

    PCIE_DMA实例五:基于XILINX XDMA的PCIE高速采集卡 一:前言 这一年关于PCIE高速采集卡的业务量激增,究其原因,发现百度"xilinx pcie dma",出 ...

  3. Xilinx zynq-7000系列FPGA移植Linux操作系统详细教程

    Xilinx zynq-7000系列FPGA移植Linux操作系统详细教程 一:前言 最近手上压了一块米联客的Miz7035,一块xilinx zynq-7000系列的开发板,想着正好学习一下linu ...

  4. C语言库函数大全及应用实例四

    原文:C语言库函数大全及应用实例四                                    [编程资料]C语言库函数大全及应用实例四 couble fmod (double x, dou ...

  5. Xilinx 7系列FPGA部分重配置【2】

    在之前的“Xilinx 7系列FPGA部分重配置[1]”中已经较为详细地记录了分别在工程模式(Project Mode)和非工程模式(Non-Project Mode)下.使用7系列的Xilinx F ...

  6. C#进阶系列——MEF实现设计上的“松耦合”(四):构造函数注入

    前言:今天十一长假的第一天,本因出去走走,奈何博主最大的乐趣是假期坐在电脑前看各处堵车,顺便写写博客,有点收获也是好的.关于MEF的知识,之前已经分享过三篇,为什么有今天这篇?是因为昨天分享领域服务的 ...

  7. KEIL MDK环境下uCOS-II在LPC17xx上的移植实例

    1. 知识准备 要想对ucos-ii的移植有较深的理解,需要两方面知识: (1)目标芯片,这里是lpc17xx系列芯片,它们都是基于ARMv7 Cortex-M3内核,所以这一类芯片的ucos-ii移 ...

  8. Web攻防系列教程之文件上传攻防解析(转载)

    Web攻防系列教程之文件上传攻防解析: 文件上传是WEB应用很常见的一种功能,本身是一项正常的业务需求,不存在什么问题.但如果在上传时没有对文件进行正确处理,则很可能会发生安全问题.本文将对文件上传的 ...

  9. 地图 SDK 系列教程-在地图上展示指定区域(转载)

    腾讯位置服务地图SDK是一套提供多种地理位置服务的应用程序接口.通过调用该接口,开发者可以在自己的应用中加入地图相关的功能(如地图展示.标注.绘制图形等),轻松访问腾讯地图服务和数据,构建功能丰富.交 ...

随机推荐

  1. win7下解决vs2015新建项目,提示“未将对象引用设置到引用实例“的问题

    问题描述: 打开vs2015新建c++项目时,出现有如下内容的对话框“未将对象引用设置到引用实例”的提示 解决方法: 1.  温馨提示:千万不要一冲动,就去卸载vs2015!! win7下安装vs20 ...

  2. JavaScript实现时间查询

    首先要引入js文件和css文件 <script src="jquery-1.11.2.min.js"></script> <script src=&q ...

  3. 本地用maven搭建SpringMvc+redis集成

    ---恢复内容开始--- 首先本地需要搭建私服,简单说一下搭建私服的步骤 1.为什么使用Nexus 如果没有私服,我们所需的所有构件都需要通过maven的中央仓库和第三方的Maven仓库下载到本地,而 ...

  4. nodejs设置NODE_ENV环境变量(1)

    看下app.js文件中的一部分代码,如下: //开发环境错误处理 // will print stacktrace if (app.get('env') === 'development') { ap ...

  5. 8.2、常用模块介绍2:xml,configparser,hashlib

    xml: 介绍:包含关于可扩展标记语言xml的函数 使用: python有三种方法解析XML--SAX,DOM,以及ElementTree,由于xml技术落后,所以这里不对sax,dom介绍: xml ...

  6. 【mysql数据库】Linux下mysql安装连接全过程(含有问题详解)

    本次安装操作在腾讯云上实现(版本:CentOS Linux release 7.4.1708 (Core) ). 根据教程实现(中途各种挖坑,填坑...),地址:http://www.runoob.c ...

  7. Linux centos6.5 系统语言改成中文简体

    有时候上传的文件在linux上ls显示的时乱码,原因可能是系统语言编码问题,以Linux centos6.5为例,解决方法如下: 1.在root(皇帝)权限下更改: 查看当前所有语言环境:locale ...

  8. c语言:复合文字

    复合文字的意义,相当于是在C语言中,为数组类型定义了一种类似于8之于int,'w'之于char一样的常量类型,所以从C99之后,可以在一些地方使用复合文字来代替数组使用. 复合文字的声明 (]){,, ...

  9. 15 Top Paying IT Certifications In 2016: AWS Certified Solutions Architect Leads At $125K

    Each of the five Amazon Web Services (AWS) certifications brings in an average salary of more than $ ...

  10. MyEclipse免费使用

    import java.text.DecimalFormat; import java.text.NumberFormat; import java.text.SimpleDateFormat; im ...