#ni-fpga #interface #applications #access #lab-view #set

ni-fpga-interface

提供从 Rust 访问 NI FPGA 应用的能力

1 个不稳定版本

0.1.0 2023年10月23日

#1072硬件支持

MIT 许可证

64KB
909

ni-fpga-interface

为 Rust 提供的 NI FPGA 接口

此 crate 旨在简化与 LabVIEW FPGA 的通信。

要求

  • C 接口需要以没有空格的“前缀”导出,我们期望有一个包含 NiFpga C 和 H 文件的单一目录。

入门

  1. 使用可从 https://www.ni.com/en/support/downloads/drivers/download.fpga-interface-c-api.html#477242 下载的生成器生成 FPGA C 接口
  2. ni-fpga-interface-build crate 作为构建依赖项添加,并将 ni-fpga-interface 作为正常依赖项添加。
  3. 为您的项目创建一个构建脚本,并将构建器添加到脚本中。例如
        fn main() {
        let mut fpga_c_interface = ni_fpga_interface_build::FpgaCInterface::from_custom_header(
            "../fpga_c_interface/NiFpga_Main.h",
        );
        fpga_c_interface.build();
    }
    
  4. 将生成的 Rust 模块包含在您的应用程序中的一个模块中。
    mod fpga_defs {
        include!(concat!(env!("OUT_DIR"), "/NiFpga_Main.rs"));
    }
    
  5. 使用 ni-fpga-interface API 访问 FPGA。

示例

查看示例文件夹,其中包含一些完整的示例,包括构建支持。

支持的功能

以下是支持的和计划中的功能。

原生类型是标准的整数类型以及单精度和双精度浮点数。

功能 支持
原生类型的寄存器
FXP 数字寄存器 计划中
集群寄存器 待定
原生类型的 DMA
DMA FIFO 控制
中断请求 (IRQ)
会话控制
多线程
多 FPGA 支持的模式 计划中
多 FPGA 支持的动态接口 计划中

架构

此方法的原理是尽可能使用生成的 C 代码,而不是预先针对预期的接口构建。

这应该使我们尽可能版本独立,并减少 NI 在生成的 C 代码中已解决的问题的复杂性。

这可能需要时间,但将通过 3 层抽象构建

  1. NI 生成的 C 调用。
  2. Rust 中的 C 调用的安全包装。
  3. 为提供的特定 FPGA 位文件/接口生成的 Rust 接口。
flowchart 
subgraph LabVIEW
C[FPGA C Interface]
LV[LabVIEW FPGA] --generates--> C
end
subgraph Build Support
C --bindgen--> Types[FPGA Definitions]
C --cc--> Obj[Compiled NI FPGA Interface]
end
Obj --links--> Wrapper[Safe Generic Wrapper]
Types --mod import--> Direct[Your Code with Direct interface]
Wrapper --mod import--> Direct
Types --generator--> Specific[FPGA Interface Module]
Wrapper --generator--> Specific
Specific --> App[Your Code Using Custom Interface]

此图显示了关键组件和目标工作流程。名称可能会更改。

本项目的关键组件有3个

  1. 构建支持,以便轻松将FPGA生成的C接口集成到您的Rust项目中。
  2. 安全包装,让您无需直接调用不安全函数。
  3. FPGA接口生成器,它将在Rust中生成一个结构体,提供对特定FPGA接口的轻松访问。

自定义类型支持

我们需要支持固定点和集群,这些在C中以自定义类型的形式出现。

这需要生成一些代码作为构建支持的一部分,以便为这些类型启用安全包装。

交叉编译

交叉编译应被视为首要考虑事项,以确保轻松针对compactRIO目标使用。

我已经测试了针对x64和armv7 LinuxRT目标的示例构建。

计划方法

  1. 解决构建支持问题。
  2. 让标准类型的安全包装工作。
  3. 让自定义类型的安全包装工作。
  4. 解决单个位文件的API生成问题。
  5. 看看是否有合理的方法来抽象多个位文件之间的接口(类似于LabVIEW中的动态接口)

我打算将其作为一个单独的crate开始,但后来可能需要将其拆分。

依赖项

~46KB