【LabVIEW FPGA入门】局部变量和全局变量

局部变量

        无法访问某前面板对象或需要在程序框图节点之间传递数据时,可创建前面板对象的局部变量。创建局部变量后,局部变量仅仅出现在程序框图上,而不在前面板上。

        局部变量可对前面板上的输入控件或显示件进行数据读写。写入局部变量相当于传递数据至其他接线端。但是,局部变量还可向输入控件写入数据和从显示控件读取数据。实际上,使用局部变量可将前面板对象同时用作输入和输出。

        例如,如果用户界面需要用户登录,可在每次新用户登录时清空登录和密码提示框中的内容。通过局部变量,当用户登录时使用局部变量从登录和密码字符串输入控件中读取数据,当用户离开时向这些输入控件写入空字符串。

        右键单击一个前面板对象或程序框图接线端并从快捷菜单中选择创建»局部变量便可创建一个局部变量,该对象的局部变量的图标将出现在程序框图上。

        如需使局部变量与输入控件或显示控件相关联,可右键单击该局部变量节点,从快捷菜单中选择选择项。展开的快捷菜单将列出所有带有自带标签的前面板对象。

        LabVIEW通过自带标签关联局部变量和前面板对象,因此前面板输入控件和显示控件的自带标签应具有一定的描述性。

全局变量

        全局变量可在同时运行的多个VI之间访问和传递数据。全局变量是内置的LabVIEW对象。创建全局变量时,LabVIEW将自动创建一个有前面板但无程序框图的特殊全局VI。向该全局VI的前面板添加输入控件和显示控件可定义其中所含全局变量的数据类型。该前面板实际便成为一个可供多个VI进行数据访问的容器。

        例如,假设现有2个同时运行的VI。每个VI含有一个While循环并将数据点写入一个波形图表。第一个VI含有一个布尔控件来终止这两个VI。此时须用全局变量通过一个布尔控件将这两个循环终止。如这两个循环在同一个VI的同一张程序框图上,可用一个局部变量来终止这两个循环。

        从函数选板上选择一个全局变量,将其放置在程序框图上。双击该全局变量节点可显示全局VI的前面板。该前面板与标准前面板一样,可放置输入控件和显示控件。

        LabVIEW以自带标签区分全局变量,因此前面板输入控件和显示控件的自带标签应具有一定的描述性。

        可创建多个仅含有一个前面板对象的全局VI,也可创建一个含有多个前面板对象的全局VI从而将相似的变量归为一组。

        所有对象在全局VI前面板上放置完毕后,保存该全局VI并返回到原始VI的程序框图。然后必须选择全局VI中想要访问的对象。右键单击该全局变量节点并从快捷菜单中选中一个前面板对象。该快捷菜单列出了全局VI中所有自带标签的前面板对象。右键单击该全局变量节点并从选择项快捷菜单中选择一个前面板对象。

        如为全局变量节点创建了一个副本,则LabVIEW将把这个新的全局变量节点与原始变量节点的全局VI相关联。

局部变量和全局变量的初始化

        如需对一个本地或全局变量进行初始化,应在VI运行前将已知值写入变量。否则变量可能含有导致VI发生错误行为的数据。如变量的初始值基于一个计算结果,则应确保LabVIEW在读取该变量前先将初始值写入变量。将写入操作与VI的其他部分并行可能导致竞争状态。

        要使变量初始化在VI其他部分执行之前完成,可将把初始值写入变量的这部分代码单独放在顺序结构的第一帧。也可将这部分代码放在一个子VI中,通过连线使该子VI在程序框图的数据流中第一个执行。

        如在VI第一次读取变量之前,没有将变量初始化,则变量含有的是相应的前面板对象的默认值。

        当全局变量或本地变量的值连接至程序框图上的任何位置,变量改变不会引起连线上的值改变。变量的值更改以后,要读取变量的值,才会更新连线上的值。

竞争状态

        两段或更多代码并行执行并访问同一部分内存时会引发竞争状态。如果代码是相互独立的,就无法判断LabVIEW按照何种顺序访问共享资源。

        竞争状态会引起不可预期的结果。例如,两段独立的代码访问同一个队列,但是用户未控制LabVIEW访问队列的顺序,这种情况下会引发竞争状态。

        竞争状态随着程序运行的时间因素而改变,因此具有一定的危险性。操作系统、LabVIEW版本和系统中其他软件的改变均会引起竞争状态。

        如改动了VI的时间要素(例如,更新操作系统或LabVIEW版本),请检查访问同一部分数据的并行代码,并使用定时条件来控制哪一部分代码首先执行。

使用局部变量和全局变量时的竞争状态

        对同一个存储数据进行一个以上更新动作均会造成竞争状态,但是竞争状态通常在使用局部变量和全局变量或外部文件时出现。以下程序框图显示了一个局部变量造成竞争状态的范例。

1378

        该VI的输出,即本地变量x的值取决于首先执行的运算。因为每个运行都把不同的值写入x,所以无法确定结果是7,还是3。在一些编程语言中,由上至下的数据流模式保证了执行顺序。在LabVIEW中,可使用连线实现变量的多种运算,从而避免竞争状态。下列程序框图通过连线而不是局部变量执行了加运算。

1378

        提示如必须在局部变量或全局变量上执行一个以上操作,则应确保各项操作按顺序执行。

        如两个操作同时更新一个全局变量,也会发生竞争状态。如要更新全局变量,需先读取值,然后修改,再将其写回原来的位置。当第一个操作进行了读取-修改-写入操作,然后才开始第二个操作时,输出结果是正确的,可预知的。第一个操作读取值,然后第二个操作读取值,则两个操作都修改和写入了一个值。这样操作造成了读取-修改-写入竞争状态,会产生非法值或丢失值。

        要避免全局变量引起的竞争状态,可使用功能全局变量保护访问变量操作的关键代码。使用一个功能全局变量而不是多个本地或全局变量可确保每次只执行一个运算,从而避免运算冲突或数据赋值冲突。

循环中的变量行为

        当一个变量控制多个并行循环时,循环必须在写入变量后执行,在循环每次执行后读取变量。

        当系统重新启动时,循环读取变量之前,必须为变量设置合适的开始条件,避免变量过早停止。

局部变量和全部变量的内存分配

局部变量

        局部变量复制数据缓冲区的数据。从一个局部变量读取数据时,便为相关控件的数据创建了一个新的缓冲区。

        如使用局部变量将大量数据从程序框图上的某个地方传递到另一个地方,通常会使用更多的内存,最终导致执行速度比使用连线来传递数据更慢。如在执行期间需要存储数据,可考虑使用移位寄存器。

全局变量

        从一个全局变量读取数据时,LabVIEW将创建一个数据的副本,保存于该全局变量中。

        操作大型数组和字符串时,将占用相当多的时间和内存来操作全局变量。操作数组时使用全局变量尤为低效,原因在于即使只修改数组中的某个元素,LabVIEW仍对整个数组进行保存和修改。如一个应用程序中的不同位置同时读取某个全局变量,则将为该变量创建多个内存缓冲区,从而导致执行效率和性能降低。

FPGA上的局部变量使用

 

在不同时钟源的定时循环中使用局部变量

        下面的屏幕截图演示了跨多个时钟域传输数据时的常见错误。在以 Windows 为目标的 VI 中,每次迭代期间在下部循环中读取的局部变量始终彼此同步,因为软件数据流约束确保下部 while 循环中读取的数据始终是写入到下部循环中的最后一个值。局部变数。然而,在LabVIEW FPGA中,数据流以握手逻辑的形式硬件实现。握手会向您的代码添加额外的逻辑,以确保存在数据来执行您的操作。例如,在乘法运算中,在执行乘法例程之前必须存在两个数字输入。硬件握手确保两个输入都必须存在才能执行乘法。


        本例中硬件握手的后果之一是由于附加逻辑的速度而导致的延迟。在上面所示的VI中,出现了一个问题,因为连接到每个变量的握手逻辑需要多个时钟周期才能执行,但SCTL强制内部代码在一个时钟周期内执行。由于握手逻辑在写入操作中引入了延迟,这可能导致在较低的循环中读取“旧”值。为了缓解此问题,请使用 FIFO 而不是局部变量在循环之间传递数据。 

        上例中出现的另一个问题是数字和布尔值可能不相互同步。这是因为没有逻辑来确保布尔和数值局部变量同步。为了解决这个问题,请将数字和布尔值捆绑在一起,并通过局部变量传递集群。 

 


        当在同一时钟域内工作时,上述同步问题不适用。因此,如果上面显示的两个环路都使用 10 MHz 定时源,则不会出现同步问题。

全局变量示例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/759644.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

流畅的 Python 第二版(GPT 重译)(十三)

第二十四章:类元编程 每个人都知道调试比一开始编写程序要困难两倍。所以如果你在编写时尽可能聪明,那么你将如何调试呢? Brian W. Kernighan 和 P. J. Plauger,《编程风格的要素》 类元编程是在运行时创建或自定义类的艺术。在 P…

局域网内怎么控制另一台电脑

局域网内怎么控制另一台电脑 在局域网内控制另一台电脑是一个相对高级的操作,通常用于远程管理、技术支持或资源共享等场景。要实现这一功能,需要确保两台电脑都连接到同一个局域网,并且已进行适当的配置。以下是几种常见的方法:…

【蓝桥杯选拔赛真题42】C++切蛋糕 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解析

目录 C切蛋糕 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 C切蛋糕 第十四届蓝桥杯青少年创意编程大赛C选拔赛真题 一、题目要求 1、编程实现 有一块矩形蛋糕,小明从蛋糕…

GCN-Align论文翻译

GCN-Align翻译 Cross-lingual Knowledge Graph Alignment via Graph Convolutional Networks 基于图卷积网络的跨语言知识图谱对齐 Abstract 多语言知识图(KGs),如DBpedia和YAGO,包含几种不同语言的实体结构化知识&#xff0c…

墨菲安全在软件供应链安全领域阶段性总结及思考

向外看:墨菲安全在软件供应链安全领域的一些洞察、思考、行动 洞察 现状&挑战: 过去开发安全体系是无法解决软件供应链安全问题的;一些过去专注开发安全领域的厂商正在错误的引导行业用开发安全思维解决软件供应链安全问题,治…

SpringCloud中的@EnableDiscoceryClient和@EnableFeignClients注解的作用解析、RPC远程过程调用

目录 EnableDiscoveryClient 服务发现的核心概念 服务注册中心 EnableDiscoveryClient注解的作用 服务心跳健康检查 使用示例 EnableFeignClients Feign简介 EnableFeignClients注解的作用 RPC(Remote Procedure Call) 参考链接 Spring Cloud…

javaScript——BFS结合队列求迷宫最短路径

这里推荐先去看下B站这个老师讲的BFS迷宫问题,只用看前五分钟就能懂用BFS队列实现的原理。[POJ] 3984 迷宫问题 BFS_哔哩哔哩_bilibili 问题描述:由m*n的矩阵构成了一个迷宫, 矩阵中为1的元素表示障碍物,不能走,为0表示…

如何在职场中提升自己的竞争力

随着社会的发展,职场竞争日益激烈。如何在职场中提升自己的竞争力,成为许多职场人士关注的焦点。本文将从以下几个方面为大家提供一些建议。 一、不断学习,提升专业技能 在职场中,专业技能是衡量一个人竞争力的重要标准。要想在职…

让数据在两个buckets之间传输 - Google Storage Transfer Service

在业务场景中, 有时我们不想直接暴露数据存储空间给上游系统, 而需要设置1个landing Path 让上游系统发送数据 如图: 我们只需grant landing bucket 的权限给上游系统, 而上游系统是访问不了storage bucket的保证了数据隔离 但是…

这个小技巧真不错!

大家好,我是前端队长。前端程序员,2023年开始玩副业。玩过AI绘画,公众号爆文项目,累计变现五位数。 今天看到萌萌在陪伴群分享了我公众号次图封面显示不全的问题。 这里我分享设计师萌萌的方法,很简单,但是…

为什么HubSpot可以干翻营销和销售副总裁?

本文纯属虚构,作为销售的人,看完惊出一身大汗绝对属于正常。建议您先准备一个大毛巾,等下看完肯定会出汗的。还有,别忘记睡前给自己倒满一杯红酒🍷,今晚会失眠的呢。 1. 为什么是Hubspot? 2. H…

金融知识分享系列之:KD指标

金融知识分享系列之:KD指标 一、KD指标二、KD指标计算三、KD指标原理四、KD指标应用 一、KD指标 KD信号提供入场的工具 名称:随机震荡指标参数:(9,3,3)组成:K线,D线,20轴&#xff0…

【Linux】传输层协议:TCP/UDP

目录 netstat pidof UDP协议 TCP协议 TCP协议段格式 TCP协议的相关机制 确认应答(ACK)机制 超时重传机制 连接管理机制 服务端状态转换 客户端状态转化 流量控制 流量控制常见问题: 滑动窗口 拥塞控制 延迟应答 面向字节流…

流畅的 Python 第二版(GPT 重译)(九)

第四部分:控制流 第十七章:迭代器、生成器和经典协程 当我在我的程序中看到模式时,我认为这是一个麻烦的迹象。程序的形状应该只反映它需要解决的问题。代码中的任何其他规律性对我来说都是一个迹象,至少对我来说,这表…

(day 14)JavaScript学习笔记(对象2)

概述 这是我的学习笔记,记录了JavaScript的学习过程。在写博客的时候我会尽量详尽的记录每个知识点。如果你完全没接触过JavaScript,那么这一系列的学习笔记可能会对你有所帮助。 今天继续学习对象,主要是this、getters和setters、原型&#…

vulhub中DNS域传送漏洞复现

DNS协议支持使用axfr类型的记录进行区域传送,用来解决主从同步的问题。如果管理员在配置DNS服务器的时候没有限制允许获取记录的来源,将会导致DNS域传送漏洞。 环境搭建 Vulhub使用Bind9来搭建dns服务器,但不代表只有Bind9支持AXFR记录。运行…

Power BI学习(数据可视化)

另一个也可以的工具是:Tableau 还有一个是:神策,主要是用于互联网的app的数据埋点 数据分析的过程: 数据源--数据清洗(power query)-构建指标 新建度量值(power pivot)-可视化&…

构建一个前端智能停车可视化系统

引言 随着城市化进程的加速,停车难问题日益突出。智能停车可视化系统通过实时展示停车场的车位信息,帮助用户快速找到空闲车位,提高停车效率。 目录 引言 一、系统设计 二、代码实现 1. 环境准备 2. 安装依赖 3. 创建停车场组件 4. 集…

MAC IntelliJ IDEA搭建Doris Fe

目录 版本信息 安装环境依赖 拉取源码 下载 Doris 编译依赖 修改系统最大文件句柄数 编译 Doris 配置 Debug 环境 生成 FE 代码 FE模块代码导入 配置 Debug FE 启动 FE 报错问题 版本信息 本次安装的doris版本信息为doris-2.1.0-rc11 IntelliJ IDEA 配置jdk17、m…

数据之王国:解析Facebook的大数据应用

引言 作为全球最大的社交媒体平台之一,Facebook拥有庞大的用户群体和海量的数据资源。这些数据不仅包括用户的个人信息和社交行为,还涵盖了广告点击、浏览记录等多方面内容。Facebook通过巧妙地利用这些数据,构建了强大的大数据应用系统&…