当FPGA硬件被系统识别成功后,我们就可以编写一个上位机PC端的应用程序来与之通信,比如用来监控下位机FPGA前面板上的控件值或者下发控制指令给FPGA了。为了方便广大用户的使用,我们将2上2下共计4个通道的中间层Memory读写通道传输也封装到前面给用户介绍过的那个DLL动态链接库里面了,这样对于使用不同编程语言(C\C++\C#\Python)开发上位机应用程序的用户来说,直接调用我们封装好的DLL驱动就可以了。这个DLL位于本书配套的云盘里面,如图7-74所示。
图7-74:我们给用户封装好的包含8对DMA FIFO和2对Memory通道的DLL动态链接库
注意:不管是win7还是win10系统,基本上都没有ucrtbased.dll和vcruntime140d.dll,因此,如果用户直接调用我们生成的“Xillybus_PC_for_LV_DLL_8Chs.dll”,win7系统会弹框提示你少了的库的名称,其实就是前面两个依赖库,但是win10系统不提示,直接报错,从这一点看,win10系统的用户体验做的太烂。因此,为了方便用户使用,我们直接将这两个系统依赖库跟我们的“Xillybus_PC_for_LV_DLL_8Chs.dll”放在同一个目录下,这样用户就不用操心了,无论通过什么软件去调用dll都能正常了!!!
下面再回顾一下前面我们针对LabVIEW软件封装好的一个lvlib库文件,对于熟悉LabVIEW编程的工程师来说,直接将lvlib里面的VI拖拽到自己的程序里面就可以完成跟下位机FPGA之间的PCIe通信了,一目了然。图7-75显示的是我们封装好的上位机LabVIEW My FPGA PCIe Toolkit软件工具包项目浏览器截图。
图7-75:封装出来的FPGA PCIe DMA和Memory上位机LabVIEW项目库
里面主要包含两大块,分别是PCIe DMA FIFO相关的多态VI和Memory通道读写相关的多态VI;DMA FIFO相关函数我们在前面7.3.3节已经做了详细介绍,本节先着重介绍一下我们封装的lvlib库里面的Memory相关函数(VI),这些函数位于这个虚拟文件夹“PC_Memory_RW_2Chs_Func”里面。
为了提高Memory读写的效率,我们特地有针对性的封装,将Memory上行读数据(FPGA–>Host)和下行写数据(Host–>FPGA)的传输过程分成3个步骤,分别对应6个子VI,也就是打开、读写、关闭,如图7-76所示。
图7-76:lvlib库里面的7个PCIe Memory通道读写函数
PCIe Memory读通道初始化(FPGA_Memory_Read_