FPGA:跨時鐘域數據交互

收藏大神們的牛貼。以便學習。

爲了實現OV7725視頻採集,同時實時顯示於VGA顯示器,我們需要將捕獲後的數據交給VGA進行實時顯示,但我們卻不能簡單的實現這一功能~~~~(>_<)~~~~,太多人問過我這個問題,今天在這裏總結一下!!!

這並非OV7725輸入的視頻流數據量有多大,也不是因爲輸入視頻數據不連續,而是因爲時鐘的不同步,造成我們不能直接進行數據的交互。因此我們直接解決了這一個問題,才能完成不同時鐘域的數據交互,以保證數據流的連續性,完成實時VGA視頻顯示的功能。分析OV7725視頻採集到顯示之間的時鐘域,主要有以下幾個方面(這裏只考慮RGB565/YUV422格式,RAW直接輸出12.5MHz):

① 在RGB565/YUV422下,OV7725在25MHz的時鐘驅動下,以25MHz的數據時鐘的速率,輸出8Bit的數據流。

② OV7725輸出視頻流經FPGA捕獲、解碼後,以12.5MHz的速率輸出拼接後的16Bit像素數據,並且每秒30幀。

③ 針對640*480分辨率,VGA格式爲640*480@60Hz,此時VGA的驅動時鐘爲25MHz(OV7725像素時鐘的2倍),幀率爲60(與OV7725輸出幀率不一致)。

這樣,在整個系統的框架中,我們得到了3個時鐘域,如下圖所示:

wps_clip_image-15379

3個時鐘域的數據交互,涉及到了2次跨時鐘域的過程。首先在採集時從25MHz過渡到12.5MHz,在這需要從12.5MHz提升到25MHz給VGA顯示。如果我們不經過處理,直接在時鐘2驅動下讀取時鐘1輸出的數據,直接跨越了時鐘,是否可行?

由於跨時鐘域數據的操作,當輸入信號從時鐘域1跨入時鐘域2時,對於時鐘域2而言,該數據是一個異步信號。而異步信號造成的亞穩態不穩定性,Bingo過去的文章種豆提到過,這一潛在的危機,也許會造成致命的傷害。爲了避免這種情況的發生,實現數據從一個時鐘域過渡到另一個時鐘域,我們需要需要採用一定的辦法,來解決跨時鐘數據交互問題。

廣義的跨時鐘域,不僅僅侷限於時鐘頻率的不同,始終相位的不同也可以認爲是跨時鐘,典型的2個處理器即便主頻一樣,也認爲爲跨時鐘域,因爲兩者相位不可能一樣。爲了解決跨時鐘數據交互,Bingo認爲,主要有以下3種方法:

① 採用使能信號實現跨時鐘域數據交互

這一方式我們在前面已經多次應用。比如在FPGA與MCU進行SPI總線通信時,FPGA捕獲外部輸入的SPI_CLK信號,通過邊沿採樣原理,得到SPI_CLK的上升沿使能時鐘(mcu_en)。繼而進行使能的判斷,讀取外部輸入的數據,實現跨時鐘域數據的交互,框圖如下所示:

wps_clip_image-13445

通過FPGA邊沿採樣原理,捕獲使能時鐘來解決跨時鐘域數據交互,在FPGA設計中非常的常用。採用使能時鐘進行跨時鐘域數據交互,實現方式非常的簡單,也非常適用於FPGA實現。不過這種方法也有一定的侷限性,由於高頻時鐘能採樣到高頻時鐘,而高頻時鐘不能採樣到低頻時鐘,因此這決定了數據流只能由低頻域向高頻域傳輸時。比如在SPI總線通信中,MCU的時鐘相對於FPGA而言,屬於低頻域。

當外部時鐘與FPGA主時鐘旗鼓相當時,採用這種方式進行跨時鐘與數據交互就會有很大的問題。比如當年Bingo在進行CPLD與STM32的FSMC總線通信時,在FSMC以較低時鐘運行時,數據交互完全沒有問題;而在設定FSMC以最高速率運行,數據的丟失就很嚴重。最後用邏輯分析儀觀察STM32輸入的信號,如下圖所示:

wps_clip_image-16767

同時查閱手冊,發現了問題的所在。由於STM32的FSMC以硬件電路運行,能達到很高的速率(實際測試能達到每秒10張以上的1024*768的模擬圖片),而在最高速率下,STM32的FSMC總線的WR信號,將在72MHz的主頻下運行。問題在於項目中CPLD主時鐘爲50MHz,因此使用50MHz去採樣72MHz的時鐘域數據,不出問題纔怪……最後,通過更換100MHz的晶振,解決了WR的是能採樣問題。

② 採用片內存儲器實現跨時鐘域數據交互

這個方法主要是利用存儲器的雙端口讀取,由於FPGA片內RAM、FIFO等,都可以設置成雙端口讀取模式,即獨立的讀時鐘與寫時鐘。由於雙端口 RAM、DCFIFO等讀寫操作,其固有特性決定了可以在2個時鐘域下進行數據的讀寫操作。雙端口RAM與DCFIFO的Module如下圖所示:

wps_clip_image-14548

在跨時鐘域讀寫操作中,將輸入連接到時鐘域1,將輸出連接到時鐘域2,通過地址,或者判斷存儲器內存儲的數據,確定數據達到了飽和,開始進行數據的交互。

由於DCFIFO採用的是先入先出機制,同時根據存儲的容量判斷所存儲的跨時鐘域數據的量,很容易的就能實現跨時鐘與數據的數據交互。個人覺得采用DCFIFO實現跨時鐘與數據的交互更容易,更適合。在SDRAM控制器中Bingo就採用了2個DCFIFO實現跨時鐘域數據的交互。

採用DCFIFO實現跨時鐘域的數據交互的好處在於,能實現低頻域到高頻域的數據交互,同時由於FIFO有一定的存儲量,也可以實現由高頻率到低頻域的數據交互。在實際項目開發的跨時鐘域數據交互中,採用DCFIFO作爲交互的中介,非常的使用。

③ 採用SRAM/SDRAM等存儲器作爲跨時鐘域數據交互

由於片內存儲器有限,當數據量較大時,採用外部存儲器,也能實現跨時鐘與數據交互。這裏的SRAM/SDRAM相當於雙端口RAM。最簡單的方式,可以採用2片SRAM/SDRAM,模擬實現雙端口RAM,實現循環“時鐘域1寫、時鐘域2讀”的乒乓讀寫機制,框圖如下所示:

wps_clip_image-13433

從乒乓讀寫操作框圖中分析,這種方式實現的跨時域數據交互主要是如下3個過程:

① 在第一時刻,外部數據通過時鐘域1寫入SRAM1/SDRAM1,同時通過時鐘域2讀取SRAM2/SDRAM2數據;

② 在第二時刻,外部數據通過時鐘域2寫入SRAM2/SDRAM2,同時通過時鐘域2讀取SRAM1/SDRAM1數據。

③ 當SRAM1/SDRAM1寫入完畢,並且SRAM2/SDRAM2讀取完畢,切換一次乒乓操作。這需要處理SRAM1/SDRAM1寫入完畢,而SRAM2/SDRAM2未讀寫完畢的數據。

以SRAM/SDRAM來實現跨時鐘域數據交互,好處在於實現海量跨時鐘與數據的處理,能同時實現低頻域到高頻域,或者高頻域到低頻與的跨時鐘數據轉換。另外,SRAM的驅動時序簡單,便於實現,但是價格高;而SDRAM的驅動時序複雜,實現困難,但是價格便宜。在實際項目開發中,根據週期與產品的成本敏感程度而定。

上述三種跨時鐘域數據交互的方法,在OV7725視頻採集顯示的設計中,每一種都淋漓盡致的應用到了。處理好跨時鐘域數據的交互,有效地提高系統的穩定性,防止數據的錯位與丟失,在開發中極爲重要。最後,給出Bingo設計的OV7725視頻採集系統中,3個跨時鐘域數據處理的框圖,如下所示:

wps_clip_image-10063


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章