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.0x4的带宽要求,因此选用PL端的DDR3做数据缓存。

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

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

Vivado工程建立#

ZYNQ配置#

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

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

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

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

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

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

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

../_images/image767.png

PCIe xdma配置#

  1. 添加PCIe DMA子系统

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

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

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

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

../_images/image1247.png

PL端DDR3配置#

  1. 添加PL端DDR3控制器MIG

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

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

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

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

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

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

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

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

../_images/image2150.png
  1. 默认

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

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

../_images/image2430.png
  1. 通过原理图可知,系统时钟选择C8/C7引脚

../_images/image2527.png
  1. 默认

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

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

../_images/image2817.png

模块连接#

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

../_images/image2917.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/image3016.png
  1. 点击Run Block Automation

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

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

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

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

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

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

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

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

  2. 创建HDL文件

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

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

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

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

生成烧写BOOT#

  1. 导出硬件,运行Vitis

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

  3. 生成BOOT.bin

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

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

设置电脑进入测试模式#

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

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

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

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

../_images/image4711.png

安装PCIe驱动#

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

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

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

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

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

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

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

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

../_images/image5410.png

测试PCIe#

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

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

  2. 读写同时进行测试

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

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

../_images/image583.png

实验总结#

本实验主要是掌握PCIe硬件工程的建立,初步体验PCIe读写速度,在后续的实验中我们会做一些更加实用的功能。上位机软件使用QT开发,如果需要自己修改编译,请先学习如何使用QT。