1 个不稳定版本
0.3.0 | 2023年11月16日 |
---|---|
0.2.0 |
|
0.1.7 |
|
0.1.6 |
|
#9 in #ni-fpga
53 每月下载量
在 nifpga-dll 中使用
7KB
nifpga-dll-rs,
非官方的NiFpga.dll
绑定。
nifpga-dll-rs
是一个Rust语言的非官方库,用于与DLL库NiFpga.dll
提供的API进行接口交互。此库允许例如打开FPGA会话、读取/设置寄存器、从FIFO中读取/写入数据等。
nifpga-dll-rs
由三个crate组成:nifpga-dll
、nifpga-dll-sys
、nifpga-dll-type-macro
。
免责声明:nifpga-dll-rs
不是官方NI接口。此库是独立自主的开发,与NI无关联。要使用nifpga-dll-rs
,请确保您的系统已安装NI提供的DLL库NiFpga.dll
。
nifpga-dll-rs
项目在MIT许可证下分发。它是一个衍生作品,其中包含了以下两个项目的代码
nifpga-rs
https://github.com/DBTaylor/nifpga-rs 作者 David Taylor 在crates.io上以MIT许可证发布,并且ni-fpga-rs
https://github.com/first-rust-competition/ni-fpga-rs 作者 Connor Worley 在crates.io上以MIT许可证提供。
如果您想用您的项目替换此Rust crate或想成为维护者,我们非常欢迎!请随时联系我们,有任何疑问或请求。
常见问题解答
我在哪里可以找到我的FPGA位文件的签名
?
NI FPGA 的 .lvbitx
文件是 XML 文本文件。您需要打开 FPGA 会话的签名可以在 .lvbitx
文件中通过搜索 <SignatureRegister>
来找到。
在哪里可以找到寄存器和 FIFO 的地址?
NI FPGA 的 .lvbitx
文件是 XML 文本文件。在那里您可以找到位文件中所有对象的地址。
使用示例
extern crate nifpga_dll;
use nifpga::{NifpgaError, Session};
fn main() -> Result<(), NifpgaError>{
//open the session
//it will be closed when it goes out of scope
let session = Session::open(
"/home/admin/fpga.lvbitx",
"0DA1668CDC2C6C492F1437AE6DC2151E",//signature search <SignatureRegister> in the .lvbitx
"RIO0",
true, //run on open
true //reset on close
)?;
//reserve an IRQ context and wait on IRQ 0
//the context will be unreserved when it goes out of scope
session.reserve_irq_context()?.wait_on_irqs(1, 1000)?;
//acknowledge IRQ 0
session.acknowledge_irqs(1)?;
//open a target-to-host FIFO
//this configures the FIFO and starts it
//it will be stopped when it goes out of scope
let (reader, _) = session.open_read_fifo::<f32>(0, 100)?;
//open a host-to-target FIFO
let (writer, _) = session.open_write_fifo::<f32>(1, 100)?;
//write 2 values to the FIFO
writer.write(&[5.0, 5.0], 1000)?;
// unsafe{
// //acquire 4 elements in the host write buffer
// //these elements will not be sent to the target until they go out of scope
// //this method is unsafe because elements must be dropped in the order they are acquired
// let( elements, _, _) = writer.acquire_elements(4, 1000)?;
// elements.slice.iter_mut().for_each(|el| {*el = 1.0});
// }
//read 3 elements from the FIFO
let mut read_buff = [0.0; 3];
reader.read(&mut read_buff, 1000)?;
println!("{:?}", read_buff);
// unsafe{
// //acquire 3 elements in the host read buffer
// //this section of the buffer will not be available for the FIFO until these elements are dropped
// //this method is unsafe because elements must be dropped in the order they are acquired
// let(elements, _, _) = reader.acquire_elements(3, 1000)?;
// println!("{:?}", elements.slice)
// }
//write to control x18004
session.write::<f32>(0x18004, 5.0)?;
//read from indicator x1800C
println!("{:?}", session.read::<f32>(0x1800C)?);
//write contents of array to control x18000
let array = [5.0, 5.0];
session.write_array::<f32>(0x18000, &array)?;
//read indicator 0x18008 into array
let mut array = [0.0; 2];
session.read_array::<f32>(0x18008, &mut array)?;
println!("{:?}", array);
Ok(())
}
依赖项
~1.5MB
~34K SLoC