FPGA的設計中,一個前級模塊A向下游模塊B發送數據,如下圖所示,當下游模塊B不能及時處理數據時,希望前級模塊A停止發送數據,這個時候模塊B會通過一個反壓信號給到模塊A,告訴模塊A,不要再給我發數據了。這就是一種最常見,也是用得最普遍的一種發壓場景。
那究竟要如何設計反壓呢?看似簡單,其實也不簡單,處理不好的話對系統的穩定性和性能會帶來一定的影響。本文介紹幾種常見的反壓方式,并給出他們的一些優缺點。
立即反壓
所謂立即反壓,就是指下游模塊給出反壓后,前級模塊立即停止發包,如下圖所示:
一共有7個數據,但是真正能被下游模塊接收的數據只有6個,其中數據E在發送的時候因為ready無效,所以不能被接收。如果對axi_stream接口比較了解的話,可以看出,這就是axi_stream接口,只有在valid和ready同時有效的時候的數據才能被接收。
它的優點就是能立即反壓,尤其是下游模塊沒有緩存的時候。另外就是這種接口是標準接口,和外部模塊對接的時候不會有歧義。缺點就是因為需要立即反壓,組合邏輯處理比較簡單,如果用時序邏輯,控制起來不是很方便。
將滿反壓
如果下游接收模塊有緩存,一般是fifo或者ram。當緩存快要滿的時候,會給前級模塊反壓,這就是將滿反壓。如下圖所示:
這種反壓的特點就是下游模塊給出反壓信號后,前級模塊還可以繼續寫入一些數據,一般不超過5拍。上圖中,雖然afull = 1了,但是前級模塊還會繼續寫入2個數據,數據F和數據G。同時下游模塊也要控制好緩存的水限,在給出反壓信號后還要預留一定的緩存空間,具體多少,需要和前級模塊配合好,筆者的經驗,一般預留8個以上。
如下圖所示緩存的深度為128,當數據寫滿100以后給出反壓,此時緩存還可以寫入28個數據,該緩存的水限就為100。
這種將滿反壓的優點就是處理非常方便,只要下游模塊不反壓,就可以不停地寫入數據,控制非常方便,另外下游模塊緩存的深度和前級模塊無關,一般用于項目內部模塊之間。至于缺點,如果一定要找一個缺點,那就是下游模塊必須有緩存,而立即反壓可以不需要。
另外,對于緩存,到底是用ram還是用fifo,應該根據場景來確定,通常情況下用fifo可以滿足大部分的應用場景。
整包反壓
上述將滿反壓,如果反壓頻繁的話,會給前級模塊的處理帶來一點點的復雜度,為了簡化這種反壓帶來的影響,還有一種叫整包反壓。和將滿反壓相比,就是下游模塊給出反壓信號后,前級模塊會把當前的數據報文全部發送給下游模塊,如下圖所示:
當數據在傳輸的過程中,如果下游模塊給出反壓使得afull = 1,前級模塊會繼續發送報文,直到報文的eop為止。這種場景下,首先需要約定報文的最大長度,假定為MAX_LEN,那么對下游的緩存就會有要求,其容量至少為MAX_LEN,考慮到流水性能,其容量要為2*MAX_LEN,同時水限的設置要保證反壓后的空間至少能存放一個報文。
這種方案的優點是控制簡單,只要開始發送的時候不反壓,就可以把當前的報文全部發送完。缺點就是當約定的MAX_LEN比較大時,需要較多的緩存開銷。
小結
反壓是FPGA設計中的一個最基本且重要的話題,在實際應用中,模塊與模塊之間的反壓要做好“逐級反壓”,當反壓點與緩存較遠的時候,尤其要考慮在途的數據,反壓后的空間要能緩存住在途數據。除了上述的幾種方案外,請求應答接口某種意義上也是一種反壓的設計,只是性能較低罷了,一般不建議采用。
-
FPGA
+關注
關注
1629文章
21729瀏覽量
603017 -
模塊
+關注
關注
7文章
2695瀏覽量
47433 -
FPGA設計
+關注
關注
9文章
428瀏覽量
26512
發布評論請先 登錄
相關推薦
評論