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:
1、等待FIFO_A缓存够4KB,然后进行一次连续的传输
2、等待FIFO_B缓存够4KB,然后进行一次连续的传输

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

1、FIFO_B写使能控制:一级FIFO输出数据有效valid,且标示flag_3为高(下图标注)
2、FIFO_B计数器wrcnt_4k_2:依靠写使能计数,计数到128归0,此时标志信号flag_2拉高。
3、FIFO_B的读使能:flag_2拉高(已经缓存够4KB)且PCIe的ready信号使能,直到FIFO_B为空。
4、FIFO的计数标志位flag_2:写使能开始计数到128拉高,开启读使能计数到128拉低。
5、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万次)

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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM