非同步fifo 關於非同步fifo的快轉慢的問題

2021-10-12 17:14:52 字數 1708 閱讀 5153

最近一位童鞋跟我聊到乙個非同步fifo的問題,還是很有水準的。我貼在這裡給大家看一下:非同步fifo需要將讀寫的pointer作比較產生滿和空訊號,但是假如fifo的兩個時鐘域的clk相差特別大,pointer在做跨時鐘域轉換的時候就會出現問題。什麼問題呢?慢時鐘採快時鐘會漏採資料

舉個栗子:非同步fifo,寫時鐘500m,讀時鐘100m,相差5倍。那麼寫時鐘域的write_pointer就會以500m的頻率增加,但是讀時鐘的read_pointer增加的頻率是100m。現在要判斷滿和空,滿是在寫時鐘域判斷的,空是在讀時鐘域判斷的。下圖所示:

判斷滿的方法是拿write_pointer和做完cdc轉換過來的read_pointer作比較。cdc轉換的方法是採用格雷碼過兩級flip-flop的同步器。由於read_pointer屬於100m的頻率,write時鐘域有500m,屬於快採慢,cdc轉換不會有什麼問題。因此滿的判斷不會有問題。

判斷空的方法是拿read_pointer和做完cdc轉換過來的write_pointer做比較。cdc轉換的方法也是採用格雷碼過兩級flip-flop的同步器。由於write_pointer的變化頻率是500m,而read時鐘域只有100m的clk,屬於慢採快,cdc的轉換就會出問題。

出什麼問題?

因為read時鐘的頻率過低,所以write_pointer做完cdc之後得到的將是零星的離散的取樣值,而非連續的值,比如說可能會取樣到格雷碼的5->10->15,而非連續的格雷碼的5->6->7->8............

那麼該怎麼解決這個問題?

這個問題其實沒法解決,也不需要解決。

為什麼沒法解決?

因為快時鐘往慢時鐘傳資料,要想乙個不漏,唯一的辦法就是hold住(通常來講,至少hold住目標時鐘域2t)。把當前資料牢牢keep住,等到資料被取走了再傳下乙個。但是很明顯write_pointer屬於自增型的,只要fifo沒有滿,它都可以持續增加,並不會hold不變,所以必然會漏採。

為什麼不需要解決?

因為只要fifo夠大,即便讀到的write_pointer是離散的,也不會影響到fifo判空。只要fifo判空不出錯,非同步fifo的行為就沒有問題,只不過效率可能略微降低。

舉個栗子:

當read時鐘域取樣到write_pointer的值是5的時候,真正的write_pointer的值可能是多少?可能已經是5,6,7,8,9等等了。但絕對不可能比5小。

為什麼不可能比5小?

因為對於write_pointer而言,它從4變到5,這個沿變在跨cdc的時候,只有沒採著和採著兩種可能,沒採著的話,跨完時鐘域得到4,採著了就得到5。絕對不可能得到比5大的值。

也就是說,只要是格雷碼跨cdc,跨過去的值只可能比真實值相等或者小,不可能比真實值大!

所以如果在read時鐘域已經看到write_pointer等於5了,那麼真實的write_pointer必然不小於5。那麼基於write_pointer等於5來判斷空,將會得到乙個很保守的空(也可以叫假空)!也就是說非同步fifo明明還有數,讀時鐘域就判斷出空,暫時停止讀取資料。

但是這並不會導致出錯,因為這種保守的空判斷,只是降低了讀的效率,並沒有導致讀出錯誤的資料或者不存在的資料。

所以,即便取樣到的write_pointer是個離散值,但是由於非同步fifo並不會有實際的行為出錯,所以也不需要解決這個問題。

非同步fifo 跨時鐘域同步(非同步FIFO)

本文使用 zhihu on vscode 創作並發布 之前學習了跨時鐘域下的單bit訊號同步的方法,這些單bit訊號多是作為控制訊號或者標誌訊號來使用,再實際的專案中,處理多bit資料也是十分常見的,即資料的同步。非同步fifo的實現其實本質上和雙口ram是一樣的,其實現思路就是將資料在src cl...

非同步FIFO程式

module fifo wr clk,write fifo clock nwr,write fifo signal din,write fifo data rd clk,read fifo clock nrd,read fifo signal dout,read fifo data full,1 f...

非同步FIFO程式

module fifo wr clk,write fifo clock nwr,write fifo signal din,write fifo data rd clk,read fifo clock nrd,read fifo signal dout,read fifo data full,1 f...