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