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萬次)

且重發機制未觸發,問題獲得解決

相關文章
相關標籤/搜索