XDMA出现C2H丢数并解决

在XDMA开发过程当中,发现数据回传丢失问题:缓存


将数据经过H2C发送至DDR4缓存,发送完毕接收last信号后,等待上位机发送指令(读/写/处理?)该指令经过AXI_lite接口处理。框架

当接收回传数据指令后,数据量小的时候,未出现丢数,当数据量大的时候,通过屡次循环测试,开始丢,且位置固定(指的是同组数据)异步

当时提出的解决办法是:测试

C2H的4KB对齐方式传输优化

目的:回传4KB对齐方式
框架:
设计

 

 


设计思想:
DDR4数据到PCIe接口为二级缓存。
等待缓存够4KB进行一次发送。
设计采用了双FIFO,使用一种类乒乓操做。
详细:
一级缓存FIFO,深度8192,半满4096,进16B,出 32B,异步双口。
二级FIFO设计深度为128,宽度32B,同步FIFO,异步复位。
当数据从DDR4搬运至一级FIFO:跨时钟域,
当数据从一级FIFO搬运至二级FIFO:
一、等待FIFO_A缓存够4KB,而后进行一次连续的传输
二、等待FIFO_B缓存够4KB,而后进行一次连续的传输blog

二级缓存:
FIFO_A与FIFO_B切换控制:
一、FIFO_A写使能控制:一级FIFO输出数据有效valid,且标示flag_3为低(下图标注)
二、FIFO_A计数器wrcnt_4k_1:依靠写使能计数,计数到128归0,此时标志信号flag_1拉高。
三、FIFO_A的读使能:flag_1拉高(已经缓存够4KB)且PCIe的ready信号使能,直到FIFO_A为空。
四、FIFO的计数标志位flag_1:写使能开始计数到128拉高,开启读使能计数到128拉低。
五、FIFO_A与FIFO_B写切换标志位flag_3:wrcnt_4k_1计数至128时拉高,wrcnt_4k_2计数至128时拉低。

一、FIFO_B写使能控制:一级FIFO输出数据有效valid,且标示flag_3为高(下图标注)
二、FIFO_B计数器wrcnt_4k_2:依靠写使能计数,计数到128归0,此时标志信号flag_2拉高。
三、FIFO_B的读使能:flag_2拉高(已经缓存够4KB)且PCIe的ready信号使能,直到FIFO_B为空。
四、FIFO的计数标志位flag_2:写使能开始计数到128拉高,开启读使能计数到128拉低。
五、FIFO_A与FIFO_B写切换标志位flag_3:wrcnt_4k_1计数至128时拉高,wrcnt_4k_2计数至128时拉低。
时序图:
接口

 

 

 

 


附加流控:
暂时来看,DDR4的读速度(1片DDR4)低于PCIe发送(256bit),后期若DDR4的速度高于PCIe侧,则须要增长内部流控

一级FIFO流控:
当fifo_1_busy于fifo_2_busy频繁拉高时,触发一级FIFO半满时,bus_busy拉高。
该信号拉高后,反馈于DDR4的TOP层,使得DDR4不在发送数据。

二级流控:
FIFO_A的fifo_1_busy信号:
定义:当FIFO_B缓存结束,FIFO_A仍未读结束,断定FIFO_A为忙状态,fifo_1_busy拉高
fifo_1_busy:拉高中止写操做,并反馈于一级缓存FIFO

FIFO_B的fifo_2_busy信号:
定义:当FIFO_B缓存结束,FIFO_B仍未读结束,断定FIFO_B为忙状态,fifo_2_busy拉高
fifo_2_busy:拉高中止写操做,并反馈于一级缓存FIFO开发

仿真测试:
同步

 

 


实际测试:

 

 

 

重发机制:
若上位机抓取失败,则FPGA执行重发机制。

抓取失败,经过指令寄存器,发出响应指令。FPGA接收到指令后,对数据进行从新发送。

 

通过乒乓缓存4k对齐后,在时序优化的加持下,未出现丢数状况,(通过循环测试78万次)

且重发机制未触发,问题获得解决

相关文章
相关标签/搜索