廣東工業(yè)大學(xué)自動(dòng)化學(xué)院 周 偉 杜玉曉 楊其宇 張育俊 曾 浩
FPGA跨時(shí)鐘域亞穩(wěn)態(tài)研究
廣東工業(yè)大學(xué)自動(dòng)化學(xué)院 周 偉 杜玉曉 楊其宇 張育俊 曾 浩
在FPGA電路設(shè)計(jì)中,一個(gè)系統(tǒng)可能包含了很多跨時(shí)鐘域的時(shí)鐘信號,當(dāng)其目標(biāo)域時(shí)鐘與源域時(shí)鐘不同時(shí),如何在這些不同域之間傳遞數(shù)據(jù)成為了一個(gè)重要問題。特別是在中心模塊與外圍電路芯片的通信設(shè)計(jì)中,容易導(dǎo)致亞穩(wěn)態(tài)的跨時(shí)鐘域就不可避免。針對FPGA設(shè)計(jì)中的亞穩(wěn)態(tài)問題,本文給出了一系列行之有效的解決方法,很好地抑制亞穩(wěn)態(tài),提高系統(tǒng)可靠性。
亞穩(wěn)態(tài);建立時(shí)間;保持時(shí)間;異步FIFO;握手協(xié)議
在FPGA同步時(shí)序電路設(shè)計(jì)中,即所有時(shí)鐘寄存器的時(shí)鐘共享一個(gè)時(shí)鐘,可以有效地消除亞穩(wěn)態(tài)。然而,許多實(shí)際應(yīng)用要求在同一個(gè)可編程邏輯器件內(nèi)采用多個(gè)時(shí)鐘,且核心模塊與外設(shè)的通信設(shè)計(jì)也涉及跨時(shí)鐘域的數(shù)據(jù)傳遞。跨時(shí)鐘的異步時(shí)序電路含有的多個(gè)時(shí)鐘源,它們存在頻率和相位的差異,當(dāng)它們用作寄存器的輸入時(shí)鐘時(shí),就可能違背建立時(shí)間和保持時(shí)間的要求,出現(xiàn)亞穩(wěn)態(tài)[1-5]。亞穩(wěn)態(tài)問題是跨時(shí)鐘域異步數(shù)據(jù)傳輸過程面臨的主要問題。
在FPGA設(shè)計(jì)中,每種觸發(fā)器都有時(shí)序要求。“建立時(shí)間”(Setup time)是指在時(shí)鐘沿到來之前,觸發(fā)器輸入信號必須保持穩(wěn)定的時(shí)間。“保持時(shí)間”(Hold time)則是指在時(shí)鐘沿之后,信號必須保持穩(wěn)定的時(shí)間。這些指標(biāo)通常比較保守,以應(yīng)對不同的PVT(工藝、電壓、溫度)環(huán)境下時(shí)序各有差異的情況。如果一個(gè)設(shè)計(jì)滿足了這些時(shí)序要求,則觸發(fā)器出現(xiàn)錯(cuò)誤的可能性可以忽略不計(jì)。
亞穩(wěn)態(tài)是當(dāng)信號在跨時(shí)鐘的異步電路中或是無關(guān)的時(shí)鐘域之間傳輸時(shí)導(dǎo)致數(shù)字系統(tǒng)失效的一種現(xiàn)象。為了使觸發(fā)器能夠正確捕獲并輸出數(shù)據(jù),F(xiàn)PGA的信號傳輸數(shù)據(jù)信號都會(huì)有一定的時(shí)序要求,為了確保可靠的操作,輸入寄存器的數(shù)據(jù)信號必須在時(shí)鐘沿的某段時(shí)間(寄存器的建立時(shí)間Tsu)之前保持穩(wěn)定,并且持續(xù)到時(shí)鐘沿之后的某段時(shí)間(寄存器的保持時(shí)間Th)之后才能改變。寄存器的輸入反映到輸出則需要經(jīng)過一定的延時(shí)(時(shí)鐘到輸出的時(shí)間Tco)。如果數(shù)據(jù)信號的變化違反了Tsu和Th的要求,那么寄存器的輸出就會(huì)處于亞穩(wěn)態(tài)[6]。此時(shí),寄存器的輸出會(huì)在高電平1和低電平0之間盤旋一段時(shí)間,這也意味著寄存器的輸出達(dá)到一個(gè)穩(wěn)定的高或者低電平的狀態(tài)所需要的時(shí)間會(huì)大于Tco。
隨著跨時(shí)鐘域設(shè)計(jì)的愈發(fā)常見和復(fù)雜化,只要系統(tǒng)中存在跨時(shí)鐘域,亞穩(wěn)態(tài)就是無法避免的,因此設(shè)計(jì)的電路首先要減少亞穩(wěn)態(tài)導(dǎo)致錯(cuò)誤的發(fā)生,其次要使系統(tǒng)對產(chǎn)生的錯(cuò)誤不敏感。前者要靠同步來實(shí)現(xiàn),而后者根據(jù)不同的設(shè)計(jì)應(yīng)用有不同的處理辦法。
在FPGA設(shè)計(jì)中,數(shù)據(jù)信號在不同時(shí)鐘域間傳遞,最容易產(chǎn)生亞穩(wěn)態(tài),即觸發(fā)器無法在時(shí)序要求的規(guī)定時(shí)間段內(nèi)達(dá)到一個(gè)可確認(rèn)的狀態(tài)。數(shù)據(jù)信號在傳輸過程中觸發(fā)器的建立時(shí)間或保持時(shí)間不滿足時(shí)序要求,即信號在穩(wěn)定前的狀態(tài),一般是由于時(shí)序余量不夠,使得電路的輸入電平無法上升或下降到所需邏輯電平1或0。
跨時(shí)鐘異步輸入信號可以在任何時(shí)間點(diǎn)翻轉(zhuǎn),它與下級同步采樣信號沒有必然聯(lián)系。此外,在數(shù)據(jù)翻轉(zhuǎn)前,設(shè)計(jì)者無法預(yù)知該被采樣信號的時(shí)鐘沿或翻轉(zhuǎn)順序,也就不能保證信號滿足建立時(shí)間。無法保證穩(wěn)定的采樣,給跨時(shí)鐘域的FPGA設(shè)計(jì)帶來難題。
跨時(shí)鐘域的轉(zhuǎn)換的核心就是要保證下級時(shí)鐘對上級時(shí)鐘數(shù)據(jù)的采樣的Tsu和Th時(shí)間。如果觸發(fā)器的Tsu時(shí)間或Th時(shí)間不能滿足,就可能產(chǎn)生亞穩(wěn)態(tài),此時(shí)觸發(fā)器輸出端Q在有效時(shí)鐘沿之后較長時(shí)間處于不確定狀態(tài),在這段時(shí)間內(nèi)Q端產(chǎn)生毛刺并不斷振蕩,最終固定在某一個(gè)值,這個(gè)值不一定等于原來數(shù)據(jù)輸入端口D的數(shù)值,這短時(shí)間稱為判決時(shí)間(Resolution time),經(jīng)過Resolution time之后Q端經(jīng)穩(wěn)定到0或1上,但究竟是0還是1,是隨機(jī)的。與輸入沒有必然的聯(lián)系。
如圖1所示,時(shí)鐘CLK_A在上升沿時(shí)采樣數(shù)據(jù)DATAIN,數(shù)據(jù)信號data是時(shí)鐘CLK_A同步產(chǎn)生的,輸入信號data對下一級的觸發(fā)器的時(shí)鐘CLK_B是跨時(shí)鐘的異步信號,由于data的變化與CLK_B時(shí)鐘域時(shí)鐘的采樣邊沿太接近,未滿足采樣建立時(shí)間,造成的亞穩(wěn)態(tài)周期。輸出DATAOUT傳遞到后面的組合邏輯會(huì)產(chǎn)生不定狀態(tài),若在進(jìn)入下一級采樣前還沒有進(jìn)入穩(wěn)定狀態(tài),就會(huì)導(dǎo)致系統(tǒng)混亂。

圖1

圖2

圖3 握手協(xié)議

圖4 異步FIFO
亞穩(wěn)態(tài)的危害主要是破壞系統(tǒng)的穩(wěn)定性。由于輸出在穩(wěn)定前可能有毛刺、振蕩、固定的某一電壓值,因此亞穩(wěn)態(tài)將導(dǎo)致邏輯誤判,嚴(yán)重的情況輸出0~1之間的電壓值還會(huì)使下一級產(chǎn)生亞穩(wěn)態(tài),即亞穩(wěn)態(tài)的傳播。邏輯誤判導(dǎo)致功能性錯(cuò)誤,而亞穩(wěn)態(tài)傳播則擴(kuò)大故障面。另外,在亞穩(wěn)態(tài)下,電源干擾、環(huán)境噪聲、工作溫度等細(xì)微的擾動(dòng)都可能導(dǎo)致更惡劣的狀態(tài)不穩(wěn)定,這時(shí)系統(tǒng)的傳輸延遲增大,狀態(tài)輸出錯(cuò)誤。
FPGA設(shè)計(jì)中,要減少亞穩(wěn)態(tài)導(dǎo)致的錯(cuò)誤并使系統(tǒng)對產(chǎn)生的錯(cuò)誤不敏感,就要正確定義和處理FPGA內(nèi)部與外部時(shí)鐘之間的接口。對于異步或無關(guān)時(shí)鐘域間傳輸?shù)男盘枺贔PGA本地時(shí)鐘域使用該信號前,必須對其進(jìn)行同步。同步器的功能是采樣異步輸入信號,使產(chǎn)生的輸出信號滿足同步系統(tǒng)對建立時(shí)間和保持時(shí)間的要求,從而抑制亞穩(wěn)態(tài)對電路的影響。在許多應(yīng)用中,跨時(shí)鐘域傳送的不只是簡單的信號,數(shù)據(jù)總線、地址總線和控制總線都會(huì)同時(shí)跨域傳輸,這些復(fù)雜的情況,就需要應(yīng)用握手協(xié)議和異步FIFO的手段來處理這些情況。因此處理跨時(shí)鐘域常用的方法有兩級觸發(fā)器同步法、握手協(xié)議和異步FIFO法3種。
為了避免進(jìn)入亞穩(wěn)態(tài),通常采用的方法是使用兩級寄存器,即一個(gè)信號要進(jìn)入另外一個(gè)時(shí)鐘域之前用另一時(shí)鐘域的時(shí)候進(jìn)行兩次寄存,在圖2中,左邊為異步的輸入端,經(jīng)過兩級觸發(fā)器采樣,在右邊的輸出與時(shí)鐘CLK_B同步,而且該輸出基本不存在亞穩(wěn)態(tài)。其原理是即使第一個(gè)觸發(fā)器的輸出端存在亞穩(wěn)態(tài),經(jīng)過一個(gè)CLK時(shí)鐘周期后,第二個(gè)觸發(fā)器D端的電平仍未穩(wěn)定的概率非常小,因此第二個(gè)觸發(fā)器Q端基本不會(huì)產(chǎn)生亞穩(wěn)態(tài)。理論上如果再添加一級寄存器,是同步采樣達(dá)3級。則末級輸出為亞穩(wěn)態(tài)的概率幾乎為0。因此使用兩級寄存器采樣可以有效地減少亞穩(wěn)態(tài)繼續(xù)傳播的概率。
使用圖2所示兩級寄存器采樣不僅能降低亞穩(wěn)態(tài)的概率。但是并不能保證第二級的輸出的穩(wěn)定電平就是正確的電平。前面說過經(jīng)過Resolution time之后寄存器輸出電平是一個(gè)不正確定的穩(wěn)態(tài)值。也就是說這種處理方法不能排除采樣錯(cuò)誤的產(chǎn)生。這時(shí)就要求所設(shè)計(jì)的系統(tǒng)對采樣錯(cuò)誤有一定的容忍度。有些應(yīng)用本身就對采樣錯(cuò)誤不敏感,有些系統(tǒng)對錯(cuò)誤采樣比較敏感,可以采用一些糾錯(cuò)編碼手段完成錯(cuò)誤的糾正。
握手協(xié)議是實(shí)現(xiàn)總線數(shù)據(jù)跨時(shí)鐘域通信的一種有效方法,它能在避免亞穩(wěn)態(tài)傳播的同時(shí)正確地捕獲總線數(shù)據(jù)。握手信號,雙方電路在聲明或中止各自的握手信號前都要等待對方的響應(yīng)。使用握手協(xié)議方式處理跨時(shí)鐘域數(shù)據(jù)傳輸,只需要對雙方的握手信號(req、ack)分別使用脈沖檢測方法進(jìn)行同步。在具體實(shí)現(xiàn)中,首先,電路A聲明它的請求信號,即先把數(shù)據(jù)放入總線,隨后發(fā)送有效的請求req信號給電路B。然后,電路B檢測到有效的req信號后鎖存數(shù)據(jù)總線,聲明它的響應(yīng)信號,即回送一個(gè)有效的ack信號表示讀取完成應(yīng)答。當(dāng)電路A檢測到電路B回應(yīng)的響應(yīng)信號有效后,中止自己的請求信號,即撤銷當(dāng)前的req信號。最后,當(dāng)電路B檢測到電路A的信號req撤銷后也相應(yīng)撤銷ack信號,此時(shí)完成一次正常握手通信。此后,可以繼續(xù)開始下一次握手通信,如此循環(huán)。該方式能夠使接收到的數(shù)據(jù)穩(wěn)定可靠,有效的避免了亞穩(wěn)態(tài)的出現(xiàn),以上所述的通信流程如圖3所示。
信號跨越一個(gè)時(shí)鐘域要花兩個(gè)時(shí)鐘周期的時(shí)間,信號在跨越多個(gè)時(shí)鐘域前被電路寄存。全部的時(shí)間序列是:A時(shí)鐘域中最多五個(gè)周期加上B時(shí)鐘域最多六個(gè)周期。握手有效的避免了亞穩(wěn)態(tài)的出現(xiàn),因?yàn)橥ㄟ^檢測請求與響應(yīng)信號,每個(gè)電路都清楚地知道對方的狀態(tài)。但控制信號握手檢測會(huì)消耗通信雙方較多的時(shí)間,完成所有交互的整個(gè)過程要花費(fèi)很多時(shí)鐘周期。
異步FIFO[7-8]是一種先進(jìn)先出的電路,使用在需要產(chǎn)時(shí)數(shù)據(jù)接口的部分,用來存儲(chǔ)、緩沖在兩個(gè)跨時(shí)鐘異步時(shí)鐘之間的數(shù)據(jù)傳輸。使用一個(gè)異步FIFO在兩個(gè)時(shí)鐘域的交界處通信,通過它來實(shí)現(xiàn)數(shù)據(jù)流的傳輸。由發(fā)送時(shí)鐘域?qū)?shù)據(jù)寫入,接收時(shí)鐘域?qū)?shù)據(jù)取出,在數(shù)據(jù)傳輸?shù)耐瑫r(shí)實(shí)現(xiàn)了數(shù)據(jù)的緩存,因此是一種較理想的方法。
由圖4可以看出:整個(gè)系統(tǒng)分為兩個(gè)完全獨(dú)立的時(shí)鐘域——讀時(shí)鐘域和寫時(shí)間域;FIFO的存儲(chǔ)介質(zhì)為一塊雙端口RAM,可以同時(shí)進(jìn)行讀寫操作。在寫時(shí)鐘域部分,由寫地址產(chǎn)生邏輯產(chǎn)生寫控制信號和寫地址;讀時(shí)鐘部分由讀地址產(chǎn)生邏輯產(chǎn)生讀控制信號和讀地址。在空/滿標(biāo)志產(chǎn)生部分,由讀寫地址相互比較產(chǎn)生空/滿標(biāo)志。
不同時(shí)鐘域間數(shù)據(jù)傳遞的問題及其解決方法不同時(shí)鐘域間數(shù)據(jù)傳遞的最重要問題就是亞穩(wěn)態(tài)問題。當(dāng)數(shù)據(jù)信號通過兩個(gè)時(shí)鐘域的交界處時(shí),將會(huì)分別由這兩個(gè)時(shí)鐘來控制信號的值。此時(shí)如果兩時(shí)鐘信號的敏感沿非常接近并超過了允許的額度,則將出現(xiàn)數(shù)據(jù)信號的不穩(wěn)定,即電路陷入亞穩(wěn)態(tài),也稱為同步失敗,同樣會(huì)產(chǎn)生亞穩(wěn)態(tài)。但是通過設(shè)計(jì)改進(jìn)可以將其發(fā)生的概率降低到一個(gè)可以接受的程度。
在FIFO設(shè)計(jì)中,F(xiàn)IFO指針邏輯使用了格雷碼,代替指針使用的二進(jìn)制碼。格雷碼在每一次計(jì)數(shù)增減時(shí)只改變其中的一位。你可以在格雷碼總線上使用同步器,因?yàn)槊恳淮慰偩€改變時(shí)只有一根信號線有變化,于是就消除了格雷碼總線各位通過不同同步器時(shí)的競爭情況,降低了亞穩(wěn)態(tài)的產(chǎn)生,在異步FIFO設(shè)計(jì)中,通過提高空/滿標(biāo)志產(chǎn)生邏輯的可靠性,能夠很好地抑制亞穩(wěn)態(tài),進(jìn)一步的降低了亞穩(wěn)態(tài)的產(chǎn)生。
在FPGA跨時(shí)鐘域設(shè)計(jì)中,亞穩(wěn)態(tài)與設(shè)計(jì)可靠性有著密切的聯(lián)系。本文探討分析了跨時(shí)鐘域亞穩(wěn)態(tài)的產(chǎn)生機(jī)制及FPGA設(shè)計(jì)中亞穩(wěn)態(tài)問題的解決方法,提出的這些方法行之有效。傳輸在不相關(guān)時(shí)鐘域的信號,都有可能在相對于捕獲寄存器時(shí)鐘沿的任何時(shí)間點(diǎn)變化。因此,設(shè)計(jì)者無法預(yù)測信號變化的順序或者說信號兩次變化間經(jīng)過了幾個(gè)鎖存時(shí)鐘周期。設(shè)計(jì)者必須考慮到電路的這些情況,在實(shí)際應(yīng)用中,設(shè)計(jì)者可根據(jù)具體的實(shí)際情況而使用異步FIFO傳輸信號或者使用握手信號進(jìn)行控制。
一般情況下兩級寄存器同步適合步時(shí)鐘域之間單信號傳輸;當(dāng)幾個(gè)電路不能預(yù)知相互的響應(yīng)時(shí)間時(shí),握手方法能讓數(shù)字電路間實(shí)現(xiàn)有效的通信;總線數(shù)據(jù)同步、高速數(shù)據(jù)傳輸、數(shù)據(jù)在跨越時(shí)鐘域時(shí)需要存儲(chǔ)容量大的緩沖時(shí)則可以采用異步FIFO。這些措施能夠有效解決FPGA設(shè)計(jì)中跨時(shí)鐘域的亞穩(wěn)態(tài)問題,能實(shí)現(xiàn)數(shù)據(jù)跨越時(shí)鐘域的安全傳遞。
[1]夏字聞.Verilog數(shù)字系統(tǒng)設(shè)計(jì)教程(2版)[M].北京:北京航空航天大學(xué)出版社,2008.
[2]魏堃.跨時(shí)鐘域信號同步技術(shù)研究[D].西安:西安電子科技大學(xué),2009.
[3]Michelle Lange.Automated CDC verification protects complex electronic hardware from metastability failures.Mentor Graphics Corporation.Aug.2008.
[4]孟憲元,譯.高級FPGA設(shè)計(jì)結(jié)構(gòu)、實(shí)現(xiàn)和優(yōu)化[M].北京:機(jī)械工業(yè)出版社,2009.
[5]徐翼,鄭建宏.異步時(shí)鐘域的亞穩(wěn)態(tài)問題和同步器[J].微計(jì)算機(jī)信息,2008,24(2):171-172.
[6]吳小蕻.跨時(shí)鐘域若干問題的研究-同步與亞穩(wěn)態(tài)[D].合肥:中國科學(xué)技術(shù)大學(xué),2008.
[7]楊青山,蔡敏.基于多時(shí)鐘域的異步FIFO設(shè)設(shè)計(jì)[J].中國集成電路,2007(9):36-39.
[8]于海,樊曉椏.基于FPGA異步FIFO的研究與實(shí)現(xiàn)[J].微電子學(xué)與計(jì)算,2007.