[NI技术]LabVIEWFPGA代码模块设计
[NI 技术] LabVIEW FPGA 代码模块设计 概览 对于利用 LabVIEW FPGA 实现 RIO 目标平台上的定制硬件的工程师与开发人员,他们可以很容易地利用 所推荐的组件设计构建适合其应用的、可复用且可扩展的代码模块。基于已经验证的设计进行代码模块开 发,将使现有 IP 在未来应用中得到更好的复用,也可以使在不同开发人员和内部组织之间进行共享和交换 的代码更好服用。 目录 1. 代码模块 2. 可复用代码——知识产权 3. I/O 与资源的独立性 4. 定时独立性 5. 框图独立性 6. 文档、测试与范例 7. 总结 1. 代码模块 任一项软件开发工作均包括函数、子例程、对象和代码模块,以及其他较大架构的基础构建模块的开发。 当设计一个应用时,各个函数与操作均被识别和实现。然后,这些构建模块被组合与集成以形成更大的应 用。通过长期开发不同应用的过程,一个开发小组或团队将创建表示常见操作的代码模块库,并对其进行 复用以更快速地构建未来的应用。开发这样的代码库目的是通过一次构建和测试函数并多次复用它,减少 开发的总工作量。模块化设计,除了促进现有代码的复用外,还提高了代码的可测试性与可维护性,从而 允许开发人员和设计人员关注于应用相关的特性和代码段。 每种编程语言以及某些情况下的编程环境都有一个优选的代码模块设计模型,以便改进代码模块的实现与 集成。该优选设计可以因具体的开发人员而异,但通常一个开发组会根据共同的需要和考虑确定一组共享 的设计准则。作为一种编程语言,LabVIEW 自身拥有一组供世界各地的程序人员开发子 VI 使用的指导方 针, 以便子 VI 可以容易理解、 而且运用于不同应用并由不同开发人员维护。 LabVIEW FPGA, 作为 LabVIEW 的一个子集,拥有其自身的一组用于利用 FPGA 特定行为构建代码模块(子 VI)的指导方针,以便它们可 以有效运用于广泛的基于 FPGA 的应用。 2. 可复用代码——知识产权 FPGA 平台上的可复用代码模块通常称为 IP(知识产权)核——从传统芯片设计长时间演化来的名称。在 LabVIEW FPGA中, 这样的IP核由常用于LabVIEW 编程和LabVIEW 工具集的子VI组成。 LabVIEW FPGA 中的子 VI 支持我们一次实现不同的函数与操作,优化 FPGA 上的实现,然后将其运用至不同的应用。为 使这样的子 VI 可以与不同的重叠需求和架构方便地协同使用,我们需要遵循某些基本指导方针,以确保子 VI 广泛可用,而不是专为一项特定应用而优化。 为进一步促进和改善 LabVIEW FPGA IP 的复用,代码模块应当除子 VI 源码以外还包括一些组件。这些组 件包括文档、测试代码和使用 IP 的基本范例。 在 LabVIEW FPGA 应用中,IP 代码模块典型地用于一些操作的执行,如通信协议(如 SPI、I2C 等)的编 码与解码、数字信号处理、滤波、控制算法的实现、传感器信号(如 PWM、积分信号)的编码/解码和基 准标定等。 开发 LabVIEW FPGA IP 的最基本指导方针便是,开发不仅独立于其主应用、而且对其主应用不产生影响 或不会有显著要求的代码模块。 IP 代码模块与其主应用间的唯一需求或依赖性应当是子 VI 连接面板的接口。 该文档将阐述如何在 LabVIEW FPGA IP 中创建这样的调用独立的 IP 子 VI,并展示一些相关范例。 3. I/O 与资源的独立性 为使 LabVIEW FPGA IP 便于应用于不同的应用, 它应当独立于任何输入/输出通道 (I/O) 或其他硬件资源, 如 FPGA 块存储器。根据具体的应用,最终应用可以使用不同的 RIO 板卡或其他 FPGA 目标平台。因此, IP 代码模块不应根据一个特定类型的 I/O 资源进行编程。 将 IP 模块集成至最终应用的编程人员或开发人员 将选择使用某个特定的 I/O 资源。来自 I/O 资源数据与值,应当以参数的方式传递给 IP 模块,或从 IP 模块 返回。 例如对于一个 PWM 输出 IP 模块,应用开发人员将为 PWM 输出信号选用某条数字输出线。在此例中,该 PWM IP 模块应当产生并输出信号的当前状态。开发人员将把在更高层次VI 中赋值给 I/O 资源。该 I/O 资 源未嵌入在 IP 代码模块的框图中。 图 1:一个调用 PWM 输出 IP 代码模块(子 VI)的应用 VI 的框图 同样的指导方针应用于任意输入信号。例如,假设您在使用一个由数字滤波器设计工具包创建的模拟滤波 器 IP 子 VI,模拟数值应当自该滤波器子 VI 外部采集,然后传递给 IP 代码模块。 图 2:使用一个模拟滤波器 IP 子 VI(直接 FIR)。模拟数值在主 VI 采集并传递给滤波器 IP。 独立于 I/O 资源的 IP 代码模块的开发,使其使用更为方便和灵活,并支持将其多次集成到一项应用,而不 必定制该 IP 代码模块的每个实例。 块存储 除了 I/O 通道外,其他可能为 LabVIEW FPGA IP 使用的资源便是块(用户)存储器。LabVIEW FPGA 支 持开发人员利用多个不同的函数访问 FPGA 上的块存储器,其中包括存储器读/写、FIFO、查询表及其他 函数。这些函数中的大多数均在块存储中创建了一个唯一的地址空间,以避免发生IP 与该应用其他 IP 间 的存储器冲突。 然而,LabVIEW FPGA 8.0 存储器读函数和存储器写函数,对于其在作为当前 FPGA 功能特性一部分的任 一 VI 中使用的所有实例,均使用了一个 16 kB 共有地址空间,这个共有地址空间被当前 FPGA 功能中任 一 VI 的函数实例所使用。使用这些函数可能会与该应用其他部分使用的存储器产生冲突,因此不应当使用 这些函数。 如果需要在利用 LabVIEW FPGA 8.0 (或者更早版本) 开发的 IP 代码模块中支持随机存储访问, 您应当使用利用LabVIEW 存储器扩展应用程序创建的一个存储器模块。 在 LabVIEW FPGA 8.20 中,每个存储器读函数和存储器写函数引用一个特定的存储块(地址空间),典 型情况下,它在 LabVIEW 项目中作为一项资源被创建。由于这些存储块在项目中被定义,因此,如果您 将一个 IP 代码模块 VI 加载至一项新应用,它们不会自动转递给新的项目。为此,您可以在 VI 中定义一个 存储块作为 VI-Scoped 存储配置, 而不是 LabVIEW 项目。 这一 VI-Scoped 存储块可以在IP中创建并使用; 对于任一使用该 IP 的新应用,它将被自动创建。 图 3:使用 LabVIEW FPGA 8.20 VI scoped 指定存储块 相似地,使用块存储器来缓存数据的 LabVIEW FPGA FIFO 函数,是基于一个在 LabVIEW 项目中创建的 FIFO 资源。在 LabVIEW FPGA 8.0 中,如果您决定使用一个 IP 代码模块中的 FIFO,该 IP 的用户需要在 应用项目中手动创建相关的 FIFO资源。 为免除对IP代码模块用户的这一额外需求, 我们建议对