当前位置:首页|资讯

第6章>>实验13:PS(ARM)端通过PL端FPGA实现IIC总线通信(EEPROM读写)《LabVIEW ZYNQ》

作者:神电测控发布时间:2024-08-10

1、实验内容

        众所周知,ZYNQ芯片PS端ARM里面原生自带的IIC总线数量很少,一般只有两路,有时候在一个IIC网络里面需要同时对很多IIC器件进行同步读写,比如同步采集8个温度传感器,此时,如果只有两路IIC接口显然满足不了高同步和高实时性的要求;当然了,对于不需要同步采集的IIC器件,可以利用IIC器件地址进行区分以实现分时操作。

        那么我们有没有办法让ZYNQ芯片具备更多路的IIC总线通信能力呢?答案就在本节实验。学完本节内容后,大家就能非常自由的利用我们在PL端FPGA里面模拟的IIC协议,然后根据自己的项目和产品需求进行任意拼接组合实现更复杂的IIC应用层协议,比如常用的EEPROM读写、OLED操作、温湿度传感器读取、RTC时钟控制、3D加速度传感器读写等。

        为了拓展ZYNQ芯片的IIC总线通道数,我们可以借助ZYNQ芯片内部的PL部分,也就是万能FPGA,直接在PL端FPGA里面将IIC通信协议时序模拟出来,这样就能实现任意多路的IIC总线通信协议了,包括前面讲解过的UART、CAN以及后续的SPI都可以这样实现。

        这种方式可以充分发挥出ZYNQ芯片内部FPGA的作用,而且多路UART、CAN、IIC、SPI之间是真正意义上的并行,就算所有通道一起使用也不会影响外设吞吐率,很容易做到高速并行同步,这一点也是传统ARM芯片无法比拟的,因为FPGA才是真正的万能芯片,好东西。

        需要注意的是:IIC总线速率不算太高,通常情况下都是≤100Kbps或者400Kbps或者3.4Mbps,支持IIC通信的器件一般都可以挂在一个IIC总线上,然后利用器件地址进行区分对待访问,这样可以节约IIC总线数量和节省FPGA引脚。

        在我们之前编写的《LabVIEW纯FPGA开发宝典》里面,已经给大家提供了完善的UART、CAN、IIC、SPI等FPGA通信VI,这里我们直接调用即可,然后将这些通信协议解析出来的数据直接通过FIFO传递给PS端Linux RT即可。换言之,ZYNQ里面PL端FPGA实现的UART、CAN、IIC、SPI有点类似透传功能了,PS端只需关心应用层需要发送的或者接收到的数据即可,对于UART、CAN、IIC、SPI等具体协议是如何工作的,无须干涉。

        为了降低用户开发难度,我们提前将8路IIC总线通信协议在PL端FPGA里面进行了封装,变成了子VI;同时在PS端将FPGA端的这些子VI也进行了一对一的映射,这样,大家就可以在PS端Linux RT里面直接调用这些IIC VI函数了,省去了FPGA反复编译麻烦。提醒:虽然我们只封装了8路IIC总线通信,但是大家可以参考我们提供的IIC FPGA VI,直接复制出来任意多个IIC接口,只要FPGA资源足够即可,所以对于FPGA来说,也就不存在IIC数量的限制。

        另外,大家可能会问,既然可以直接在纯FPGA芯片或者ZYNQ的PL端FPGA里面完成IIC总线通信,为啥还要将其映射封装到PS端ARM里面呢?

        这是因为,虽然PL端FPGA里面实现了IIC总线原始通信协议,但是对于更高层次的协议数据应用来说,比如基于IIC协议的EEPROM、OLED、RTC、温湿度传感器、加速度传感器等应用层协议来说,直接在FPGA编程反而很麻烦,并且会消耗很多宝贵的FPGA逻辑门资源,而这些应用层协议,在PS端LinuxRT里面编写反而简单;更重要的是PL端FPGA程序越复杂,编译时间越长,而PS端LinuxRT基本上不需要编译,实时下载实时在线前面板,并且支持探针、单步运行等调试方法,非常直观。

        因此,从开发难度、编译时间、调试效率等方面考虑,对于这些通信速度要求不高的IIC器件应用层协议直接映射到ZYNQ芯片里面的PS端非常合适,这也正是ZYNQ芯片被广大用户喜欢的原因所在。

2、实验目标

        本节实验需要利用LabVIEW同时开发ZYNQ PS端Linux RT程序和PL端FPGA程序。      先编写一个PL端IIC总线通信FPGA VI,将FPGA函数选板里面最原始的IIC通信VI函数拖拽到FPGA VI里面,然后PS端就可以通过内部Reg寄存器来操作PL端FPGA IIC里面的状态机了。

        然后编写一个PS端Linux RT程序,调用PS端IIC和EEPROM函数选板里面的读写VI,控制PL端FPGA里面的IIC底层协议,即可实现PS端直接访问外部EEPROM器件。

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

3、硬件介绍

        本节实验会涉及到对ZYNQ开发板底板上的EEPROM器件进行读写;另外,还需要1个Xilinx JTAG下载器(可选)和1根千兆网线即可。

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

        图13-1显示的是正点原子领航者ZYNQ开发板底板上的EEPROM芯片所在的位置。

图13-1:正点原子领航者ZYNQ开发板实物图(EEPROM芯片所在位置)


4、原理图介绍

        由于本节实验用到了ZYNQ开发板上的EEPROM芯片,为了节约ZYNQ芯片PL端FPGA引脚,原子在设计的时候,将支持IIC协议的其他外设也挂在这组IIC总线上了,比如RTC芯片PCF8563和音频WM8960芯片,如图13-2所示。那么我们怎么区分这些IIC器件从而实现分时访问呢?答案就在于IIC协议里面规定了一个器件地址,多个外设只要器件地址设置的不一样就可以独立访问,比如下图显示的正点原子ZYNQ开发板上这3个IIC器件(EEPROM、RTC、WM8960)地址分别就是0x50、0x51和0x1A。

图13-2:正点原子ZYNQ开发板上挂在PL端FPGA同一组IIC总线上的3个外设器件

 

        打开正点原子ZYNQ开发板底板原理图,找到EEPROM芯片(AT24C64)与PL端FPGA引脚之间的连接原理图,如图13-3所示。

图13-3:挂在正点原子ZYNQ开发板PL端FPGA引脚上的EEPROM芯片原理图


图13-3:挂在正点原子ZYNQ开发板PL端FPGA引脚上的EEPROM芯片原理图

  

        提醒:通过原理图还可以看出,EEPROM关联的ZYNQ PL端FPGA引脚(IIC_SCL和IIC_SDA)是位于BANK35上的E18和F17这两个引脚,大家可以直接右击FPGA终端找出这两个引脚对应的EIO端口添加到FPGA里面来,如图13-4所示。

图13-4:将EEPROM芯片关联的ZYNQ芯片PL端的FPGA引脚添加到FPGA终端里面来

 

        提醒:EEPROM芯片的器件地址通常由这颗芯片的A0、A1、A2这3个引脚的高低电平决定的,也就是说,3个引脚最多可以产生8个不同的器件地址,也就是说同一个IIC总线上如果要同时挂在EEPROM芯片,最多只能挂8颗;下图13-5显示的A0、A1、A2全部接到GND上了,所以器件地址就是0x50,关于EEPROM器件地址到底是怎么规定的,可以参考EEPROM芯片手册,这里不再赘述了。

图13-5:EEPROM器件地址由A0、A1、A2这3个引脚电平来决定(图中接法为0x50)


5、驱动VI函数讲解

5.1:PL端FPGA IIC总线通信函数选板

        对于ZYNQ PL端FPGA来说,要想与外面的IIC器件进行通信,需要借助PL端FPGA里面的IIC通信函数。为了方便客户调用IIC函数,我们将PL侧8个相互独立的IIC总线操作函数与PS端底层进行交互的数据和命令通道以Socket CLIP的方式封装到FPGA终端下面,如图13-6所示。这些CLIP通道负责PS端与PL端建立起IIC总线命令和数据交互。

图13-6:ZYNQ FPGA终端下的IIC Socket CLIP端口信号(最原始的)

 

        上面这些IIC总线通信Socket CLIP端口是最原始的,操作起来不直观,为了方便用户调用,我们将NI提供的原始8个IIC操作函数与这里的CLIP合在一起,封装成8个子VI,放在了“PL-IIC”函数选板里面了,如图13-7所示。

图13-7:ZYNQ PL端FPGA终端里面的8个基础IIC总线操作VI函数


        下面先来讲解一下上面函数选板里面第2行里面的8个独立的IIC基础操作子VI,理论上,所有支持IIC协议的器件通讯都可以由这8个IIC子VI进行组合实现。

        1)第1个子VI是IIC通信初始化配置函数(I2C_Init_PL.vi),主要用来配置IIC主设备时钟和数据引脚,并对这两个IO口进行上拉处理,如图13-8所示。

图13-8(a):ZYNQ PL端FPGA里面的IIC初始化配置子VI
图13-8(b):ZYNQ PL端FPGA里面的IIC初始化子VI内部程序框图

 

        2)第2个子VI是IIC启动函数(I2C_Start_PL.vi),一般是IIC主设备向从设备发送地址和数据之前的通知启动命令,如图13-9所示。这个VI的“HalfCycle(us)”参数是用来控制IIC总线的CLK时钟频率的。

图13-9(a):ZYNQ PL端FPGA终端里面的IIC总线发送启动命令子VI
图13-9(b):ZYNQ PL端FPGA终端里面的IIC总线发送启动命令子VI内部程序框图

 

        3)第3个子VI是IIC发送主动Ack响应函数(I2C_Send_Ack_PL.vi),一般用于主设备向从设备发送Ack应答回应信号,如图13-10所示。

图13-10(a):ZYNQ PL端FPGA终端里面的IIC Ack应答发送子VI函数
图13-10(b):ZYNQ PL端FPGA终端里面的IIC Ack应答发送子VI函数内部程序框图

 

        4)第4个子VI是IIC发送非应答函数(I2C_Send_NAck_PL.vi),主设备通知从设备不需要Ack应答信号,如图13-11所示。

图13-11(a):ZYNQ PL端FPGA终端里面的IIC Nack非应答子VI函数
图13-11(b):ZYNQ PL端FPGA终端里面的IIC Nack非应答子VI函数内部程序框图

 

        5)第5个子VI是IIC主设备等待从设备Ack响应函数(I2C_Wait_Ack_PL.vi),主设备等待从设备的应答信号,如图13-12所示。

图13-12(a):ZYNQ PL端FPGA终端里面IIC主设备Ack应答等待子VI函数
图13-12(b):ZYNQ PL端FPGA终端里面IIC主设备Ack应答等待子VI函数内部程序框图

 

        6)第6个子VI是IIC主设备向从设备发送字节数据函数(I2C_WriteByteToSlave_PL.vi),主设备向从设备写入字节数据,如图13-13所示。

图13-13(a):ZYNQ PL端FPGA终端里面的IIC主设备向从设备发送字节数据子VI函数
图13-13(b):ZYNQ PL端FPGA终端里面的IIC主设备向从设备发送字节数据子VI函数内部程序框图

 

        7)第7个子VI是IIC主设备读取从设备输出的字节数据函数(I2C_ReadByteFromSlave_PL.vi),如图13-14所示。

图13-14(a):ZYNQ PL端FPGA终端里面的IIC主设备读取从设备字节数据子VI函数
图13-14(b):ZYNQ PL端FPGA终端里面的IIC主设备读取从设备字节数据子VI函数内部程序框图

 

        8)第8个子VI是IIC主设备向从设备发送停止信号(I2C_Stop_PL.vi),如图13-15所示。

图13-15(a):ZYNQ PL端FPGA终端里面的IIC主设备向从设备发送停止命令子VI函数
图13-15(b):ZYNQ PL端FPGA终端里面的IIC主设备向从设备发送停止命令子VI函数内部程序框图


        提醒:细心的用户发现了,这8个IIC操作函数本质上就是底层最原始的IIC协议,所有IIC应用层协议都可以由这8个VI组合而成,因此,灵活性也是最高的,但是如果直接在PL端FPGA里面反复调用这8个IIC基本VI来实现对EEPROM、RTC、OLED或者温湿度传感器的操作,你会发现编译消耗的FPGA资源非常大,比如下图13-16所示的就是直接在FPGA里面调用这8个基础IIC通信VI实现7个独立的周立功TPS02R温度传感器温度读取的程序框图,编译之后FPGA资源基本上所剩无几了;对应的FPGA VI程序前面板如图13-17所示。

图13-16:直接在PL端FPGA里面利用最原始的8个IIC VI实现的周立功温度传感器读取
图13-17:利用PL端FPGA最原始的8个IIC函数实现的共计14路热电阻温度采集


        虽然,我们在PL端FPGA里面也直接封装了EEPROM读写VI,如图13-18所示;并且编写了配套的范例程序,如图13-19所示;但是同样的问题在于,这些FPGA VI编译成功后消耗的FPGA资源过大,因此,纯FPGA端的EEPROM VI函数不建议大家使用,仅供参考。

图13-18:ZYNQ PL端FPGA里面的EEPROM读写VI
图13-19:ZYNQ PL端FPGA神电测控编写的配套EEPROM读写程序


        痛点:纯FPGA虽然优势很多,比如并行、高速、同步,但是对于这类通信速度要求不高的总线协议,其实没有必要浪费大量宝贵的FPGA资源。因此,我们决定摒弃这种方法,直接将PL端FPGA里面的8个原始IIC通信VI一对一的映射到PS端Linux RT里面来,这样用户就可以像在单片机或者STM32里面那样在PS端Linux RT里面直接调用对应的IIC函数来完成复杂的IIC应用层协议了。

        为此,我们将PL端FPGA里面的这8个IIC子VI利用状态机合并到一个无限循环的多态VI里面来(I2C_Status_Operations_PS2PL_Poly.vi),如图13-20所示,用户只需要给这个内涵状态机VI关联一下IIC的SCL时钟和SDA数据引脚就可以了。这样一来,PS端Linux RT只需要操作状态机里面的条件切换就可以实现对PL端这8个子VI的控制。

图13-20(a):将8个独立的底层IIC操作函数封装到一个状态机VI里面
图13-20(b):将8个独立的IIC底层子VI封装到一个无限循环的状态机内部程序框图


        结论:这样一来,我们就可以充分发挥出ZYNQ芯片PS端ARM端的优势了,反而PL端FPGA里面只需放置一个上面图13-20所示的IIC状态机VI就可以了,剩下的所有编程工作都可以在PS端完成,并且PS端Linux RT程序编译只需几秒,还支持探针和单步运行调试,非常直观方便和灵活。

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

        正式开始采用LabVIEW编写ZYNQ PS端Linux RT读写EEPROM芯片程序之前,我们先来了解一下本节实验需要用到的PS端Linux RT环境下的IIC总线和EEPROM驱动VI函数功能。

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

        要完成本节实验,我们需要用到5个函数选板,分别是“PS_Load_FPGA_bit”、“PS_Load_KO”、“HiSpeedReg”、“PS2PL_IIC”和“PS_EEPROM”,如图13-21所示。

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

 

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

        1)由于本节实验要在PS端实现IIC总线通信功能,需要借助PL端FPGA环境下的IIC总线通信VI,所以需要编写FPGA VI编译生成bit文件,然后由PS端Linux RT程序动态加载到ZYNQ芯片里面运行,因此Linux RT程序运行时的第一个VI必须是动态加载FFPGA bit文件“PS_Load_FPGA_bit.vi”这个函数。凡是需要调用ZYNQ芯片里面PL端FPGA参与的程序,都需要调用这个FPGA bit文件动态加载函数,切记!

        2)为了提高ZYNQ芯片PS端的内存使用率,我们将很多外设KO驱动做成了动态加载和卸载。比如本节实验,PS端Linux RT与PL端FPGA需要完成IIC总线命令和数据的快速交互,不能使用之前用过的普通Reg寄存器(GPIO)通道,必须要用我们单独封装的高速HiSpeed驱动。所以在Linux RT程序初始化之前,我们需要利用下面图13-22里面的HiSpeed寄存器动态加载“Load_HiSpeed_KO”函数(PSLoadHiSpeedKO(SubVI).vi)加载HiSpeed寄存器驱动,等到Linux RT程序停止退出之前,再调用“Unload_HiSpeed_KO”卸载函数(PSUnloadHiSpeedKO(SubVI).vi)卸载HiSpeed寄存器驱动以便释放HiSpeed寄存器通道占用的内存和资源。

图13-22:HiSpeed高速寄存器类外设驱动动态加载和卸载函数

 

        3)要想在PS端使用HiSpeedReg高速寄存器通道传递IIC总线命令和数据,必须要先对HiSpeedReg通道进行初始化,等到Linux RT程序退出的时候,再关闭HiSpeedReg寄存器通道,这两个VI函数位于下图13-23所示的“HiSpeedReg”函数选板里面。

图13-23:ZYNQ芯片PS端HiSpeed Reg寄存器打开和关闭函数


        注意:只要是用到PS端IIC总线和SPI总线通信的场合,都需要调用上面“PS_HiSpeedReg”函数选板里面的第1个和第4个VI,也就是“PS_HiSpeedReg_Open.vi”和“PS_HiSpeedReg_Close.vi”,相当于对HiSpeedReg高速寄存器通道的初始化和程序退出前的HiSpeedReg关闭。

        4)为了让ZYNQ PS(ARM)端Linux RT能够控制PL端FPGA里面的IIC总线通信函数,我们特地在PS端Linux RT下将PL端里面的8个底层IIC驱动VI封装到PS端里面来了,位于“PS2PL_IIC”函数选板,这8个PS端VI功能与PL端FPGA下的IIC状态机里面的8个分支是一一对应的,如图13-24所示。这8个IIC驱动VI的功能与前面介绍过的PL端IIC是一样的,这里不再赘述了。PS端有了这8个基本IIC操作函数之后,就可以实现任意的IIC通信协议了。提醒:只要是涉及IIC通信的,PS端Linux RT主程序里面必须要调用下面图13-24里面的第1个VI,也就是IIC初始化函数。

图13-24:PS端Linux RT下封装的8个独立的IIC操作函数


        5)虽然我们在ZYNQ PS端Linux RT下给大家封装了这8个基本IIC操作函数,对于一些非标的IIC通信器件来说,大家可以参考芯片手册里面的IIC时序,通过将这8个IIC基础VI进行组合即可。但是对于很多常用的标准化的IIC器件来说,比如EEPROM、RTC、3D加速度传感器、温湿度传感器来说,我们可以直接一步到位,参考这些器件的时序图,将IIC协议封装到内部,直接形成一个独立的函数选板,比如本节实验涉及的EEPROM器件,我们就给大家直接封装好了,并且为了展示封装的过程,我们提供了两种形式的EEPROM函数选板,如图13-25所示。其中,用C封装的EEPROM VI更节省一些资源,用子VI封装的改起来更灵活,各有各的优势。

图13-25:神电测控封装的两种类型的ZYNQ PS端Linux RT下的EEPROM VI


        1、一种是EEPROM读写函数内部直接调用上面图13-24里面的8个IIC子VI来实现的,如图13-26所示,这些子VI图标左下角我们特地加了一个VI字样,提醒大家这些EEPROM函数是通过调用原始8个度的IIC子VI实现的。感兴趣的用户,可以打开这些VI看看里面的程序框图具体是如何实现的。

图13-26:基于8个独立的IIC子VI封装起来的EEPROM读写VI


        2、另外一种是EEPROM内部直接通过LabVIEW库函数节点调用我们神电测控编写的IIC驱动动态库so文件,这种方式我们在每个EEPROM VI图标左下角标注了C,意指底层通过C语言实现的IIC协议。

图13-27:调用Linux RT下的EEPROM驱动动态链接库so文件实现的EEPROM VI


        提醒:为了方便大家使用,无论是哪种形式实现的EEPROM读写VI,我们都封装了4种接口,分别是单个U8字节读写、U32数据读写、U8字节数组读写和字符串读写,实际上,字符串本质就是字节数组。至于其他数据类型,都可以通过LabVIEW里面的“强制类型转换”函数转换成字符串或者U8字节数组再连到上面的EEPROM VI端口上。

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

6.1:ZYNQ PL端FPGA IIC总线透传通信协议开发过程

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

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

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

图13-28:打开前面新建好的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/虚拟文件夹”,创建一个虚拟文件夹,如图13-29所示;然后重命名为“实验13-PS端通过PL端实现IIC总线通信-EEPROM(ZYNQ PL端)”,如图13-30所示。

图13-29:右击FPGA终端新建一个虚拟文件夹
图13-30:虚拟文件夹重命名“实验13-PS端通过PL端实现IIC总线通信-EEPROM(ZYNQ PL端)”


6.1.2.1:新建IIC总线透传通信FPGA VI应用程序

        1)为了方便FPGA环境下不同对象的管理,我们将FPGA主VI放在“Main”虚拟文件夹里面,如果存在子VI的话,一般会放在“SubVI”虚拟文件夹里面,如果是ngc或者edf网表的话,一般放在“NGC/EDF”网表文件夹里面。

        右击虚拟文件夹“实验13-PS端通过PL端实现IIC总线通信-EEPROM(ZYNQ PL端)”,选择“New/新建>>Virtual Folder/虚拟文件夹”,如图13-31所示,重命名为“Main”,如图13-32所示。

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


图13-32:将子虚拟文件夹重命名为“Main”

 

        2)右击子虚拟文件夹“Main”,选择“New/新建>>VI”,如图13-33所示;然后保存该VI,命名为“实验13-PS端通过PL端实现IIC总线通信-EEPROM(ZYNQ PL端).vi”,如图13-34所示。

图13-33:右击虚拟文件夹“Main”新建一个FPGA主VI程序
图13-34:将VI另存为“实验13-PS端通过PL端实现IIC总线通信-EEPROM(ZYNQ PL端).vi”

 

        3)打开上面新建的FPGA VI,切换到程序框图,然后放置一个普通循环,将while循环的停止条件设置为F,添加500ms延时函数,再利用移位寄存器和取反函数实现心跳灯,如图13-35所示。因为本节实验PL端FPGA只需要实现IIC总线透传协议即可,EEPROM读写时序都在PS端组合完成,所以主VI实际上看不到任何变化,为了展示PL端FPGA VI在线前面板交互式运行的强大优势,我们这里加入的这个普通while循环没有别的意思,仅仅是向大家展示PL端FPGA bit被PS端加载之后,是否运行起来了。

图13-35:放置一个带心跳指示灯的普通while循环(展示PL端FPGA VI是否在运行)

 

        4)然后将LabVIEW FPGA环境下“PowerGod_ZYNQ_FPGA_PL”函数选板里面的“PL-IIC”选板里面的“I2C_Status_Operations_PS2PL_Poly.vi”拖到FPGA VI程序框图,点击多态VI下拉列表,选择其中任意一个IIC通道作为本次实验的IIC透传协议,至于底层具体走哪个IIC接口,取决于赋予这个IIC VI关联的SCL时钟和SDA数据引脚,这两个IIC引脚可以根据ZYNQ开发板硬件原理图得知,前面我们已经将EEPROM连接的两个PL端FPGA引脚添加到了FPGA终端里面来了,所以这里直接在这个多态IIC通信VI的引脚下拉列表中选择一下即可,如图13-36所示;至于PL端FPGA里面的IIC通信时钟可以在PS端进行动态修改,PL端无须赋值。

图13-36:将PL端FPGA第1路IIC SCL时钟和SDA数据引脚与EEPROM芯片IO关联上


        5)最终,编写完成的ZYNQ PL端IIC总线透传通信FPGA VI程序框图和前面板,分别如图13-37和13-38所示。注意:由于IIC子VI里面没有使用PS端的FLCK0这个时钟,那么在主程序里面就至少要加一个由FCLK0驱动的定时循环,否则产生的bit文件加载之后会导致ZYNQ芯片死机,切记!!!

图13-37:ZYNQ PL端IIC总线通信透传FPGA VI程序框图
图13-38:ZYNQ PL端IIC总线通信透传FPGA VI程序前面板


6.1.3:LabVIEW ZYNQ PL端FPGA仿真、编译、下载、运行和调试

        一般情况下,为了减少FPGA VI的编译次数和提高调试效率缩短开发周期,用户可以参考下面的5个步骤进行:仿真、编译、下载、在线前面板交互式运行和调试。

6.1.3.1:LabVIEW ZYNQ PL端FPGA VI离线仿真

        1)前面我们编写好的ZYNQ PL端IIC总线透传FPGA VI程序虽然比较简单,只有1个while循环、1个PS端FLCK0驱动的定时循环和1个IIC通信子VI,但是在编译下载前,我们可以借助上位机LabVIEW对其进行功能性仿真,做到心中有数。如果FPGA程序里面有复杂的算法(比如FFT)或者时序(FIFO溢出)或者第三方网表(NGC/EDF),更需要如此。如果用户对LabVIEW非常熟练精通的话,也可以跳过这个步骤,直接进入编译下载环节。

        右击FPGA终端,选择“Select Execution Mode/执行VI>>Simulation(Simulated I/O)/带仿真I/O的计算机”,如图13-39所示。一旦切换到这个模式,表明位于该ZYNQ FPGA终端项目下的所有VI都会在PC机上进行在线模拟运行。

图13-39:将VI执行模式切换到计算机仿真模式

 

        2)然后打开“实验13-PS端通过PL端实现IIC总线通信-EEPROM(ZYNQ PL端).vi”,点击左上角的“运行”箭头按钮,如图13-40所示。此时发现这个VI运行起来了,可以看到前面板上的“Running_PL”显示控件里面的数值变成1之后就不动了,但是“Running_FLCK 0”数值变化很快,这是因为主程序里面还有一个定时循环,在仿真模式下,定时循环的优先级要高于普通while循环,加上我们给的是500ms的等待延时,所以看起来while循环就运行了2次,实际上,如果将上面的定时循环禁用掉,只保留下面的while循环,你会发现,此时的“Running_PL”运行速度非常快,远远大于500ms。

        这是因为上位机模拟仿真只是对整个程序框图的功能性仿真,而涉及到FPGA芯片驱动时钟的速度仿真,LabVIEW无法精确模拟时钟频率,但是不影响相对时钟之间的关系和时序结果。当然,用户还可以在程序框图里面用探针去观察每条线上的数据流变化。

图13-40:FPGA VI程序快速运行起来了(功能性仿真和时序仿真)


        提醒:如果用LabVIEW FPGA环境下的IP Block节点调用ngc或者edf网表的话,这里的离线仿真模式也是支持的,也能完全仿真出来网表里面的行为特性。

6.1.3.2:LabVIEW ZYNQ PL端FPGA VI程序编译

        1)在计算机仿真模式下,用户无法仿真FPGA真实的I/O电平,因为仿真计算机上没有对应的物理I/O引脚。所以,我们需要将VI执行模式切换回FPGA终端运行模式。右击FPGA终端,选择“Select Execution Mode/执行VI>>FPGA Target/FPGA终端”,如图13-41所示。

图13-41:将FPGA VI执行模式切换回FPGA终端模式

 

        2)提醒:开始编译前的准备工作(重要步骤)

        用过NI LabVIEW FPGA的用户知道,LabVIEW FPGA默认编译出来的是NI加密过的lvbitx文件,而不是原始的FPGA bit位文件,因此,我们需要想办法将FPGA编译完成后最原始的bit文件弄出来,为此,我们专门给大家提供了一个名为“License-ID-Bitfile-ZYNQ.vi”程序,只要在FPGA VI编译过程中一直打开运行这个VI就可以得到最原始的FPGA bit位文件了。为了防止用户忘记打开运行这个VI,我们可以将这个VI提前添加到LabVIEW项目下的“我的电脑”下面,然后打开点击运行箭头即可,直如图13-42所示。

图13-42:将获取原始ZYNQ FPGA bit文件的VI(License-ID-Bitfile-ZYNQ.vi)拖拽到项目里面的“我的电脑”下面,而不是拖到FPGA终端(切记)

 

        然后,在LabVIEW FPGA Bit文件导出路径里面选择开发电脑存在的路径,至于导出来的FPGA bit文件名称,可以自己随意取,比如,我们将实验13编译出来的ZYNQ IIC FPGA bit文件存放到这个目录下(E:\ZYNQ FPGA Bit Files),取名为“13-PS2PL-IIC.bit”,如图13-43所示。唯一需要注意的是:导出来的FPGA bit文件存放路径最好不放在C盘根目录下,因为很多系统的C盘根目录没有复制权限会导致保存失败,选择其他的盘符更保险。

图13-43:选择合适的路径将实验13编译成功后的原始的ZYNQ FPGA bit文件保存下来(这个VI一直开着运行即可)


        需要注意的是:设置的FPGA bit文件路径不能太深,而且bit文件名称里面不能有中文字符,切记,否则后续下载会失败!

 

        3)然后点击FPGA VI前面板上的“运行”箭头按钮,LabVIEW会启动编译服务器提示对话框,如图13-44所示。里面有3行,分别是:

1-本地编译服务器:顾名思义,就是调用安装在本地计算机上的Xilinx ISE或者Vivado编译器来编译这个VI。这个最为常用。

2-连接至网络编译服务器:这个相当于将这个VI生成的VHDL代码传送给远程服务器上的ISE或者Vivado编译器进行编译,需要用户提前配置好一台安装有Xilinx编译环境的服务器。目的是可以借助服务器强大的性能来加速编译过程,缩短编译时间。需要联网,因此,这个用的很少。

3-连接至LabVIEW FPGA编译云服务:这个是NI官方提供的远程服务器,需要付费才能使用,而且编译速度也没有想象中快多少,所以这个功能基本上也就是NI内部使用的多。如果用户报名参考NI FPGA认证考试或者提供购买过NI硬件产品序列号的话,NI会提供一个试用期为30天的LabVIEW FPGA编译云服务,编译速度跟本地基本一样,没有多大优势。因此,用的也很少。

图13-44:FPGA编译服务器选择提示框


        此时,先不着急点击上图里面的“OK/确定”按钮,让我看看自动产生的FPGA程序生成规范里面是不是还有什么特殊的地方需要设置。因此,这里,我们选择“Cancel/取消”按钮,如图13-45所示。

图13-45:先取消编译(因为我们要检查一下FPGA程序生成规范)

 

        4)展开FPGA终端里面的“Build Specifications/程序生成规范”,如图13-46所示;然后双击打开这个程序生成规范(实验13-PS端通过PL端实现IIC总线通信-EEPROM(ZYNQ PL端)),将里面的一个重要选项“Run when loaded to FPGA/加载至FPGA时运行”勾选上,如图13-47,否则后续编译出来的ZYNQ FPGA bit文件下载到FPGA芯片里面是运行不了的,所以这里一定要检查一下是否打勾了。最后点击“OK/确定”关闭程序生成规范对话框。

图13-46:展开FPGA终端里面的程序生成规范,然后直接双击打开即可
图13-47:将“加载至FPGA时运行”勾选上(一定要勾上,切记!!!)

 

        5)接下来,再次点击FPGA VI左上角的运行箭头,触发重新编译对话框,这次就可以放心点击里面的“OK/确定”按钮了,如图13-48所示;然后就会自动进入“正在生成中间文件”对话框,如图13-49和13-50所示。里面一共有5个阶段,主要就是将LabVIEW编写的FPGA VI程序框图转换为VHDL代码,然后进行压缩传递给Xilinx编译器进行编译。

图13-48:再次点击FPGA VI左上角运行箭头触发重新编译对话框(这次点击OK)
图13-49:LabVIEW FPGA VI程序框图正在生成中间VHDL文件
图13-50:正在压缩打包生成好的中间VHDL文件


        6)等待中间文件生成完毕后,LabVIEW会启动“Compilation Status/编译状态”窗口,如图13-51所示。里面一共经历5个步骤:配置、综合、布局、时钟约束、时钟布线。如果是6代FPGA,例如,Spartan6,需要经过每一步的编译,每个步骤都不能报错,否则会无法生成bit文件。但是对于7系列FPGA来说,例如ZYNQ、A7、K7、V7,如果FPGA VI里面用的是普通while循环,或者用的定时循环时钟源是默认的,那么后面两项“估计定时”和“最终定时”是不起作用的,LabVIEW会跳过检查,直接生成可以运行的原始FPGA bit文件;如果定时循环用到了创建的衍生时钟,那么最后两项定时约束还是会进行的。

图13-51:Xilinx编译器正在执行综合

 

        7)在“Reports/报表”的下拉列表里面选择“Configuration/配置”,可以看到配置页面里面的信息汇总,如图13-52所示。可以发现LabVIEW FPGA调用的是64位的Xilinx Vivado 2019.1这个版本的编译器,7系列FPGA只支持Vivado编译器。

图13-52:Xilinx编译器“配置”页面里面的信息汇总

 

        8)等待综合完成后,切换到“Estimated device utilization(synthesis)/估计设备使用(综合)”,如图13-53所示。可以看到这个VI编译后的资源预估计占用情况。

图13-53:Xilinx编译器“Synthesis/综合”页面里面的资源预估计

 

        9)等待转换和映射完成之后,就能在“Final device utilization(placement)/最终设备使用(布局)”页面里面,看到Xilinx编译器反馈的FPGA芯片实际资源使用情况,如图13-54所示。可以看出实际编译的结果与前面的资源预估计相差无几,这样,用户可以根据在资源预估计阶段里面的资源占用情况,来判断是否直接结束编译过程,避免浪费不必要的编译时间。例如,如果预估计的资源使用率严重超过100%的话,那么建议用户直接终止编译,返回去优化程序后再编译。

图13-54:Xilinx编译器“placement/映射”页面里面的最终资源占用结果

 

        10)当用户在“Status/状态”提示框里面看到“Generating programming file/正在生成编程文件”,说明LabVIEW FPGA正在生成可执行bit文件,如图13-55所示。相同的代码要比之前Spartan6里面的ISE编译器快了一倍多。这也是Vivado编译器改变编译策略后的一大优势。

图13-55:Xilinx Vivado编译器正在生成可编程bit文件

 

        11)编译完成,会自动启动弹出“Preparing for interactive execution/准备交互式运行”提示框,但是不会像第五章那样弹出一个路径选择对话框,这是因为,前面我们将配置Xilinx JTAG下载器下载还是仿真的ini.txt文件里面的1改成0了,所以就LabVIEW就会跳过选择FPGA bit文件和下载这个过程了。接着我们到这个“License-ID-Bitfile-ZYNQ.vi”里面指定的路径下,发现了刚刚编译出来的FPGA bit文件,如图13-56所示。

图13-56:到先前设置的路径里面找到刚刚编译出来的ZYNQ FPGA bit文件

 

        12)如果用户的Xilinx JTAG下载器驱动没有提前安装好,或者没有接入实际的下载器跟ZYNQ开发板的话,那么过一会会弹出一个错误代码位-310601的错误提示框,如图13-57所示。错误代码的意思就是LabVIEW无法识别到Xilinx JTAG下载器通信线缆,如果大家接了Xilinx下载器和板子上电之后还出现这种错误提示,可以参考前面第三章里面的Xilinx下载器驱动安装方法,重新安装一遍驱动即可。我们这里报错是因为我们还没有将Xilinx JTAG下载器跟板子接到电脑上,故意触发这个错误提醒用户的。另外,前面我们将ini.txt里面的1改成0,所以在PS端没有动态加载这里的FPGA bit之前,在线前面板也是无法运行的,切记!!!

图13-57:弹出-310601错误(提示LabVIEW没有识别到Xilinx JTAG下载器通信线缆)

        至此,关于LabVIEW ZYNQ FPGA VI程序的编译过程就结束了,并且我们成功得到了原始的ZYNQ FPGA bit文件,这为用户产品的批量部署奠定了基础。

6.2:ZYNQ PS(ARM)端Linux RT EEPROM程序开发过程

6.2.0:编程思路(PS端Linux RT)

        要想ZYNQ芯片PS端Linux RT通过PL端FPGA实现EEPROM芯片访问读写,必须按照下面的流程至少调用8个VI函数,调用次序如下,后面Linux RT程序编写就是参考这个流程来的:PS_Load_FPGA_bitàLoad_HiSpeedReg_KOàPS_HiSpeedReg_OpenàPS2PL_IIC_Inità PS_EEPROM_Write / PS_EEPROM_ReadàPS_HiSpeedReg_CloseàUnload_ HiSpeedReg _KO

        了解完ZYNQ芯片PS端IIC、HiSpeedReg和EEPROM驱动VI和操作流程后,接下来,我们就可以利用LabVIEW编写1个Linux RT程序访问读写EEPROM芯片了,然后下载到ZYNQ PS端ARM里面去运行。

6.2.1:新建或者打开已有的LabVIEW ZYNQ Linux RT项目

        打开前面第五章我们新建好的LabVIEW ZYNQ项目(My_FPGA_Stater_Board_ZYNQ7020_PS+PL.lvproj),这个项目前面我们在编写ZYNQ PL端FPGA程序时已经打开过了,如图13-79所示。

图13-79:打开前面我们创建好的同时包含ZYNQ PS(ARM)端和PL(FPGA)端的LabVIEW ZYNQ项目

 

        由于前面IIC总线透传通信FPGA VI已经编写完成了,并且生成了可用的FPGA bit文件,这里为了缩小截图,我们暂且先将FPGA Target终端收起来,如图13-80所示。

图13-80:将My FPGA终端暂时收起来(因为前面FPGA VI已经编写好了)


6.2.2:编写LabVIEW Linux RT EEPROM读写应用程序

        1)右击Linux RT终端(ZYNQ7020_PS_Linux_RT)选择“New/新建”一个“Virtual Folder/虚拟文件夹”,如图13-81所示。将其重命名为“实验13-PS端通过PL端实现IIC总线通信-EEPROM(ZYNQ PS端)”,如图13-82所示;再右击刚刚创建的虚拟文件夹,新建1个子虚拟文件夹,命名为“Main”,如图13-83所示,以示分类管理好区分。

图13-81:右击Linux RT终端选择新建一个虚拟文件夹
图13-82:将刚刚新建出来的虚拟文件夹重命名为“实验13-PS端通过PL端实现IIC总线通信-EEPROM(ZYNQ PS端)”
图13-83:将子虚拟文件夹重命名为“Main”

 

        2)接着,右击刚刚创建的虚拟文件夹“Main”选择“New/新建”一个VI程序,如图13-84所示,然后将这个VI另存为“实验13-PS端通过PL端实现IIC总线通信-EEPROM(ZYNQ PS端).vi”,如图13-85所示。

图13-84:右击虚拟文件夹新建一个VI
图13-85:将新建出来的VI保存并重命名为“实验13-PS端通过PL端实现IIC总线通信-EEPROM(ZYNQ PS端).vi”


        3)打开这个新建的VI,将前面第5.2节“PowerGod-RIO-RT”函数选板里面的8个子VI函数拖拽到程序框图里面,然后按照6.2.0节里面的步骤进行排序串联,最后在前面板上创建相应的控件,即可完成PS端借助PL端实现一个完整的EEPROM芯片读写程序,最终形成完整的Linux RT EEPROM程序框图,如图13-86所示。提醒:看不清的用户可以缩放一下pdf,因为这里贴的程序框图是直接复制的LabVIEW原始矢量图,不是截图。

图13-86:完整的ZYNQ PS(ARM)端通过PL端FPGA实现的EEPROM芯片读写Linux RT程序框图


        提醒:我们将8个独立的IIC总线做成了多态VI,PS端Linux RT程序里面的IIC初始化分支选择(比如这里的IIC_1)必须要跟PL端FPGA VI里面的保持一致。

 

        4)ZYNQ PS端通过PL端FPGA IIC协议实现的EEPROM数据读写的Linux RT应用程序前面板,如图13-87所示。

图13-87:ZYNQ PS端通过PL端FPGA IIC协议实现的EEPROM读写Linux RT程序前面板

 

        提醒:ZYNQ PS端Linux RT程序前面板上有一个FPGA bit文件加载路径,这个路径“/home/lvuser/natinst/bin/data/”是LabVIEW在Linux RT系统下的默认路径,如果用户自己编译出来的FPGA bit文件名称跟我们的不一样,只需要将路径里面最后的bit文件名称替换一下即可,前面的默认路径最好不要动。

7、硬件接线实物图

        提醒:由于本节实验只需要访问挂在ZYNQ PL端FPGA上的EEPROM芯片,没有其他外设了,所以只需要Xilinx下载器和千兆网线就可以了。如果用户想在线观察ZYNQ PL端FPGA VI前面板实际运行情况,可以将Xilinx JTAG下载器接到ZYNQ开发板上;反之,如果不想观察FPGA VI的在线前面板交互式运行,这里也可以不用接下载器,因为PL端的FPGA bit文件可以通过PS端来动态加载,不需要通过下载器下载都行。

        对于ZYNQ PS端Linux RT程序的部署和下载,则需要一根CAT5+或者CAT6类千兆网线或者通过WiFi无线部署(参考第6章实验2),然后将ZYNQ开发板跟上位机开发电脑互联起来即可,上位机开发电脑通过网线和Xilinx JTAG下载器与正点原子ZYNQ开发板之间的硬件接线实物图,如图13-88所示。

图13-88:完整的硬件接线实物图(千兆网线接到PS端网口里面)


8、程序编译下载

8.1:准备工作(将前面编译好的PL端FPGA bit文件添加到PS端)

        由于本节实验用到了ZYNQ芯片PL端FPGA部分,为了让PS端Linux RT程序可以动态加载PL端的FPGA bit文件,我们需要将前面编译好的PL端EEPROM下的IIC总线FPGA bit文件添加到ZYNQ PS端Linux RT终端里面来,步骤如下。

        右击ZYNQ PS端Linux RT终端下的“ZYNQ PL FPGA bit files”,选择“Add/添加>>File/文件”,如图13-89所示;然后在弹出来的文件选择对话框里面找到前面编译出来的PL端FPGA bit文件,如图13-90所示;添加成功后的效果如图13-91所示。

图13-89:右击Linux RT终端选择添加FPGA bit文件
图13-90:选择前面编译出来的PL端IIC FPGA bit文件
图13-91:IIC FPGA bit文件添加成功后的效果


8.2:ZYNQ PS端Linux RT应用程序编译、部署、下载

        1)由于ZYNQ开发板与上位机电脑之间是通过网线直连的,中间没有经过路由器,所以,上位机要利用ZYNQ PS端Linux RT默认的静态IP地址:192.168.2.99来部署下载上位机写好的Linux RT程序,因此,上位机网卡IP地址也要设置成同一个网段,比如192.168.2.10,如图13-92所示。

图13-92:将上位机开发电脑网卡IP地址设置成跟下位机ZYNQ里面的eth0:1虚拟网卡静态IP地址在同一个网段内

 

        2)然后检查一下LabVIEW ZYNQ PS端Linux RT终端里面的IP地址是否为下位机ZYNQ里面的固定IP地址(192.168.2.99),如果不是,则右击终端选择“Properties/属性”,如图13-93所示;再在属性设置页面里面修改一下即可,如图13-94所示。

图13-93:如果IP地址不一样的话,可以右击LabVIEW Linux RT终端选择属性
图13-94:在Linux RT属性配置里面将IP地址改成ZYNQ直连方式下的固定静态IP地址

 

        3)右击ZYNQ PS端Linux RT终端(ZYNQ7020_PS_Linux_RT)选择“Connect/连接”,如图13-95所示;不出意外的话,会弹出来一个“Deployment Progress”部署成功的提示框,如图13-96所示;最后点击一下“Close/关闭”该对话框即可,此时,可以看到LabVIEW Linux RT终端左下角的指示灯点亮了,如图13-97所示,表明上位机Linux RT终端与下位机ZYNQ板子通过网线建立起了连接。

图13-95:右击LabVIEW Linux RT终端(ZYNQ7020_PS_Linux_RT)选择“Connect/连接”
图13-96:弹出一个部署进度与部署成功的提示框(Close即可)
图13-97:连接成功后Linux RT终端logo图标指示灯会点亮

 

        4)右击Linux RT终端(ZYNQ7020_PS_Linux_RT)里面的程序生成规范,选择“New/新建”一个“Real-Time Application/实时应用程序”,如图13-98所示;然后在弹出来的RT应用程序属性配置页面里面,将程序生成规范重命名为“实验13-PS端通过PL端实现IIC总线通信-EEPROM(ZYNQ PS端)”,如图13-99所示;再选择左侧目录里面的“Source Files/源文件”里面的本节实验13编写的VI程序(实验13-PS端通过PL端实现IIC总线通信-EEPROM(ZYNQ PS端).vi)添加到右侧的“Startup Vis/启动VIs”列表里面,如图13-100所示;最后将中间文件夹“ZYNQ PL FPGA bit files”里面的FPGA bit文件(13-PS2PL-IIC.bit)作为附件添加到右下方的“Always Included/总是包含”里面,如图13-101所示。

图13-98:右击Linux RT终端下的程序生成规范新建一个RT应用程序规范
图13-99:将新建出来的Linux RT应用程序生成规范重命名以示区分
 图13-100:将源文件里面本节实验13编写的Linux RT VI添加到右侧启动VIs列表里

     

图13-101:将前面编译好的PL端FPGA bit文件添加到右侧“Always Included/总是包含”

 

        提醒:所有非LabVIEW静态调用的文件都可以放到这个“Always Included/总是包含”里面,这样后续部署下载的时候,上位机LabVIEW会把这些文件自动通过网络下载到下位机ZYNQ Linux RT系统里面去,免去了手动拷贝,简单实用可靠。

 

        5)接下来,右击刚刚创建的实验13对应的RT应用程序生成规范,选择“Build/编译”,如图13-102所示;大概几秒钟就能编译完成,并且会有一个编译成功的提示框,如图13-103所示;点击“Done/完成”按钮退出这个提示框,再右击实验13程序生成规范,选择“Deploy/部署”将刚刚编译出来的Startup.rtexe以及FPGA bit文件全部部署下载到ZYNQ板子里面去,如图13-104所示;一切顺利的话,会有一个部署进度条和部署成功的提示框出现,如图13-105所示。

图13-102:右击实验13 Linux RT应用程序生成规范进行“Build/编译”
图13-103:编译完成后会有一个编译进度条和编译成功提示框
图13-104:右击Linux RT实验13程序生成规范选择“Deploy/部署”下载
图13-105:ZYNQ PS端Linux RT程序及其组件附件会一起部署下发到ZYNQ里面去


9、实验现象

        1)直接点击本节实验13对应的Linux RT程序(实验13-PS端通过PL端实现IIC总线通信-EEPROM(ZYNQ PS端).vi)左上角的运行箭头,可以看到上位机LabVIEW会把这个VI程序及其组件、驱动和FPGA bit文件一起部署下载到ZYNQ芯片里面运行,如图13-106所示;同时PS端里面的Linux RT应用前面板活了,自动进入在线前面板交互式运行模式,此时,前面板上的“Running_PS”显示控件里面的数值开始递增,说明PS端的Linux RT程序里面的while循环开始运行起来了,如图13-107所示。

图13-106:上位机实验13对应的Linux RT程序和FPGA bit文件成功部署到了下位机ZYNQ芯片里面运行
图13-107:Running_PS显示控件数值递增,表明Linux RT程序里的while循环运行了

 

        2)为了同步观察ZYNQ PL端FPGA VI程序运行情况,我们可以借助Xilinx JTAG下载器和LabVIEW FPGA在线前面板交互式运行功能,由于PS端已经将PL端的FPGA bit加载到ZYNQ芯片里面运行了,所以这里不需要Xilinx下载器去下载FPGA bit文件了,因此,我们需要先将ini.txt文件里面的1改成0,如图13-108所示,让PL端FPGA VI直接进入在线前面板交互式运行,直接运行项目下的ZYNQ PL端My FPGA终端下的实验13这个FPGA VI,等待几秒可以看到,FPGA VI前面板活了,同时前面板上的“Running_PL”显示控件里面的数值按照500ms的速度递增,“Running_FCLK0”按照54MHz左右的速度递增,并且“Heartbeat_LED”心跳指示灯也闪烁了,如图13-109,这是因为FPGA VI程序框图里面的普通while循环延时设置的就是500ms。

图13-108:将Xilinx JTAG下载器配置文件ini改成0(跳过下载直接进入在线前面板)
图13-109:直接运行ZYNQ PL端My FPGA终端里面的FPGA VI(前面板活了)

 

        3)接下来,我们测试一下ZYNQ PS端Linux RT程序能不能实现对ZYNQ开发板底板上的EEPROM芯片读写。PS端Linux RT程序运行之后,可以看到右侧的字符串显示控件“Read_String”里面出现了跟左侧“Write_String”输入控件里面完全一样的内容,如图13-110所示,说明程序默认字符串成功的写入了EEPROM芯片,并且成功的读出来了。然后我们试着修改一下左侧输入字符串里面的内容,比如改成“元旦快乐,祝大家心想事成、万事如意、学业事业更上一层楼!”,然后你会发现右侧显示控件里面立刻更新了,变成了跟左侧输入的完全一样,如图13-111所示。再次说明了我们编写的ZYNQ EEPROM程序完全符合预期设计。

图13-110:ZYNQ PS端Linux RT EEPROM读写程序实际运行效果(读写完全一致)
图13-111:ZYNQ PS端Linux RT EEPROM读写程序实际运行效果(读写完全一致)

 

11、实验总结

        我们总结一下本节实验学到的内容和需要注意的事项。

        本节实验我们通过PL端FPGA里面的IIC总线透传VI实现了PS端Linux RT下的EEPROM芯片读写访问,并且进一步拓展了PS端的IIC总线接口数量,这种方式充分发挥了ZYNQ芯片里面PL端FPGA万能芯片的作用。有了基本的IIC总线通信协议之后,我们就可以利用ZYNQ PS端Linux RT的优势实现各种支持IIC协议的器件通信。

        IIC通信非常重要,在很多对读写速度要求不高的传感器、RTC、EEPROM、OLED、音频等外设,基本上都支持IIC协议,所以大家务必要掌握基于ZYNQ芯片的IIC通信协议开发,这个对于拓展用户的知识面和产品种类可以起到很好的推动作用,要学会举一反三,只要是支持标准IIC协议的器件,都可以通过本书里面的实验例程来搞定。另外,感兴趣的用户还可以仔细研究一下我们在PL端FPGA里面编写的IIC基础协议子VI内部程序框图,具有一定的参考价值。

        下一节实验我们会继续讲解如何借助ZYNQ PL端FPGA里面的IIC通信协议在ZYNQ PS端Linux RT里面实现RTC时钟芯片PCF8563的访问。其实,所有支持标准IIC协议的器件都可以用本书讲解的方法搞定。


Copyright © 2026 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1