LabVIEW:以编程方式设置 FPGA I/O 变量(模板?)

LabVIEW: Programmatically setting FPGA I/O variables (templates?)

问题

有没有办法以编程方式设置我正在读取或写入的 FPGA 变量,以便我可以为我想要 运行 的每个对象概括我的主要模拟循环?除了读取和写入的 FPGA 变量不同,每个对象的仿真循环都是相同的。详情如下。

背景

我有一段代码使用 LabVIEW OOP 来定义一堆我想模拟的 东西。然后每个 thing 都有一个 update 方法,该方法 运行 在 RT 控制器的定时循环内,接受一组输入,并且 returns一组输出。其中一些输入来自 FPGA,一些输出在发送到硬件之前传回 FPGA 进行一些处理。

我的问题是我的代码中每个 东西 都有一个单独的模拟 VI,因为每个 从 FPGA 读取和返回不同的值事情。这是可维护性的痛苦,似乎需要更好的方法。问题如下图所示。重要的部分是 FPGA 输入和输出节点(每个 thing 都会改变),以及 update 方法的输入和输出簇(始终相同)。

有没有什么方法可以定义一个通用的主模拟 VI,然后以编程方式(可能使用存储在我的 things 中的属性)告诉它使用 FPGA 的哪些特定输入和输出?

如果是这样,那么我认为下一步显然是使主模拟循环成为我的对象的 public 方法,然后为我需要模拟的每个对象调用该方法。

谢谢!

这看起来像是一个 [对象映射] 问题,LabVIEW 对它的支持不是很好,但是可以解决。

我的代码将一个集群映射到另一个集群,假设控件类型相同,使用 2 列数组作为 "lookup."

简短的回答是否定的。不幸的是,一旦您使用 LabVIEW FPGA 进入硬件级别,事情就开始变得非常静态并依赖于硬编码的 IO 访问。这通常完全按照您介绍当前方法的方式进行处理。但是,您可以在此处使用一些小技巧来封装 IO 访问。

考虑一下,将图表上的 IO 节点定义为接口,并使用函数(或 VI 或方法,无论您喜欢哪个术语)将它们抽象出来。您可以使用动态 VI 调用或面向对象的方法来实现它。

您知道您的接口定义的数据类型是众所周知的,因为您正在从不会更改的集群中推送和拉取它们。

通过使用方法调用抽象出硬件 IO,您可以维护一个函数调用库,代表系统中每个 "thing" 的唯一硬件访问。这会将对硬件 IO 访问的更改封装在专用于该作业的一段代码中。

使用动态 VI 调用是丑陋的,但您可以使用 "things" 的属性来指示您需要为该事物的 IO 调用的确切函数的路径。

面向对象的方法可能会让您创建一个小的 class 层次结构,其中的根对象表示通用 IO 访问(可能什么都不做),子对象覆盖读取或写入的核心方法调用。此调用将获取您的 FPGA 参考并吐出每个硬件调用将 return 的变量(对于读取,反之亦然)。在底层,它负责准确决定要访问 FPGA 上的哪个 IO。示例如下:

请记住,这离功能还很远,我只是想让你看看图表的样子。该方法将帮助您进一步概括主循环,并允许您按照建议将其嵌入到 public 调用中。