LabVIEW FPGA PCIe开发讲解-7.4节:LabVIEW FPGA PCIe 8通道DMA Socket CLIP 讲解(神电测控独家提供A和B版本)

本文详细介绍了LabVIEW FPGA中封装的PCIeCLIP组件,包括其功能、用法以及核心组件Xillybus PCIe DMA IP的移植和适配。内容涵盖不同版本的PCIe DMA IP核性能,如何新建和使用FPGA终端设备,以及PCIeCLIP的四线握手FIFO接口。此外,还解析了PCIeCLIP的各个信号端口,如PCIe状态LED、同步时钟、上行和下行通道等,为用户提供了清晰的编程指导。
摘要由CSDN通过智能技术生成

本节我们重点给用户讲解一下我们封装好的LabVIEW FPGA下的PCIe CLIP组件功能和用法。这个PCIe CLIP也是我们My FPGA软件工具包的核心组件之一,我们花费了近3个月的时间,将Xillybus官方提供的代码进行移植、修改和适配,并进行了大量的测试验证,最终才把底层的精髓部分PCIe DMA IP封装到LabVIEW FPGA CLIP里面来,并且给用户提供了极其简单的四线握手FIFO接口,所有关于PCIe协议本身的通信都封装到底层去了,用户不需要了解什么是PCIe,一样可以使用LabVIEW FPGA来调用这个PCIe CLIP进而快速开发出一个属于自己的PCIe FPGA设备来。

Xillybus官方提供了4个版本的PCIe DMA通信IP核,分别是A版本、B版本、XL版本和XXL版本。其中,A版本在PCIe X4模式下的最大吞吐率是400MB/s,X8模式下是800MB/s;B版本在X4模式下是800MB/s,在X8模式下是1.6GB/s;而XL和XXL版本对应的传输速度则分别是B版本的2倍和4倍,比如XXL版本可以实现目前Xilinx最新款的KU芯片PCIe最高传输带宽6.6GB/s。

目前我们默认提供给用户使用的是A版本和B版本的Socket CLIP组件,而XL和XXL版本则需要向Xillybus公司发邮件申请,同意之后就可以开发更高带宽的PCIe总线设备了。

对于目前大多数应用来说,800MB/s完全足够了,相当于六七个千兆以太网同时并行传输了。并且超过800MS/s的应用,一般多是RF射频和高速流盘系统,如果直接将超过800MB/s的数据放到计算机内存里面也是瞬间就会爆掉,所以一般都会配一个磁盘阵列来保存数据,中间的过程,用户很难在PC端对数据进行在线处理,因为任何算法都有可能导致数据不连续,如果把算法放到FPGA里面运行,对数据进行逐点处理,则完全不影响上位机的数据流盘或者显示。

下面我们重点给用户介绍一下我们封装好的8上8下的FPGA PCIe DMA Socket CLIP,首先在LabVIEW项目浏览器下的“我的电脑”上右击,选择新建“终端和设备”,如图7-35所示。 在这里插入图片描述
图7-35:右击“我的电脑”选择新建FPGA终端和设备

然后在弹出来的终端设备新建对话框里面,找到ARTIX7-100T对应的X4模式下8通道下的A和B两个版本的FPGA终端,如图7-36所示。

在这里插入图片描述
图7-36:在弹出的列表框中找到X4模式下8通道的A版本和B版本FPGA终端

点击“确定”按钮后,这两个版本的PCIe通信Socket CLIP组件会自动添加到FPGA终端里面来,图7-37显示的是A版本的LabVIEW FPGA CLIP,图7-38显示的是B版本的LabVIEW FPGA CLIP。

展开这两个CLIP之后,用户可以看到一共有50个EIO节点,虽然多,是因为我们封装了8上8下,也就是16个通道,每个通道都是一个标准的四线握手制FIFO,相当于3根线,所以,所有通道的握手信号就有16×3=48个,再加上1个100MHz同步时钟和反应PCIe IP工作状态的的4个LED灯,一共就是48+1+1=50个EIO节点。 在这里插入图片描述
图7-37:新建出来的Aritx7 A版本的PCIe FPGA Socket CLIP组件 在这里插入图片描述
图7-38:新建出来的Aritx7 B版本的PCIe FPGA Socket CLIP组件

默认情况下,我们给这8上8下共计16个PCIe通道分配的驱动名称和带宽,分别如下面的图7-39和7-40所示。这两个表里面每个通道的传输带宽也可以自由分配,并不局限于我们的设置那样,今后,如果用户需要修改这些参数可以联系我们神电测控。 在这里插入图片描述
图7-39:我们封装的A版本PCIe FPGA CLIP对应的主机端(PC)通道名称和传输带宽 在这里插入图片描述
图7-40:我们封装的B版本PCIe FPGA CLIP对应的主机端(PC)通道名称和传输带宽

可以看出,B版本的位宽和带宽都要比A版本的高,所以为了尽可能提升PCIe的通信带宽,接下来我们会重点以B版本进行讲解,其他版本其实除了位宽,其余都是完全一样的四线握手的FIFO。虽然端口数量比较多,但是每个端口的用法都是一样的,对于下位机FPGA来说,用户需要关心的就是位宽和速度。

为了支持更高端的FPGA芯片以及后续国产化FPGA(深圳国微和上海复旦微),我们特地将Xilinx Kintex7家族也进行了B版本的LabVIEW PCIe DMA CLIP封装,如图7-41所示。新建出来的FPGA PCIe Socket CLIP节点里面的端口,如图7-42所示。 在这里插入图片描述
图7-41:在弹出的列表框中找到X4模式下8通道的B版本Kintex7 FPGA终端 在这里插入图片描述
图7-42:新建出来的Kintex7 B版本的PCIe FPGA Socket CLIP组件

下面我们给大家逐一讲解一下B版本的LabVIEW FPGA PCIe Socket CLIP里面每个信号端口的含义和注意事项。通过虚线将50个CLIP端口划分成4类:分别是PCIe Socket CLIP输出状态端口(LED)、CLIP同步100M时钟、上行(FPGA–>Host)通道以及下行(Host–>FPGA)通道。其中,Host可以直观的理解成上位机PC。

 1)pcie_lv_clip_ip_to_gpio_led

 2)Clock PCIE_LV_Clock_100M

 3)pcie_lv_clip_fpga2host_in_64_tdata_ch0
 4)pcie_lv_clip_fpga2host_out_64_tready_ch0
 5)pcie_lv_clip_fpga2host_in_64_tvalid_ch0
 ……………………
 24)pcie_lv_clip_fpga2host_in_8_tdata_ch7
 25)pcie_lv_clip_fpga2host_out_8_tready_ch7
 26)pcie_lv_clip_fpga2host_in_8_tvalid_ch7

 27)pcie_lv_clip_host2fpga_out_64_tdata_ch0
 28)pcie_lv_clip_host2fpga_in_64_tready_ch0
 29)pcie_lv_clip_host2fpga_out_64_tvalid_ch0
 ……………………
 48)pcie_lv_clip_host2fpga_out_8_tdata_ch7
 49)pcie_lv_clip_host2fpga_in_8_tready_ch7
 50)pcie_lv_clip_host2fpga_out_8_tvalid_ch7

备注:中间的省略号指的是同类端口,只是这些端口的位宽和速度不一样,但是用法是完全雷同的,所以我们只需要把CLIP里面其中一个端口的用法讲清楚,其余的照搬照抄就可以了,而且真实应用中,这些8上8下的端口一般不会全部使用,除非是超复杂的项目。下面我们给用户详细讲解一下每个端口的含义。

1)pcie_lv_clip_ip_to_gpio_led
Xillybus提供的PCIe IP核里面默认预留了4个GPIO输出状态口,可以用来通知用户当前这个IP核所处的工作状态。我们在封装LabVIEW FPGA PCIe Socket CLP的时候,也一并将其封装进来了,关于这4个LED状态的含义,我们在Xillybus官方论坛上找到了下面一段英文回复,但是Xillybus官网上却没有给出;另外,Xillybus最新推出的XillyUSB对应的8个LED状态,官网上却给出了每个LED的含义,因此,建议官方把Xillybus PCIe IP核的LED含义也放在官网页面上,不然会让用户找的好辛苦!
So we have some kind of progress. If your “custom board” is manufactured by some other hardware vendor, I suggest trying out their test code for PCIe.If it’s your own – please take a look on the LEDs. Their meaning is as follows:
GPIO LED 0: Heartbeart. Just blinks.
GPIO LED 1: Indicates transmission of data from the FPGA to the CPU
GPIO LED 2: Indicates transmission of data from the CPU to the FPGA
GPIO LED 3: Indicates that the FPGA is waiting for CPU-to-FPGA data to arrive (i.e. there’s at least an outstanding request for reading) OR that the Xillybus logic is held reset (on some platforms).

我们简单翻译一下:
GPIO LED_0:心跳指示灯,1Hz,当PCIe IP核正常加载,且被PC识别成功,那么LED_0会按照1Hz的频率进行闪烁;反之,如果不闪烁,说明FPGA里面的代码写的有问题或者PC端的驱动没有正常安装或者PCIe相关的引脚约束没有整对。
GPIO LED_1:显示上行(FPGA–>PC)数据正在发送指示灯,也就是当FPGA把数据发送给主机PC时,这个指示灯会闪烁,发送频率越高,闪烁越快;反之,如果不闪烁,要么就是FPGA不发送数据,要么就是FPGA程序没写好。
GPIO LED_2:显示下行(PC–>FPGA)数据正在接收指示灯,也就是当PC端把数据下发给FPGA时,这个指示灯会闪烁,下发频率越高,闪烁越快;反之,如果不闪烁,要么就是PC不下发数据,要么就是PC端程序没写好。
GPIO LED_3:指示FPGA正在等待CPU到FPGA数据到达(即至少有一个未完成的读取请求)或Xillybus逻辑保持重置。

一般情况下,在开始调试程序的时候,建议大家使用这些LED状态输出信号,帮助我们快速定位一些常见的问题,一旦程序完善了,如果FPGA板子上的LED不够用了,那么可以将PCIe关联的信号拿掉。

实战中:用户可以将FPGA终端下的PCIe CLIP里面的“pcie_lv_clip_ip_to_gpio_led”端口拖拽到FPGA VI程序框图里面,然后把定点输出FXP<+4,4>通过“数值至布尔数组”转换函数变成一维字节数组,再连到4个LED上面,如图7-43所示,这样就可以在实验过程中很直观的看到PCIe IP核的运行状态了。如果一切正常,可以看到电脑重启之后,LED1指示灯会闪烁;发送上行数据时,LED2指示灯会闪烁;接收下行数据时,LED3指示灯会闪烁;FPGA重置时,LED4指示灯会常量。 在这里插入图片描述
图7-43:将CLIP里面的led状态信号端口赋值给FPGA外部的LED灯

2)Clock PCIE_LV_Clock_100M
FPGA PCIe IP核用户时钟,默认是100MHz,这个时钟是路由出来给用户自己写程序用的FIFO同步时钟。众所周知,Xilinx官方给的PCIe IP核配置页面里面,时钟一般是125MHz或者250MHz,但是Xillybus把这些内部时钟隔离了,预留出来一个100MHz的异步时钟(相对于Xilinx PCIe IP核的125MHz时钟来说,就是异步)给用户线程使用,但是这个100MHz时钟跟后面16个通道对应的四线握手的FIFO是同步的,也就是说,用户如果要把FPGA里面的数据发送给PC或者接收PC下发的数据,必须要使用这个100MHz时钟源,才能保持FIFO同步握手。为此,我们将这个100MHz时钟直接封装到我们的LabVIEW FPGA PCIe Socket CLIP里面来了,时钟信号名为“Clock PCIE_LV_Clock_100M”。
如何使用外部CLIP路由进来的时钟,跟前面我们封装的千兆以太网、USB时钟一样,用户可以直接在FPGA定时循环左边创建一个时钟源常量,然后在下拉列表里面选择,如图7-44所示;或者直接双击FPGA定时循环,在弹出来的时钟配置页面里面选择“PCIE Data\Clock PCIE_LV_Clock_100M”,如图7-45所示。 在这里插入图片描述
图7-44:为FPGA定时循环创建一个PCIe时钟源常量 在这里插入图片描述
图7-45:直接在FPGA定时循环时钟配置页面里面选择PCIe同步时钟
3)pcie_lv_clip_fpga2host_in_64_tdata_ch0
4)pcie_lv_clip_fpga2host_out_64_tready_ch0
5)pcie_lv_clip_fpga2host_in_64_tvalid_ch0
……………………
24)pcie_lv_clip_fpga2host_in_8_tdata_ch7
25)pcie_lv_clip_fpga2host_out_8_tready_ch7
26)pcie_lv_clip_fpga2host_in_8_tvalid_ch7

上面这8个PCIe发送通道(326)的四线握手信号,其实就是上行数据发送端口,为了方便不同用户的项目需求,我们封装了8个不同位宽和速度的Pipe管道(或者叫Channel通道),如果是高速的数据采集上传,可以选择64位或者32位的Channel0或者Channel1,如果是低速的数据传输可以选择8位的Channel4Channel7.

每个上行通道都有3个握手端口组成,比如,拿64位上行数据端口来说:pcie_lv_clip_fpga2host_out_64_tready_ch0、pcie_lv_clip_fpga2host_in_64_tdata_ch0和pcie_lv_clip_fpga2host_in_64_tvalid_ch0。
为了让用户更加形象的理解和掌握这些握手信号的用法,我们先给出一个FPGA PCIe数据发送程序框图,如图7-46所示。毕竟LabVIEW框图看起来显而易见,一图胜千言! 在这里插入图片描述
图7-46:FPGA通过PCIe四线握手发送数据给PC端(上行)

其中,“fpga2host_out_tready”信号就是PCIe Socket IP核里面的接收FIFO准备就绪信号,如果这个“fpga2host_out_tready”拉高,说明PCIe IP核可以接收FPGA给过来的数据,然后将其发送到PC端,因此,我们可以将这个tready接到FPGA里面的数据源FIFO的“输出就绪”端口上面;再把FPGA里面用户创建的FIFO输出的数据和有效信号分别接到PCIe Socket CLIP的“fpga2host_in_tdata”和“fpga2host_in_tvalid”端口上面。
27)pcie_lv_clip_host2fpga_out_64_tdata_ch0
28)pcie_lv_clip_host2fpga_in_64_tready_ch0
29)pcie_lv_clip_host2fpga_out_64_tvalid_ch0
……………………
48)pcie_lv_clip_host2fpga_out_8_tdata_ch7
49)pcie_lv_clip_host2fpga_in_8_tready_ch7
50)pcie_lv_clip_host2fpga_out_8_tvalid_ch7

接下来,剩下的这8个PCIe接收数据通道(27-50)的握手信号,其实就是下行数据接收端口,为了方便不同用户的项目需求,我们封装了8个不同位宽和速度的Pipe管道(或者叫Channel通道),如果需要快速下发数据给FPGA,可以选择64位或者32位的Channel0或者Channel1,如果是低速的数据传输可以选择8位的Channel4~Channel7.

每个下行通道同样是3个握手端口组成,比如,拿64位下行数据端口来说:pcie_lv_clip_host2fpga_in_64_tready_ch0、pcie_lv_clip_host2fpga_out_64_tdata_ch0和pcie_lv_clip_host2fpga_out_64_tvalid_ch0。为了让用户更加形象的理解和掌握这些握手信号的用法,我们先给出一个FPGA PCIe数据接收程序框图,如图7-47所示。毕竟LabVIEW框图看起来更直观易懂! 在这里插入图片描述
图7-47:FPGA通过PCIe四线握手接收PC端下发的数据(下行)

其中,“host2fpga_in_tready”信号就是PCIe Socket IP核内部的FIFO数据输出使能信号,相对于FPGA来说,就是输入信号,如果给这个“host2fpga_in_tready”赋高,那么一旦PCIe总线接收到上位机PC下发的数据后,那么对应的“host2fpga_out_tdata”和“host2fpga_out_tvalid”就会有效;因此,我们可以将FPGA里面用户创建的接收FIFO的“输入就绪”端口接到Socket CLIP的“host2fpga_in_tready”上面;再把“host2fpga_out_tdata”和“host2fpga_out_tvalid”分别接到FPGA里面用户创建的FIFO数据输入和输入有效信号端口上。

注意1:其他位宽的PCIe通道也是如此,用户只需要更改一下FIFO的数据类型,使其数据宽度跟PCIe Socket CLIP通道位宽一致就可以了。

注意2:我们封装的PCIe上行和下行tdata都是FXP定点数,可以直接接收有符号或者无符号整形数据,而需要提前进行转换,当然,如果用户不放心的话,也可以将整形通过“数值至布尔数组”将符号特性去掉,然后再利用“布尔数组至数值”转换成FXP定点数给到PCIe Socket CLIP的tdata端口上面。

注意3:Xillybus提供的PCIe IP核内部是小端格式,也就是说,低字节在前,高字节在后,所以,要么在下位机FPGA里面提前做翻转,要么在上位机做大小端变换!比如,如果用户在FPGA里面发送一个32位位宽的数据,那么可以借助“拆分数字”和“交换字节”两个函数来完成大小端格式的转换,如图7-48所示。这里,我们给出了3种不同数据类型的大小端格式转换,这个功能将在后续的实验部分会用到,大家可以留心一下。 在这里插入图片描述
图7-48:FPGA里面不同数据类型的大小端格式转换代码

可以看出,虽然PCIe协议本身很复杂,但是对于用户来说,只要理解了FIFO的四线握手编程,就可以搞定所有线程之间的数据传输问题了,这也就是为什么我们在书中每个实验里面都反复强调四线握手和并转串以及串转并的重要性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值