日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

异步fifo_FPGA设计基础——FIFO的应用

發布時間:2024/1/23 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 异步fifo_FPGA设计基础——FIFO的应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

說明:這里主要總結FIFO應用相關的問題,FIFO的設計原理有很多資料描述,這里不再說明。


FIFO和RAM可以說是一對孿生兄弟(RAM的應用),FIFO的應用和RAM的應用有很多相似的地方。這里重點介紹下FIFO和RAM不一樣的地方,以及在工程使用中的一些問題。

1、什么是FIFO

顧名思義,先進先出。它不可以隨機訪問,這個特性和RAM最大的區別,也決定了他們使用場景的不同。

2、FIFO特性

FIFO從邏輯上講,就是RAM和控制邏輯組成(同步FIFO和異步FIFO的設計也是一個比較經典的問題,這里不展開),所以這也就決定了FIFO的特性和前面提到的RAM的特性有很多相似的地方。這里主要簡單說下不同點:

(1)、FIFO分類

從使用的RAM的資源類型來講,和RAM是一樣的。即FIFO中的緩存可以是DRAM、BRAM或者URAM。

從端口開來講,FIFO沒有分類,因為是固定的2個端口,寫端口和讀端口。

從讀寫端口時鐘是否同源分為同步FIFO和異步FIFO,本文所描述的內容對同步FIFO和異步FIFO都適用。

(2)、接口時序

和RAM的時序類似,少了讀寫地址信號,多了一個空信號和滿信號。

其他比如大小配置、工作頻率等特性上和RAM都是一致的。

3、FIFO的使用場景

在FPGA的設計中,很多時候是即可以使用RAM,又可以使用FIFO,就個人習慣而言,作者更加喜歡使用FIFO,原因就是一個,不用控制地址,尤其是xilinx的預讀FIFO,讀時序上使用起來更加方便。

(1)模塊緩存

在高性能的系統設計中,我們有一個基礎的原則就是“盡力而為”,即在本模塊中,在資源和復雜度沒有顯著增加的情況下,應該將本模塊的性能做的盡可能的高(對性能有特殊要求的除外),由于不同模塊之間的性能處理是有差異的,如何處理模塊之前的銜接呢?最簡單高效的方法就是用FIFO來隔離。如下圖所示:

模塊A的處理不需要考慮模塊B的性能,只需要看模塊B中的FIFO是否將滿,只要不滿,就可以不斷的向模塊B寫數據。這樣的好處是模塊A和模塊B只有一個信號耦合,即該FIFO的將滿(afull)信號。

該場景在ASIC設計中可能并不是這樣,考慮到面積,需要將緩存用到極致,而不是這樣的“浪費”。

(2)數據緩存

這也是一個很常用的場景,在模塊內部處理數據的過程中,當前后處理的性能不一致的時候,往往會用一個fifo做為前面處理數據的中間緩存,平衡前后的性能。其實和上面(1)的應用是類似的,只不過一個是用于模塊間,一個用于模塊內部。

(3)跨時鐘域

在不同時鐘域傳遞多bit數據的時候,最簡單可靠的方案就是采用異步FIFO。

4、FIFO使用的注意事項

(1)空滿信號的使用

FIFO的空滿信號一般有4個,滿(full)、將滿(afull)、空(empty)、將空(aempty)。但是在實際應用中最常用的是將滿和空。

為什么用將滿了?如應用場景3.1中描述的A模塊在FIFO沒有給出反壓的時候會一直發送數據,當遇到B模塊給出的反壓后,A應該停止傳輸數據。但是A模塊為了簡化設計,數據傳輸可能是基于“一段”數據來實現的。即A不能馬上停止發送數據,需要把當前這“一段”數據發送完后才停止發送數據,B模塊需要有空間把當前這一段數據接收完。所以B采用afull信號更合理,至于afull的水限是多少,則需要AB兩個模塊協商好。

為什么用空了?設計中把FIFO的數據讀完,一般也是2種方案,1、根據長度來讀,即有長度信息后,按照長度信息來讀取;2、非空就讀。遇到FIFO空就停下來。所以一般用空信號來保證FIFO中數據能被讀完。

(2)遇到空停止讀數據時多讀一拍問題

前面說的讀FIFO中數據采用“非空即讀”的方案時,遇到empty信號后,就停止讀FIFO,但是這樣會多讀一拍數據,產生溢出。如下圖所示:

在讀使能(ren)是時序邏輯產生的時候,遇到empty信號后停止后,會在紅色的位置多讀一拍。所以給FIFO真正的讀使能(fifo_ren)必須用組合邏輯產生,用ren & (~empty)來產生,消除最后多讀的一拍數據。

(3)將滿(afull)水限

該問題在前面提過了,這里再單獨說明。因為這個問題非常重要。遇到過太多因為將滿水位設置不合理導致FIFO寫溢出的案例。如何設置FIFO afull的水位,抓住一點就可以:給出afull信號后,前級模塊還需要寫多少數據、路上已經有多少數據。如下圖所示:

4個紅色的FIFO中存放的是數據長度,先將4個長度信息調度到黃色FIFO中,然后根據長度信息讀DDR,從DDR返回的數據發給4個不同的隊列。隊列和前面紅色FIFO是一一對應的。這樣的設計會存在一個問題,就是當有一個后繼隊列反壓(紫色信號),會阻塞其他隊列數據的發送。這個問題解決的方法有很多,這里說下不改變上述架構的情況下的最簡單的方案。

紫色的反壓信號可以在3個地方起作用。讀藍色數據FIFO、讀黃色命令FIFO、讀紅色命令FIFO。但是前2種方案都不能解決該問題。唯一的辦法就是反壓到紅色的FIFO中。這種方案的問題就是反壓后,在路上的數據比較復雜。一般情況下,紅色FIFO中命令對應的最長數據是已知的,這個時候,可以控制黃色FIFO的深度來控制在路上數據,即保證在路上數據全部寫入后繼FIFO后,也不會溢出即可。假如一個紅色命令對應的長度最大值為1Kbyte。我們控制黃色FIFO的深度為6,即同一個隊列數據在路上最多有6Kbyte數據還會繼續寫入后繼FIFO。后繼FIFO保證6kbyte以上的水位后,即可解決上面阻塞問題。

FIFO的應用是FPGA設計中的基石,應用的場景有很多,但是基本都在上述框架內,以上是一些工程經驗的總結,文章中有不對的地方,也歡迎留言一起交流討論。

總結

以上是生活随笔為你收集整理的异步fifo_FPGA设计基础——FIFO的应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。