RIFFA架构

用户侧通过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之前开始。

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

相关推荐
吃饺子不吃馅7 分钟前
【开源】create-web-app:多引擎可插拔的前端脚手架
前端·javascript·架构
贝塔实验室9 分钟前
Altium Designer 6.0 初学教程-如何生成一个集成库并且实现对库的管理
linux·服务器·前端·fpga开发·硬件架构·基带工程·pcb工艺
d111111111d28 分钟前
关于STM32的选项字节的问题:如果我通过操作指针把数据写在了单片机的选项字节区域那么换别的程序时候数据会进行变化吗?
笔记·stm32·单片机·嵌入式硬件·学习
ouliten1 小时前
C++笔记:std::stringbuf
开发语言·c++·笔记
mudtools1 小时前
使用.NET 8+ 与飞书API构建组织架构同步服务
架构·.net·飞书
安如衫2 小时前
【机器学习基础】Attention in Transformers:注意力机制
笔记·深度学习·学习·机器学习·注意力机制
努力搬砖的咸鱼3 小时前
微服务到底是什么
微服务·云原生·架构
十安_数学好题速析3 小时前
幂次之争:巧用对称性破解指数不等式
笔记·学习·高考
せいしゅん青春之我3 小时前
【JavaEE进阶】JVM-面试中的高频考点1
java·网络·jvm·笔记·面试·java-ee
一起养小猫4 小时前
《枕边算法书》阅读笔记:一场从热爱到实践的算法启蒙之旅
笔记