PCIe测试#

实验VIvado工程为“PCIe_test”。

本实验使用Xilinx提供的PCIe XDMA来完成一个简单的PCIe,读写实验,来测试PCIe的速度。PCIe 2.0,每个lane的速度是5Gbit/s,由于编码、协议等开销,可用带宽可以达到80%。由于ZYNQ的HP只有64位,如果速度跑到150MHz,带宽只有9.6Gbit/s,不能够满足PCIe 2.0x8的带宽要求,因此选用PL端的DDR3做数据缓存。

开发板提供Windows 7 64位和Windows 10 64位驱动程序,已经驱动程序的源代码,驱动程序使用VS2015开发,开发板也提供了Linux版本的驱动源码和测试程序。

为了在Windows下更直观的测试,芯驿电子使用QT开发了一些带界面的测试程序,方便测试。

Vivado工程建立#

ZYNQ配置#

  1. 新建一个名为PCIe_test的Vivado工程

../_images/image150.png
  1. 新建一个Block设计

../_images/image238.png
  1. 添加ZYNQ处理器

../_images/image328.png
  1. 配置MIO,BNAK 0电平为LVCMOS 3.3V, Bnak1电平为LVCMOS 1.8V,使能QSPI,这样才能固化程序,PCIe才能正常使用。

../_images/image428.png
  1. 为了调试方便,使能UART0

../_images/image527.png
  1. ddr3配置,ddr3选择MT41J256M16 RE-125

../_images/image624.png
  1. 配置FCLK_CLK0为100MHz用于GP0时钟,FCLK_CLK1为150MHz用于axi_interconnect,点击OK。

../_images/image724.png

PCIe xdma配置#

  1. 添加PCIe DMA子系统

../_images/image817.png
  1. 配置PCIe xdma参数,Lane宽度选择X8,速率选择5.0 GT/s,其他参数都保持默认。

../_images/image915.png
  1. 添加PCIe 差分参考时钟缓冲

../_images/image1013.png
  1. 配置为收发器时钟差分缓冲

../_images/image1117.png
  1. 连接PCIe参考时钟

../_images/image1214.png

PL端DDR3配置#

  1. 添加PL端DDR3控制器MIG

../_images/image1311.png
  1. 与PL端读取DDR3配置类似

../_images/image1410.png
  1. 默认会选择AXI4总线

../_images/image1510.png
  1. 点击下一步

../_images/image169.png
  1. 选择DDR3

../_images/image179.png
  1. 选择型号MT41K256M16XX-125

../_images/image189.png
  1. AXI数据宽度选择256

../_images/image199.png
  1. 输入时钟选择200MHz

../_images/image208.png
  1. 系统时钟选择差分,参考时钟选择系统时钟,系统复位选择低电平有效

../_images/image2114.png
  1. 默认

../_images/image2211.png
  1. 选择Fixed Pin Out

../_images/image239.png
  1. 与PL端读取DDR3一样,读取UCF文件(在工程目录下),并且点击Validate校验。

../_images/image246.png
  1. 通过原理图可知,系统时钟选择F9/E8引脚

../_images/image256.png
  1. 默认

../_images/image266.png
  1. 选择Accept

../_images/image276.png
  1. 最后选择Generate

../_images/image286.png

模块连接#

  1. 添加axi_interconnect,连接M00_AXI到DDR3控制器的S_AXI,ui_clk连接到M00_ACLK

../_images/image296.png
  1. 连接处理器GP0和xdma的M_AXI到axi_interconnect,连接FCLK_CLK0到S01_ACLK,连接FCLK_CLK1到ACLK,用于interconnect异步时钟。xdma的axi_aclk连接到S00_ACLK,xdma的axi_aresetn连接到S00_ARESETN。

../_images/image305.png
  1. 点击Run Block Automation

../_images/image3112.png
  1. 连接MIG核的sys_rst到ZYNQ核的FCLK_RESET0_N

../_images/image329.png
  1. 点击Run Connection Automation自动连接

../_images/image336.png
  1. 点中MIG的SYS_CLK和DDR3端口右键选择Make External,导出引脚

../_images/image345.png
  1. 添加reset模块,进行如下连接

../_images/image355.png
  1. 继续添加两个复位模块,分别连接axi_interconnect的复位ARESETN和S01_ARESETN

../_images/image365.png
  1. 修改端口名称

../_images/image375.png
  1. 查看Address Editor,点击自动分配地址,由于PCIe上位机访问是从0地址开始的,因此需要将xdma的Offset Address改成0x0000_0000_0000_0000

../_images/image385.png
  1. 保存设计,按F6 检查设计

  2. 创建HDL文件

../_images/image395.png
  1. 运行Generate Output Products

../_images/image405.png
  1. 添加其他的文件,主要是5338芯片的配置,为PL端DDR3提供时钟

../_images/image4112.png
  1. 添加xdc约束

../_images/image429.png
  1. 修改xdc文件内容,详细文件可以参考例程提供的Vivado工程,xdc文件使用是TCL教程语言,不熟悉TCL可以去找相关资料

../_images/image435.png
  1. 编译生成bit文件

生成烧写BOOT#

  1. 导出硬件,运行Vitis

  2. 新建名为fsbl的APP,模板选择Zynq FSBL

  3. 生成BOOT.bin

../_images/image444.png
  1. 烧写BOOT.bin到QSPI flash,PCIe对启动时间有严格要求,使用QSPI启动比SD卡启动要快。

../_images/image454.png
  1. 烧写完成以后设置开发板启动模式为QSPI,插入计算机PCIe插槽(断电操作),这时开发板不需要外部电源适配器供电,由电脑主板供电。

设置电脑进入测试模式#

由于PCIe驱动程序没有经过微软数字签名,所以只能用于测试,需要将系统设置到测试模式,设置的详细方法参考MSDN文档https://msdn.microsoft.com/en-us/windows/hardware/drivers/install/the-testsigning-boot-configuration-option

  1. 使用管理员身份运行cmd

../_images/image464.png
  1. 输入命令Bcdedit.exe -set TESTSIGNING ON 打开测试模式

../_images/image474.png
  1. 重启电脑后桌面显示正在运行测试模式

../_images/image484.png

安装PCIe驱动#

PCIe驱动和上位机测试文件都位于“course_s1/资源文件/PCIe”

  1. 没有安装驱动时,设备管理器如下,发现一个PCI串行端口

../_images/image494.png
  1. 例程提供的编译好的驱动程序

../_images/image504.png
  1. 选择设备,右键更新驱动

../_images/image5111.png
  1. 浏览计算机以查找驱动程序软件

../_images/image528.png
  1. 测试电脑安装的是win7,这里使用Win7_Release版本

../_images/image534.png
  1. 有个安全警告,选择安装

../_images/image543.png
  1. 正确安装了设备驱动

../_images/image552.png

测试PCIe#

  1. xilinx提供了一些测试程序,不过都是命令行的程序

../_images/image562.png
  1. 芯驿电子开发了一些有界面的应用,使用pciespeed.exe来测试一下PCIe读写速率,这个读写测试会把数据写入ZYNQ的ddr然后再读取出来。

  2. 读写同时进行测试

../_images/image572.png
  1. 只读测试

../_images/image582.png
  1. 只写测试

../_images/image592.png

ZYNQ-7000开发平台 FPGA教程 - Alinx官方网站