欢迎光临散文网 会员登陆 & 注册

My FPGA PCIe客户案例69:带PCIe和FMC接口(HPC)的K7开发板高速采集

2021-03-26 17:44 作者:神电测控  | 我要投稿

      1、准备好开发环境和硬件设备

 1)本节实验用到的FMC ADC模块(瀚阑电子工作室)上的ADC芯片型号是:ADS42LB69,最大采样率支持200MS/s,16位精度,实物正反面分别如图69-1和69-2所示。                       

图69-1:200MS/s,16位高精度FMC ADC模块(正面)


图69-2:200MS/s,16位高精度FMC ADC模块(背面)

2)采用的Kintex7 PCIe开发板上的FPGA是性价比超高的325T-FBG900芯片,实物如图69-3~69-7所示。

图69-3:Xilinx Kintex7-325T-FBG900-PCIe开发板(正面)
图69-4:Xilinx Kintex7-325T-FBG900-PCIe开发板(8个LED灯)
图69-5:Xilinx Kintex7-325T-FBG900-PCIe开发板(FMC HPC接口)
图69-6:Xilinx Kintex7-325T-FBG900-PCIe开发板(立体图)
图69-7:Xilinx Kintex7-325T-FBG900-PCIe开发板(与下载器相连)

3)将Kintex7 FPGA开发板插到工控机机箱里面,如图69-8所示,注意,机箱不要上电,不能带电插!再从外部接入一路信号源到FMC ADC模块上,如图69-9所示。

图69-8:Xilinx Kintex7-325T-FBG900-PCIe开发板(插到机箱里面)
图69-9:Xilinx Kintex7-325T-FBG900-PCIe开发板(外接一路信号源)

  4)将信号源的输出信号设置为正弦,频率设置为100KHz,幅度设置为5V,偏置设置为2.5V,如图69-10所示。这样实际生成的是1路信号峰峰值为±2.5V的100KHz正弦信号。

图69-10:设置信号源参数(±2.5V,100KHz,正弦信号)

       2、下位机FPGA程序开发

1)打开LabVIEW,新建一个带PCIe的FPGA终端(Kintex-7-325T-FBG900),编写下位机FPGA高速FMC AD采集程序和上位机PC端采集显示程序,完整的项目如图69-11所示。其中,我们将网上通用的200MS/s,16位ADC模块封装到LabVIEW里面来了,如图69-12所示,方便用户直接在FPGA里面调用。

图69-11:带PCIe的FPGA终端项目(K7-325T-FBG900)
图69-12:封装到LabVIEW FPGA下的FMC ADC模块CLIP

 2)具体的下位机FPGA程序和上位机PC端的程序编写过程,这里就不再介绍了,用户可以直接参考我们给出的例程,相信只要用户把本书前面的LabVIEW FPGA PCIe基础实验和中级实验学会了,这里实战的时候也是信手拈来。

        图69-13显示的是下位机FPGA上的程序框图。由于下位机FPGA里面我们使用了新型EIO节点,所以在程序初始化的话,对三态的FPGA引脚进行了方向控制,一共3个线程搞定:ADC采集线程、PCIe传输线程、指令参数解析线程。

图69-13:下位机FPGA+PCIe+FMC+ADC高速采集程序框图

        图69-14显示的是上位机PC端的数据采集前面板,图69-15显示的是上位机程序框图。上位机比较简单,直接参考前面中级实验里面的改改适配一下就可以了!

图69-14:上位机PCIe数据采集前面板
图69-15:上位机PCIe数据采集程序框图

3)FPGA程序编写完成后,打开获取Kintex7 FPGA bit文件的软件,如图69-16所示。编译完成后的K7-325T芯片的资源消耗情况,如图69-17所示。

图69-16:运行获取Kintex7 FPGA bit文件
图69-17:编译结束后的K7-325T FPGA资源消耗情况

4)接下来,将工控机上电,将Xilinx下载器接到电脑上,将前面编译出来的bit文件(ARTIX7_XC7K325T_FBG900_PCIe_X4_8Chs_B_FMC_ADC.bit)通过Vivado软件下载到K7开发板里面运行,下载过程如图69-18所示。

图69-18:利用Vivado软件将bit文件烧写到Kintex7 FPGA里面运行

       3、实验测试结果

1)PCIe不支持热插拔,所以FPGA程序下载之后,需要右击热启动一下电脑,不能选择关机,必须是重启电脑,这样主板不会掉电。重启之后,运行上位机测试软件,挨个测试一下4个通道是否能够正常采集外部信号,以及更改采样率之后的变化。

图69-19:即使开启波形显示,内存池不会溢出,因为采样率低(4MS/s,量程±8V)

        上图69-19中,我们开启了大量程测试模式,外部给的正弦信号峰峰值是2.5V,换算一下,就是2.5/8×32767=10239,正好与采集到的I16波形幅度相符。

2)接下来换一组参数继续测试,采样率保持不变,将量程切换到±8V,具体操作是,先按下点亮两个量程按钮,再点击一次Send发送更新指令和参数就可以了,此时波形图通道1里面出现的波形幅度变成了2000多,也就是2.5/4×32767,如图69-20所示。

图69-20:即使开启波形显示,内存池不会溢出,因为采样率低(4MS/s,量程±4V)

        将波形图展开之后,可以看到,400个点里面一共有10个周期的正弦信号,这是因为外部信号频率是100KHz,FPGA下的ADC采样率设置的是4MS/s,所以一个周期的量化点数就是40个点,10个波形就是400个点。

3)接下来,将采样率提高到8M,那么4个通道共计传输带宽就是4×8M×2Bytes=64MB/s。此时,前面板上的内存池会慢慢增加直到溢出,如图69-21所示。一旦发生溢出,上位机就死机了,并且下位机FPGA会一直往上位机发数据,导致中间层的PCIe驱动出现阻塞,因此,这样情况下,必须要在内存池溢出之前点击“停止”按钮将下位机FPGA停下来采集。之所以会出现溢出,是因为前面板上的控件显示消耗了大量的CPU,导致CPU没办法将PCIe DMA传输上来的数据及时读走,这种现象早在前面的PCIe通信里面就给用户讲解过了,不记得的用户可以回顾一下前面的中级实验内容。

图69-21:开启波形显示,内存池逐渐溢出,因为波形显示消耗CPU,加上采样率高了,传输数据量变大了许多(8MS/s,量程±4V)

4)为此,我们可以将前面板上的波形显示功能关掉(熄灭波形显示按钮),然后再点击一下Send发送按钮下发更新指令参数,此时,内存就会在很小的范围震荡,没有出现任何溢出的迹象,说明只要上位机CPU能够及时将数据读走是不会出现丢点的。如图69-22所示。

图69-22:关闭波形显示,即使采样率高了,内存池不会溢出(8MS/s,量程±4V)

5)然后进一步提高采样率测试看看会不会溢出,如果将采样率提高到20MS/s,实际传输带宽变成了160MB/s,在开启“波形显示”的情况下, 可以看到内存池瞬间飙升,如图69-23所示。一定要在内存池溢出之前停下FPGA采集,前面板上的波形周期变成了2个,这是因为,20MS/s的采样率,100KHz的信号每个周期量化点数是200个点,所以400个点的显示区间里面只能显示2个周期的信号。


图69-23:开启波形显示,内存池飙升,采样率太高(20MS/s,量程±4V)

6)同样,只要我们把波形显示功能关闭掉,内存池就不会出现溢出了,如图69-24所示,说明在160MB/s的传输带宽下,PCIe DMA传输都是OK的。

图69-24:关闭波形显示,即使采样率很高,内存池也不会溢出(20MS/s,量程±4V)

7)最后,经过我们反复测试发现,这款FMC ADC板子在大量程模式下,高速采集的时候,会周期性出现正负冲击的错误点,如图69-25。小量程模式下,测试半个小时,稳定性非常好,不会出现任何异常,因此,建议用户在实际应用中,选择小量程,也就是±4V进行测量,等到后续开发这个FMC模块的卖家搞定电路之后应该就切换到大量程了。

图69-25:大量程(±8V)模式下,采集的波形会有正负冲击,初步推断位电路问题

        针对上面这个问题,我们的解决方法是,如果用户希望ADS42LB29工作在量程模式下,那么可以在VHDL文件里面加上一个寄存器设置,如图69-26所示。

也就是:

WHEN X"2001"=>SPISHIFT <= X"140C";       -- 大量程模式下用(±8V下不会出现冲击)

如果用户想在小量程模式下采集,那么只需要保留这一句话即可,上面的140C要删掉,也就是:

WHEN X"0001"=>SPISHIFT <= X"1501";  -- 小量程模式下用(±4V下不会出现冲击)

也就是说:大量程与小量程模式不能兼容,好在我们有方法可以解决。

图69-26:大量程与小量程两种模式对应的SPI寄存器参数设置

8)当我们将140C寄存器参数写入ADC芯片之后,再次编译下载运行,可以看到大量程模式下,没有冲击了,如图69-27所示。放大之后的波形,如图69-28所示。不幸的是,大量程模式下的信噪比没有小量程好,所以用户今后可以根据实际信号峰峰值选择合适的量程采集。

图69-27:增加一个140C寄存器之后,大量程模式下没有冲击了
图69-28:大量程模式下的信噪比没有小量程好(250MS/s,外部信号1MHz,峰峰值±2.5V)

        特别需要注意的是:如果采样率设置的很大,上位机来不及读取,PCIe在传输的时候会阻塞丢点,因为上位机前面板上的波形显示会消耗大量的CPU资源,所以如果不想丢点,最好关闭上位机波形显示功能,或者将采集到的数据转移到队列里面进行缓冲,或者把一些复杂的耗时算法直接放在FPGA上跑,这些措施都能减轻上位机PC端的压力。

 

        特别需要提醒的是:有很多用户将分频系数改成0之后,实际采集到的整周期波形点数只有100个点,并非250个点,这是因为4个通道并行250MS/s采样率,实际带宽带宽就是2GB/s,而PCIe的时钟是100MHz,传输带宽只有800MB,所以我们特地将程序改造了一下,项目下的VI如图69-29所示,只把其中一路信号以250MS/s采样率采集之后通过PCIe传输到上位机显示,程序框图如图69-30所示。

图69-29:将ADS42LB29其中一路信号进行采集传输
图69-31:利用串转并将其中一个通道的250MS/s采样率下的数据进行上传

        实际运行的效果就是上图69-32所示的。此时的点数就对了,证实了我们定时循环是250MHz时钟域跑的,因为一个通道的数据量是500MB/s小于PCIe通道0的720MB/s,因此可以无损的传输。

图69-32:250M采样率下的通道1采集上来的波形


My FPGA PCIe客户案例69:带PCIe和FMC接口(HPC)的K7开发板高速采集的评论 (共 条)

分享到微博请遵守国家法律