《LabVIEW ZYNQ FPGA宝典》第5章-5.4:ZYNQ芯片内部的PS(ARM) Linux RT程序开发实战演示

    5.4.1:硬件搭建:利用一根网线将ZYNQ开发板与开发电脑互联起来

        找一根CAT5+或者CAT6(6类)千兆网线一头接入ZYNQ开发板的PS端网口,一头接到上位机开发电脑的网口,然后给ZYNQ板子上电,实际接线,如图5-130所示。注意:接的PS端也就是连在ZYNQ芯片ARM端的网口,不是PL端FPGA上的网口,切记!!!

图5-130:利用网线将下位机ZYNQ开发板(PS端网口)跟上位机开发电脑互联起来

    5.4.2:LabVIEW ZYNQ PS(ARM) 端Linux RT项目浏览器

        1)打开前面新建过的“My_FPGA_Stater_Board_ZYNQ7020_PS+PL.lvproj”这个LabVIEW项目,然后在项目上右击选择“New/新建>>Targets and Devices/终端和设备”,如图5-131所示。

图5-131:右击My FPGA项目名称选择新建终端和设备

        2)然后在弹出来的“添加终端和设备”对话框里面选择“New target or device”,再展开里面的“LINX”文件夹,找到“Raspberry Pi 2 B”这个Linux RT设备终端,如图5-132所示。

图5-132:展开LINX找到里面的“Raspberry Pi 2 B”这个Linux设备

        3)点击“OK/确定”后,可以看到LabVIEW项目下多出来一个Linux RT的终端设备,将其重命名为“ZYNQ7020_PS_Linux_RT”,如图5-133所示;右击这个“ZYNQ7020_PS_Linux_RT”选择最下面的“Properties/属性”,在弹出来的属性配置页面里面,将IP地址设置成下位机ZYNQ开发板里面直连方式下的IP地址:192.168.2.99,如图5-134所示;点击“OK/确定”按钮关闭配置页面即可,如图5-135所示。

图5-133:右击“ZYNQ_PS_Linux_RT”设备终端选择“属性”

图5-134:将ZYNQ PS端Linux RT设备IP地址设置成静态IP(192.168.2.99)

图5-135:给ZYNQ PS Linux RT终端设置好IP地址

        4)提醒:用户在开发的时候,如果身边没有路由器的话,可以将ZYNQ硬件与电脑直连,此时的ZYNQ IP地址里面会有一个固定的192.168.2.99,而我们上位机开发电脑网卡IP地址也需要设置一下,跟ZYNQ IP地址保持在同一个网段内。比如这里面我们将开发电脑网卡IP地址设置为192.168.2.10,如图5-136所示。关于ZYNQ硬件与上位机开发电脑之间的网络连接方式在前面第三章里面里做过详细的讲解,这里不再赘述!

图5-136:将上位机开发电脑上的网卡IP地址设置成同一个网段(比如192.168.2.10)

        5)此时,可以先利用电脑自带的cmd命令方式ping一下下位机ZYNQ,看看能不能ping通。具体操作就是同时按住“窗口键+R”,然后输入cmd,如图5-137所示;再在弹出来的cmd命令框里面输入ping 192.168.2.99回车,正常情况下,可以看到ZYNQ有响应,如图5-138所示,表明上位机开发板电脑跟下位机ZYNQ之间网络是通畅的。

图5-137:同时按住“窗口键+R”输入cmd

图5-138:在cmd命令输入框里面输入“ping 192.168.2.99”测试网络连接是否正常

        6)如果上面能正常ping通ZYNQ硬件的话,可以右击LabVIEW项目里面的“ZYNQ_PS_Linux_RT”终端选择“Connect/连接”,如图5-139所示;然后就会弹出一个部署连接下位机的消息提示框图,如图5-140所示,不出意外的话,就能连上,然后点击“Deployment Progress”提示框下面的“Close/关闭”按钮即可;此时,Linux RT终端(ZYNQ7020_PS_Linux_RT)logo图标右下角的小点指示灯会点亮,如图5-141所示。

图5-139:右击Linux RT终端选择Connect连接下位机ZYNQ硬件

图5-140:连接过程中会弹出部署提示对话框(部署成功说明连接成功)

图5-141:上位机开发电脑与下位机ZYNQ硬件连接成功后的绿灯亮起标识

        表明Linux RT已经成功的与下位机ZYNQ开发板建立了网络连接,后续的Linux RT VI程序部署下载和在线调试都是通过这个网线来完成的。提醒:当然了,在后续第6章等我介绍完WiFi模块的设置,还可以通WiFi无线方式将上位机的Linux RT程序部署下载到ZYNQ芯片里面运行,非常方便,不需要Xilinx JTAG下载器都行,因为我们可以直接通过网络下载调试更方便。

    5.4.3:将前面编译出来的ZYNQ PL端FPGA bit文件添加到PS(ARM)端Linux RT里面

        为了让ZYNQ PS(ARM)端的Linux RT VI程序能够控制PL端的FPGA程序,我们需要将前面编译好的FPGA bit文件提前部署到下位机ZYNQ开发板的TF卡里面,本质上是下载到PS端Linux RT系统里面,一般可以通过在LabVIEW Linux RT程序生成规范进行部署下载,也可以手动下载,比如借助前面讲过的MobaXterm将FPGA bit文件拷贝到TF卡里面,但是推荐用LabVIEW自动部署下载最简单省事。具体过程如下:

        1)首先,我们把前面编译好的ZYNQ PL端FPGA bit文件添加到Linux RT终端里面来,为了方便后续所有实验的统一管理,这里我们先新建一个虚拟文件夹来管理这些PL端的FPGA bit文件。

        右击LabVIEW Linux RT终端(ZYNQ7020_PS_Linux_RT)选择“New/新建”里面的“Virtual Folder/虚拟文件夹”,如图5-142所示;然后重命名为“ZYNQ PL FPGA bit files”,如图5-143所示。

图5-142:右击ZYNQ Linux RT终端选择新建一个虚拟文件夹

图5-143:将虚拟文件夹重命名为“ZYNQ PL FPGA bit files”

        2)然后,将先前编译出来的ZYNQ PL端FPGA bit添加或者拖拽到这个虚拟文件夹里面,如图5-144所示。提醒:以后我们会把所有FPGA bit文件全部拖到这个虚拟文件夹里面,方便维护。

图5-144:将先前编译好的ZYNQ PL端FPGA bit文件拖拽到“ZYNQ PL FPGA bit files”
虚拟文件夹里面(备注:1-PS2PL-LED.bit)

        3)接着,右击LabVIEW Linux RT终端(ZYNQ_PS_Linux_RT)下面的“Build Specifications/程序生成规范”,然后选择“New/新建”里面的“Real-Time Application/实时程序”,如图5-145所示。在弹出来的应用程序配置页面将“Build specification name/程序生成规范”名称改成“ZYNQ PL FPGA bit download to TF(Linux RT)”,如图5-146所示,意为通过这个程序生成规范可以将上位机编译出来的ZYNQ芯片PL端的FPGA bit文件部署下载到ZYNQ板子上的TF卡,实测是部署到TF的Linux RT系统里面去的。

图5-145:右击Linux RT里面的程序生成规范新建一个RT应用规范

图5-146:在弹出来的配置页面里面将程序生成规范重命名以示区分

        注意:上图里面的“Target destination directory/目标终端路径”这里不要改动,就用默认的这个“/home/lvuser/natinst/bin”就行,编译部署的时候,上位机LabVIEW会下发指令给下位机ZYNQ PS端Linux RT系统让其创建出来这里设置的路径,比如默认的路径就是这个“/home/lvuser/natinst/bin”,如果用MobaXterm观察下位机ZYNQ Linux RT系统的话,可以看到里面会自动创建出来这样一个路径。

        

        4)在程序生成规范属性配置页面左侧的“Category/目录”里面选中“Source Files/源文件”,然后将中间“Project Files/项目文件”里面的“ZYNQ PL FPGA bit files”虚拟文件夹选中,再点击右下方的“Add Item/添加”将其添加到“Always Included/总是包含”目录里面,如图5-147所示。

图5-147:将包含FPGA bit文件的虚拟文件(ZYNQ PL FPGA bit files)夹添加到“Always Included/总是包含”列表中

        5)再点击一下程序生成规范属性配置页面左侧的“Category/目录”里面的“Destinations/目标文件”,可以看到中间的“Support Directory”实际默认的指向路径就是Linux RT实时系统里面的“/home/lvuser/natinst/bin/data”这个路径,如图5-148所示。也就是说,如果我们不去修改这个路径的话,那么等会部署下载到Linux RT TF里面的FPGA bit文件就会存放在这个目录下,当然了,如果大家以后还有很多其他类型的文件需要分类管理,比如Linux RT里面的txt文档、exe可执行文件、ko驱动、so动态库、小程序等等,可以在程序生成规范里面添加新的路径,这里为了简化,我们保持默认的路径即可,不要改动。

图5-148:观察一下“Destinations”里面的非exe文件所在的下位机存放路径(/home/lvuser/natinst/bin/data)

        其它地方暂时不用设置,保持默认,最后点击“OK/确定”按钮关闭程序生成规范属性页面即可,如果弹出提示说没有指定Linux RT系统里面的启动VI,选择Yes忽略即可,如图5-149所示。这是因为,我们还没有编写ZYNQ PS端的Linux RT应用程序VI,等到后面写好Linux RT VI之后,再到程序生成规范属性页面“源文件”里面添加启动VI就可以了。

图5-149:选择Yes忽略启动VI,关闭属性配置页面

        

    5.4.4:LabVIEW ZYNQ PS(ARM)端Linux RT应用程序编写(LabVIEW ZYNQ PS(Linux RT)程序调用PL(FPGA) bit程序二者实时交互)

        接下来,我们就要开始编写ZYNQ PS(ARM)端Linux RT系统下的RT VI应用程序了,开发方式跟上位机类似。步骤如下:

        1)为了方便后续其他实验的分类统一管理, 我们采用虚拟文件夹的方式对各个实验进行区分。右击Linux RT终端(ZYNQ7020_PS_Linux_RT),选择“New/新建”一个“Virtual Folder/虚拟文件夹”,如图5-150所示;将这个虚拟文件夹重命名为“实验1-入门实验(ZYNQ PS端)”,如图5-151所示。

图5-150:右击Linux RT终端新建一个虚拟文件夹

        2)右击刚刚创建出来的文件文件夹(实验1-入门实验(ZYNQ PS端)),选择“New/新建”一个VI,如图5-152所示;然后将其重命名为“实验1-入门实验(ZYNQ PS端).vi”,如图5-153所示。

图5-152:右击虚拟文件夹新建一个VI

图5-153:将这个VI重命名为“实验1-入门实验(ZYNQ PS端).vi”

        3)为了实现ZYNQ PS(ARM)端的Linux RT程序可以通过Reg寄存器的方式控制PL端的FPGA用户LED灯,我们需要用到我们封装好的“PowerGod-RIO-RT”函数选板里面的4个子函数选板,如图5-154所示。这4个函数选板分别是FPGA bit文件动态加载/动态卸载、PS端KO驱动文件动态加载/动态卸载、PS端Reg寄存器打开/关闭、PS段Reg寄存读写。关于这些V函数选板的简介在前面板第三章里面有相关内容,不清楚的用户可以回顾一下。

图5-154:本次实验用到的“PowerGod-RIO-RT”函数里面的4个子函数选板

        4)为了方便讲述,这里面我们直接给出本次实验的ZYNQ PS端的Linux RT程序框图,如图5-155所示。提醒:关于这个PS端的Linux RT程序框图具体编写过程可以参考本书配套的视频教程;另外,看不清的用户可以缩放一下pdf,因为这里贴的程序框图是直接复制的LabVIEW原始矢量图,不是截图。

图5-155:ZYNQ PS(ARM)端Linux RT入门实验程序框图(矢量图,支持缩放)

        上面的Linux RT程序框图(5-155)一共有7个部分组成,分别是:

        1)动态加载FPGA bit文件:用户可以给这个VI一个存放FPGA bit文件的路径即可,等着这个VI执行的时候,会自动将这个路径下的FPGA bit文件加载到ZYNQ PL端FPGA芯片里面运行起来。

        2)加载GPIO KO驱动:为了充分节约ZYNQ PS端Linux RT实时系统的内存使用率,我们将各类KO驱动的加载也做成了动态加载和动态卸载,这样可以用户在编写不同的程序时,根据实际用到的外设,来动态加载对应的KO驱动文件或者卸载对应的KO驱动文件。比如,本节实验PS端通Reg寄存器来操控PL端FPGA的IO引脚,因此,我们需要加载通用类的GPIO KO驱动。

        3)打开Reg寄存器:在对Reg寄存器进行读写操作之前,需要先执行打开函数,相当于PS端Linux RT初始化Reg寄存器。

        4)PS端Bool类型的Reg寄存器1写操作:将前面板上的“Reg_Data_Write_Bool-1”按钮状态通过这个子VI函数写入搭配PL端FPGA里面去,由于FPGA里面把PS端传递过来的Bool类型的Reg寄存器1与FPGA的IO引脚关联起来了,所以就可以实现对ZYNQ底板PL端LED灯(PL_Carryboard_LED1)实现控制了。

        5)PS端Bool类型的Reg寄存器2写操作:将前面板上的“Reg_Data_Write_Bool-2”按钮状态通过这个子VI函数写入搭配PL端FPGA里面去,由于FPGA里面把PS端传递过来的Bool类型的Reg寄存器2与FPGA的IO引脚关联起来了,所以就可以实现对ZYNQ底板PL端LED灯(PL_Carryboard_LED2)实现控制了。

        6)关闭Reg寄存器:为了防止内存泄漏,在程序关闭退出前,可以调用Reg寄存器关闭VI函数将Reg寄存器引用释放掉。

        7)卸载前面加载的GPIO KO驱动,释放引用和内存占用:当用户停止while循环结束该程序运行时,为了防止内存泄漏,可以调用卸载KO驱动函数将GPIO KO驱动及时卸载释放掉。

        8)完整的Linux RT程序前面板,如图5-156所示。

图5-156:ZYNQ PS端Linux RT入门实验VI程序前面板

        9)为了,方便用户编写程序和调试,我们将不同数据类型的Reg操作VI函做成了多态VI,同时也把里面的多路寄存器封装成了枚举下拉列表的方式,一目了然,如图5-157所示,ZYNQ PL端FPGA那边用到哪路Reg寄存器通道,PS端这边相应的选择一下即可,非常简单直观。

图5-157:不同数据类型的Reg寄存器读写封装成多态VI,寄存器通道做成了枚举控件

        10)最后,需要注意的是,前面板上的ZYNQ PL端FPGA bit文件路径不要写错了,前面的路径一般用默认的固定路径即可,跟前面的程序生成规范里面一直即可,后面的FPGA bit文件名称只要写对就可以了,如图5-158所示。

图5-158:Linux RT系统里面的FPGA bit文件路径,千万别写错了,否则加载不了

    5.4.5:LabVIEW ZYNQ PS(ARM)端Linux RT程序编译、部署(下载)、运行、调试

        正常情况下,如果不去控制ZYNQ PL端FPGA的话,只是纯PS(ARM)Linux RT程序的话,直接点击Linux RT VI左上角的运行箭头就可以了自动部署下载到ZYNQ里面运行了,但是我们这个实验需要控制PL端FPGA部分,为了把过程讲解清楚,这里还是按照Linux RT VI程序编译、下载、运行和调试4个步骤展开。

       5.4.5.1:ZYNQ PS(ARM)端Linux RT程序编译

        1)首先,双击打开前面5.4.3节里面新建的程序生成规范(ZYNQ PL FPGA bit download to TF(Linux RT)),在“Source Files”属性配置页面里面将本次PS端Linux RT实验1程序“实验1-入门实验(ZYNQ PS端).vi”添加到右侧的“Startup VIs”列表里面,如图5-159所示。最后点击“OK/确定”退出属性配置页面。

图5-159:将本次PS端Linux RT入门实验VI程序添加到右侧的启动VI列表里面

        2)右击程序生成规范(ZYNQ PL FPGA bit download to TF(Linux RT)),选择“Build/编译”,如图5-160所示。然后会弹出一个“Build status/编译状态”进度条对话框,正常情况下,几秒钟就会编译完成,如图5-161所示,这个比传统的单片机C语言编译快多了,主要得益于NI Linux RT实时系统的实时编译机制。

图5-160:右击Linux RT终端下面的程序生成规范进行编译

图5-161:编译成功后会有编译完成提示

        3)点击上图左边的“Explore/浏览”按钮,可以看到上位机开发电脑里面Linux RT应用程序编译后的最终可执行文件rtexe,如图5-162所示;然后继续深入data文件夹,可以看到我们先前拖拽到“Always Included”里面的FPGA bit文件,如图5-163所示。这些编译出来的以及自动添加进来的文件都可以直接部署到下位机ZYNQ Linux RT系统里面去运行或者加载。

图5-162:点击浏览可以看到当前编译出来的Linux RT可执行文件 (rtexe)

图5-163:先去添加到Always Included里面的文件也会被一起打包到data文件夹里面(备注:1-PS2PL-LED.bit)

       5.4.5.2:ZYNQ PS(ARM)端Linux RT程序部署(下载)

        接下来,就是把上面编译成功的ZYNQ PS(ARM)端Linux RT应用程序和PL端FPGA bit文件一起部署或者说下载到ZYNQ开发板里面去运行。方法很简单,直接右击Linux RT程序生成规范,选择“Deploy/部署”即可,如图5-164所示。部署成功后,会弹出如图5-165所示的部署过程和部署进度提示框。

图5-164:右击Linux RT程序生成规范选择Deploy开始部署下载Linux RT程序和FPGA bit

图5-165:Linux RT应用程序及其附件部署下载成功

       5.4.5.3:ZYNQ PS(ARM)端Linux RT程序运行

        接下来,我们直接点击ZYNQ PS(ARM)端Linux RT应用程序(实验1-入门实验(ZYNQ PS端).vi)左上角的运行箭头,等待几秒可以看到上位机会重新将其部署下载到下位机ZYNQ开发板里面去运行,如图5-166所示。整个部署过程可以看到LabVIEW会把程序程序涉及到的各种子VI函数、控件、lvlib库等一并部署下载到ZYNQ芯片里面。

图5-166:点击Linux RT VI会自动将其所有附件、子VI、控件等一并部署下去

        实验现象:

        1)部署成功后,点击上图里面的“Close/关闭”按钮,此时LabVIEW Linux RT VI程序就进去了在线前面交互运行模式了,等待几秒钟,可以看到前面板上的“Running_PS”显示控件里面出现递增的数值,说明我们的Linux RT程序里面的while循环开始工作了,如图5-167所示。

图5-167:ZYNQ PS(ARM)端Linux RT VI前面板进入在线前面板交互式运行
(while循环开始工作了,备注:1-PS2PL-LED.bit)

        2)同时ZYNQ核心板上的PL端LED灯(PL_Core_LED)开始闪烁了,如图5-168所示,这说明什么呢?说明我们的FPGA bit文件成功的被PS端Linux RT程序动态加载成功了,恭喜大家,这一步非常重要,是ZYNQ PS(ARM)端与PL(FPGA)端二者之间实现通信和交互的核心。

图5-168:ZYNQ核心板上的PL端LED灯开始闪烁了(表明FPGA bit文件被PS端成功的动态加载到FPGA里面了)

        3)为了更加直观的观察ZYNQ PS(ARM)与PL(FPGA)之间的交互过程,我们可以利用上位机ZYNQ PS端Linux RT程序前面板和PL端FPGA VI前面板的在线前面板交互式运行功能实现对二者的同时观察。

        ZYNQ PS(ARM)端Linux RT VI程序通过网线部署之后就会自动进入在线前面板运行模式,已经OK了,不去管它了;而PL端的FPGA VI在线前面板交互运行可以借助Xilinx JTAG下载器,实现在线观察PL端FPGA VI的运行状态和前面板控件信息,相比于前面5.3节,这里的Xilinx JTAG下载器不需再承担下载FPGA bit文件的任务了,只需要执行在线前面板交互式运行观察即可,因为,有了PS端ARM的加持,以后所有的FPGA bit文件都可以实现动态加载了,不需要Xilinx JTAG下载器参与下载了,是不是很爽!

        再开启ZYNQ PL端FPGA VI程序前面板交互式运行之前,我们需要关闭FPGA VI的自动下载方式,只保留debug调试模式就行,具体方法如下:

        在下面这个路径(C:\Program Files (x86)\National Instruments\LabVIEW 2020\vi.lib\FPGAPlugInAG\My_FPGA_Robot_Board)里面找到这个ini.txt文件,如图5-169所示。

图5-169:找到LabVIEW安装环境下的Xilinx JTAG下载器ini.txt工作方式文件

        4)双击打开这个ini.txt,将里面的1改成0即可,如图5-170所示。这个ini文件的功能是当年我们为了给纯FPGA PCIe通信准备的,因为PCIe VI下载到FPGA芯片里面之后,电脑需要热重启才能被电脑识别,如果每次运行FPGA VI都执行下载那就会陷入自我死循环,关于这个ini文件的介绍,在我们My FPGA Pro5宝典里面有详细的讲解,这里不再重复,大家只需要记得将ini文件里面的1改成0,就能关闭FPGA VI的自动下载功能,转而直接进入在线前面交互式运行模式。

图5-170:将ini.txt配置文件里面的1改成0(关于Xilinx JTAG下载器的下载功能,转而直接进入在线前面板交互式运行模式)

        5)接着,我们就可以直接点击运行ZYNQ PL端FPGA项目终端里面,前面编译好的ZYNQ PL端下的FPGA VI程序了,如图5-171所示。你会发现,此时经过几秒之后,FPGA VI前面板就活了,这是因为ZYNQ PL端FPGA里面早已有了对应这个FPGA VI的bit文件在运行了,所以不需要执行下载过程,很快就进入了在线前面板交互式运行模式了,如图5-172所示。

图5-171:运行前面编译好的ZYNQ PL端FPGA VI程序(备注:1-PS2PL-LED.bit)

        6)细心的用户会发现,此时FPGA VI前面板上的“Running_FPGA”显示控件里面的数值很大将近2000多秒了,如图5-172所示。表明我们的FPGA VI程序里面的while循环运行了很久了,这是因为ZYNQ PS端在30分多钟之前就加载了FPGA VI运行了,而我们现在截图的FPGA VI在线前面交互式运行是在半个多小时以后的,之所以运行这么久,也是为了测试我们LabVIEW开发的ZYNQ PS(ARM)端和PL(FPGA)端程序的可靠性和稳定性。

图5-172:ZYNQ PL端FPGA VI程序快速进入在线前面板交互式运行(非常直观)

        7)通过上图的PS端和PL端支持在线前面板交互式运行效果来看,是不是一目了然,是不是把一个非常复杂的ZYNQ芯片开发变成了小儿科,按照余总的话说就是“Piece of cake”.只要大家会一点LabVIEW图形化开发基础,就可以轻松拿下业界最难的ZYNQ嵌入式芯片程序开发了,遥遥领先,工资翻一翻也就指日可待了!!!

       8)下面,我们测试一下ZYNQ PS端ARM是否能够正常控制PL端FPGA。直接按下PS(ARM)端Linux RT VI程序前面板上的“Reg_Data_Write_Bool-1”这个按钮,此时,可以看到ZYNQ PL端FPGA VI前面板上的“PS_System_Reg_Data\lv_PS2PL_Reg_Bool_1”灯亮起了,如图5-173所示;同时ZYNQ底板上的PL端LED0也点亮了,如图5-174所示,说明我们的PS端成功了控制了PL端的IO引脚,并且中间通过Reg寄存器通道1进行信息传递也是成功的,这里只是冰山一角,后面实验里面会有更多的例程向大家展示PS端与PL端之间的交互和同时方式,不局限于Reg寄存器。

图5-173:ZYNQ PS端Linux RT VI前面板上的按钮1通过Reg寄存器通道1控制PL端FPGA VI前面板上的布尔指示灯(备注:1-PS2PL-LED.bit)

图5-174:PS端Linux RT程序通过控制PL端FPGA的IO实现对LED0灯的控制

        9)接着,我们测试一下第2路Reg寄存器通道功能是否正常。直接按下PS(ARM)端Linux RT VI程序前面板上的“Reg_Data_Write_Bool-2”这个按钮,此时,可以看到ZYNQ PL端FPGA VI前面板上的“PS_System_Reg_Data\lv_PS2PL_Reg_Bool_2”灯亮起了,如图5-175所示;同时ZYNQ底板上的PL端LED1也点亮了,如图5-176所示,说明我们的PS端成功了控制了PL端的IO引脚,并且中间通过Reg寄存器通道2进行信息传递也是成功的。

图5-175:ZYNQ PS端Linux RT VI前面板上的按钮2通过Reg寄存器通道2控制PL端FPGA VI前面板上的布尔指示灯

图5-176:PS端Linux RT程序通过控制PL端FPGA的IO实现对LED1灯的控制

        10)最后,我们同时测试一下两路Reg寄存器通道功能是否正常。同时按下PS(ARM)端Linux RT VI程序前面板上的“Reg_Data_Write_Bool-1”和“Reg_Data_Write_Bool-2”两个按钮,此时,可以看到ZYNQ PL端FPGA VI前面板上的“PS_System_Reg_Data\lv_PS2PL_Reg_Bool_1”和“PS_System_Reg_Data\lv_PS2PL_Reg_Bool_2”灯都亮起了,如图5-177所示;同时ZYNQ底板上的PL端LED0和LED1也都点亮了,如图5-178所示,惊不惊喜意不意外。更多动态效果展示可以参考后期录制的My FPGA ZYNQ Pro20视频教程。

图5-177:ZYNQ PS端Linux RT VI前面板上的2个按钮通过Reg寄存器同时控制PL端FPGA VI前面板上的2个布尔指示灯

图5-178:PS端Linux RT VI程序通过控制PL端FPGA的2个IO实现对2个LED灯的控制

       5.4.5.4:ZYNQ PS(ARM)端Linux RT程序调试

        除了我们可以借助LabVIEW的在线前面板观察PS端Linux RT程序和PL端FPGA VI程序的运行情况,我们还可以利用跟上位机一样的LabVIEW探针、断点、单步运行等方法对我们的PS端Linux RT VI程序进行仿真和调试。所以说,我们以前经常说,开发Linux RT程序本质上跟开发上位机Windows应用程序差不多,简单很多。

        具体操作很简单,就是用鼠标在需要观察的线上点一下就可以看到探针里面的变量运行情况了,左上角的断点和单独运行也都支持,大家可以自己体会一下,这里不再演示了,效果如图5-179所示。

图5-179:利用LabVIEW工具自身的探针、单步调试、断点等功能可以加速代码的调试

    5.4.6:LabVIEW ZYNQ PS(ARM)端Linux RT程序生成开机自启动rtexe程序(程序初始化务必加上延时20s,等待外部LinuxOS彻底完成启动再调用KO和SO,项目完成交付)

        当我们开发和调试完ZYNQ PS端Linux RT VI和PL端FPGA VI程序之后,就可可以将其固化到ZYNQ板子里面批量发货了,相当于上电开机自启动,如果不做这一步操作的话,直接断电,前面的Linux RT VI就会从内存里面消失,所以这里面,我们教大家如何将开发好的Linux RT程序生成开机自启动程序部署下载到ZYNQ板子里面,一劳永逸。

        1)右击Linux RT终端(ZYNQ PL FPGA bit download to TF(Linux RT))程序生成规范,选择“Set as startup/设置为开机自启动”,如图5-180所示;然后再选择“Run as startup”,如图5-181所示;此时会弹出一个部署成功的提示框,如图5-182所示,将刚刚设置好的startup.rtexe可执行程序部署下载到ZYNQ芯片里面,覆盖旧的rtexe程序。

图5-180:右击Linux RT里面的程序生成规范设置为“开机自启动”

图5-181:右击Linux RT程序生成规范将设置好的开机自启动VI重新部署下载到ZYNQ板子里面

图5-182:部署成功后的提示框

        2)最后会弹出一个让用户重启ZYNQ板子的对话框,这里面我们选择“Yes”,如图5-183所示。但实际上,由于ZYNQ里面的Linux RT与schroot之间存在隔阂,不一定会执行重启,所以,我们可以手动给ZYNQ板子断电再上电,或者通过MobaXterm发送sudo reboot重启指令。

图5-183:提示重启下位机ZYNQ板子(最好手动给ZYNQ板子上电)

        3)不幸的是:ZYNQ板子重启之后,并没有看到我们预期的ZYNQ核心板上的PL端LED持续闪烁现象,取而代之的是短暂闪烁之后,就停了,这是为啥呢?

        这是因为ZYNQ PS端的Linux RT系统组件太多,启动太慢,很多驱动还没有准备好,比如Reg组件驱动之类的,然后前面我们部署的startup.rtexe启动却是非常的快,在Linux系统全部启动好之前就开始执行了,而Linux RT startup.rtexe运行后的第一个VI函数就是动态加载FPGA bit文件,所以我们观察到了ZYNQ PL端FPGA上的指示灯按照100ms的周期开始闪烁,但是当PS端Linux RT执行到后面的Reg加载和读写操作时,由于Linux系统本身还没有完全启动好,所以就会导致整个ZYNQ芯片卡死,那么怎么解决这个问题呢?

        但是此时,你会发现上位机开发电脑跟下位机ZYNQ连不上了,这是因为ZYNQ芯片卡死了,那么怎么办呢?不要慌,有两个办法:一是将TF卡拔下来,参考前面第三章将ZYNQ镜像重新烧录一遍,相当于恢复出厂设置;二是利用MobaXterm软件抓住开机到死机之前的这段时间空隙,利用Linux强制删除命令rm将里面开机自启动的rtexe文件删掉就好了,具体命令如下:sudo rm -f /home/lvuser/natinst/bin/startup.rtexe

执行过程,如图5-184所示,注意这段空隙时间约为30s,如果用户不熟悉Linux操作的话,可以选择第一种方式,简单一些。

图5-184:在ZYNQ卡死之前,利用MobaXterm软件和Linux删除指令将开机自启动rtexe文件删掉就好了

        4)解决卡死办法很简单(小技巧)

        既然知道了ZYNQ芯片卡死的原因是因为我们生成的rtexe自启动VI先于Linux RT系统组件运行了,那么我们就在ZYNQ PS端Linux RT程序最开始加上一个延时,比如15s~20s左右的延时函数就可以了,如图5-185所示。

图5-185:在原先的Linux RT程序最开始加上一个20s左右的延时函数即可

      

        5)然后,按照上面的步骤重新编译一下这个Linux RT程序,再右击以开机自启动rtexe方式下发到ZYNQ板子里面,最后重启一下ZYNQ板子观察一下现象,这次可以看到,ZYNQ核心板上的PL端FPGA LED指示灯持续闪烁了,FPGA的优势就在于万年不变,只要芯片不坏程序都会一直在运行。

       提醒:如果碰到以下情况,可以参考前面5.1.6节相关内容(否则跳过即可):

       注意1设置静态IP地址最佳的方式,就是把这个文件里面最上面的dhcp动态获取改成跟下面类似的静态方式static,因为有些时候这个eth0:1不灵,所以要么接路由器,要么就彻底将eth0弄成静态IP地址。对于分布式多个ZYNQ硬件的话,最好弄成静态IP地址好区分(前期不需要,后期产品批量生产的时候,分布式应用的时候可以这样弄)。

        注意2如果有时候身边没有路由器,默认的192.168.2.99在直连(ZYNQ开发板与上位机开发电脑直连)的情况下连不上,可以尝试执行一下下面这个指令:比如将原先的eth0网卡的eth0:1(虚拟网卡IP)重新设置启动一下,注意:每一台ZYNQ设备的MAC地址不要相同,否则会在内网里面有冲突,简单的办法就是把IP地址的最后一位作为MAC的地址的最后一位,以示区分。

ifconfig eth0:1 192.168.2.99 hw ether 00:11:00:00:11:44 netmask 255.255.255.0 broadcast 192.168.2.255 up

        结论:看完整个ZYNQ芯片的PS(ARM)端与PL(FPGA)端的LabVIEW嵌入式开发、运行、调试、部署、发布过程和实验现象之后,大家是不是一种醍醐灌顶的感觉,一颗复杂的包含ARM和FPGA的ZYNQ芯片就这样被LabVIEW轻松拿下了,不需要任何Verilog或者VHDL或者C语言编程,从开发到编译、到下载、到运行、到调试、到最终发布,全部一气呵成,是不是简单又快乐,写到这里,编者也突然如释重负,喊出那句“遥遥领先”

  • 24
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值