導(dǎo)言
在很久之前便陸續(xù)談過亞穩(wěn)態(tài),F(xiàn)IFO,復(fù)位的設(shè)計。本次亦安做一個簡單的總結(jié),從宏觀上給大家展示跨時鐘域的解決方案。
什么是亞穩(wěn)態(tài)?
對大多數(shù)工程師來講,亞穩(wěn)態(tài)是非常難以追蹤的,因為它具有不確定性,在相對規(guī)范的設(shè)計下,如果仍然發(fā)生這個問題,那么可能非常難以復(fù)現(xiàn)異常。簡單來講,當(dāng)觸發(fā)器不滿足建立時間和保持時間要求時,就會導(dǎo)致亞穩(wěn)態(tài)。亞穩(wěn)態(tài)出現(xiàn)時,觸發(fā)器既不是高邏輯也不是低邏輯,后續(xù)電路則可能讀取為0或者1(不確定狀態(tài)),導(dǎo)致電路邏輯做出不符合當(dāng)前事物邏輯的事情。
對于數(shù)字設(shè)計人員來講,只要信號從一個時鐘域跨越到另一個時鐘域,那么就可能發(fā)生亞穩(wěn)態(tài)。我們稱為“跨時鐘域”即“Clock Domain Crossing”,或CDC。
所以今天主要簡單了解如何處理CDC這些基礎(chǔ)問題。
同步跨時鐘域信號
對大多數(shù)初學(xué)者來講,當(dāng)我們遇到CDCs時,有經(jīng)驗的工程師會告訴我們“打兩拍”,即讓信號通過兩個 flip-flops,每個flip-flop都由新時鐘域的時鐘驅(qū)動(如下圖)。第一個觸發(fā)器出現(xiàn)亞穩(wěn)態(tài)的概率很高,但第二個觸發(fā)器的輸出亞穩(wěn)態(tài)的概率就會低得多。當(dāng)然更多的flip-flops會讓亞穩(wěn)態(tài)的概率進一步下降,但一般下降的概率差距不會太大,如何選擇取決于設(shè)計者自己。但并非多數(shù)CDC問題都能用這種簡單方法,這種設(shè)計適用于舊時鐘域比新時鐘域慢的多的情況。經(jīng)典的可配置的代碼如下。
//Language:Verilog-2001 `resetall `timescale1ns/1ps `default_nettypenone /* *Synchronizesanasyncronoussignaltoagivenclockbyusingapipelineof *tworegisters. */ modulesync_signal#( parameterWIDTH=1,//widthoftheinputandoutputsignals parameterN=2//depthofsynchronizer )( inputwireclk, inputwire[WIDTH-1:0]in, outputwire[WIDTH-1:0]out ); reg[WIDTH-1:0]sync_reg[N-1:0]; /* *Thesynchronizedoutputisthelastregisterinthepipeline. */ assignout=sync_reg[N-1]; integerk; always@(posedgeclk)begin sync_reg[0]<=?in; ????for?(k?=?1;?k?
異步復(fù)位同步釋放
CDC中一個常見的例子就是異步復(fù)位,這個問題我在“FPGA復(fù)位信號設(shè)計討論“一文中有詳細(xì)的表述,這里簡單講解,對于初學(xué)者而言,不太建議用異步復(fù)位,盡管他們各有優(yōu)劣,但至少對FPGA設(shè)計者而言,這個建議應(yīng)該是有效的,即使是Xilinx官方也同樣建議使用同步復(fù)位(UG949)。
但有些狀態(tài)下可能同步復(fù)位無效,比如在低功耗設(shè)計中,時鐘可能在復(fù)位前就已經(jīng)被“無效”,那么異步復(fù)位自然成為一個選擇。異步復(fù)位關(guān)鍵點不在進入復(fù)位狀態(tài),而在于移除復(fù)位,因為移除狀態(tài)可能會進入亞穩(wěn)態(tài),除了“FPGA復(fù)位信號設(shè)計討論”一文,大家同樣可以參閱我翻譯的經(jīng)典論文“同步復(fù)位與異步復(fù)位”。經(jīng)典的代碼如下所示,但請注意區(qū)別此處代碼和“打兩拍“的區(qū)別。
//Language:Verilog-2001 `resetall `timescale1ns/1ps `default_nettypenone /* *Synchronizesanactive-highasynchronousresetsignaltoagivenclockby *usingapipelineofNregisters. */ modulesync_reset# ( //depthofsynchronizer parameterN=2 ) ( inputwireclk, inputwirerst, outputwireout ); (*srl_style="register"*) reg[N-1:0]sync_reg={N{1'b1}}; assignout=sync_reg[N-1]; always@(posedgeclkorposedgerst)begin if(rst)begin sync_reg<=?{N{1'b1}}; ????end?else?begin ????????sync_reg?<=?{sync_reg[N-2:0],?1'b0}; ????end end endmodule `resetall
很多人爭論高電平復(fù)位有效好還是低電平復(fù)位有效好,一般情況下我常見低電平復(fù)位有效,但高電平復(fù)位有效也不是沒有,一般認(rèn)為在FPGA中區(qū)別不是太大,但在ASIC中,低電平似乎更加常見。
跨時鐘握手
有時需要一種方法來處理CDC,例如從慢時鐘到快時鐘,從快時鐘到慢時鐘,這時需要:握手信號,在“AXI4協(xié)議邏輯規(guī)范以及BUG處理”一文寫過握手的注意點。握手的詳細(xì)技術(shù)點感興趣的朋友可以網(wǎng)上找相關(guān)資料。
FIFO
FIFO網(wǎng)上的文章特別多,具體的設(shè)計細(xì)節(jié)有很多需要討論的地方,但對于跨時鐘域而言,F(xiàn)IFO幾乎是最方便的數(shù)據(jù)傳輸方式。這里不展開講,之前我寫過關(guān)于FIFO的相關(guān)文章,不是特別詳細(xì),接下來會有詳細(xì)的關(guān)于FIFO的計劃,在此之前,大家可以看Clifford E. Cummings經(jīng)典論文,他的論文真的很推薦。
http://www.sunburst-design.com/papers/CummingsSNUG2008Boston_CDC.pdf
審核編輯:劉清
-
FPGA設(shè)計
+關(guān)注
關(guān)注
9文章
428瀏覽量
27364 -
fifo
+關(guān)注
關(guān)注
3文章
402瀏覽量
44821 -
CDC
+關(guān)注
關(guān)注
0文章
57瀏覽量
18224 -
觸發(fā)器
+關(guān)注
關(guān)注
14文章
2039瀏覽量
62148 -
時鐘域
+關(guān)注
關(guān)注
0文章
53瀏覽量
9792
原文標(biāo)題:跨時鐘域的幾種基本處理方法
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
跨時鐘域控制信號傳輸設(shè)計方案

如何處理好FPGA設(shè)計中跨時鐘域間的數(shù)據(jù)
關(guān)于FPGA中跨時鐘域的問題分析
揭秘FPGA跨時鐘域處理的三大方法
fpga跨時鐘域通信時,慢時鐘如何讀取快時鐘發(fā)送過來的數(shù)據(jù)?
如何處理跨時鐘域這些基礎(chǔ)問題

評論