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之前开始。

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

相关推荐
柒和远方4 分钟前
Phase 7.4 学习博客:为什么多 API 项目需要 Swagger / OpenAPI
前端·后端·架构
mONESY7 分钟前
AI Loop 自动化工程实践,放弃手工调 Prompt,循环才是标准答案!
架构
Kel16 分钟前
Pregel 为什么会成为LangGraph编排的心脏
人工智能·设计模式·架构
柒和远方18 分钟前
Phase 7.3 复盘:后台任务不只是“扔进队列”,还要能被看见
前端·后端·架构
杉氧26 分钟前
跨平台资源管理:一套代码如何搞定 Android、iOS 和 Web 的图片与多语言?
android·架构·android jetpack
RainCity28 分钟前
Java Swing 自定义组件库分享(十三)
java·笔记·后端
techdashen2 小时前
从网络栈继续往下:micro:bit、2.4GHz、调制方式,以及一个不太靠谱但很有趣的想法
网络·fpga开发
FPGA小徐2 小时前
FIR 数字滤波器 --verilog设计实现
fpga开发
zlinear数据采集卡2 小时前
从协议解析到波形实时显示:硬核拆解ZLinear采集卡上位机软件的开发架构
arm开发·单片机·嵌入式硬件·fpga开发·架构·开源
pcjiushizhu3 小时前
ModelSim 仿真时 Simulate 无反应或只显示 Loading 的解决方法:网卡问题排查
fpga开发