導(dǎo)言
在很久之前便陸續(xù)談過亞穩(wěn)態(tài),F(xiàn)IFO,復(fù)位的設(shè)計(jì)。本次亦安做一個(gè)簡單的總結(jié),從宏觀上給大家展示跨時(shí)鐘域的解決方案。
什么是亞穩(wěn)態(tài)?
對大多數(shù)工程師來講,亞穩(wěn)態(tài)是非常難以追蹤的,因?yàn)樗哂胁淮_定性,在相對規(guī)范的設(shè)計(jì)下,如果仍然發(fā)生這個(gè)問題,那么可能非常難以復(fù)現(xiàn)異常。簡單來講,當(dāng)觸發(fā)器不滿足建立時(shí)間和保持時(shí)間要求時(shí),就會(huì)導(dǎo)致亞穩(wěn)態(tài)。亞穩(wěn)態(tài)出現(xiàn)時(shí),觸發(fā)器既不是高邏輯也不是低邏輯,后續(xù)電路則可能讀取為0或者1(不確定狀態(tài)),導(dǎo)致電路邏輯做出不符合當(dāng)前事物邏輯的事情。
對于數(shù)字設(shè)計(jì)人員來講,只要信號從一個(gè)時(shí)鐘域跨越到另一個(gè)時(shí)鐘域,那么就可能發(fā)生亞穩(wěn)態(tài)。我們稱為“跨時(shí)鐘域”即“Clock Domain Crossing”,或CDC。
所以今天主要簡單了解如何處理CDC這些基礎(chǔ)問題。
同步跨時(shí)鐘域信號
對大多數(shù)初學(xué)者來講,當(dāng)我們遇到CDCs時(shí),有經(jīng)驗(yàn)的工程師會(huì)告訴我們“打兩拍”,即讓信號通過兩個(gè) flip-flops,每個(gè)flip-flop都由新時(shí)鐘域的時(shí)鐘驅(qū)動(dòng)(如下圖)。第一個(gè)觸發(fā)器出現(xiàn)亞穩(wěn)態(tài)的概率很高,但第二個(gè)觸發(fā)器的輸出亞穩(wěn)態(tài)的概率就會(huì)低得多。當(dāng)然更多的flip-flops會(huì)讓亞穩(wěn)態(tài)的概率進(jìn)一步下降,但一般下降的概率差距不會(huì)太大,如何選擇取決于設(shè)計(jì)者自己。但并非多數(shù)CDC問題都能用這種簡單方法,這種設(shè)計(jì)適用于舊時(shí)鐘域比新時(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中一個(gè)常見的例子就是異步復(fù)位,這個(gè)問題我在“FPGA復(fù)位信號設(shè)計(jì)討論“一文中有詳細(xì)的表述,這里簡單講解,對于初學(xué)者而言,不太建議用異步復(fù)位,盡管他們各有優(yōu)劣,但至少對FPGA設(shè)計(jì)者而言,這個(gè)建議應(yīng)該是有效的,即使是Xilinx官方也同樣建議使用同步復(fù)位(UG949)。
但有些狀態(tài)下可能同步復(fù)位無效,比如在低功耗設(shè)計(jì)中,時(shí)鐘可能在復(fù)位前就已經(jīng)被“無效”,那么異步復(fù)位自然成為一個(gè)選擇。異步復(fù)位關(guān)鍵點(diǎn)不在進(jìn)入復(fù)位狀態(tài),而在于移除復(fù)位,因?yàn)橐瞥隣顟B(tài)可能會(huì)進(jìn)入亞穩(wěn)態(tài),除了“FPGA復(fù)位信號設(shè)計(jì)討論”一文,大家同樣可以參閱我翻譯的經(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中,低電平似乎更加常見。
跨時(shí)鐘握手
有時(shí)需要一種方法來處理CDC,例如從慢時(shí)鐘到快時(shí)鐘,從快時(shí)鐘到慢時(shí)鐘,這時(shí)需要:握手信號,在“AXI4協(xié)議邏輯規(guī)范以及BUG處理”一文寫過握手的注意點(diǎn)。握手的詳細(xì)技術(shù)點(diǎn)感興趣的朋友可以網(wǎng)上找相關(guān)資料。
FIFO
FIFO網(wǎng)上的文章特別多,具體的設(shè)計(jì)細(xì)節(jié)有很多需要討論的地方,但對于跨時(shí)鐘域而言,F(xiàn)IFO幾乎是最方便的數(shù)據(jù)傳輸方式。這里不展開講,之前我寫過關(guān)于FIFO的相關(guān)文章,不是特別詳細(xì),接下來會(huì)有詳細(xì)的關(guān)于FIFO的計(jì)劃,在此之前,大家可以看Clifford E. Cummings經(jīng)典論文,他的論文真的很推薦。
http://www.sunburst-design.com/papers/CummingsSNUG2008Boston_CDC.pdf
審核編輯:劉清
-
FPGA設(shè)計(jì)
+關(guān)注
關(guān)注
9文章
428瀏覽量
26606 -
fifo
+關(guān)注
關(guān)注
3文章
389瀏覽量
43836 -
CDC
+關(guān)注
關(guān)注
0文章
57瀏覽量
17846 -
觸發(fā)器
+關(guān)注
關(guān)注
14文章
2003瀏覽量
61320 -
時(shí)鐘域
+關(guān)注
關(guān)注
0文章
52瀏覽量
9569
原文標(biāo)題:跨時(shí)鐘域的幾種基本處理方法
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論