3个版本 (稳定)
1.0.1 | 2020年8月23日 |
---|---|
1.0.0 | 2020年5月24日 |
0.1.0 | 2020年5月24日 |
#975 in 过程宏
6KB
102 行
ni-fpga-rs
使用此Rust接口与NI FPGAs交互!有关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宏支持。也支持枚举数组。将根据变体的数量选择以下类型之一:u8
、u16
、u32
或u64
作为后备类型。
#[derive(Enum)]
enum SPIDebugState {
Idle,
CheckWindow,
CheckAvailable,
SetFIFOMark,
EnableSPI,
StuffFIFO,
CheckMark,
ShuffleData,
Disable,
}
定点数值类型
有符号和无符号FXP类型在fxp
模块中实现。这两种类型都接受两个泛型参数:字长度和整数长度。字长度是该类型实际使用的位数。整数长度是如此,即该类型的最大值是2integer length - 1(如果它是有符号的,则是半数)且该类型的分辨率是2integer length - word length。例如,如果无符号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(())
}
贡献
欢迎并感谢贡献。查看开放问题以找到要工作的任务。我们特别需要以下方面的帮助
- 创建自动测试策略
- 改进文档
- 支持中断请求(IRQs)和先进先出队列(FIFOs)(参见NI API 参考文档)
依赖关系
~1.5MB
~35K SLoC