1.简介
PCI Express(PCIE)是一种高速串行总线标准,广泛应用于计算机系统中,用于连接主板和外部设备。在FPGA领域中,PCIE也被广泛应用于实现高速数据传输和通信。FPGA是一种灵活可编程的集成电路,可以根据需要重新配置其功能和连接。PCIE与FPGA结合使用,可以实现高速数据传输和通信,适用于需要大量数据处理和传输的应用场景。在FPGA中使用PCIE可以实现以下功能:①高速数据传输:PCIE提供了高达16 GT/s的数据传输速度,可以满足对数据传输速度要求较高的应用需求。②多通道通信:PCIE支持多通道通信,可以同时传输多路数据,提高数据传输效率。③灵活性和可扩展性:FPGA可以根据需要重新配置PCIE接口,实现不同功能和连接需求,同时支持多种PCIE设备连接,具有较高的灵活性和可扩展性。总的来说,PCIE在FPGA领域中的应用可以实现高速数据传输和通信,提高系统性能和效率,适用于需要大量数据处理和传输的应用场景。随着PCIE技术的不断发展和完善,PCIE在FPGA领域中的应用前景将更加广阔。
不同的FPGA芯片制造厂家提供了不同的解决方案,就xilinx一家提供了三种实现PCIE的方案用于不同的场景。此外,PCIE自身的发展也经历好几代的迭代,PCIE本身还涉及总线架构、带宽、通道、BAR寄存器等等知识,关于这些后面的文章整合了大量资料有详细说明,本章基于xilinx K7芯片,xdma ip,win10系统,vivado2020.2版本快速搭建PCIE基础应用。关于更复杂的应用后面循序渐进展开。
2.配置环境
①禁止驱动签名启动
打开windows设置,选择更新与安全,选择“恢复”,点击立即重新启动,随后选择疑难解答,选择启动选项,出现选择禁止后,按下数字“7”即可禁止驱动签名认证。当驱动发布给客户的时候,需要进行驱动签名认证。
②关闭快速启动
在windows设置中找到电源和睡眠选项,单机“选择电源按钮的功能”,取消勾选“启用快速启动”。
③打开测试模式
以管理员方式运行命令提示符,输入Bcdedit.exe -set TESTSIGNING ON命令打开测试模式,重启后生效,如果没有测试模式的水印出现,可以换个系统壁纸试一下,正常水印如下所示。
还可通过管理员打开命令提示符,通过Bcdedit.exe /enum {current}查看是否打开了测试模式。
④安装驱动
首先找到.cer后缀的文件,选择安装证书
然后插入PCIE设备,可以发现设备已连接
更新驱动程序,选择开发板厂家提供好的驱动,安装过程中选择始终相信,安装结束可以看到如图所示,多了Xilinx DMA设备,表示安装成功。
此处之前一直有黄色感叹号,提示“该设备无法启动。(代码10)在两项驱动程序间或一项I/O驱动程序内检测到协议错误”。网上分析罕见,正点原子认为这是驱动的Bug,Xilinx官网有人说是Xilinx的驱动只支持4通道,必须设置成4通道。由于这个涉及Windows和Xilinx的底层函数,单从现象很难判断原因为何,我在开发过程中也碰到这个情况,我用的是vivado2020.2,换成2018.2或者2021.1版本即可解决这个问题。因此我认为可能与vivado的版本有关。
⑤切换PCIE插槽
这个适个人机器情况调整,我的机器只有两个PCIE扩展槽,一个x16通道用于接显卡,另一个是x4通道,于是把显卡换到pcie x4通道上,把xilinx的x8切换到x16的通道上。
⑥添加头文件
Xilinx提供了驱动还提供了驱动接口文件xdma_public.h、pcie_fun.h、pcie_fun.c文件,将其添加到上位机工程中,即可使用这些函数进行pcie接口的操作。
3.IP核配置
第一页①处通常Basic,不用Advanced;②处选择通道数,具体与硬件板卡相关,这里选择x8;③选择线速度,与硬件板卡有关,这里是PCIE2.0,选择5.0GT/s,也与FPGA芯片有关,7K系列最多支持PCIE2.0。④这是PCIE的参考时钟,是由Root节点的插槽给到PCIE插卡的,固定为100MHz。⑤AXI总线的宽度和时钟频率由PCIE的线速度和线速率决定。⑥DMA用户接口选项,AXI Memory Mapped适合与内存交互数据,AXI Stream适合流数据,本次AXI_MM工程就选AXI Memory Mapped接口,AXI_ST工程选择stream接口。⑦AXI4-Lite Slave Interface:选择是否启用 AXI4-Lite Slave 接口以访问 DMA 状态寄存器,通常不用。
第二页保持默认配置,说明如下。
- Vendor ID(供应商 ID):用于识别器件或应用的制造商。有效标识由 PCI Special Interest Group 指定,以保证每个标识都唯一。默认值 10EEh 为赛灵思的供应商标识
- Device ID (器件 ID):对应于应用的唯一标识;默认值为 70<link speed><link width>h,该值取决于所选配置。该字段可采用任何值;请针对应用更改该值。默认器件 ID 参数取决于: 器件系列:9 表示 UltraScale+,8 表示 UltraScale,7 表示 7 系列器件 ;EP 或 RP 模式链路宽度:1 表示 x1,2 表示 x2,4 表示 x4,8 表示 x8,F 表示 x16;链路速度:1 表示 Gen1,2 表示 Gen2,3 表示 Gen3,4 表示 Gen4
- Revision ID (版本 ID):表示器件或应用的版本;作为器件 ID 的扩展。默认值为 00h;请针对应用输入相应的值;
- Subsystem Vendor ID (子系统供应商 ID):进一步限定器件或应用的制造商。请在此处输入子系统供应商 ID;默认值为 10EEh。通常,该值与供应商 ID 相同。将该值设为 0000h 可能导致合规性测试出现问题;
- Subsystem ID (子系统 ID):进一步限定器件或应用的制造商。该值通常与器件 ID 相同;默认值取决于所选通道宽度和链路速度。将该值设为 0000h 可能导致合规性测试出现问题;
- Enable PCIe-ID Interface:启用 PCIe-ID 接口。如果选中该参数,那么根据选中的 PFx 数量,在 IP 顶层会显示 PCIe ID 端口:cfg_vend_id、cfg_subsys_vend_id、cfg_dev_id_pf*、cfg_rev_id_pf* 和cfg_subsys_id_pf*,并可供用户逻辑驱动。如未选中该参数,则不会在顶层显示这些端口,并根据自定义时设置的值来驱动这些端口。
- Class Code Look-up Assistant (类代码查找助手):类代码查找助手可针对选定的器件常规功能提供对应的基本类、子类和接口值。
第三页配置,①处PCIe to AXI Lite Master Interface:启用该接口,主机可以通过该接口控制用户侧逻辑,在PCIe_AXILite工程中就勾选此接口。PCIe to AXI Translation:PCIe到AXI的转换。通常情况下,主机侧PCIe BAR地址与用户逻辑侧AXI LIte的地址是不一样的,这个设置就是进行主机侧BAR地址到AXI地址的转换,比如主机一侧BAR地址为0,用户逻辑侧AXI LIte的地址为0x40000000,则主机访问AXI LIte用户逻辑时,XDMA将根据该设置将主机侧BAR地址0转换到AXI LIte总线地址0x40000000。对与该值的设置有两种方式,一种是手动指定,然后修改后面 AXI LIte 总线的偏移地址,另一种是先确定AXI LIte总线的偏移地址,然后根据偏移地址设置该值。在1.4.8节修改地址映射可以看到AXI LIte总线的偏移地址为0x40000000,所以设置此值为0x40000000。此外,PCIe to AXI Translation 同样也是AXI LIte总线的基地址,当 AXI LIte 总线连接多个AXI IP核时,会有多个偏移地址,上位机访问其他 IP 核时的偏移地址是以PCIe to AXI Translation的值为基址0进行参考的,比如,AXI LIte总线连接的另一个AXI IP的偏移地址为0x40010000,上位机访问该IP核的偏移地址就是该IP核的偏移地址0x40010000 - PCIe to AXI Translation的值0x40000000=0x10000。因此当AXI LIte总线连接多个AXI IP核时,需确保PCIe to AXI Translation的值小于等于这些AXI IP核偏移地址的最小值。②处可以选择是否预取,预取就是将数据提前放到线上,会让读数据变得更快。③PCIe to DMA BypassInterface:选择是否启用PCIe至DMA旁路接口。DMA Bypass就是普通的PCIe传输,不用DMA逻辑,而是直接通过PCIe进行通信,一般传输效率会高于Pcie to AXI Lite。
第四页,关于中断的设置,详细功能后续展示,保持如下设置即可。
最后一页设置DMA上下行通道均为2即可。