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