https://blog.csdn.net/qijitao/article/details/50969328
<article class="baidu_pl" style="box-sizing: inherit; outline: 0px; margin: 0px; padding: 16px 0px 0px; display: block; position: relative;">
首先要了解的是異步FIFO使用格雷碼的唯一目的就是“即使在亞穩(wěn)態(tài)進(jìn)行讀寫指針抽樣也能進(jìn)行正確的空滿狀態(tài)判斷”。
那么典型的判斷方法是怎樣進(jìn)行的呢炎辨?以滿狀態(tài)判斷為例刑枝,先要對讀指針(屬于讀時鐘域)在寫時鐘域進(jìn)行抽樣释液,然后才能與寫指針進(jìn)行比較,如果寫指針趕上了讀指針卧土,說明已經(jīng)寫滿,寫操作必須暫停。
接下來說說為什么2進(jìn)制指針不適合做空滿判斷娄昆。事實上2進(jìn)制讀指針在增減時,經(jīng)常發(fā)生多位突變缝彬,比如6位地址111111會在下一時刻變成000000萌焰,在實際電路中,這個變化過程要持續(xù)很長一段時間谷浅,會由111111經(jīng)歷6個狀態(tài)轉(zhuǎn)移到達(dá)000000扒俯。比如111111-> 101111 -> 100111 ->100110 -> 100100 -> 000100-> 000000。由于寫時鐘與讀時鐘不同步一疯,異步的寫時鐘很可能會在狀態(tài)不穩(wěn)定的中間某個狀態(tài)抽樣撼玄,這樣就會得到錯誤的讀指針,進(jìn)而做出錯誤的狀態(tài)判斷墩邀,導(dǎo)致系統(tǒng)異常互纯。而且由于多位同時突變,憑借概率論常識可知發(fā)生錯誤的可能性很大磕蒲。
那么怎樣才能避免這個問題的發(fā)生呢留潦?顯然只盹,在中間狀態(tài)抽樣,這個是不可避免的兔院,這是異步系統(tǒng)天生的缺陷殖卑。我們的目標(biāo)是:即使在中間狀態(tài)抽樣,也要不影響空滿狀態(tài)的判斷坊萝。符合這個要求的編碼方法是每次只能有1個比特發(fā)生改變孵稽。為什么這么說呢?因為當(dāng)只有一個比特發(fā)生改變時十偶,即使在中間狀態(tài)抽樣菩鲜,其結(jié)果也不外乎兩種:遞增前原指針和遞增后新指針。顯然遞增后新指針是最新情況的反映惦积,如果抽樣到這個指針接校,那么和我們的設(shè)計預(yù)期是一致的,如果抽樣到遞增前的原指針狮崩,會有什么結(jié)果呢蛛勉?假設(shè)現(xiàn)在抽樣讀指針,那么最壞的情況就是把“不滿”判斷成了“滿”睦柴,使得本來被允許的寫操作被禁止了诽凌,但是這并不會對邏輯產(chǎn)生影響,只是帶來了寫操作的延遲坦敌。同樣的侣诵,如果現(xiàn)在抽樣寫指針,那么最壞的情況就是把“不空”判斷成了“空”狱窘,使得本來被允許的讀操作被禁止了窝趣,但是這也不會對邏輯產(chǎn)生影響,只是帶來了讀操作的延遲训柴。
顯然每次只變化1比特的編碼方案可以有效解決中間狀態(tài)下空滿狀態(tài)的判斷問題哑舒,格雷碼就是這樣的一種編碼。
回答一:
格雷碼是的確非常有用幻馁。它的特點(diǎn)就是相鄰碼只有一位發(fā)生翻轉(zhuǎn)洗鸵,比如00->01->11->10->00...
在編寫狀態(tài)機(jī)時,我也喜歡用這種相鄰狀態(tài)只發(fā)生一位翻轉(zhuǎn)的編碼仗嗦。這樣從一個狀態(tài)切換到下一個狀態(tài)膘滨,就只有一位寄存器發(fā)生變化。這么做可以帶來降低功耗的好處稀拐,因為寄存器的翻轉(zhuǎn)是消耗動態(tài)功耗的火邓,而這種編碼將翻轉(zhuǎn)的次數(shù)降到最低,所有有利于降低功耗。
回答二:
你說的降低功耗的前提是铲咨,一個狀態(tài)到下一個狀態(tài)的變化也要遵循格雷碼連續(xù)的變化躲胳,否則,就不成立了纤勒。比如:如你所說坯苹,00<->01<->11<->10這樣的變化,確實是有利于降低功耗摇天;但是粹湃,狀態(tài)的變化不一定就是這樣變化,它有可能是00<->11泉坐,01<->10這樣的變化为鳄,那么你說的有利于降低功耗就不成立。
回答三:
低功耗設(shè)計的內(nèi)容還是很博大精深的腕让。如何合理的選擇信號形式孤钦,以使得系統(tǒng)在發(fā)生狀態(tài)變化時只有少數(shù)信號發(fā)生翻轉(zhuǎn)?所依賴的公式為
P=aCV^2*f
其中a為信號翻轉(zhuǎn)率记某,C為系統(tǒng)等效電容,V為電路驅(qū)動電壓构捡,f為時鐘頻率液南。使用格雷碼降低功耗就是想使a小下來。當(dāng)然如果電路中做不到嚴(yán)格的格雷碼也沒關(guān)系勾徽,只要是有利于減小a的滑凉,就有利于功耗的降低。
期待牛人能對低功耗設(shè)計的內(nèi)容普及一下喘帚。在移動的智能終端上低功耗的問題已經(jīng)越來越受重視了畅姊。
回答四:
主要是為了多比特同步,這個例子中功耗是次要的因素
回答五:
格雷碼有兩個作用吹由,一是消除多個比特同時變化帶來的潛在競爭與冒險若未,二是降低功耗(翻轉(zhuǎn)次數(shù)減少)。在狀態(tài)機(jī)中通常為了簡單起見表示現(xiàn)態(tài)與次態(tài)的狀態(tài)參數(shù)并不使用格雷碼而是二進(jìn)制碼倾鲫,因為一個狀態(tài)的變化可能是發(fā)散的而非單向的粗合,就是說不同的條件對應(yīng)不同的次態(tài),這個時候用格雷碼對狀態(tài)進(jìn)行編碼達(dá)不到一次只變化一位的目的乌昔,除非在特殊情況下隙疚,即狀態(tài)機(jī)的變化是單向的,總是由S0到S1磕道,再到S2供屉,等等,這個時候用格雷碼就能達(dá)到原來的目的。
回答六:
十進(jìn)制計數(shù)容易產(chǎn)生毛刺伶丐,格雷碼則不會產(chǎn)生毛刺悼做。
回答七:
格雷碼每次只有一位跳變,兩級寄存才安全撵割。
回答八:
在異步的FIFO中贿堰,采用格雷碼進(jìn)行計數(shù),相鄰的數(shù)據(jù)僅僅只有1bit變化啡彬,這樣在兩個時鐘域同步的時候僅僅可能只有1bit產(chǎn)生亞穩(wěn)態(tài)羹与,通過同步以后,亞穩(wěn)態(tài)可以消除庶灿,最壞的情況是這1bit采錯纵搁,但是即使是采錯地址也只是相差1個,這對判斷空滿標(biāo)志不會產(chǎn)生影響往踢。
如果是采用10十進(jìn)制進(jìn)行編碼腾誉,則相鄰的數(shù)據(jù)可能有很多位同時進(jìn)行變化,那么如果多位同時產(chǎn)生亞穩(wěn)態(tài)而且同時采錯數(shù)據(jù)峻呕,會對寄存器的空滿標(biāo)志做出嚴(yán)重錯誤的判斷利职,會丟失數(shù)據(jù)或者讀出無用的數(shù)據(jù),使系統(tǒng)出錯瘦癌。
回答九:
樓上說的都很精彩猪贪!順便補(bǔ)充一點(diǎn):
由于跳變減少,可減少功耗讯私,多用于低功耗設(shè)計中热押。
回答十:
我在想這個問題,
如果單指gray的話確實如此
但是在實際應(yīng)用中,往往是將二進(jìn)制的轉(zhuǎn)換成gray
就是說不管如何二進(jìn)制的數(shù)依然會存在
同時其轉(zhuǎn)換的外加邏輯必然會帶來損耗,
在多比特的情況,功耗是否會跟多呢
gray一般是用在不同時鐘域的連續(xù)數(shù)值的傳送,即數(shù)據(jù)必須是遞增或遞減的
這樣,其主要是在asynchronou fifo中使用
感覺功耗并不會下降