非同步FIFO中讀寫指標為什麼要用格雷碼

2021-08-02 22:04:47 字數 1018 閱讀 4308

首先要了解的是非同步fifo

使用格雷碼的唯一目的就是「即使在亞穩態進行讀寫指標抽樣也能進行正確的空滿狀態判斷」。

那麼典型的判斷方法是怎樣進行的呢?以滿狀態判斷為例,先要對讀指標(屬於讀時鐘域)在寫時鐘域進行抽樣,然後才能與寫指標進行比較,如果寫指標趕上了讀指標,說明已經寫滿,寫操作必須暫停。

接下來說說為什麼

2進製指標不適合做空滿判斷。事實上

2進製讀指標在增減時,經常發生多位突變,比如

6位位址

111111

會在下一時刻變成

000000

,在實際電路中,這個變化過程要持續很長一段時間,會由

111111經歷6

個狀態轉移到達

000000

。比如111111-> 101111 -> 100111 ->100110 -> 100100 -> 000100-> 000000

。由於寫時鐘與讀時鐘不同步,非同步的寫時鐘很可能會在狀態不穩定的中間某個狀態抽樣,這樣就會得到錯誤的讀指標,進而做出錯誤的狀態判斷,導致系統異常。而且由於多位同時突變,憑藉概率論常識可知發生錯誤的可能性很大。

那麼怎樣才能避免這個問題的發生呢?顯然,在中間狀態抽樣,這個是不可避免的,這是非同步系統天生的缺陷。我們的目標是:即使在中間狀態抽樣,也要不影響空滿狀態的判斷。符合這個要求的編碼方法是每次只能有

1個位元發生改變。為什麼這麼說呢?因為當只有乙個位元發生改變時,即使在中間狀態抽樣,其結果也不外乎兩種:遞增前原指標和遞增後新指標。顯然遞增後新指標是最新情況的反映,如果抽樣到這個指標,那麼和我們的設計預期是一致的,如果抽樣到遞增前的原指標,會有什麼結果呢?假設現在抽樣讀指標,那麼最壞的情況就是把「不滿」判斷成了「滿」,使得本來被允許的寫操作被禁止了,但是這並不會對邏輯產生影響,只是帶來了寫操作的延遲。同樣的,如果現在抽樣寫指標,那麼

最壞的情況就是把「不空」判斷成了「空」,使得本來被允許的讀操作被禁止了,但是這也不會對邏輯產生影響,只是帶來了讀操作的延遲。

顯然每次只變化1位元的編碼方案可以有效解決中間狀態下空滿狀態的判斷問題,格雷碼就是這樣的一種編碼。

關於非同步fifo為什麼用格雷碼

那麼典型的判斷方法是怎樣進行的呢?以滿狀態判斷為例,先要對讀指標 屬於讀時鐘域 在寫時鐘域進行抽樣,然後才能與寫指標進行比較,如果寫指標趕上了讀指標,說明已經寫滿,寫操作必須暫停。接下來說說為什麼2進製指標不適合做空滿判斷。事實上2進製讀指標在增減時,經常發生多位突變,比如6位位址111111會在下...

為什麼要返回煉表頭指標()

訪問鍊錶的時候,都是從頭結點開始的,當你用完的時候也要回到頭結點,這是通用的方法,如果不,有下列兩種情況。1.如果不返回呢,這個鍊錶就無法用了,應為無法抓住乙個節點,是無法順藤摸瓜,找到其它元素了。2.如果返回其它節點呢,如果是迴圈鍊錶或者雙向鍊錶,這是可以訪問的,雖然程式可讀性不好,但要是單項鍊表...

為什麼要建設資料指標字典

指標越來越多可能會暴露什麼問題?相同口徑指標名稱不一致?指標口徑描述不清晰,復用難?指標名難理解?計算邏輯不清晰?指標開發後,長時間遺忘,暴露出資料問題後增加解決問題的時間?如何解決 對指標進行全域性梳理,輸出企業的指標字典。最後形成乙個全域性業務口徑一致的指標字典。讓使用指標的人,可以通過指標字典...