LabVIEW FPGA PCIe开发讲解-7.2节:目前主流的4大Xilinx FPGA PCIe DMA通信IP核讲解

1、要开发一个带PCIe或者PXIe接口的FPGA板卡出来,除了硬件本身外,最重要的就是FPGA芯片里面的PCIe通信代码编写,俗称下位机FPGA编程;还有中间层的驱动文件编写以及上位机PC端的应用程序开发。

2、其中,中间层驱动和上位机PC端一般都可以使用C语言或者LabVIEW进行开发,但是下位机FPGA里面的PCIe代码一般会采用VHDL或者Verilog进行编写,难度比较大,尤其是涉及到PCIe DMA这类复杂的通信协议,开发难度和工作量会非常大,导致很多应用工程师在做PCIe相关的FPGA嵌入式开发时,碰到了不少坑,投入了很多精力和时间也没有把FPGA PCIe DMA做稳定。

3、本章重点就是告诉用户如何使用LabVIEW在FPGA芯片里面编写PCIe DMA程序,彻底解决下位机FPGA代码编写的痛点,让LabVIEW图形化编程语言深入到FPGA骨髓里面去,降低FPGA PCIe嵌入式开发门槛,真正发挥出PCIe总线高速通信的能力。

4、目前Xilinx FPGA芯片是全球出货量最多的,同时芯片种类也是最多的,所以我们重点需要研究的就是Xilinx FPGA芯片的PCIe通信IP核。目前市面上现有的支持Xilinx FPGA芯片的PCIe DMA通信IP主要有以下4家:
 Xilinx官方推出的XAPP1052和XMDA IP核
 以色列Xillybus FPGA PCIe DMA IP核
 GitHub上的RIFFA(AReusable Integration Framework For FPGA Accelerators)IP 核
 北大无线可重构体系结构课题小组的框架:EPEE(Efficient and Flexible Host-FPGA PCIe Communication Library)

下面我们简单介绍一下这4家方案。
1)Xilinx官方的PCIe IP核有两个版本:一个是很古老的XAPP1052,一个是近些年才推出的XDMA IP核。其中,XAPP1052 IP核和例程提供了全部的底层Verilog源代码,便于用户去理解和掌握PCIe通信协议在FPGA里面是怎么实现的,但是这些代码据说在使用的时候,存在一些坑,尽管网上有很多高手给出了解决方案,但是对于没有经验的用户来说,可能会造成不必要的困扰;后来,Xilinx下定决心,重新开发了一个也就是现在大家所熟知的XDMA IP核框架,这个也是目前主流的开发板厂商采用的方案。国内做Xilinx FPGA开发板业务比较大的当属黑金和米联客,其中米联客对Xilinx提供的XAPP1052和XDMA都有详细的教程和视频,当然是收费的;而黑金现在基本上都是基于XDMA编写的FPGA PCIe例程。

Xilinx官方提供的XDMA IP核方案有一个不足的地方,就是PCIe通信时的通道数量有限制,用户无法灵活配置,只能两上两下,无法实现8上8下这种,除非用户自己通过软件编写实现,这样工作量就会无比巨大。另外,Xilinx官方提供的驱动文件没有经过微软数字签名认证,无法正常安装,只能将windows系统设置到测试模式下才行,这点对于普通用户来说,比较麻烦。

2)以色列XILLYBUS公司推出的Xillybus FPGA PCIe DMA驱动IP核。这家公司技术实力非常全面,在很早的时候,就把复杂的FPGA PCIe DMA通信技术通过自己的封装变成傻瓜化,让用户能够轻轻松松集成到自己的项目和产品应用中。与此同时,该公司还把USB 3.0协议进一步封装成非常易用的FPGA IP核,以及将Xilinx ZYNQ平台里面的AXI4总线重新封装了。除此之外,Xillybus不仅仅支持Xilinx公司带PCIe的全系列FPGA芯片,还支持Altera公司带PCIe的全系列FPGA 芯片。

XILLYBUS公司这样做的目的就是为了降低开发者的门槛,节约软件工程师大量的开发时间成本。其实,这个本应该是Xilinx公司该干的事情,但是Xilinx却没有这样做,很多原创公司做的软件其实都太偏底层了,应用层和易用性都不太好。

下面,我们来看看,Xillybus是如何将一个复杂的PCIe DMA封装成傻瓜式的IP核,让用户不费吹灰之力就能嵌到自己的FPGA程序里面。先看图7-5所示。
LabVIEW FPGA PCIe开发讲解-7.2节:目前主流的4大Xilinx FPGA PCIe DMA通信IP核讲解_第1张图片
图7-5:Xillybus PCIe IP核内部链接示意图

首先,Xillybus将Xilinx或Altera公司的底层PCIe接口IP core,接入到它自己的Xillybus IP core,然后再通过四线握手的Application FIFO接口将收发TX、RX通道映射出来给到FPGA。结构非常清晰,用户即使完全不懂PCIe通信协议,也可以很简单的在FPGA里面通过调用Xillybus提供的收发FIFO接口,将数据发送到上位机PC或者接收上位机PC下发的数据,因为Xillybus直接将底层的IP核全部屏蔽了,用户只需要按照标准的四线握手协议来操作对应的FIFO缓冲区就可以了。而上位机PC端更加简单,只需要通过打开被系统(Windows和Linux都支持)识别出来的名为xillybus的PCIe设备,然后调用标准的文件读写函数,进行文件读写即可控制底层FPGA芯片里面的FIFO数据的收发。

这个控制过程其实就跟全双工的串口通信一样简单,用户只需要关心数据存放在哪里,到哪里去读数据就可以了;另外,Xillybus还提供了一个web配置页面,用户可以直接在上面自由的分配FPGA端的PCIe通道数量和通道传输速率,非常方便,比如,在一个既有高速采集又有很多控制命令和参数传输的应用中,如果我们直接在页面上配置多个不同位宽不同传输速度的Channel,那么用户在FPGA里面编程和上位机解析的时候就会非常方便,因为每个通道都是一个独立的存在,比如将需要高速采集传输的数据流通过64位位宽的Channel0发送给PC(上行),将上位机低速的控制参数通过8位位宽的Channel4发送给FPGA(下行),如图7-6所示。 LabVIEW FPGA PCIe开发讲解-7.2节:目前主流的4大Xilinx FPGA PCIe DMA通信IP核讲解_第2张图片
图7-6:Xillybus PCIe IP通道参数配置页面

在后续我们封装出来给用户的LabVIEW FPGA PCIe CLIP里面,我们默认提供了8上8下,一共16个通道,这样极大的方便了用户今后在自己的项目里面使用PCIe通信,而无需考虑因为通道不够导致数据不好解析的尴尬。从上位机PC端的角度来看,其实这8上8下的PCIe通道,本质上有点类似8对串口通信,只不过PCIe的传输速度远快于串口、USB、网口而已。因此,用户在上位机就可以像操作串口那样通过PCIe总线来操作和访问FPGA里面的数据了,开发过程非常简单,只要会一点LabVIEW就能轻松搞定。

3)GitHub上的RIFFA(AReusable Integration Framework For FPGA Accelerators)IP 核

RIFFA(用于FPGA加速器的可重用集成框架),它是用于通过PCIe总线从主机CPU到FPGA相互之间进行数据交互的简单框架。该框架要求具有PCIe的上位机PC或者工控机和带有PCIe接口的FPGA硬件。RIFFA中间层驱动支持Windows和Linux,底层驱动FPGA PCIe IP核支持Xilinx和Altera芯片,上位机应用层支持LabVIEW、C / C ++、Python、Matlab和Java。
软件方面,RIFFA有两个主要功能:数据发送和数据接收。上层提供C / C ++、Python、MATLAB、Java下的DLL链接库。中间层驱动程序在每个系统(Linux和Windows操作系统)下支持识别多个FPGA(最多5个)。

硬件方面,用户访问具有独立发送和接收信号的接口(全双工),无需了解总线地址,缓冲区大小或者PCIe数据包格式。只需在FIFO接口上发送数据并在FIFO接口上接收数据即可。RIFFA不依赖于PCIe桥接器,因此不受桥接器实现的限制。取而代之的是,RIFFA直接与PCIe端点一起使用,RIFFA使用直接内存访问(DMA)传输和中断信号传输数据。这样可以在PCIe链路上实现高带宽。软件和硬件接口都已大大简化。
关于RIFFA PCIe IP核的工作示意图,如图7-7所示。
LabVIEW FPGA PCIe开发讲解-7.2节:目前主流的4大Xilinx FPGA PCIe DMA通信IP核讲解_第3张图片
图7-7:RIFFA PCIe IP工作示意图

FPGA底层集成了Xilinx的PCIe core,然后使用TX、RX引擎,经过通道仲裁映射到最多12个TX、RX通道上。结构与PIO、BMD的结构类似,增加了通道扩展的功能,这样用户就不需要自己去写仲裁代码了。

上位机PC端主要就是基本的驱动、应用结构,PCIe的访问空间映射到了PC的内存上;中间层的RIFFA驱动负责内存以及PCIe接口的管理,RIFFA动态链接库可以被用户应用程序调用,从而实现对底层RIFFA驱动的调用,并最终实现PCIe的数据通信。
可以看出,这个RIFFA的框架跟上面的Xillybus框架其实很类似,只不过Xillybus更强大更灵活,基于Web的通道配置页面里面可以实现最多128个通道的任意分配和带宽设置,远多于RIFFA的12个通道。

4)北大的EPEE(Efficient and Flexible Host-FPGA PCIe Communication Library)

最后一个就是昙花一现的北大开源组织做的EPEE,图7-8是其系统框图,感兴趣的用户可以自行分析,因为目前可以找到这个EPEE的资料和应用非常少,这里就不在介绍了。
LabVIEW FPGA PCIe开发讲解-7.2节:目前主流的4大Xilinx FPGA PCIe DMA通信IP核讲解_第4张图片
总结:对于我们传统的嵌入式工程师来说,选择一个合适的FPGA PCIe驱动IP非常重要,不仅可以节约大量开发时间,关键是稳定性要比我们自己写的更好,毕竟很多商业的FPGA驱动IP核和驱动inf文件都是经过了大量企业实践检验过的,而很多所谓的开源代码,实际上用起来总是有这样那样的bug和坑,需要用户自己花费大量的时间去调试、修改和维护,有时候得不偿失。如果是做产品的话,个人愚见,还是用成熟的企业版软件工具包和FPGA驱动IP核,毕竟稳定胜于一切,社会分工不一样。

经过上面的讲解和分析,最终我们选择了以色列的Xillybus作为我们LabVIEW FPGA底层PCIe驱动IP核的候选,我们将整个Xillybus的FPGA PCIe IP核以CLIP的方式重新封装到LabVIEW My FPGA下面,这样用户就能通过LabVIEW图形化的方式直接调用这个IP核了(关于这个PCIe DMA CLIP的详细介绍,后面专门会有一节进行讲解),用户只需要会一点点LabVIEW就可以将最为复杂的FPGA PCIe DMA通信轻松拿下。

旁白:我们也衷心地希望国内有更多的牛人、高手或者企业能够像以色列Xillybus公司那样专注于做一件事情,然后把这件事做到极致,做出属于我们中国人自己的底层FPGA PCIe IP核、中间层驱动inf和上层应用层DLL。我相信这一天早晚会到来!

你可能感兴趣的:(labview,fpga,pci-e,编程语言,人工智能)