参考:
PCIE之RIFFA框架接口时序_riffa 框架-CSDN博客
一、概述
RIFFA是一个开源框架,用于实现简便的PCIE通信,使开发者只需要关注与数据相关的接口,不必花费大量时间用于TLP包的解析核封装。一个简单的结构框图如下:
二、接口时序
使用RIFFA框架开发只用关注用户侧的数据接口时序,RIFFA模块可以自己完成TLP封包解包。硬件接口如下图:
接口名称红色的为握手信号,黑色的为FIFO端口(RIFFA模块中用FIFO作为数据缓冲)。I/O的方向以USER LOGIC为起点,例如对于USER LOGIC,CHNL_RX_CLK为output,对于RIFFA则为input。具体的接口功能如下:
CHNL_RX_CLK:用户端(USER LOGIC)从RIFFA读数据的时钟(其实就是从FIFO中读);
CHNL_RX:高电平表明RIFFA中有数据到来,(上位机执行send的时候,PCIE设备接收数据时,当所有数据写入到riffa内部fifo后,CHNL_RX拉高;当从riffa rx fifo中把数据全部读走后,CHNL_RX拉低);
CHNL_RX_ACK:高电平表明可以接收来自RIFFA的数据(用于响应CHNL_RX,在读取前拉高至少一个时钟周期,最多拉高持续到本次读取完成);
CHNL_RX_LAST:高电平表明这是最后一个事务(最后一个TLP包);(类似于DDR3 APP接口的END,可能一直为1)
CHNL_RX_LEN[31:0]:数据长度,单位是DW(4字节)。意思就是LEN*4是数据的字节数(CHNL_RX拉高的同时CHNL_RX_LEN有效);
CHNL_RX_OFF[30:0]:四字节偏移,指示包头包尾不是整DW时的字节有效位;(用于过滤协议字一类的数据,比如指示以太网帧前八个前导码无效,从第九个开始存储)
CHNL_RX_DATA[DWIDTH-1:0]:数据;
CHNL_RX_DATA_VALID:数据有效标志;
CHNL_RX_DATA_REN:其实就是RIFFA中FIFO的读使能。当数据标志一般为CHNL_RX_DATA_VALID & CHNL_RX_DATA_REN;
CHNL_TX_CLK:用户端(USER LOGIC)向RIFFA写数据的时钟(其实就是FIFO写时钟);
CHNL_TX:高点平表明有数据要发送;
CHNL_TX_ACK:当有高脉冲来临时,才可以向RIFFA写入数据;
CHNL_TX_LAST:高电平表明这是最后一个事务(最后一个TLP包);
CHNL_TX_LEN[31:0]:数据长度,单位是4字节。意思就是LEN*4是数据的字节数;
CHNL_TX_OFF[30:0]:四字节偏移,指示包头包尾不是整DW时的字节有效位;
CHNL_TX_DATA[DWIDTH-1:0]:发送数据;
CHNL_TX_DATA_VALID:数据有效标志;
CHNL_TX_DATA_REN:高电平时USER LOGIC中的数据才被RIFFA读走;
PCIE组帧
PCIE协议下,一帧的最小控制单位是字节,通过首部和尾端有效控制字来实现;
而正常传输数据的最小单位是DW,也就是四个字节,当然,这里指的是事务层,数据链路层的DLLP包以及物理层的命令集都不以此为准;
总而言之,128位端口的RIFFA一次传输4个DW,而64位则是两个DW。
fpga_send 函数 此函数用于向 FPGA 设备的指定通道发送数据。它的参数如下: fpga_t *fpga:指向已打开的 FPGA 设备的指针。 int chnl:指定哪个通道用于发送数据。 void *data:指向要发送的数据的指针。 int len:指定 data 指针指向的数据数组中的字(word)数目,每个字为 4 字节。 int destoff:目标设备数据偏移量,指定在 FPGA 的内存中写数据的起始位置。 int last:一个标志,指示这是否为最后一批发送的数据。 long long timeout:超时时间(毫秒)。如果指定时间内没有完成发送操作,函数将返回。 函数的返回值为 int 类型,代表成功发送到 FPGA 的数据字数。
标签:Riffa,TX,RIFFA,组帧,RX,CHNL,PCIE,DATA,数据 From: https://www.cnblogs.com/VerweileDoch/p/18248018