一:前言

很多和我一样初学pcie的硬件工程师都会遇到这样一个问题,看了不少pcie相关的资料,还是搞不清这玩意儿到底该怎么用。于是我们打开ISE的core_generator工具,生成了一个pcie的ip核,用modelsim仿真一下example design,仔细分析一下,好像对协议部分理解更深了。至于怎么用,呵呵……

当然,多数硬件工程师都是有上进心的!于是我们上网找资料,发现了一个xilinx官方出品的demo:xapp1052。全称是Bus Master DMA Performance Demonstration Reference Design for the Xilinx Endpoint PCI Express® Solutions。高大上啊,终于知道用在什么地方了,果断下载下来。打开一看,东西不少,按照里面xapp1052.pdf的说明,一步一步生成bit,下载到开发板里,然后安装上位机软件,最后测试并且用chipscope抓信号分析。但事实上,你愚蠢得连bit都生成不了(遇到相同情况的朋友请默默为我点赞)。就在你干着急的时候,你看到了这篇伟大的博客……接下来,我将手把手教你如何使用这个xapp1052。

二:前期准备

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

2、一块开发板,我使用的是Xilinx ML605。

3、一台带PCIE插槽的主机。

4、Xapp1052 Demo(http://download.csdn.net/download/yuzeren48/7723795)

5、ISE14.1套件

三:使用说明

1、打开coregenerator生成一个4通道gen2的pcie ip核,配置部分见下图,尤其注意classcode必须是’h058000,否则无法正常安装驱动。除图中几处需要更改外,其余均为默认设置

PCIE_DMA实例一:xapp1052详细使用说明-LMLPHP

图1 配置1

PCIE_DMA实例一:xapp1052详细使用说明-LMLPHP

图2 配置2

PCIE_DMA实例一:xapp1052详细使用说明-LMLPHP

图3 配置3

PCIE_DMA实例一:xapp1052详细使用说明-LMLPHP

图4 配置4

PCIE_DMA实例一:xapp1052详细使用说明-LMLPHP

图5 Pcie核目录

2、建立BMD_Dsign 工程。完整工程文件下载地址(http://download.csdn.net/download/yuzeren48/7723831)。下载需要积分,推荐大家按照以下说明一步一步自己建立。首先打开ise,新建工程,添加文件。文件来自:

..\v6_pcie_v1_7\source全部

..\v6_pcie_v1_7\example_design中的xilinx_pcie_2_0_ep_v6_04_lane_gen2_xc6vlx240t-ff1156-1_ML605.ucf和xilinx_pcie_2_0_ep_v6.v

..\xapp1052\dma_performance_demo\fpga\BMD\common全部

..\xapp1052\dma_performance_demo\fpga\BMD中的BMD_64_RX_ENGINE.v和BMD_64_TX_ENGINE.v和v6_pci_exp_64b_app.v

然后编译,由于要先编译BMD_PCIE_20.v,所以右键选择manual compile order,如图6所示。

PCIE_DMA实例一:xapp1052详细使用说明-LMLPHP

图6 编译工程

选中所有.v和.ucf文件,完成综合以及布局布线,并生成bit文件,如图7所示。

PCIE_DMA实例一:xapp1052详细使用说明-LMLPHP

图7 生成bit文件

注意:如果觉得这样编译不舒服,看不清层次结构。可以将BMD_PCIE_20.v删除,并把所有文件中的`ifdef PCIE2_0去掉。

3、modelsim仿真

很多人觉得直接把bit写入开发板,用chipscope在线调试即可。小编觉得最好还是先用modelsim做一下仿真,确定逻辑没有问题再烧板子。小编曾好几次烧了错误的bit,用chipscope怎么都抓不到信号。接下来我们讲如何仿真。

首先将..\v6_pcie_v1_7\example_design文件夹下的文件(除xilinx_pcie_2_0_ep_v6.v以外)全部删除,将..\dma_performance_demo\fpga\BMD\common下的全部文件以及..\dma_performance_demo\fpga\BMD下的BMD_64_RX_ENGINE.v和BMD_64_TX_ENGINE.v和v6_pci_exp_64b_app.v复制到..\v6_pcie_v1_7\example_design文件夹下。

然后修改..\v6_pcie_v1_7\simulation\functional下的board.f文件,注意BMD_PCIE_20.v必须放在最前面编译,修改后的board.f文件如图8所示:

PCIE_DMA实例一:xapp1052详细使用说明-LMLPHP

图8 修改后的board.f

最后,打开Modelsim SE10.1b软件,更改目录至. .\v6_pcie_v1_7\simulation\functional

输入脚本do simulate_mti.do 仿真结果如图9图10所示

PCIE_DMA实例一:xapp1052详细使用说明-LMLPHP

图9 仿真结果1

PCIE_DMA实例一:xapp1052详细使用说明-LMLPHP

图10 仿真结果2

备注:这里的modelsim仿真并没有用到DMA功能,只是测试我们的代码完整性。如果需要仿真DMA功能,可以自己调用pci_exp_usrapp_tx.v中的函数,往DMA控制寄存器中写入地址、长度等数据,然后启动DMA读或者写。

4、Chipscopes抓包分析

首先需要在ise工程里添加chipscope核,chipscope的使用方法详见(http://download.csdn.net/download/yuzeren48/7705033),这里给出带有chipscope核的ise工程文件下载地址(http://download.csdn.net/download/yuzeren48/7723831)

插入cdc,生成了bit之后,下载到开发板中,将开发板插入主机的PCIE插槽,上电设备管理器检测到有PCI内存控制器。用xapp1052.pdf中的步骤,强制安装驱动。安装完驱动后打开软件如图11所示

PCIE_DMA实例一:xapp1052详细使用说明-LMLPHP

图11 上位机软件

先测试write:

将pattern to write 改成0x01020304,其余保持默认设置。点击start,在chipscope中我们就可以看到DMA控制寄存器一共收到了来自主机的多个数据包,如图12所示(注意,将windows设成8,depth设成8,同时设置触发信号如图13所示)。

PCIE_DMA实例一:xapp1052详细使用说明-LMLPHP

图12 主机写DMA控制寄存器

PCIE_DMA实例一:xapp1052详细使用说明-LMLPHP

图13 设置触发信号

这些包都是用来写DMA控制寄存器的,这几个包的发包顺序如下:

PCIE_DMA实例一:xapp1052详细使用说明-LMLPHP

当主机向偏移地址为04的寄存器写入0x00000001时,DMA启动写内存模式,如图14所示。(我们可以通过设置触发信号trn_rd的低32位为0x01000000来检测DMA写开始)

PCIE_DMA实例一:xapp1052详细使用说明-LMLPHP

图14 DMA写内存

同样的方法,测试read。我们可以通过DMA来读内存。如图15所示

PCIE_DMA实例一:xapp1052详细使用说明-LMLPHP

图15 DMA读内存

05-14 07:29