FPGA設計基礎——數據同步

數據同步一般是指數據從不同時鐘域之間傳遞的過程,是FPGA設計中的基礎。數據同步中最常見的問題就是數據在同步過程中被改變,主要原因也就是異步時鐘域之間的亞穩態問題(關於亞穩態的問題,網上有很多資料,這裡不單獨說明),那麼在工程中如何有效的解決這個問題了?

數據同步一般有單bit同步和多bit同步2種場景,這2種場景的解決方案不太一樣。

一、多bit數據的同步,該場景下的方案比較簡單粗暴,就是採用異步FIFO來同步,如下圖所示,數據要從50M的時鐘域同步到125M的時鐘域,只需要一個異步FIFO即可,通過50M的時鐘域將數據寫入,再由125M的時鐘域將數據讀出,即可實現同步。

FPGA設計基礎——數據同步

異步FIFO時鐘域同步

該方案在實際工程中,簡單可靠。唯一需要注意的點就是:

(1)、寫使能、寫數據、滿或者將滿信號的處理都需要在寫時鐘域處理,比如上圖中的50M時鐘域處理;

(2)、讀使能、讀數據、空信號都需要在讀時鐘域處理,比如上圖中的125M時鐘域;

另外,多bit數據的同步也可以採用異步RAM的方式來同步,如果不需要考慮RAM中是否有數據,即僅僅作為表項的查詢,那麼使用RAM來同步也同樣簡單,如果需要考慮RAM中是否有數據,比如上圖中的數據在不同時鐘域穿越,那麼使用RAM來同步需要用戶在不同時鐘域判斷空滿情況,相對比較複雜。

二、單bit數據同步:單bit數據的同步,就方法來說,常見的有2種。一種是採用FIFO同步,一種是寄存器同步。

考慮不同的場景,如果需要同步的單bit數據,變化沒有規律,且傳遞的是純數據,那麼必須採用FIFO來同步,同步的方案和多bit數據同步的方案一樣。

如果需要同步的信號並不是數據信號,比如我們只是需要同步它的變化,那麼可以採用寄存器同步。寄存器的同步又分為2種情況:

1、低頻時鐘域信號同步到高頻時鐘域

該場景下,直接講需要同步的信號在目的時鐘域(高頻時鐘域)用寄存器打3拍(具體是2拍還是3拍,有不同的看法,但是從工程的角度來講,建議打3拍),取2dly和3dly的異或信號來輸出。如下圖所示:

FPGA設計基礎——數據同步

單bit信號寄存器同步

2、高頻時鐘域信號同步到低頻時鐘域

高頻時鐘域信號同步的低頻時鐘域會出現一個問題,就是高頻的時鐘時候變化的太快,低頻時鐘域的寄存器根本就採用不到這個變化,那麼採用寄存器直接同步就會出問題。如下圖所示:sig2信號在clk2這個時鐘域無法採樣到sig1的變化。

FPGA設計基礎——數據同步

低頻時鐘無法採用高頻變化信號

為了說明方便,假設125M時鐘域的信號同步到50M時鐘域。那麼解決上述的問題,又分2種情況:

(1)、高頻時鐘域信號變化頻率很低,即無論是由0到1還是由1到0的變化後,都能保持很長時間(遠遠大於125/50 = 2.5個時鐘週期),那麼可以採用和低頻時鐘域信號同步到高頻時鐘域類似的方案。

(2)、高頻時鐘域信號變化的頻率高,無法保持2.5個時鐘週期以上,那就不能採用寄存器同步,否則會出現漏採樣,如下圖所示:這種情況只能採用FIFO來實現數據的同步

FPGA設計基礎——數據同步

低頻時鐘信號出現漏採樣


最後用一張圖總結下上述的各種場景:

FPGA設計基礎——數據同步

數據同步各種場景的方案


分享到:


相關文章: