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

1、实验内容

        上一节实验里面介绍的Reg寄存器通道比较适合在PS端和PL端之间传递标量数据,也就是单个元素,如果要传递多个元素的数组或者连续数据流的话,Reg寄存器通道就不是很合适了。

        本节实验我们向大家讲解如何借助Memory存储器通道在PS(ARM)端Linux RT和PL端FPGA之间传递一定长度的数组或者向量或者图像数据。比如最常见的应用之一就是定长传输,我们可以将PS端Linux RT里面的控制参数、命令、数据等合在一起,形成一个数组,然后通过Memory存储器通道映射到PL端FPGA里面,这样就能批量更新控制FPGA端程序了,当然也可以读取PL端FPGA里面的Memory存储器数据。

        为了方便用户使用,我们提前将8位、16位、32位的无符号和有符号类型的PS2PL下行和PL2PS上行Memory存储器通道封装到ZYNQ PS端和PL端,大家只需要有一点LabVIEW基础,简单拖拽和连线就能实现ZYNQ芯片内部ARM端跟FPGA端的存储器映射交互了。

        提醒:对于FXP定点数传输也很简单,那就是先把FXP定点数先通过“数值至布尔数组”函数去除符号特性,然后再利用“布尔数组至数值”函数转换成U8、U16、U32或者字节数组再发送出去。

2、实验目标

        本节实验需要利用LabVIEW同时开发ZYNQ PS端Linux RT程序和PL端FPGA程序。     先编写一个PL端FPGA VI,将FPGA函数选板里面所有数据类型的Memory存储器通道VI函数拖拽到FPGA VI里面,再在前面板上创建一维输入和显示数组控件,借助LabVIEW FPGA在线前面板交互式运行功能,动态修改这些数组内容以及观察PS端的数组元素是否一致。

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

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

        为了方便讲解,我们设计了3个Memory存储器通道读写交互实验程序,分别是:

  1. PS端Linux RT发送一维数组给PL端FPGA(PS2PL下行)
  2. PL端FPGA发送一维数组给PS端Linux RT(PL2PS上行)
  3. PS端发送一维数组给PL端同时读取回来(PS2PL回环)

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下载器也可以不用接。

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

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

4、原理图介绍

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

5、驱动VI函数讲解

5.1:PL端FPGA Memory存储器通道

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

图7-2:ZYNQ FPGA终端下的Memory存储器端口信号(最原始的)

        上面这些Memory存储器CLIP端口是最原始的,操作起来不直观,为了方便用户调用,我们将8位、16位和32位的Memory存储器读写操作直接封装成VI,放在了“PL-Mem”函数选板里面了,如图7-3所示。其中,无符号和有符号单独分开,并且不同的数据类型利用多态VI的方式组合在一起,这样用户只需要记住读写两个VI函数就可以了,省时省力。

图7-3:ZYNQ PL端FPGA终端里面的Memory存储器通道读写VI函数

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

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

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

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

图7-4:本节实验要用到的神电测控“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里面的存储器或者将PS端发送过来的数组写入PL端存储器,这个存储器本质上也属于通用IO,也就是GPIO类,所以在Linux RT程序初始化之前,我们需要利用下面图7-5里面的GPIO动态加载“Load_GPIO_KO”函数(PSLoadGPIOKO(SubVI).vi)加载GPIO驱动,等到Linux RT程序停止退出之前,再调用“Unload_GPIO_KO”卸载函数(PSUnloadGPIOKO(SubVI).vi)卸载GPIO驱动以便释放GPIO类占用的内存和资源。

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

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

图7-6: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下封装了4个读写函数(多态VI),分别是无符号数据类型的“Mem_Unsigned_Read_Poly.vi”和“Mem_Unsigned_Write_Poly.vi”,以及有符号数据类型的“Mem_Signed_Read_Poly.vi”和“Mem_Signed_Write_Poly.vi”,位于“PS2PL_Memory”函数选板里面,如图7-7所示。其中,第1列的“Mem_xxx_Read_Poly.vi”函数顾名思义,就是PL2PS上行通道,也就是Linux RT可以利用这个函数读取到PL端FPGA里面的存储器数据;反之,第2列的“Mem_xxx_Write_Poly.vi”则是PS2PL下行通道,Linux RT程序可以通过这个VI将PS端的数组写入PL端FPGA的Memory里面去。

图7-7:负责PS端与PL端二者之间通信的Memory存储器通道读写VI函数

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

        提醒2为了更好的区分ZYNQ芯片里面PS端和PL端的VI函数,我们特地在每个子VI图标里面加入了PS或者PL字样,如图7-8所示。如果这个子VI有PS字样,那么这个VI就可以被Linux RT主机端也就是PS端调用,反之如果是PL端字样,那就是被FPGA VI调用。比如,下图中左边就是PS端Linux RT程序可以调用的Memory存储器通道函数,右边则是PL端FPGA里面可以需要调用的Memory存储器操作函数。

图7-8:子VI图标上有PS和PL字样(用于区分该VI是运行在PS端Linux RT里面还是在PL端FPGA里面)

6、ZYNQ程序开发讲解(PL(FPGA)+PS(ARM))

6.1:ZYNQ PL端FPGA程序开发过程

6.1.1:新建或者打开已有的LabVIEW ZYNQ PL FPGA终端

        1)前面第五章里面我们已经新建过了一个LabVIEW ZYNQ FPGA终端了,这里不再重复创建了,不记得的用户可以回顾一下前面第五章5.3.1节里面的相关内容。

        2)打开之前新建的项目浏览器“My_FPGA_Stater_Board_ZYNQ7020_PS+PL.lvproj”,如图7-9所示,可以看到该项目里面有两个终端分别是ZYNQ PL端FPGA部分和PS端Linux RT部分。

图7-9:打开前面新建好的LabVIEW项目浏览器(My_FPGA_Stater_Board_ZYNQ7020_PS+PL.lvproj)

6.1.2:LabVIEW ZYNQ PL端FPGA应用程序编写(FPGA VI)

        1-右击“FPGA Target(My_FPGA, ZYNQ_XC7Z020_2CLG400_Navigator_MyRIO_V3_All)”,选择“New/新建>>Virtual Folder/虚拟文件夹”,创建一个虚拟文件夹,如图7-10所示;然后重命名为“实验7-PS与PL通过Memory存储器交互(ZYNQ PL端)”,如图7-11所示。

图7-10:右击FPGA终端新建一个虚拟文件夹

图7-11:虚拟文件夹重命名为“实验7-PS与PL通过Memory存储器交互(ZYNQ PL端)”

6.1.2.1:新建FPGA Memory存储器

        为了对FPGA终端下的不同元素进行分类管理,我们将Memory存储器单独存放到1个子虚拟文件夹里面,具体步骤如下:

        1)右击虚拟文件夹“实验7-PS与PL通过Memory存储器交互(ZYNQ PL端)”,选择“New/新建>>Virtual Folder/虚拟文件夹”,如图7-12所示,重命名为“PL-Memory”,如图7-13所示,PL指的就是FPGA。

图7-12:右击ZYNQ PL端FPGA新建1个子虚拟文件夹

图7-13:将子虚拟文件夹重命名为“PL-Memory”

        2)右击“PL-Memory”虚拟文件夹,选择“New/新建>>Memory/存储器”,如图7-14所示;在弹出来的Memory存储器属性配置页面里面将“Name/名称”改成“PS2PL-Memory-U8”;“Requested number of elements/请求元素数量”改成10个元素,这里仅仅是演

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值