源同步信號跨時(shí)鐘域采集的兩種方法
對于數(shù)據(jù)采集接收的一方而言,所謂源同步信號,即傳輸待接收的數(shù)據(jù)和時(shí)鐘信號均由發(fā)送方產(chǎn)生。FPGA應(yīng)用中,常常需要產(chǎn)生一些源同步接口信號傳輸給外設(shè)芯片,這對FPGA內(nèi)部產(chǎn)生時(shí)鐘或數(shù)據(jù)的邏輯和時(shí)序都有較嚴(yán)格的要求。而對于一些FPGA采集信號的應(yīng)用中,常常也有時(shí)鐘和數(shù)據(jù)均來自外設(shè)芯片的情況,此時(shí)對數(shù)據(jù)和時(shí)鐘的采集也同樣需要關(guān)注FPGA內(nèi)部的邏輯和時(shí)序。當(dāng)然,無論何種情況,目的只有一個(gè),保證信號穩(wěn)定可靠的被傳送或接收。
對于一個(gè)如圖1所示的某視頻芯片產(chǎn)生的源同步信號,當(dāng)FPGA對其進(jìn)行采集同步到另一個(gè)時(shí)鐘域時(shí),特權(quán)同學(xué)通常的做法有兩種,特權(quán)同學(xué)稱之為脈沖邊沿檢測采集法和異步FIFO采集法。下面簡單的對這兩種方法做一些討論和說明。
圖1
脈沖邊沿檢測采集法
脈沖邊沿檢測采集法,顧名思義,一定是應(yīng)用了經(jīng)典的脈沖邊沿檢測法來幫助或者直接采集信號。對于脈沖邊沿檢測法,大家可以參考特權(quán)同學(xué)的《深入淺出玩轉(zhuǎn)FPGA》或者用gooogle擺渡一下。而這里尤其需要提醒大家注意的是,著名的奈奎斯特采樣定理告訴我們:要從采樣信號中無失真的恢復(fù)原信號,采樣頻率應(yīng)大于兩倍信號最高頻率。而特權(quán)同學(xué)通過實(shí)踐得出的結(jié)論與此相仿:若想穩(wěn)定有效的采集到脈沖(數(shù)字信號)變化的邊沿,采樣頻率應(yīng)大于被采樣脈沖最大頻率的3倍。注意是要大于3倍,甚至若是可能盡量采用4倍以上的采樣頻率才能夠達(dá)到穩(wěn)定的狀態(tài)。至于為什么,我想深諳此道(脈沖邊沿檢測法)的聰明人看完結(jié)論就已經(jīng)明白了,無需特權(quán)同學(xué)再廢話解釋一番。
而具體的做法也很簡單,把圖1理想化就如圖2所示。其中,待采集信號時(shí)鐘Tx Clock,待采集數(shù)據(jù)使能信號Enable Signal,待采集數(shù)據(jù)總線Data Bus。FPGA內(nèi)部信號采集時(shí)鐘為Rx Clock,該時(shí)鐘為待采集時(shí)鐘的4倍。
圖2
采用脈沖邊沿檢測法,使用Rx Clock去采集Tx Clock,Rx Clock reg1和Rx Clock reg2分別為第一級和第二級Tx Clock鎖存信號。Tx Clock上升沿對應(yīng)的一個(gè)有效指示信號Tx Clock pos每個(gè)Tx Clock時(shí)鐘周期產(chǎn)生一個(gè)Rx Clock脈寬的有效高電平使能信號。從圖3中可以看到,此時(shí)若用Tx Clock pos作為FPGA內(nèi)部采樣使能信號,雖然Tx Clock pos處于第7個(gè)Tx Clock,但是真正采集Data Bus其實(shí)已經(jīng)是第8個(gè)Tx Clock上升沿了。很明顯,第8個(gè)Tx Clock上升沿對準(zhǔn)的不是Data Bus的穩(wěn)定信號中央,數(shù)據(jù)很可能采集到錯(cuò)誤值。
圖3
因此,通過上面的分析,還是可以采取一些變通的方式來保證第8個(gè)Tx Clock上升沿采集到Data Bus的中央值。如圖4所示,采用同樣的方式對Data Bus做兩級信號鎖存,那么第8個(gè)Tx Clock上升沿就能夠在Data Bus reg2的中央采集數(shù)據(jù)了。這樣做只有一點(diǎn)小問題,相應(yīng)的需要多付出2組寄存器來鎖存Data Bus。
圖4
異步FIFO采集法
再說異步FIFO采集法,其實(shí)這種方法沒什么新奇,只不過充分利用異步FIFO的同步特性來完成跨時(shí)鐘域的數(shù)據(jù)交互。但是其中還是有幾個(gè)非常關(guān)鍵的要點(diǎn)需要提醒設(shè)計(jì)者注意,無論如何FIFO的輸入端數(shù)據(jù)和時(shí)鐘信號(包括控制信號,如有效使能信號等)必須符合FIFO的數(shù)據(jù)鎖存有效建立和保持時(shí)間,這個(gè)最重要的條件除了需要靠數(shù)據(jù)源端來保證外,還需要靠數(shù)據(jù)鎖存端(FPGA內(nèi)部)設(shè)計(jì)者做好時(shí)序上的約束和分析,否則到源端再nice的波形恐怕都無法保證能夠可靠的被FIFO鎖存。
異步FIFO的基本通訊時(shí)序波形如圖5所示。我們關(guān)心的是FIFO的寫入。由圖中不難發(fā)現(xiàn),寫入時(shí)鐘wrclk的每個(gè)上升沿會判斷寫入請求信號wrreq是否有效,若是有效則FIFO會相應(yīng)的鎖存當(dāng)前的寫入數(shù)據(jù)data。簡單來看,從基本時(shí)序上分析,wrclk的上升沿需要對準(zhǔn)wrreq和data的中央,這是外部傳輸過來的源信號必須滿足的基本關(guān)系。無論如何,即便是絞盡腦汁,也要想辦法讓這個(gè)基本關(guān)系得到保證,否則,后面的rdclk、rdreq配合的再默契恐怕都不能得到穩(wěn)定的q輸出。
圖5
原型開發(fā)的前期,設(shè)計(jì)者必須首先驗(yàn)證寫入信號的關(guān)系,哪怕是不惜動(dòng)用示波器(⊙﹏⊙b汗,連示波器都沒有不要混了),源端給到FPGA輸入端口的信號很多時(shí)候不是那么盡善盡美的,實(shí)踐出真知,測試結(jié)果說了算。當(dāng)然了,實(shí)在沒有先進(jìn)武器又想打勝仗的朋友恐怕只有不停的用代碼測試采集到最穩(wěn)定的數(shù)據(jù)了,這有點(diǎn)碰運(yùn)氣的成分在里面,不是非常推薦。
類似與開篇提到的應(yīng)用,特權(quán)同學(xué)的實(shí)際信號采集如圖6所示,把寫入時(shí)鐘Tx Clock和寫入請求信號Enable Signal都先用同步時(shí)鐘Rx Clock打了一拍,然后再輸入FIFO中,而數(shù)據(jù)總線Data Bus則直接送往FIFO。這樣從最終檢測來看,能夠保證時(shí)鐘的上升沿對準(zhǔn)數(shù)據(jù)和控制信號的中央,相對穩(wěn)定和安全的把數(shù)據(jù)送往FIFO中。
圖6
工程實(shí)踐中往往不是一招一式的生搬硬套理論,一定要抓住最關(guān)鍵的設(shè)計(jì)要點(diǎn),并采取各種有效的手段保證設(shè)計(jì)的實(shí)現(xiàn)。