基于異步FIFO實(shí)現(xiàn)不同時(shí)鐘域間數(shù)據(jù)傳遞的設(shè)計(jì)
摘 要:數(shù)據(jù)流在不同時(shí)鐘域間的傳遞一直是集成電路芯片設(shè)計(jì)中的一個(gè)重點(diǎn)問(wèn)題。本文通過(guò)采用異步FIFO的方式給出了這個(gè)問(wèn)題的一種解決方法,并采用Verilog 硬件描述語(yǔ)言通過(guò)前仿真和邏輯綜合完成設(shè)計(jì)。
關(guān)鍵詞:異步FIFO;時(shí)鐘域;Verilog
引言
當(dāng)今集成電路設(shè)計(jì)的主導(dǎo)思想之一就是設(shè)計(jì)同步化,即對(duì)所有時(shí)鐘控制器件(如觸發(fā)器、RAM等)都采用同一個(gè)時(shí)鐘來(lái)控制。但在實(shí)際的應(yīng)用系統(tǒng)中,實(shí)現(xiàn)完全同步化的設(shè)計(jì)非常困難,很多情況下不可避免地要完成數(shù)據(jù)在不同時(shí)鐘域間的傳遞(如高速模塊和低速模塊之間的數(shù)據(jù)交換)。這時(shí),如何保持系統(tǒng)的穩(wěn)定,順利完成數(shù)據(jù)的傳輸就成為一個(gè)重要的問(wèn)題,這也是異步電路設(shè)計(jì)中最為棘手的問(wèn)題。
通常的做法是采用對(duì)每位信號(hào)加同步器或增加握手信號(hào)來(lái)解決這一問(wèn)題,但這樣會(huì)增加系統(tǒng)的復(fù)雜度且影響傳輸速度。本文的做法是在兩個(gè)時(shí)鐘域的交界處設(shè)計(jì)一個(gè)異步FIFO,通過(guò)它來(lái)實(shí)現(xiàn)數(shù)據(jù)流的傳輸。由發(fā)送時(shí)鐘域?qū)?shù)據(jù)寫(xiě)入,接收時(shí)鐘域?qū)?shù)據(jù)取出,在數(shù)據(jù)傳輸?shù)耐瑫r(shí)實(shí)現(xiàn)了數(shù)據(jù)的緩存,因此是一種較理想的方法。
不同時(shí)鐘域間數(shù)據(jù)傳遞的
問(wèn)題及其解決方法
不同時(shí)鐘域間數(shù)據(jù)傳遞的最重要問(wèn)題就是亞穩(wěn)態(tài)問(wèn)題。當(dāng)數(shù)據(jù)信號(hào)通過(guò)兩個(gè)時(shí)鐘域的交界處時(shí),將會(huì)分別由這兩個(gè)時(shí)鐘來(lái)控制信號(hào)的值。此時(shí)如果兩時(shí)鐘信號(hào)的敏感沿非常接近并超過(guò)了允許的額度,則將出現(xiàn)數(shù)據(jù)信號(hào)的不穩(wěn)定,即電路陷入亞穩(wěn)態(tài),也稱(chēng)為同步失敗。亞穩(wěn)態(tài)是在兩時(shí)鐘敏感沿靠得很近、第二級(jí)時(shí)鐘敏感沿到來(lái)時(shí)其輸入數(shù)據(jù)不穩(wěn)時(shí)發(fā)生,可將其視為僅僅是第二級(jí)觸發(fā)器輸入信號(hào)不穩(wěn)定所導(dǎo)致的結(jié)果。只要使輸入信號(hào)穩(wěn)定,就能解決亞穩(wěn)態(tài)問(wèn)題。
針對(duì)如上所述亞穩(wěn)態(tài)的特點(diǎn),可設(shè)計(jì)一個(gè)同步器來(lái)保證數(shù)據(jù)的穩(wěn)定傳輸以解決這個(gè)問(wèn)題。其原理在于使信號(hào)在新的時(shí)鐘域中先穩(wěn)定下來(lái)再進(jìn)入相關(guān)的邏輯,以保證信號(hào)與新的時(shí)鐘同步。本設(shè)計(jì)在時(shí)鐘域的接口處就采用此法。
異步FIFO模塊設(shè)計(jì)及實(shí)現(xiàn)
異步FIFO結(jié)構(gòu)設(shè)計(jì)
本文所設(shè)計(jì)的異步FIFO采用循環(huán)隊(duì)列方式,由獨(dú)立的兩個(gè)時(shí)鐘Iclk和Oclk來(lái)控制讀、寫(xiě)指針。模塊結(jié)構(gòu)如圖1所示。
輸入端口:輸入端時(shí)鐘Iclk,輸出端時(shí)鐘Oclk,8位并行輸入數(shù)據(jù)Din,復(fù)位信號(hào)Rst_。
輸出端口:8位并行輸出數(shù)據(jù)Dout,F(xiàn)IFO寫(xiě)滿(mǎn)信號(hào)Full,F(xiàn)IFO讀空信號(hào)Empty。
信號(hào)后綴:i—由輸入時(shí)鐘域控制、o—由輸出時(shí)鐘域控制、g—GRAY碼、b—二進(jìn)制自然碼。
由于FIFO的空、滿(mǎn)是通過(guò)比較讀、寫(xiě)指針來(lái)確定的,而讀、寫(xiě)指針?lè)謩e屬于Oclk和Iclk兩個(gè)時(shí)鐘域,所以對(duì)其比較時(shí)要進(jìn)行同步化處理,即用到雙觸發(fā)器型同步器,以避免亞穩(wěn)態(tài)的出現(xiàn)。以寫(xiě)指針Wp為例。Wpib轉(zhuǎn)換為Wpig,一方面控制Din的寫(xiě)入地址,另一方面通過(guò)同步和GRAY到二進(jìn)制碼轉(zhuǎn)換送入到Oclk。本文將傳輸?shù)腤p由GRAY碼形式轉(zhuǎn)換為二進(jìn)制形式,形成Wpob。此時(shí)Wpob與Rpob為同步信號(hào),比較其大小后可判斷FIFO是否讀空來(lái)控制FlagE信號(hào)。若FIFO為空,則FlagE置Empty信號(hào),同時(shí)調(diào)整Rpob停止讀出數(shù)據(jù)。同理可知Rp和Full的控制過(guò)程。
在整個(gè)數(shù)據(jù)流動(dòng)過(guò)程中,需要跨過(guò)時(shí)鐘域的指針經(jīng)歷了兩次碼制的變化:二進(jìn)制碼到GRAY碼和GRAY碼到二進(jìn)制碼。前者是利用GRAY碼在遞增時(shí)每次只有一位發(fā)生變化的特點(diǎn),以GRAY碼的形式通過(guò)時(shí)鐘域分界線(xiàn)最大限度減小了指針信號(hào)的變化,避免了信號(hào)傳輸中的抖動(dòng)。而再將信號(hào)由GRAY碼轉(zhuǎn)換為二進(jìn)制碼進(jìn)行比較則是由FIFO異步的特點(diǎn)所決定。由于讀、寫(xiě)指針異步,不存在穩(wěn)定的相對(duì)關(guān)系,為避免讀、寫(xiě)指針同時(shí)對(duì)一個(gè)存儲(chǔ)單元進(jìn)行操作,在對(duì)FIFO做空、滿(mǎn)比較時(shí)會(huì)對(duì)指針差留下一定余量。由于GRAY碼形式不易于直接比較這種有固定差額的數(shù)值,所以將其轉(zhuǎn)化為二進(jìn)制碼進(jìn)行比較。
HDL實(shí)現(xiàn)
下面采用Verilog HDL語(yǔ)言在RTL級(jí)上設(shè)計(jì)此異步FIFO數(shù)據(jù)通道。此方案的核心在于GRAY碼到二進(jìn)制的轉(zhuǎn)換和同步器的設(shè)計(jì),均在同步和GRAY到二進(jìn)制碼轉(zhuǎn)換模塊中實(shí)現(xiàn),程序如下:
……
always@(posedge Oclk or negedge Rst_)// Oclk domain synchronization
if(!Rst_)
……//initialize Wpmg1,Wpmg2 and Wpob
else
begin
Wpmg1<= Wpig;
Wpmg2<= Wpig1;
Wpob[0]<= Wpmg2[5]^Wpmg2[4] ^Wpmg2[3] ^Wpmg2[2] ^Wpmg2[1] ^Wpmg2[0];//GRAY to binary
Wpob[1]<= Wpmg2[5]^Wpmg2[4] ^Wpmg2[3] ^Wpmg2[2] ^Wpmg2[1];
……
Wpob[0]<= Wpmg2[5];
end
……
如上程序所示,以寫(xiě)指針為例,輸入時(shí)鐘GRAY碼寫(xiě)指針Wpig進(jìn)入輸出時(shí)鐘域后賦給兩個(gè)串行寄存器Wpmg1、Wpmg2,此后將Wpmg2變換成二進(jìn)制碼并傳輸給下一級(jí)寄存器Wpob。這樣就完成跨時(shí)鐘域數(shù)據(jù)的同步化并實(shí)現(xiàn)了碼制的變換。
這樣,當(dāng)讀、寫(xiě)信號(hào)被順利同步化以后,實(shí)際上其中通過(guò)時(shí)鐘域邊界的信號(hào)(仍以Wpob為例)已被同步器延遲了兩個(gè)Oclk周期,在這段時(shí)間內(nèi)Wpib有可能已經(jīng)在Iclk作用下增加了。如果使用“Wpob=Rpob”為條件來(lái)判斷FIFO達(dá)到空狀態(tài),則此時(shí)實(shí)際控制讀FIFO主體的指針Wpig可能已繼續(xù)下行,導(dǎo)致讀出錯(cuò)誤的數(shù)據(jù)。為避免這種情況的出現(xiàn),進(jìn)行指針比較時(shí)是留有一定余地的,具體程序如下:
……
parameter DIFF=3’b 100;
……
assign FlagE=((Wpob<=Rpob +DIFF)&&(Wpob>=Rpob))?1:0;
……
如上程序所示,以空標(biāo)志為例,比較的是保留了4位的“即空”狀態(tài),即讀指針離寫(xiě)指針還差4個(gè)周期時(shí),就認(rèn)為其讀“空”,從而置讀空標(biāo)志FlagE。對(duì)于一個(gè)FIFO而言,數(shù)據(jù)流在其中是連續(xù)流動(dòng)的,“即空”狀態(tài)的判斷是通過(guò)減小FIFO的最大容量來(lái)保證傳輸?shù)姆€(wěn)定。
仿真驗(yàn)證和綜合
設(shè)系統(tǒng)復(fù)位后Din輸入為從0開(kāi)始每Iclk周期加1至63的循環(huán)變化數(shù)據(jù)。如果仿真時(shí)鐘周期Iclk設(shè)為30ns、Oclk設(shè)為50ns,所得結(jié)果如圖2所示。
從圖2中可以看到,當(dāng)輸入時(shí)鐘頻率大于輸出時(shí)鐘頻率時(shí)會(huì)出現(xiàn)數(shù)據(jù)寫(xiě)滿(mǎn)的情況。因?yàn)榇藭r(shí)寫(xiě)時(shí)鐘是快時(shí)鐘,故寫(xiě)滿(mǎn)比較發(fā)生在輸入時(shí)鐘域。當(dāng)比較到兩指針差等于定義的DIFF值(此時(shí)為4)時(shí),由Iclk觸發(fā)寫(xiě)滿(mǎn)信號(hào)給前級(jí)系統(tǒng)。同理可得空狀態(tài)的仿真也能達(dá)到設(shè)計(jì)要求。
對(duì)于邏輯綜合,本文使用Synopsys公司的Design Compiler工具實(shí)現(xiàn)ASIC綜合。通過(guò)生成的Violators.rpt、area.rpt、tim_max.rpt、lib.rpt等報(bào)告觀察綜合所得電路的特性,可知此設(shè)計(jì)無(wú)violated constraints,表明綜合結(jié)果能夠達(dá)到約束條件的要求,此設(shè)計(jì)能在給定條件下工作,即約束成功。
結(jié)語(yǔ)
本文討論了異步設(shè)計(jì)中數(shù)據(jù)在不同時(shí)鐘域間傳遞所產(chǎn)生的亞穩(wěn)態(tài)問(wèn)題及其解決方法,使用Verilog HDL,采用Top-Down的模塊設(shè)計(jì)方法實(shí)現(xiàn)了一種解決此問(wèn)題的異步FIFO方案。經(jīng)驗(yàn)證這種方案能方便安全地實(shí)現(xiàn)數(shù)據(jù)跨時(shí)鐘域的傳遞,并能同時(shí)起到數(shù)據(jù)緩存的作用,因此是一種較好的解決方法。■
參考文獻(xiàn)
1 A.Chakraborty, M.R.Greenstreet A minimal source-synchronous interface, ASIC/SOC Conference, 2002. 15th Annual IEEE International , 25-28 Sept. 2002 Page(s): 443 -447
2 William J. Dally,John W. Poulton Digital Systems Engineering,
CambridgeUniversity Press, 1998, Page(s): 468.
3 Clifford E. Cummings Synthesis and Scripting Techniques for Designing Multi-Asynchronous Clock Designs, Sunburst Design, Inc.
評(píng)論