異步FIFO

當寫指針超過最後的FIFO地址時,寫指針將使未使用的MSB(Most Significant Bit的縮寫,指最高有效位)遞增,同時將其餘的位設置爲零,如圖1所示(FIFO已經迴環並翻轉指針的MSB位)。

如果兩個指針的MSB相同,則意味着兩個指針都回環了相同的次數。

使用n位指針,其中(n-1)是訪問整個FIFO存儲器緩衝區所需的地址位數,將寫時鐘域的寫指針同步到讀時鐘域,當兩個指針(包括MSB)相等時,FIFO爲空。 將讀時鐘域的讀指針同步到寫時鐘域,當兩個指針(MSB除外)相等時,FIFO就會滿(面試陷阱:請各位童鞋思考爲什麼是這樣,反之是否可以)。

嘗試將二進制指針值從一個時鐘域同步到另一個時鐘域是有問題的,因爲n位指針的每個位可以同時改變。例如,二進制數中的7-> 8是0111->1000,所有位都改變了,實際中可能出現的情形有16種,即0111-> 1000的變化可能出現0111-> 1001、0111->1011等(請童鞋們思考原因哦,這是Cisco 19年的面試題)。

 

  格雷碼的最大優勢是任何兩個相鄰字之間的代碼距離只有1(在n位碼的遞增變化中只有1位可以變化)。

回到之前二進制數中的7-> 8變化的例子,二進制數變化爲0111->1000,此時使用了格雷碼的變化是0100->1100,即只有最高位發生了變化。使用了格雷碼後的遞增變化可能的情形有2種,即0100->1100或0100->0100,異常情形爲0100->0100。異常情形爲指針未發生正常跳變,帶來的影響爲判斷空滿狀態時出現了“假空”或者“假滿”。

假設寫指針爲爲7->8跳轉,讀指針爲6->7跳轉。寫指針由於異常情形出現了7->7的跳轉,將寫指針同步到讀時鐘域,讀寫指針都指向7,出現了“假空”。“假滿”與之類似,不再贅述。“假空”和“假滿”的出現降低了FIFO的性能,但是避免了亞穩態的問題,是可以接受的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章