基于FPGA的PCIE设计(2)

基于VIVADO的PCIE IP的使用

  • 项目简述
  • XDMA IP的定制
  • PCIE Endpoint的工程框图
  • PCIE Ip的定制
  • PCIE root port的Block Design搭建
  • 参考文献
  • 总结

项目简述

上一篇博客我们已经对PCIE协议进行了粗略的讲解,为什么粗略呢?因为详细的我也不会。那么不明白具体的PCIE协议,我们就不能在FPGA中使用PCIE来进行高速数据传输了吗?答案是否定的。因为Xilinx官方给我们提供了完善的PCIE IP,基于这些IP我们设置不需要知道TLP包的组包原理我们便可以把PCIE使用起来。这篇博客我们主要把FPGA作为endpoint来进行讲解,当然也对作为root port进行简单的描述。我们使用的主要IP是XDMA,主要参考资料是米联客。如果对IP的使用感觉到疑惑可以参考米联客的资料。

因为手头上硬件条件不够,没办法进行下板测试,我们主要进行介绍IP的定制和Block Design的搭建。

XDMA IP的定制

为什么使用XDMA IP而不使用我们前面介绍的PCIE IP,因为前面介绍的IP需要我们自己构建TLP包,还有分散收集策略,基于该IP使用起来PCIE还是优点困难。但是XDMA就特别简单了,他不需要FPGA设计者熟悉PCIE协议,直接将PCIE协议转换成AXI4与AXI_Lite协议,可以直接对DDR进行操作。XDMA内部的分散收集操作、TLP组包、DMA操作等等进行了完整的封装。我们可以把XDMA IP看成我们经常使用的ZYNQ IP,他的BAR空间被AXI_Lite总线进行读写操作用于寄存器的配置,AXI总线用与大数据的传输直接与DDR对接。

XDMA的内部额框图如下:

基于FPGA的PCIE设计(2)_第1张图片
对XDMA的内部描述如下:
1、AXI4、 AXI4-Stream,必须选择其中一个,用来数据传输
2、 AXI4-Lite Master,可选,用来实现PCIE BAR 地址到 AXI4-Lite 寄存器地址的映射,可用来读写用户逻辑寄存器
3、 AXI4-Lite Slave,可选,用来将XDMA 内部寄存器开放给用户逻辑,用户逻辑可以通过此接口访问 XDMA内部寄存器,不会映射到BAR
4、AXI4 Bypass 接口,可选,用来实现PCIE 直通用户逻辑访问,可用于低延迟数据传输

首先选择XDMA IP如下:
基于FPGA的PCIE设计(2)_第2张图片
双击点开该IP的配置:
基于FPGA的PCIE设计(2)_第3张图片
1、该IP是作为Endpoint来进行PCIE操作的
2、IP定制的模式是高级,这样一来可供选择的IP定制选项就会增多
3、PCIE硬核的位置,这里我们的芯片只有一个硬核,所以这里默认即可
4、lane的个数,与开发板相对应,这里选择2个
5、XDMA将PCIE转换成AXI协议,这个就是AXI协议的位宽
6、该片子的高速串行接口是GTP口,支持PCIE Gen1 Gen2协议,速度分别是2.5GT/s 5GT/s,这里选择最大速度5 GT/s
7、PCIE参考时钟的频率,与板子的时钟情况有关,这里是100MHz
8、AXI总线的时钟频率,这里我们选择125MHz
9、这里我们直接将PCIE协议转换成AXI协议,而不选择AXI Stream协议,简化我们的操作
基于FPGA的PCIE设计(2)_第4张图片
1、厂商ID,专属于Xilinx的PCIE的ID,是固定的。
2、设备ID,与厂商ID一起指明数据的类型,被使用选择PCIE上位机的软件驱动。
3、版本ID,指明使用该PCIE IP进行设置的版本
4、子厂商ID,用来更近一步的区分Xilinx旗下的厂商
5、子系统ID,用来识别板卡的的ID
6、PCIE在实验中承担的角色,这里我们选择默认即可
基于FPGA的PCIE设计(2)_第5张图片
1、首先使能 PCIE to AXI Lite Master Interface ,这样可以在主机一侧通过PCIE 来访问用户逻辑侧寄存器或者其他
AXI4-Lite 总线设备
2、主机侧PCIE BAR 地址与用户逻辑侧地址是不一样的,这个设置就是进行BAR 地址到AXI 地址的转换,比如主机一侧 BAR 地址为0, IP 里面转换设置为 0x80000000,则主机访问 BAR 地址 0 转换到AXI LIte 总线地址就是0x80000000,这点的理解特别重要
3、选择64bit 使能
4、用来实现PCIE 直通用户逻辑访问,可用于低延迟数据传输,这里不选择。
基于FPGA的PCIE设计(2)_第6张图片
1、选择消息中断,因为下面的工程中使用了2个中断,所以这里我们选择2
2、引脚中断,这里选不选择意义不大
其余的默认设置即可。
基于FPGA的PCIE设计(2)_第7张图片
1、2、Number of DMA Read Channel(H2C)和Number of DMA Write Channel(C2H)通道数,对于PCIE2.0 来说最大 只能选择 2,也就是 XDMA 可以提供最多两个独立的写通道和两个独立的读通道,独立的通道对于实际应用中 有很大的作用,在带宽允许的前提前,一个PCIE 可以实现多种不同的传输功能,并且互不影响。 这里我们选择1。
其余的默认即可。
基于FPGA的PCIE设计(2)_第8张图片
这里我们不共享任何逻辑。

经过上面的设置,我们已经定制了常规的XDMA IP,接下来讲解常用的Block Design设计。

PCIE Endpoint的工程框图

这里我们使用米联客中的一个例子,个人认为这是上面最难的例子了,涉及到了XDMA中断的使用。(这里只做粗略介绍,想详细学习的还是得看米联客官方的资料)

本例子主要讲述基于 PCIE XDMA IP 实现的一个图像传输应用,图像的数据流控制主要用到了 VDMA IP。整个项目的框图如下:
基于FPGA的PCIE设计(2)_第9张图片
由上图可以看出,图像数据是由 PC 端产生,然后用过 XDMA 传输到 ZYNQ 的 DDR3(通过 HP 接口),数据再经过一个 MM2S 的 VDMA 从 ZYNQ 的 DDR(通过 HP 接口)读出到 AXIS 接口,经过 AXIS to VIDEO 转换到视频时序,可以做视频处理,之后再经过 VIDEO to AXIS 转换到 AXIS 接口,经过 MM2S 的 VDMA 存入 DDR, XDMA再从 DDR 将图像数据读出到底 PC。这里面实际上包含了两条传输路径,一条是 PCIE 到视频,一条是视频到 PCIE,一个工程,两个操作例子,很有参考意义。

从上面的工程我们可以学到,FPGA 端主要实现如下功能
1、 XDMA 与 DDR 数据通信
2、 VDMA 实现视频数据搬运
3、 可编程 VTC(Video Timing Control)模块,提供视频时序功能
4、 AXIS to Video 模块,实现 axis 到视频时序的转换
5、 图像处理模块,用户可自定义图像处理功能,例程中实现彩色图像的饱和度调整算法
6、 Video to AXIS 模块,实现视频时序到 AXIS 的转换
7、 用户逻辑寄存器模块,可桥接到 XDMA,实现上位机通过 XDMA 对 FPGA 的寄存器控制
8、 读取本地图像生成图像传输链表
9、 通过 VDMA 的 MM2S 中断来从 WIN64 传输图像到 FPGA DDR
10、通过 VDMA 的 S2MM 中断来从 FPGA DDR 获取图像数据,这些中断是经过XDMA传输到上位机

关于可以学到的XDMA部分我们已经加粗。

项目的Block Design设计图如下:
基于FPGA的PCIE设计(2)_第10张图片
这里主要介绍一下XDMA在上面的Block Design设计中起到的作用。
1、使用PCIE转AXI的总线将图像数据存储到DDR、将DDR中的数据搬移到DDR中
2、通过AXI_Lite接口来配置两个VDMA的IP,使其能够正常工作起来,配置数据是PC机发送来的数据
3、通过AXI_Lite接口来配置Bram,通过这个ram来与PC机进行一定的数据交互,解决图像断帧的现象
4、通过两个VDMA的中断信号使得XDMA产生中断信号,告诉PC机进行一定的处理

上面的Block Design的设计,我们只讲解了XDMA的作用,至于VDMA的作用,这里不再讲解,因为个人认为VDMA IP还是优点鸡肋,因为需要进行配置、数据也需要上游模块主动进行读取写入。这个完全可以用自定义的AXI IP来代替。

如果真把上面的流程搞明白了,那么可以熟练的实现FPGA开发板通过XDMA与PC机之间的通信。可以熟练掌握PCIE的使用。但是,上面的使用需要经过上位机的配合,至于上位机的书写,我没有掌握的太好,就不多加解释,这个例子在米联客的PCIE教程中有,同学们可以去学习。

PCIE Ip的定制

上面我们已经讲解了PCIE作为endpoint如何进行配置与Block Design的搭建。接下来,我们讲解PCIE作为rootpoint如何来进行PCIE的配置与Block Design的设置。
首先点击PCIE IP核:
基于FPGA的PCIE设计(2)_第11张图片
基于FPGA的PCIE设计(2)_第12张图片
1、这里选择root port
2、选择开发板上的时钟100MHz
基于FPGA的PCIE设计(2)_第13张图片
1、这里选择硬核PCIE所在的位置
2、选择PCIE的lane的个数为2个
3、选择PCIE的通信速度为5GT/s
基于FPGA的PCIE设计(2)_第14张图片
1、厂商ID,专属于Xilinx的PCIE的ID,是固定的。
2、设备ID,与厂商ID一起指明数据的类型,被使用选择PCIE上位机的软件驱动。
3、版本ID,指明使用该PCIE IP进行设置的版本
4、子厂商ID,用来更近一步的区分Xilinx旗下的厂商
5、子系统ID,用来识别板卡的的ID
6、PCIE在实验中承担的角色,这里我们选择默认即可
基于FPGA的PCIE设计(2)_第15张图片
1、PCIE To AXI的BAR地址空间设置,用于IO的配置空间,也是endpoint to rootport的方向
基于FPGA的PCIE设计(2)_第16张图片
默认即可
基于FPGA的PCIE设计(2)_第17张图片
1、2、AXI TO PCIE的BAR空间,也就是rootport to endpoint可以看见的方向。
基于FPGA的PCIE设计(2)_第18张图片
1、2、AXI总线的最低地址与最高地址
基于FPGA的PCIE设计(2)_第19张图片
默认即可
基于FPGA的PCIE设计(2)_第20张图片
默认即可。

PCIE root port的Block Design搭建

这里饿哦们让你也是直接给出相应的图像,供大家简略学习:
基于FPGA的PCIE设计(2)_第21张图片
1、是endpoint读写rootport的数据通路
2、是rootport读写endpoint的数据通路
上面Block design的搭建其实我一直不明白centerDMA Ip的作用,也没真正下板实现过,这里也就不多说了。因为FPGA做为rootport来使用,本身就很少见。

上面的博客,我们主要介绍了VIVADO中PCIE IP的使用,介绍的比较粗略。尤其是第一个很常用,想进一步了解的同学可以找一找原本的资料,这里我只是介绍了自己的想法。

参考文献

[1]、V3学院
[2]、米联客

总结

由于水平有限,对PCIE的认识不到位,文章中的阐述有可能存在错误,欢迎大家指正。创作不易,认为文章有帮助的同学们可以关注、点赞、转发支持。为行业贡献及其微小的一部分。或者对文章有什么看法或者需要更近一步交流的同学,可以加入下面的群:
在这里插入图片描述

你可能感兴趣的:(FPGA)