分類:IC技術(shù)文章 首先要了解的是異步FIFO使用格雷碼的唯一目的就是“即使在亞穩(wěn)態(tài)進(jìn)行讀寫指針抽樣也能進(jìn)行正確的空滿狀態(tài)判斷”。
那么典型的判斷方法是怎樣進(jìn)行的呢?以滿狀態(tài)判斷為例,先要對讀指針(屬于讀時鐘域)在寫時鐘域進(jìn)行抽樣,然后才能與寫指針進(jìn)行比較,如果寫指針趕上了讀指針,說明已經(jīng)寫滿,寫操作必須暫停。 接下來說說為什么2進(jìn)制指針不適合做空滿判斷。事實(shí)上2進(jìn)制讀指針在增減時,經(jīng)常發(fā)生多位突變,比如6位地址111111會在下一時刻變成000000,在實(shí)際電路中,這個變化過程要持續(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ā)生改變。為什么這么說呢?因?yàn)楫?dāng)只有一個比特發(fā)生改變時,即使在中間狀態(tài)抽樣,其結(jié)果也不外乎兩種:遞增前原指針和遞增后新指針。顯然遞增后新指針是最新情況的反映,如果抽樣到這個指針,那么和我們的設(shè)計(jì)預(yù)期是一致的,如果抽樣到遞增前的原指針,會有什么結(jié)果呢?假設(shè)現(xiàn)在抽樣讀指針,那么最壞的情況就是把“不滿”判斷成了“滿”,使得本來被允許的寫操作被禁止了,但是這并不會對邏輯產(chǎn)生影響,只是帶來了寫操作的延遲。同樣的,如果現(xiàn)在抽樣寫指針,那么最壞的情況就是把“不空”判斷成了“空”,使得本來被允許的讀操作被禁止了,但是這也不會對邏輯產(chǎn)生影響,只是帶來了讀操作的延遲。 顯然每次只變化1比特的編碼方案可以有效解決中間狀態(tài)下空滿狀態(tài)的判斷問題,格雷碼就是這樣的一種編碼。 -------------------------------------- 在編寫狀態(tài)機(jī)時,我也喜歡用這種相鄰狀態(tài)只發(fā)生一位翻轉(zhuǎn)的編碼。這樣從一個狀態(tài)切換到下一個狀態(tài),就只有一位寄存器發(fā)生變化。這么做可以帶來降低功耗的好處,因?yàn)榧拇嫫鞯姆D(zhuǎn)是消耗動態(tài)功耗的,而這種編碼將翻轉(zhuǎn)的次數(shù)降到最低,所有有利于降低功耗。 P=a*C*V^2*f 其中a為信號翻轉(zhuǎn)率,C為系統(tǒng)等效電容,V為電路驅(qū)動電壓,f為時鐘頻率。使用格雷碼降低功耗就是想使a小下來。當(dāng)然如果電路中做不到嚴(yán)格的格雷碼也沒關(guān)系,只要是有利于減小a的,就有利于功耗的降低。 --------------------------------------------------- 期待牛人能對低功耗設(shè)計(jì)的內(nèi)容普及一下。在移動的智能終端上低功耗的問題已經(jīng)越來越受重視了。 回答四: 由于跳變減少,可減少功耗,多用于低功耗設(shè)計(jì)中。 如果單指gray的話確實(shí)如此 但是在實(shí)際應(yīng)用中,往往是將二進(jìn)制的轉(zhuǎn)換成gray 就是說不管如何二進(jìn)制的數(shù)依然會存在 同時其轉(zhuǎn)換的外加邏輯必然會帶來損耗, 在多比特的情況,功耗是否會跟多呢 gray一般是用在不同時鐘域的連續(xù)數(shù)值的傳送,即數(shù)據(jù)必須是遞增或遞減的 這樣,其主要是在asynchronou fifo中使用 感覺功耗并不會下降 |
|