前面7.4节我们给用户讲解了PCIe下的FIFO DMA高速传输通道的用法,FIFO顾名思义就是在保证数据不丢失的情况下,高速传输,特别适合那些数据采集、图像采集、波形回放等应用;本节我们给用户介绍另外一种相对慢速的通道,只要不断电可以一直保存数据的存储器,也称之为Memory。
这里我们说的Memory并不是LabVIEW FPGA芯片里面的存储器,而是Xillybus官方PCIe IP核里面封装的Memory通道,上位机可以直接通过PCIe总线把上位机要进行读写的地址和数据通过Memory通道下发给FPGA,非常适合用来传输同时具备地址和数据信息的内容。
相对于只有一个数据属性的FIFO而言,Memory通道具备两个属性参数,一个是地址概念,一个是数据部分。简而言之,就是下位机FPGA里面如果我们模拟一个一维数组或者一个Memory,上位机可以直接调用我们封装的好的DLL驱动,读写下位机的数组或者Memory里面指定位置的元素,地址就相当于索引,这样做的好处是,用户可以提前将下位机里面用到的参数放在数组或者Memory里面进行自动更新维护,上位机可以随时对下位机的数组或者Memory进行指定位置的读写。
举1个常见的例子:比如上位机要通过PCIe控制FPGA板子上的LED灯、继电器、数字IO输出引脚,还想着读取FPGA板子外接的按键、开关、输入信号这些状态信号。一般有两个实现方式。
第一种方式是,将下位机所有的数据拼接之后通过PCIe DMA FIFO发送到上位机,或者把上位机拼接后的数据通过FIFO下发给FPGA再逆向解析出来,这种思路很常见,对应前面我们讲解的串口、网口、USB里面其实都有所提到。优点是框架统一,不局限于何种通信接口,缺点是用户需要对数据包里面的数据组织方式有所了解。
第二种方式是,利用本节我们所要讲解的Memory通道实现地址和数据的下发。比如我们可以先把下位机FPGA里面要控制的LED灯、继电器、DO或者AO这些引脚或者参数统一按照先后顺序放到一个数组或者Memory里面(元素类型可以是U8、U16、U32),这个数组或者Memory我们称之为“下行数组”,意为上位机可以直接通过PCIe总线对这个数组或者Memory里面的元素进行写操作;然后把按键、开关、DI或者AI等信息按照先后顺序放到另外一个数组或者Memory里面,这个数组称之为“上行数组”,意为上位机可以直接通过PCIe总线读取这个数组或者Memory里面指定位置的元素。优点是用户不需要像前面FIFO那样对接收的所有数据包进行解析了,直接将各个变量当成元素存放到数组或者Memory里面去,上位机想读写控制下位机FPGA时,直接通过下发地址就可以实现对指定位置的元素进行读取或者更新了;缺点是Memory的传输速度没有FIFO快,但是对于一般的指令或者参数等状态信息是完全足够的,另外就是下位机FPGA里面要始终维护对数组或者Memory里面的数据更新。
上面描述的这个过程,我们在后续实验69里面再详细的给用户讲解怎么编程实现。
衍生:通过上面的讲解,用户是不是有一种感觉:那就是可以直接将下位机FPGA前面板上的控件以及感兴趣的局部或者全局变量按照顺序放到一维数组或者Memory里面去,然后上位机只要知道每个控件或者参数所在数组或者Memory的索引位置,就可以通过我们封装的PCIe Memory通道Socket CLIP下发地址来读取或者更新下位机FPGA的控件数值了。等于是变相的实现了类似NI FPGA那样的在线前面板仿真、调试、运行、观察。
本节重点给用户讲解的是我们封装好的LabVIEW FPGA下的PCIe Memory CLIP组件功能和用法。这个PCIe Memory CLIP也是我们My FPGA软件工具包的核心组件之一,我们花费了近1个月的时间,将Xillybus官方提供的Memory代码进行移植、修改和适配,并进行了大量的测试验证,最终才把底层的精髓部分PCIe Memory IP封装到LabVIEW FPGA CLIP里面来,并且给用户提供了极其简单的四线握手Memory接口,所有关于PCIe Memory协议本身的通信都封装到底层去了,用户不需要了解什么是PCIe Memory,可以直接使用LabVIEW FPGA来调用这个PCIe Memory来读写下位机FPGA里面的控件或者IO端口。
下面我们重点给用户介绍一下我们封装好的2上2下的FPGA PCIe Memory Socket CLIP,首先在LabVIEW项目浏览器下的“我的电脑”上右击,选择新建“终端和设备”,如图7-58所示。注意:这个后缀为8CMs的FPGA终端是完全包含后缀为8Chs的FPGA终端项目的。因此,用户将8Chs终端项目下的所有例程拖拽到8CMs下面重新编译下载都是可以的。