非同步FIFO跨時鐘域亞穩態如何解決?
跨時鐘域的問題:前一篇已經提到要通過比較讀寫指標來判斷產生讀空和寫滿訊號,但是讀指標是屬於讀時鐘域的,寫指標是屬於寫時鐘域的,而非同步FIFO的讀寫時鐘域不同,是非同步的,要是將讀時鐘域的讀指標與寫時鐘域的寫指標不做任何處理直接比較肯定是錯誤的,因此我們需要進行同步處理以後進行比較。
解決方法:兩級暫存器同步 + 格雷碼
同步的過程有兩個:
(1)將寫時鐘域的寫指標同步到讀時鐘域,將同步後的寫指標與讀時鐘域的讀指標進行比較產生讀空訊號;
(2)將讀時鐘域的讀指標同步到寫時鐘域,將同步後的讀指標與寫時鐘域的寫指標進行比較產生寫滿訊號;
非同步FIFO的寫指標和讀指標分屬不同時鐘域,這樣指標在進行同步過程中很容易出錯,比如寫指標在從0111到1000跳變時4位同時改變,這樣讀時鐘在進行寫指標同步後得到的寫指標可能是0000-1111的某個值,一共有2^4個可能的情況,而這些都是不可控制的,你並不能確定會出現哪個值,那出錯的概率非常大,怎麼辦呢?到了格雷碼發揮作用的時候了,而格雷碼的編碼特點是相鄰位每次只有 1 位發生變化, 這樣在進行指標同步的時候,只有兩種可能出現的情況:
指標同步正確,正是我們所要的;
指標同步出錯,舉例假設格雷碼寫指標從000->001,將寫指標同步到讀時鐘域同步出錯,出錯的結果只可能是000->000,因為相鄰位的格雷碼每次只有一位變化,這個出錯結果實際上也就是寫指標沒有跳變保持不變,我們所關心的就是這個錯誤會不會導致讀空判斷出錯?答案是不會,最多是讓空標誌在FIFO不是真正空的時候產生,而不會出現空讀的情形。所以gray碼保證的是同步後的讀寫指標即使在出錯的情形下依然能夠保證FIFO功能的正確性。在同步過程中的亞穩態不可能消除,但是我們只要保證它不會影響我們的正常工作即可。
版權所有權歸卿萃科技 杭州FPGA事業部,轉載請註明出處
作者:杭州卿萃科技ALIFPGA
原文地址:杭州卿萃科技FPGA極客空間 微信公眾號
掃描二維碼關注杭州卿萃科技FPGA極客空間