FPGA Asynchronous FIFO設計思路(2)編碼
首先討論格雷碼的編碼方式:spa
先看4bit的格雷碼,當MSB爲0時,正向計數,當MSB爲1時,即指針已經走過一遍了,最高位翻轉,此時的格雷碼是反向計數,這其中整套數據以最大值(深度)爲對稱中心,每個數均符合格雷碼的要求,即下一個狀態比上一個狀態只有1bit的變化。設計
3bit的格雷碼,在最高位反向後,即指針達到了FIFO最後一個地址,低位開始從新計數,此時存在一個問題是,在最高位跳轉的地方,有兩bite的數據發生變化,違背了格雷碼的規律。3d
以上爲一種利用格雷碼來產生數據指針的模型,使用格雷碼來傳遞FIFO指針數據,那麼FIFO的深度必定是pow2,以上模型中,指針ptr先經過gray to binary comb logic 模塊,將格雷碼轉化成二進制數據,而後進行加一操做,獲得bnext,而後經過binary to gray comb logic 將bnext轉化爲gnext, 而後gnext經過寄存器輸出獲得新的數據指針ptr.再經過gnext的最高位和次高位,計算出addrmsb.指針
以上是第二種數據指針生成模型,首先是,數據地址即指針去掉最高位後,參與加一運算,獲得新的數據地址,採用二進制的形式。blog
而後加一獲得的新數據地址進行格雷碼轉換,獲得gnext的值,而後經過寄存器輸出,即此模型同時輸出數據指針(採用的格雷碼)和數據地址值(採用二進制)。it
以上爲FIFO的一種總體設計模型。二進制
實際操做中,空滿標誌位信號生成的問題im
具體邏輯不用多說d3
關於空信號的生成,最高位,以及數據地址徹底相等,便可以判斷爲空。
關於滿信號的生成即複雜一些:
若是採用之前的判斷依據,指針的最高位不一樣,剩下的數據地址徹底相同,若是採用的是格雷碼編碼方式,就會出現問題。
滿信號的判斷依據中指出讀指針和寫指針的最高兩位同時不一樣,剩下的相同,便可以判斷FIFO滿。