異步FIFO爲何用格雷碼

異步FIFO經過比較讀寫地址進行滿空判斷,可是讀寫地址屬於不一樣的時鐘域,因此在比較以前須要先將讀寫地址進行同步處理,將寫地址同步到讀時鐘域再和讀地址比較進行FIFO空狀態判斷(同步後的寫地址必定是小於或者等於當前的寫地址,因此此時判斷FIFO爲空不必定是真空,這樣更保守),將讀地址同步到寫時鐘域再和寫地址比較進行FIFO滿狀態判斷(同步後的讀地址必定是小於或者等於當前的讀地址,因此此時判斷FIFO爲滿不必定是真空,這樣更保守),這樣能夠保證FIFO的特性:FIFO空以後不能繼續讀取,FIFO滿以後不能繼續寫入。異步

大多數情形下,異步FIFO兩端的時鐘不是同頻的,或者讀快寫慢,或者讀慢寫快,這時候進行地址同步的時候,可能會有地址遺漏,以讀慢寫快爲例,進行滿標誌判斷的時候須要將讀地址同步到寫時鐘域,由於讀慢寫快,因此不會有讀地址遺漏,同步後的讀地址滯後當前讀地址,因此可能滿標誌會提早產生。進行空標誌判斷的時候須要將寫地址同步到讀地址,由於讀慢寫快,因此當讀時鐘同步寫地址的時候,必然會漏掉一部分寫地址(寫時鐘快,寫地址隨寫時鐘翻轉,直到滿標誌出現爲止),那到底讀時鐘會同步到哪一個寫地址?沒必要在乎是哪個,咱們關注的是漏掉的地址會不會對FIFO的空標誌產生影響。好比寫地址從0寫到10,期間讀時鐘域只同步到了2,5,7這三個寫地址,漏掉了其餘地址。同步到7地址時,真實的寫地址可能已經寫到10地址,至關於「在讀時鐘域還沒來得及覺察的狀況下,寫時鐘域可能偷偷寫了數據到FIFO去」,這樣在比較讀寫地址的時候不會產生FIFO「空」讀操做。漏掉的地址也沒有對FIFO的邏輯操做產生影響。編碼

咱們能夠對異步FIFO的地址採用binary編碼,這樣並不影響異步FIFO的功能,前提是讀寫地址同步時可以保持正確。這種狀況在功能仿真時徹底正確,問題只有到時序仿真時纔會遇到。毛刺能夠說是異步電路的殺手,一個毛刺被觸發器採樣後會被放大,而後傳播,致使電路功能出錯。binary編碼的地址總線在跳變時極易產生毛刺,由於binary編碼是多位跳變,在實現電路時不可能作到全部的地址總線等長,address bus skew必然存在,並且寫地址和讀地址分屬不一樣時鐘域,讀寫時鐘徹底異步,這樣地址總線在進行同步過程當中出錯不可避免,好比寫地址在從0111到1000轉換時4條地址線同時跳變,這樣讀時鐘在進行寫地址同步後獲得的寫地址多是0000-1111的某個值,這個徹底不能肯定,因此用這個同步後的寫地址進行FIFO空判斷的時候不免出錯。同步

這個時候gray碼體現了價值,一次只有一位數據發生變化,這樣在進行地址同步的時候,只有兩種狀況:1.地址同步正確;2.地址同步出錯,可是隻有1位出錯;第一種正確的狀況不須要分析,咱們關注第二種,假設寫地址從000->001,讀時鐘域同步出錯,寫地址爲000->000,也就是地址沒有跳變,可是用這個錯誤的寫地址去作空判斷不會出錯,最可能是讓空標誌在FIFO不是真正空的時候產生,而不會出現空讀的情形。因此gray碼保證的是同步後的讀寫地址即便在出錯的情形下依然可以保證FIFO功能的正確性,固然同步後的讀寫地址出錯老是存在的(由於時鐘異步,採樣點不肯定)。這裏須要注意gray碼只是在相鄰兩次跳變之間纔會出現只有1位數據不一致的情形,超過兩個週期則不必定,全部地址總線bus skew必定不能超過一個週期,不然可能出現gray碼多位數據跳變的狀況,這個時候gray碼就失去了做用,由於這時候同步後的地址已經不能保證只有1位跳變了。數據

另外須要將地址總線打兩拍,這是爲了不亞穩態傳播,理論上將打兩拍不能消除亞穩態現象,由於時鐘異步,亞穩態不可避免,可是能夠極大下降亞穩態傳播的機率,低頻狀況下甚至STA不須要分析這裏的異步時序,由於寄存器均可以在一拍內將亞穩態消除,恢復到正常0/1態。而在高頻狀況下則不必定,尤爲在28nm工藝如下,須要檢查兩級觸發器的延遲,保證延遲低,這樣能夠提升Tr,提升系統MTBF。錯誤

相關文章
相關標籤/搜索