跨時鐘域的問題:前一篇已經(jīng)提到要通過比較讀寫指針來判斷產(chǎn)生讀空和寫滿信號,但是讀指針是屬于讀時鐘域的,寫指針是屬于寫時鐘域的,而異步FIFO的讀寫時鐘域不同,是異步的,要是將讀時鐘域的讀指針與寫時鐘域的寫指針不做任何處理直接比較肯定是錯誤的,因此我們需要進(jìn)行同步處理以后進(jìn)行比較。
解決方法:兩級寄存器同步 + 格雷碼
同步的過程有兩個:
(1)將寫時鐘域的寫指針同步到讀時鐘域,將同步后的寫指針與讀時鐘域的讀指針進(jìn)行比較產(chǎn)生讀空信號;
(2)將讀時鐘域的讀指針同步到寫時鐘域,將同步后的讀指針與寫時鐘域的寫指針進(jìn)行比較產(chǎn)生寫滿信號;
異步FIFO的寫指針和讀指針分屬不同時鐘域,這樣指針在進(jìn)行同步過程中很容易出錯,比如寫指針在從0111到1000跳變時4位同時改變,這樣讀時鐘在進(jìn)行寫指針同步后得到的寫指針可能是0000-1111的某個值,一共有2^4個可能的情況,而這些都是不可控制的,你并不能確定會出現(xiàn)哪個值,那出錯的概率非常大,怎么辦呢?到了格雷碼發(fā)揮作用的時候了,而格雷碼的編碼特點(diǎn)是相鄰位每次只有 1 位發(fā)生變化, 這樣在進(jìn)行指針同步的時候,只有兩種可能出現(xiàn)的情況:
指針同步正確,正是我們所要的;
指針同步出錯,舉例假設(shè)格雷碼寫指針從000->001,將寫指針同步到讀時鐘域同步出錯,出錯的結(jié)果只可能是000->000,因?yàn)橄噜徫坏母窭状a每次只有一位變化,這個出錯結(jié)果實(shí)際上也就是寫指針沒有跳變保持不變,我們所關(guān)心的就是這個錯誤會不會導(dǎo)致讀空判斷出錯?答案是不會,最多是讓空標(biāo)志在FIFO不是真正空的時候產(chǎn)生,而不會出現(xiàn)空讀的情形。所以gray碼保證的是同步后的讀寫指針即使在出錯的情形下依然能夠保證FIFO功能的正確性。在同步過程中的亞穩(wěn)態(tài)不可能消除,但是我們只要保證它不會影響我們的正常工作即可。
-
寄存器
+關(guān)注
關(guān)注
31文章
5363瀏覽量
121089 -
fifo
+關(guān)注
關(guān)注
3文章
389瀏覽量
43836
原文標(biāo)題:異步FIFO跨時鐘域亞穩(wěn)態(tài)如何解決?
文章出處:【微信號:ALIFPGA,微信公眾號:FPGA極客空間】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論