#ni-fpga #datatype #interface #helper #macro

nifpga-type-macro

nifpga数据类型的辅助宏

2个版本

0.1.1 2020年6月1日
0.1.0 2020年5月29日

#10 in #ni-fpga


用于 nifpga

MIT 许可证

3KB

nifpga-rs

通过C API连接到NI FPGAs的接口

在crates.io上

用法

在Cargol.toml中:nifpga = "0.1.2"

使用此库的任何项目都必须链接NiFpga.c

此库提供的API使用控制地址和FIFO编号。要创建针对您的FPGA的特定API,请使用nifpga-apigen

示例项目可以在这里找到:https://github.com/dbtaylor/rio-rs-ex

extern crate nifpga;

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 from generated header
        "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
~35K SLoC