#fpga #ni #interface #enums #type #interact #fxp

nightly ni-fpga

支持 FXP 的 NI FPGAs 的安全 Rust 接口

7 个版本 (稳定)

1.4.1 2021年3月5日
1.4.0 2020年8月23日
1.0.0 2020年5月24日
0.1.0 2020年5月24日

#4 in #ni

每月下载量 32

自定义许可证

57KB
1K SLoC

ni-fpga-rs

crates.io docs.rs CI

使用此 Rust 接口与 NI FPGAs 交互!有关 NI FPGA C 接口的更多信息,请参阅 NI 的文档

支持的类型

此接口支持读取和写入以下类型,包括单个和固定大小的数组

原始类型

  • bool
  • u8
  • u16
  • u32
  • u64
  • i8
  • i16
  • i32
  • i64
  • f32(用于 SGL 寄存器)
  • f64(用于 DBL 寄存器)

簇通过 derive 宏支持。簇的数组可能不支持。

#[derive(Cluster)]
struct PWMConfig {
    period: u16,
    min_high: u16,
}

枚举

枚举通过 derive 宏支持。枚举的数组也支持。根据变体的数量,将选择 u8u16u32u64 作为后备类型。

#[derive(Enum)]
enum SPIDebugState {
    Idle,
    CheckWindow,
    CheckAvailable,
    SetFIFOMark,
    EnableSPI,
    StuffFIFO,
    CheckMark,
    ShuffleData,
    Disable,
}

定点数值类型

有符号和无符号的 FXP 类型在 fxp 模块中实现。这两个类型都接受两个泛型参数:字长和整数长度。字长是该类型使用的实际位数。整数长度使得该类型的最大值是 2整数长度 - 1(如果是 signed,则为半数)且该类型的分辨率是 2整数长度 - 字长。例如,如果一个无符号 FXP 的字长为 8,整数长度为 7,则其最大值是 127,其分辨率是 0.5。

assert_eq!(
    SignedFXP::<8, 7>::from_float(-1.5)? + SignedFXP::<8, 7>::from_float(4.0)?,
    SignedFXP::<8, 7>::from_float(2.5)?,
);

定位寄存器偏移量

寄存器偏移量可以通过在 roboRIO 上检查 /boot/user.lvbitx 来找到。此文件也存在于 first-rust-competition/cross-images 图像中。

完整示例

use ni_fpga::Session;
use ni_fpga_macros::{Cluster, Enum};

#[derive(Cluster, Debug)]
struct PWMConfig {
    period: u16,
    min_high: u16,
}
#[derive(Cluster, Debug)]
struct AnalogTriggerOutput {
    in_hysteresis: bool,
    over_limit: bool,
    rising: bool,
    falling: bool,
}

#[derive(Enum, Debug)]
enum SPIDebugState {
    Idle,
    CheckWindow,
    CheckAvailable,
    SetFIFOMark,
    EnableSPI,
    StuffFIFO,
    CheckMark,
    ShuffleData,
    Disable,
}

fn main() -> Result<(), ni_fpga::Error> {
    let session = Session::open(
        "/boot/user.lvbitx",
        "264D0BA312FF00B741D4742415E1D470",
        "RIO0",
    )?;

    println!("Input voltage: {:?}", session.read::<u16>(99174)?);
    println!("{:#?}", session.read::<PWMConfig>(98536)?);
    println!("{:#?}", session.read::<[AnalogTriggerOutput; 8]>(98424)?);
    println!("{:#?}", session.read::<SPIDebugState>(99314)?);
    Ok(())
}

贡献

欢迎并感谢贡献。查看 开放问题 以找到要处理的任务。我们特别需要以下方面的帮助

  • 创建自动化测试策略
  • 改进文档
  • 添加对 IRQ 和 FIFO 的支持(请参阅 NI API 参考文档

依赖关系

~1–1.5MB
~37K SLoC