第6章>>实验6:PS(ARM)端Linux RT与PL端FPGA之间(通过Reg寄存器进行通信和交互)-《LabVIEW ZYNQ FPGA宝典》

1、实验内容

        前面第五章入门实验和上一个实验5里面我们向大家展示通过了布尔类型的Reg寄存器通道实现了ZYNQ PS端ARM和PL端FPGA二者之间的开关量交互,抛砖引玉。

        从本节实验开始,接下来4个实验我们将着重向大家讲解更为通用和更为全面的4种交互方式,分别是Reg寄存器通道、Memory存储器通道、FIFO通道、DMA通道。

        学会上面4种PS端与PL端交互方法后,基本上可以涵盖ZYNQ芯片的全部应用了。对于单个元素的标量传输,一般用Reg寄存器通道就可以了;对于同一类型多个元素的数组或者向量参数来说,一般推荐用Memory存储器映射通道;对于采样率不高的ADC采集这类连续数据流传输,一般推荐走FIFO通道;对于高速ADC采集连续数据传输则推荐DMA FIFO通道,这些通道我们神电测控花费了半年时间全部封装到LabVIEW ZYNQ FPGA工具包Pro20里面了,大家会一点LabVIEW基础直接拖拽就可以了。

        本节实验先向大家系统展示一下负责PS端ARM与PL端FPGA之间的各种数据类型的双向寄存器通道,除了前面实验里面用到的布尔类型,还有8位、16位、32位数据类型的Reg寄存器通道的用法,本质上都是一样的,PS端调用Reg读写VI,PL端里面直接将FPGA终端里面的Reg CLIP通道拖拽到FPGA VI框图里面,然后直接连线就可以了。

        提醒:虽然我们默认提供的Reg寄存器通道VI默认是无符号数,但是对于有符号的应用来说也很简单,那就是将有符号数或者FXP定点数利用“数值至布尔数组转换”去除符号特性,再通过“布尔数组至数值转换”函数变成无符号数连到函数VI或者CLIP节点里面即可,非常简单。在后续的Memory存储器通道、FIFO通道、DMA通道里面,我们给大家都直接封装好了无符号和有符号类型,方法都是相同的。

2、实验目标

        本节实验需要利用LabVIEW同时开发ZYNQ PS端Linux RT程序和PL端FPGA程序。     先编写一个PL端FPGA VI,将所有数据类型的Reg寄存器通道拖拽到FPGA VI里面,在前面板上创建输入和显示控件,借助LabVIEW FPGA的在线前面板交互式运行功能,可以动态修改这些控件数据以及观察PS端传递过来的实时数据。

        然后编写一个PS端Linux RT程序,调用Reg寄存器函数选板里面的读写VI,读取PL端FPGA发送过来的各种类型的数据显示在前面板上,同时将Linux RT程序里面的数据实时发送给PL端FPGA VI,从而实现双向通信和交互。

        最后把写好的PL端FPGA程序框图编译成bit文件,再将Linux RT程序编译部署下载到ZYNQ芯片的PS端ARM里面去运行,利用LabVIEW Linux RT动态加载前面编译好的PL端FPGA bit文件,然后接上Xilinx JTAG下载器,就可以同时在线观察到PL端FPGA VI前面板和Linux RT前面板上的控件运行效果了。对于初学者着重复习并熟练掌握ZYNQ芯片PS(ARM)端LabVIEW Linux RT程序开发和PL端FPGA程序开发的过程和原理。

3、硬件介绍

        本节实验没有用到其他外设,只需要正点原子领航者ZYNQ开发板,Xilinx JTAG下载器和一根千兆网线即可。       

        其中,Xilinx JTAG下载器可以用来在线观察ZYNQ芯片PL端的FPGA VI前面板实际运行效果也可以动态修改前面板上的输入控件数值,减少了频繁编译浪费的时间。

        网线是用来将上位机编写好的ZYNQ PS(ARM)端Linux RT程序通过网络方式部署下载到ZYNQ PS端ARM里面去运行。提醒:这里的Xilinx JTAG下载器不需要下载PL端FPGA bit文件,因为PS端可以动态加载编译好的FPGA bit文件,所以如果大家不准备观察FPGA VI前面板上的控件状态,实际上这个Xilinx JTAG下载器也可以不用接。

        图6-1显示的是正点原子领航者ZYNQ开发板实物图。

图6-1:正点原子领航者ZYNQ开发板上实物图

4、原理图介绍

        由于本节实验没有用到ZYNQ开发板上的任何外设,只需要在ZYNQ芯片内部的PS端ARM和PL端FPGA之间进行内部通信和交互,所以,理论上只要ZYNQ芯片没坏,Linux RT系统能正常启动运行就可以了,故此,本节实验不需要原理图。

5、驱动VI函数讲解

5.1:PL端FPGA Reg寄存器驱动函数选板

        对于ZYNQ PL端FPGA来说,要想把单个元素的标量数据发给PS端ARM或者从PS端读取传递过来的标量数据,那么可以借助Reg寄存器通道。为了方便客户调用寄存器通道,我们将PL侧的Reg通道直接以Socket CLIP的方式封装到FPGA终端下面。按照传输方向分为PS2PL和PL2PS,其中,PS2PL指的是PS端Linux RT发送数据给PL端FPGA,那么FPGA VI直接读取这个通道即可,相当于下行;PL2PS则是PL端FPGA将数据通过Reg寄存器发送到PS端ARM里面,相当于上行。其中,PS2PL下行方向的Reg寄存器通道,如图6-2所示;PL2PS方向的上行Reg通道,如图6-3所示。

图6-2:ZYNQ PL端FPGA终端里面的Reg寄存器下行通道(PS2PL)

图6-3:ZYNQ PL端FPGA终端里面的Reg寄存器上行通道(PL2PS)

        另外,无论是PS2PL还是PL2PS,按照数据类型,我们又可以分成4类,分别是8位、16位、32位和Bool布尔类型,其中每一种位宽的整形数据寄存器通道给大家封装了4路,Bool类型的封装了32路,这样大家就有足够的Reg寄存器通道来传输自己不同数据类型或者不同命令和参数走不同的通道。布尔类型的通道数比较多,所以单独截图,PS2PL下行方向的32路布尔寄存器通道如图6-4所示;PL2PS上行方向的32位布尔寄存器通道如图6-5所示。

图6-4:ZYNQ PL端FPGA终端里面的32路布尔类型寄存器上行通道(PS2PL)

图6-5:ZYNQ PL端FPGA终端里面的32路布尔类型寄存器下行通道(PL2PS)

5.2:PS(ARM)端Linux RT驱动函数选板

        正式开始采用LabVIEW编写ZYNQ PS端Linux RT 访问和更新PL端FPGA里面的寄存器通道数据之前,我们先来了解一下本节实验要用到的PS端Linux RT下的Reg寄存器驱动VI函数功能。

        为了方便用户调用,我们提前将底层负责PS端与PL端沟通的寄存器通道函数封装到LabVIEW Linux RT环境下的“PowerGod-RIO-RT”选板里面,变成一个个小图标,一目了然。

        要完成本节实验,我们需要用到4个函数选板,分别是“PS_Load_FPGA_bit”、“PS_Load_KO”、“PS_Reg_Address”和“PS_PL_Reg”,如图6-6所示。

图6-6:本节实验要用到的神电测控“PowerGod-RIO-RT”里面的4个函数选板

        下面,我们分别介绍一下这4个选板里面的VI功能和应用场合。

        1)由于本节实验展示ZYNQ PL端FPGA跟PS端相互通信,所以需要编写FPGA VI编译生成bit文件,然后由PS端Linux RT程序动态加载到ZYNQ芯片里面运行,所以Linux RT程序运行时的第一个VI就是“PS_Load_FPGA_bit.vi”这个函数。凡是需要调用ZYNQ芯片里面PL端FPGA参与的程序,都需要调用这个FPGA bit文件动态加载函数,切记!

        2)为了提高ZYNQ芯片PS端的内存使用率,我们将很多外设KO驱动做成了动态加载和卸载。比如本节实验,我们需要读取PL端FPGA里面的寄存器和写入PL端寄存器,这个寄存器本质上也属于通用IO,也就是GPIO类,所以在Linux RT程序初始化之前,我们需要利用下面图6-7里面的GPIO动态加载“Load_GPIO_KO”函数(PSLoadGPIOKO(SubVI).vi)加载GPIO驱动,等到Linux RT程序停止退出之前,再调用“Unload_GPIO_KO”卸载函数(PSUnloadGPIOKO(SubVI).vi)卸载GPIO驱动以便释放GPIO类占用的内存和资源。

图6-7:GPIO类外设驱动动态加载和卸载函数

        3)本节实验的重点就是要学会使用PS端和PL端之间的寄存器通道,因此,PS端少不了要对Reg寄存器初始化打开,等到Linux RT程序退出的时候,再关闭Reg寄存器,这两个VI函数就位于下图6-8所示的“PS_Reg_Address”寄存器函数选板里面。至于下图中间的两个PS端寄存器读写VI,本节实验用不到,因为负责与PL端进行沟通的Reg寄存器读写函数我们单独进行了封装,参考下面的第4)部分内容。

图6-8:ZYNQ芯片PS端ARM寄存器操作函数

        注意:只要是对PS端外设进行操作的场合,都需要调用上面“PS_Reg_Address”函数选板里面的第1个和第4个VI,也就是“PS_reg_Open”和“PS_Reg_Close”,相当于对寄存器函数的初始化和程序退出前的寄存器关闭,至于中间的Reg寄存器读写两个VI,可以根据实际情况选择,后续为了简化编程,我们对很多外设寄存器进行了二次封装,只需要调用相应的函数即可。

        4)为了让ZYNQ PS端ARM能够访问和操作PL端FPGA里面的寄存器,我们特地在PS端Linux RT下封装了两个读写函数(多态VI),分别是“PL_Reg_Write_Poly.vi”和“PL_Reg_Read_Poly.vi”,位于“PS2PL_Reg_Data”函数选板里面,如图6-9所示。其中,左侧的“PL_Reg_Write_Poly.vi”函数顾名思义,就是PS2PL下行通道,Linux RT程序可以通过这个VI将PS端的数据写入PL端FPGA里面;反之,右侧的“PL_Reg_Read_Poly.vi”函数则是PL2PS上行通道,也就是Linux RT可以利用这个函数读取到PL端FPGA里面的寄存器数值。

图6-9:负责PS端与PL端二者之间通信的Reg寄存器通道读写VI函数

        提醒1为了降低用户记忆困难,我们将相同功能的VI组合在一起,封装成多态VI,这样用户只需要点击下拉就可以改变这个VI的形态,比如不同位宽的整形数据和布尔类型,本质上都是数据,所以合并在一起,方便使用。

        提醒2为了更好的区分ZYNQ芯片里面PS端和PL端的VI函数,我们特地在每个子VI图标里面加入了PS或者PL字样,如图6-10所示。如果这个子VI有PS字样,那么这个VI就可以被Linux RT主机端也就是PS端调用,反之如果是PL端字样,那就是被FPGA VI调用。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值