RIFFA架构

本文详细描述了如何通过Channel和Riffa在FPGA中处理PCIe数据传输,涉及RX引擎、TX引擎的工作原理,以及用户侧如何通过库函数进行数据发送和接收,包括内核驱动、上行和下行传输的机制。特别强调了内核缓冲区的预先分配以优化性能。
摘要由CSDN通过智能技术生成

在这里插入图片描述
用户侧通过Channel和Riffa交联,Channel是被用来处理异步时钟域,其含有FIFO来接收发送数据。

RX引擎用来提取和多路分解收到的PCIe负载数据。TX引擎用来将负载数据格式化为PCIe包,并且提供对PCIe链路的多路复用访问。

pcie链路配置决定了数据总线宽度。这个宽度可以是32,64,128bit。Riffa对其都支持。但是不同的宽度在提取和格式化pcie数据时要求不同的逻辑。

在这里插入图片描述
上层应用调用用户库函数fpga_send,线程进入内核驱动并且获得了一块预分配的buffer来暂存用户数据。一旦获取了buffer,数据就会被复制到buffer中,以便Endpoint可以访问它。
对Endpoint配置空间的写入触发一个新的下行传输。写入包含len、offset、last参数,以及包含数据的buffer地址。
数据通过大量PCIe TLP包被从缓冲区读取到通道中。如果数据大小超过了单个buffer,driver会获取另一个buffer,将数据拷贝到新的buffer中。
为了提高传输性能,Endpoint只要认为它需要,就请求下一个buffer。这个流程持续直到所有数据被传输。
Endpoint释放最后一个buffer标志到驱动程序的传输结束。然后,驱动程序释放最后一个buffer并解锁用户线程。

在这里插入图片描述
Upstream transfer的主要不同在于,Endpoint Core 向内核buffer写入数据,由驱动将数据拷贝到用户提供的字节数组中。
此外,Upstream transfer的发起者是User core,而不是软件线程。这就意味着数据传输可以在上层应用调用fpga_recv之前开始。

内核缓冲区在系统启动时预先分配,以避免动态内存分配造成的延迟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值