唐輝艷,李紹勝
(1.北京郵電大學(xué) 信息與通信工程學(xué)院,北京 100876;2.中國(guó)軟件與技術(shù)服務(wù)有限公司,北京 100080)
隨著電子自動(dòng)化設(shè)計(jì)(EDA)技術(shù)的發(fā)展,現(xiàn)場(chǎng)可編程門陣列(FPGA)已經(jīng)在許多方面得到廣泛應(yīng)用,比如將FPGA應(yīng)用于通信領(lǐng)域,實(shí)現(xiàn)數(shù)字調(diào)制解調(diào)、編碼解碼,F(xiàn)PGA還在實(shí)現(xiàn)通信系統(tǒng)中的各種接口中起著重要作用,如PCI總線、SPI總線等。而在FPGA的接口設(shè)計(jì)中,同步?jīng)Q定了系統(tǒng)的穩(wěn)定性與接收數(shù)據(jù)的準(zhǔn)確性。但是實(shí)際的工程中,純粹單時(shí)鐘同步系統(tǒng)設(shè)計(jì)的情況很少,特別是設(shè)計(jì)模塊與外圍芯片的通信中,跨時(shí)鐘域的情況經(jīng)常不可避免。如果在跨時(shí)鐘域中采樣就會(huì)產(chǎn)生亞穩(wěn)態(tài)、采樣丟失和采樣數(shù)據(jù)錯(cuò)誤等一系列問(wèn)題,從而使系統(tǒng)無(wú)法正常運(yùn)行。本文就此分析了在FPGA設(shè)計(jì)中跨時(shí)鐘域?qū)е碌膩喎€(wěn)態(tài)現(xiàn)象以及2種同步方法,尤其是基于異步FIFO的同步方法。
在FPGA的設(shè)計(jì)中,當(dāng)用不同域的時(shí)鐘去采樣數(shù)據(jù)時(shí),如果采樣的數(shù)據(jù)不滿足setup時(shí)間和hold時(shí)間, 這樣就可能產(chǎn)生亞穩(wěn)態(tài),此時(shí)觸發(fā)器輸出端Q在有效時(shí)鐘沿之后比較長(zhǎng)的一段時(shí)間內(nèi)處于不確定的狀態(tài)。在這段時(shí)間內(nèi)Q端產(chǎn)生毛刺并不斷震蕩,最終固定在某一電壓值。此電壓值不一定等于原來(lái)數(shù)據(jù)輸入端D的數(shù)值,這段時(shí)間稱為決斷時(shí)間,經(jīng)過(guò)決斷時(shí)間之后,Q端將穩(wěn)定到0或1上,但空間是0還是1,這是隨機(jī)的。
亞穩(wěn)態(tài)的危害主要體現(xiàn)在破壞系統(tǒng)的穩(wěn)定性。由于輸出在穩(wěn)定下來(lái)之前可能是毛刺、震蕩、固定的某一電壓值,因此亞穩(wěn)態(tài)將導(dǎo)致邏輯誤差,嚴(yán)重情況下輸出0~1之間的中間電壓值還會(huì)使下一個(gè)寄存器產(chǎn)生亞穩(wěn)態(tài),即導(dǎo)致亞穩(wěn)態(tài)狀態(tài)下,任何諸如環(huán)境噪聲、電源干擾等細(xì)微擾動(dòng)都將導(dǎo)致更惡劣的狀態(tài)不穩(wěn)定。這時(shí)這個(gè)系統(tǒng)的傳輸延遲增大,狀態(tài)輸出錯(cuò)誤,在某些情況下甚至?xí)辜拇嫫髟?個(gè)有效判斷之間長(zhǎng)時(shí)間振蕩。
只要系統(tǒng)中有異步元件,亞穩(wěn)態(tài)就無(wú)法避免,因此,設(shè)計(jì)的電路要減少亞穩(wěn)態(tài)導(dǎo)致的錯(cuò)誤,要使系統(tǒng)對(duì)產(chǎn)生的錯(cuò)誤不敏感。
在異步設(shè)計(jì)中,完全避免亞穩(wěn)態(tài)是不可能的。所以,設(shè)計(jì)思路應(yīng)該是:盡可能降低亞穩(wěn)態(tài)出現(xiàn)的概率,也就是盡可能地采取同步方法。
為了避免進(jìn)入亞穩(wěn)態(tài),通常采用的方法是使用2級(jí)寄存器,即一個(gè)信號(hào)要進(jìn)入另外一個(gè)時(shí)鐘域之前用另一時(shí)鐘域的時(shí)候進(jìn)行2次鎖存,如圖1。式,讀寫時(shí)鐘采用2個(gè)不同的時(shí)鐘,寫時(shí)鐘是外部進(jìn)來(lái)的隨路時(shí)鐘,而讀時(shí)鐘采用本地鎖相環(huán)鎖出來(lái)的時(shí)鐘。系統(tǒng)框圖如圖2。
圖1 雙鎖存器法
圖2 異步FIFO結(jié)構(gòu)框圖
其中,c lk_a是與data在同一時(shí)鐘域的同步時(shí)鐘,而c lk_b是另一時(shí)鐘域的時(shí)鐘,經(jīng)c lk_a鎖存后的數(shù)據(jù)再經(jīng)c l k_b的正負(fù)沿鎖2次以后,數(shù)據(jù)data_out基本就穩(wěn)定了,理論上,采用這種方法可以有效地減少亞穩(wěn)態(tài)繼續(xù)傳播的概率,但是并不能保證第2級(jí)輸出的穩(wěn)態(tài)電平就是正確電平。前面說(shuō)過(guò)經(jīng)過(guò)決斷時(shí)間之后,寄存器輸出的電平是一個(gè)不確定的穩(wěn)態(tài)值。也就是說(shuō)這種處理方法并不能排除采樣錯(cuò)誤的產(chǎn)生。當(dāng)設(shè)計(jì)的系統(tǒng)對(duì)采樣錯(cuò)誤不敏感時(shí),如一幀圖像編碼、一段語(yǔ)音編碼等。而對(duì)于一些對(duì)錯(cuò)誤采樣比較敏感的系統(tǒng),則不能采用這種方法來(lái)解決跨時(shí)鐘域的數(shù)據(jù)采樣問(wèn)題。
使用異步FIFO來(lái)存放數(shù)據(jù),可以達(dá)到數(shù)據(jù)同步的目的。把數(shù)據(jù)存放在FIFO的方法是:將上個(gè)時(shí)鐘域提供的數(shù)據(jù)隨路時(shí)鐘作為寫信號(hào),將數(shù)據(jù)寫入FIFO,然后使用本級(jí)的采樣時(shí)鐘(一般是數(shù)據(jù)處理的主時(shí)鐘)將數(shù)據(jù)讀出即可。這種做法的關(guān)鍵是數(shù)據(jù)寫入FIFO要可靠,如果要使用FIFO,就要求有一個(gè)與數(shù)據(jù)相對(duì)延遲關(guān)系固定的隨路指示信號(hào),這個(gè)信號(hào)可以是數(shù)據(jù)的有效指示,也可以是上級(jí)模塊將數(shù)據(jù)打出來(lái)的時(shí)鐘。對(duì)于慢速數(shù)據(jù),也可以采用異步RAM或者FIFO,但是不推薦這種做法。下面主要介紹基于異步FIFO和RAM解決跨時(shí)鐘域異步問(wèn)題的方法。
本文所設(shè)計(jì)的異步FIFO采用循環(huán)隊(duì)列的方
圖2中,異步FIFO的端口定義是:wrdata是往FIFO里面寫的數(shù)據(jù),這個(gè)可以視具體情況為2n bi t,wrc lk是寫時(shí)鐘,wr ful l信號(hào)是FIFO寫滿標(biāo)志,rdc lk是讀時(shí)鐘,rdempty是讀空標(biāo)志,rdata是從FIFO里面讀出來(lái)的數(shù)據(jù)。從圖中可以看出,整個(gè)模塊分成2個(gè)完全獨(dú)立的時(shí)鐘域:讀時(shí)鐘域和寫時(shí)鐘域,讀/寫操作完全由2個(gè)不相關(guān)的時(shí)鐘來(lái)控制。在寫時(shí)鐘域,寫使能信號(hào)是由寫時(shí)鐘來(lái)控制的,當(dāng)外部數(shù)據(jù)有效的時(shí)候有效,寫使能為高,直至該幀數(shù)據(jù)結(jié)束,本設(shè)計(jì)中,寫滿和讀空標(biāo)志非常重要,對(duì)于讀/寫使能的設(shè)計(jì)也起著決定性作用,寫使能信號(hào)一定要在寫滿標(biāo)志有效前就結(jié)束,將有效數(shù)據(jù)都寫入FIFO,而讀使能一定要在讀空標(biāo)志有效前將FIFO里面的數(shù)據(jù)讀空,如果不這樣,將會(huì)出現(xiàn)數(shù)據(jù)寫覆蓋和讀錯(cuò)的現(xiàn)象。
本設(shè)計(jì)中,異步FIFO是調(diào)用IP核,空滿標(biāo)志是異步FIFO自己產(chǎn)生的,可用來(lái)控制FIFO的讀/寫使能信號(hào),寫使能信號(hào)在有效數(shù)據(jù)到來(lái)之后有效,持續(xù)到所有有效數(shù)據(jù)都寫入FIFO并且寫滿標(biāo)志未有效,這樣就可以將所有的有效數(shù)據(jù)都寫入FIFO中;為了防止數(shù)據(jù)還沒(méi)有寫完全就被讀空的狀態(tài),特別是讀時(shí)鐘太快的時(shí)候,讀使能是在當(dāng)有效數(shù)據(jù)全被寫入FIFO之后啟動(dòng)的,并且在讀空之前一直有效,用這種方法就將讀寫時(shí)鐘域完全隔離,寫入FIFO的數(shù)據(jù)速率是可調(diào)的,當(dāng)然用這種結(jié)構(gòu)的數(shù)據(jù)長(zhǎng)度是有限的,若數(shù)據(jù)長(zhǎng)度很大時(shí),則要根據(jù)讀寫時(shí)鐘的頻率來(lái)選擇FIFO的深度,具體如下:若讀時(shí)鐘的頻率大于或者等于寫時(shí)鐘的頻率,就不用擔(dān)心溢出問(wèn)題,F(xiàn)IFO的長(zhǎng)度可以任意選擇,否則,若讀時(shí)鐘頻率小于寫時(shí)鐘頻率,只能將FIFO或者RAM的深度增加,使得數(shù)據(jù)在寫滿之前已經(jīng)將數(shù)據(jù)讀完,此時(shí)FIFO的深度和讀使能信號(hào)的配合很重要。
本結(jié)構(gòu)采用Ver i log HDL硬件描述語(yǔ)言進(jìn)行電路設(shè)計(jì),調(diào)用異步FIFO核,在Cyc lone II系列的EP2C8Q208C8 FPGA上得以實(shí)現(xiàn),在Model sim軟件中進(jìn)行功能仿真,并且將該結(jié)構(gòu)用于筆者研究的一個(gè)項(xiàng)目中,在Quar tus II軟件的在線邏輯分析儀(Signal Tap Logic Analyzer)上調(diào)試抓到的信號(hào)如圖3。
從圖3中可以看出,經(jīng)過(guò)FIFO之后出來(lái)的數(shù)據(jù)和時(shí)鐘完全同步,且在此設(shè)計(jì)中讀寫時(shí)鐘是同頻率的,所以FIFO的寫入數(shù)據(jù)速率和讀出數(shù)據(jù)速率也是一致的,不過(guò),由于時(shí)鐘域的同步是需要時(shí)間的,這里設(shè)置了128個(gè)wrc lk用來(lái)緩存寫入數(shù)據(jù),故從FIFO中讀出來(lái)的數(shù)據(jù)相對(duì)于寫入的數(shù)據(jù)有一定的延時(shí),這里的延時(shí)是128個(gè)wrc lk,不同的設(shè)計(jì)中可以設(shè)置成不同的延時(shí)。本設(shè)計(jì)中寫時(shí)鐘和讀時(shí)鐘都是120 M,結(jié)果證明這種設(shè)計(jì)是正確的。
本文討論了在FPGA中跨時(shí)鐘域引起的亞穩(wěn)態(tài)現(xiàn)象及其解決方法,重點(diǎn)介紹異步FIFO緩存方法,并且在FPGA中用Ver i log HDL語(yǔ)言實(shí)現(xiàn),經(jīng)驗(yàn)證該方法能穩(wěn)定有效地解決跨時(shí)鐘域的亞穩(wěn)態(tài)問(wèn)題。能安全實(shí)現(xiàn)數(shù)據(jù)跨越時(shí)鐘域的傳遞,并能起到數(shù)據(jù)緩存的作用,因此是一種較好的方法。
[1] Mutter sbach J.,Villiger T., Kaeslin H, et al.Globally asynchronous locally synchronous architectures to simplify the design of on-chip systems[A] IEEE ASIC/SOC Conference 1999[C],15 -18 Sept.1999: 317-321.
[2] William J. Dally. John W. Plultin. Digital Systems Engineering[C].Cambridge University Press,1998, Page(s): 468.
[3]A. Chakraborty, M.R. Greenstreet interface[C]. Asic/Soc Conference, 2002, 15th Annual.
[4]朱永峰,陸生禮,茆邦琴. SoC設(shè)計(jì)中的多時(shí)鐘域處理[J].電子工程師,2003(11):60-61.
[5] 杜 旭,左 劍,夏曉菲,ASIC系統(tǒng)中跨時(shí)鐘域配置模塊的設(shè)計(jì)與實(shí)現(xiàn)[J]. 微電子學(xué)與計(jì)算機(jī),2004,21(6):173-177.
[6] 宋紅東,胡 晨,楊 軍. 一種用于高可靠性同步器電路的D觸發(fā)器設(shè)計(jì)[J].電子器件,2003,26(1):99-103.