本文首先對(duì)異步 FIFO 設(shè)計(jì)的重點(diǎn)難點(diǎn)進(jìn)行分析
最后給出詳細(xì)代碼
一、FIFO簡單講解
FIFO的本質(zhì)是RAM, 先進(jìn)先出
重要參數(shù):fifo深度(簡單來說就是需要存多少個(gè)數(shù)據(jù))
fifo位寬(每個(gè)數(shù)據(jù)的位寬)
FIFO有同步和異步兩種,同步即讀寫時(shí)鐘相同,異步即讀寫時(shí)鐘不相同
同步FIFO用的少,可以作為數(shù)據(jù)緩存
異步FIFO可以解決跨時(shí)鐘域的問題,在應(yīng)用時(shí)需根據(jù)實(shí)際情況考慮好fifo深度即可
本次要設(shè)計(jì)一個(gè)異步FIFO,深度為8,位寬也是8.
代碼是學(xué)習(xí)Simulation and Synthesis Techniques for Asynchronous FIFO Design Clifford E. Cummings, Sunburst Design, Inc.這篇文章的,
百度搜搜很容易找到,雖然是英文的但是寫的確實(shí)值得研究。
下面我會(huì)對(duì)設(shè)計(jì)的要點(diǎn)進(jìn)行分析,也是對(duì)自己學(xué)習(xí)過程的一個(gè)總結(jié),希望能和大家交流共同進(jìn)步。
二、設(shè)計(jì)要點(diǎn)解析
1、讀空信號(hào)如何產(chǎn)生?寫滿信號(hào)如何產(chǎn)生?
讀空信號(hào):復(fù)位的時(shí)候,讀指針和寫指針相等,讀空信號(hào)有效(這里所說的指針其實(shí)就是讀地址、寫地址)
當(dāng)讀指針趕上寫指針的時(shí)候,寫指針等于讀指針意味著最后一個(gè)數(shù)據(jù)被讀完,此時(shí)讀空信號(hào)有效
寫滿信號(hào):當(dāng)寫指針比讀指針多一圈時(shí),寫指針等于讀指針意味著寫滿了,此時(shí)寫滿信號(hào)有效
我們會(huì)發(fā)現(xiàn) 讀空的條件是寫指針等于讀指針,寫滿的條件也是寫指針等于讀指針,到底如何區(qū)分呢?
解決方法:將指針的位寬多定義一位
舉個(gè)例子說明:假設(shè)要設(shè)計(jì)深度為 8 的異步FIFO,此時(shí)定義讀寫指針只需要 3 位(2^3=8)就夠用了,
但是我們?cè)谠O(shè)計(jì)時(shí)將指針的位寬設(shè)計(jì)成 4 位,最高位的作用就是區(qū)分是讀空還是寫滿,具體理論 1 如下
當(dāng)最高位相同,其余位相同認(rèn)為是讀空
當(dāng)最高位不同,其余位相同認(rèn)為是寫滿
知道這個(gè)理論就萬事大吉了嗎?重點(diǎn)來啦
由于我們?cè)谠O(shè)計(jì)中判斷是讀指針是否等于寫指針的時(shí)候,用的是讀寫指針的格雷碼形式(為什么用格雷碼后面解釋),此時(shí)若用上面的理論1就會(huì)出問題,
因?yàn)楦窭状a是鏡像對(duì)稱的,若只根據(jù)最高位是否相同來區(qū)分是讀空還是寫滿是有問題的,詳情我會(huì)慢慢說,請(qǐng)看圖 1
綠色框起來的是0--15的格雷碼,用紅線將格雷碼分為上下兩部分
通過觀察格雷碼相鄰位每次只有1位發(fā)生變化,且上下兩部分,除了最高位相反,其余位全都關(guān)于紅線鏡像對(duì)稱,
7 --> 8 ,格雷碼從 0100 --> 1100 ,只有最高位發(fā)生變化其余位相同
6 --> 9 , 格雷碼從 0101 --> 1101 , 只有最高位發(fā)生變化其余位相同
以此類推,為什么要說鏡像對(duì)稱呢?
試想如果讀指針指向 8,寫指針指向 7 ,我們可以知道此時(shí)此刻并不是讀空狀態(tài)也不是寫滿狀態(tài)
但是如果在此刻套用理論 1 來判斷,看會(huì)出現(xiàn)什么情況,我們來套一下
7的格雷碼與8的格雷碼的最高位不同,其余位相同,所以判斷出為寫滿。這就出現(xiàn)誤判了,同樣套用在 6 和 9,5 和 10等也會(huì)出現(xiàn)誤判。