#ni-fpga #dll #binding #interface #session #fifo #api

nifpga-dll

对 NiFpga.dll 的非官方绑定

1 个不稳定版本

0.3.0 2023年11月16日
0.2.0 2023年9月20日
0.1.7 2023年9月20日
0.1.6 2023年6月23日

#2 in #ni-fpga

每月 35 次下载

MIT 许可证

61KB
1K SLoC

nifpga-dll-rs,

NiFpga.dll 的非官方绑定。

nifpga-dll-rs 是一个为 Rust 设计的非官方库,用于与 DLL 库 NiFpga.dll 提供的 API 进行接口。此库允许例如打开 FPGA 会话、读取/设置寄存器和从/向 FIFO 读取/写入数据。

nifpga-dll-rs 由三个 crate 组成:nifpga-dllnifpga-dll-sysnifpga-dll-type-macro

免责声明:nifpga-dll-rs 不是官方 NI 接口。此库是独立和自主的开发,与 NI 无关。要使用 nifpga-dll-rs,请确保您的系统上已安装 NI 提供的 DLL 库 NiFpga.dll

nifpga-dll-rs 项目在 MIT 许可证下分发。它是一个包含以下两个项目的代码的派生作品


如果您想用您自己的项目替换此 Rust crate 或如果您想成为维护者,我们非常欢迎!请随时联系我们,以获取任何咨询或请求。


常见问题解答 (FAQ)

我在哪里可以找到我的 FPGA 位文件的 signature

NI FPGA 的 .lvbitx 文件是 XML 文本文件。您可以通过在 .lvbitx 文件中搜索 <SignatureRegister> 来找到打开 FPGA 会话所需的 signature

我在哪里可以找到寄存器和 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
~36K SLoC