對話FPGA(5).FIFO不簡單

FIFO這件事情,可以看我之前的一個知乎上的答案:

AK23:碩士生找工作的時候把非同步fifo寫成一個項目經歷,是不是顯得很low啊?

根據之前的原則,FIFO這件事情啊,如果能用IP先別自己手寫。可以通過FPGA廠家的的IP生成工具生成相應的FIFO。

FIFO的具體實現我就不說了,什麼非空非滿什麼的大家應該都清楚啊。

說點別的,首先是格雷碼,格雷碼應用於非同步FIFO的地址操作,格雷碼的生成可以當做個入門練手的小模塊,挺不錯的,比寫什麼跑馬燈有趣多了,以此慢慢搭一個非同步FIFO,把關於FPGA的時鐘、複位、管教基本上都可以涉及到,絕對有幫助。

所以我建議專家們再寫這種FPGA入門書籍,就講非同步FIFO,內容能說很多,而且覆蓋面還真挺廣的,實現階段,還可以看這種跨時鐘布線工具報的警告,基本上需要的概念都能cover掉了。

FIFO滿防溢出的問題也被討論的挺多了,加個可編程滿作為保護時應有之意。有次逛論壇的時候,看到一篇外國大牛的帖子,專門是個教授寫的論文,提供了幾個新方法,這論文找不到了,有空找到,給大家補上來,當時就覺得,一個這麼普通的小模塊,還能研究這麼深,沒誰了。怪我當時沒保存,怪我。

空信號就沒必要搞什麼即將空,一般注意讀使能需要跟非空信號做個與運算,這是基本操作。

我曾經說過,參加工作的第一階段搞介面,介面數據傳輸時需要FIFO緩存,某些介面會封裝成幀,進行傳輸,當時的設計也是參考了一些大牛。

用兩個FIFO緩存,一個FIFO專門存數據,一個FIFO專門存幀信息,每次數據FIFO存滿夠一幀只有,幀FIFO存一條幀信息,這樣通過判斷幀FIFO來決定數據FIFO是不是空滿的,使整個設計簡單多了。

FIFO的調用需要ram,大FIFO是不可避免要用到FPGA內部的BlockRam資源的,用幾個就成了小夥伴經常要琢磨的問題。怎麼說的,看datasheet啊!

這是xinlinx 7系列的存儲資源說明,一個7系列的blockRam,可以當兩個獨立的18k Ram來使用,最大位寬是36;如果當36k Ram來用的話,最大位寬是72。

最近的一個 項目裡面,做了一個深度為1024,位寬為80的fifo,布線後顯示用了2.5個BlockRam,1024*72用了兩個BlockRam,剩下的8*1024用了半個(也就是18k)的BlockRam,加起來2.5個。

也就是說,如果你想生成一個位寬為80,深度為256的FIFO,就需要三塊18k-Ram,可不是簡單的位寬乘以深度,與ram大小作比較的算術運算,這一點一定要注意。

FIFO的功能是緩存,緩存之後,可以串並轉化,可以匹配後級帶寬,可以存儲地址指針,控制更大的數據緩存。

其應用場景的廣泛,需要大家熟悉它,用好它,FIFO真不簡單。


推薦閱讀:

從IBM人工神經元說起--相變材料與MEMS
十年間ASIC/SoC設計技術的變化
Phase-Locked Loops 的思考(二)
集成電路基礎:ESD雜談
做射頻ic 是否需要模擬ic 的基礎?

TAG:现场可编辑逻辑门阵列FPGA | 芯片集成电路 | 微电子 |