??? 摘 要: 使用FIFO同步源自不同時(shí)鐘域的數(shù)據(jù)是在數(shù)字IC設(shè)計(jì)中經(jīng)常使用的方法,,設(shè)計(jì)功能正確的FIFO會遇到很多問題,探討了兩種不同的異步FIFO的設(shè)計(jì)思路,。兩種思路都能夠?qū)崿F(xiàn)功能正確的FIFO,。
??? 關(guān)鍵詞: 異步FIFO? 握手? 同步? 二進(jìn)制? 格雷碼
?
??? 本文所研究的FIFO,從硬件的觀點(diǎn)來看,,就是一塊數(shù)據(jù)內(nèi)存。它有兩個(gè)端口,,一個(gè)用來寫數(shù)據(jù),,就是將數(shù)據(jù)存入FIFO;另一個(gè)用來讀數(shù)據(jù),,也就是將數(shù)據(jù)從FIFO當(dāng)中取出,。與FIFO操作相關(guān)的有兩個(gè)指針,寫指針指向要寫的內(nèi)存部分,,讀指針指向要讀的內(nèi)存部分,。FIFO控制器通過外部的讀寫信號控制這兩個(gè)指針移動(dòng),并由此產(chǎn)生FIFO空信號或滿信號,。
??? 對于異步FIFO而言,,數(shù)據(jù)是由某一個(gè)時(shí)鐘域的控制信號" title="控制信號">控制信號寫入FIFO,而由另一個(gè)時(shí)鐘域的控制信號將數(shù)據(jù)讀出FIFO,。也就是說,,讀寫指針的變化動(dòng)作是由不同的時(shí)鐘產(chǎn)生的。因此,,對FIFO空或滿的判斷是跨時(shí)鐘域的,。如何根據(jù)異步的指針信號對FIFO的滿狀態(tài)或空狀態(tài)進(jìn)行正確的判斷是本文研究的重點(diǎn)。此外,,設(shè)計(jì)過程中的一些細(xì)節(jié)問題也將在文中涉及到,。
1 指針以及滿空信號的產(chǎn)生
??? 為了更好地說明問題,先探討一下同步FIFO指針移動(dòng)以及滿空信號的產(chǎn)生過程,。對于同步FIFO,,讀寫指針都指向一個(gè)內(nèi)存的初始位置,每進(jìn)行一次讀寫操作,,相應(yīng)的指針就遞增一次,,指向下一個(gè)內(nèi)存位置。當(dāng)指針移動(dòng)到了內(nèi)存的最后一個(gè)位置時(shí),,它又重新跳回初始位置,。在FIFO非滿或非空的情況下,,這個(gè)過程將隨著讀寫控制信號的變化一直進(jìn)行下去。如果FIFO處于空的狀態(tài),,下一個(gè)讀動(dòng)作將會導(dǎo)致向下溢出(underflow), 一個(gè)無效的數(shù)據(jù)被讀入,;同樣,對于一個(gè)滿了的FIFO,,進(jìn)行寫動(dòng)作將會導(dǎo)致向上溢出(overflow), 一個(gè)有用的數(shù)據(jù)被新寫入的數(shù)據(jù)覆蓋,。這兩種情況都屬于誤動(dòng)作,因此需要設(shè)置滿和空兩個(gè)信號,,對滿信號置位" title="置位">置位表示FIFO處于滿狀態(tài),,對滿信號復(fù)位表示FIFO非滿,還有空間可以寫入數(shù)據(jù),;對空信號置位表示FIFO處于空狀態(tài),,對空信號復(fù)位表示FIFO非空,還有有效的數(shù)據(jù)可以讀出,。
??? 當(dāng)讀指針和寫指針相等也就是指向同一個(gè)內(nèi)存位置的時(shí)候,,F(xiàn)IFO可能處于滿或空兩種狀態(tài)??梢酝ㄟ^不同的方法判斷或區(qū)分FIFO究竟是處于滿狀態(tài)還是空狀態(tài),,也就是究竟是寫指針從后趕上了讀指針, 還是讀指針從后趕上了寫指針,。本文所應(yīng)用的方法是設(shè)置一個(gè)額外的狀態(tài)位,,指針由它的地址位以及狀態(tài)位組成。地址位隨著相應(yīng)的操作遞增,,指針由內(nèi)存的最后位置返回到初始位置的時(shí)候狀態(tài)位取反,。 因此,當(dāng)讀寫指針的地址位和狀態(tài)位全部吻合的時(shí)候,,讀寫指針經(jīng)歷了相同次數(shù)的循環(huán)移動(dòng),,也就是說,F(xiàn)IFO處于空狀態(tài)(圖1(a)),;如果讀寫指針的地址位相同而狀態(tài)位相反,,寫指針比讀指針多循環(huán)一次,標(biāo)志FIFO處于滿狀態(tài)(圖1(b)),。
?
2 二進(jìn)制指針和格雷碼" title="格雷碼">格雷碼指針的同步
??? 二進(jìn)制指針是由一位狀態(tài)位和若干位二進(jìn)制編碼的地址位組成的(例如由三位地址和一位狀態(tài)位構(gòu)成的指針的變化:0000→0001→0010→0011→0100→0101→0110→0111→1000→1001→1010→1011→1100→1101→1110→1111)。如果在不同的時(shí)鐘域內(nèi)直接同步二進(jìn)制指針,,有可能產(chǎn)生問題,。例如,當(dāng)讀指針從0111向1000變化的時(shí)侯,,指針?biāo)械奈欢家兓?,如果寫時(shí)鐘恰好在讀指針的變化時(shí)刻采樣,,寫者得到的讀指針值有可能是從0000到1111中的任何一個(gè)。所以二進(jìn)制指針不宜被直接同步,,但可以通過一對握手信號同步二進(jìn)制指針,。
??? 例如,讀指針被讀者存入一個(gè)寄存器時(shí),,讀者就發(fā)出一個(gè)就緒信號,。當(dāng)寫者看到就緒信號時(shí),讀取讀指針,,發(fā)出一個(gè)收到數(shù)據(jù)的確認(rèn)信號,。當(dāng)讀者看到確認(rèn)信號時(shí),就收回就緒信號,,然后用當(dāng)前的讀指針值刷新寄存器(圖2),。在收到確認(rèn)信號前,存放讀指針的寄存器內(nèi)容保持不變,,確保了被讀取的指針的正確性,。
?
??? 為了能夠在不同的時(shí)鐘域內(nèi)直接同步指針,可以對指針使用格雷碼的編碼方式,,也就是指針每次移動(dòng)只變化一位,,這樣就避免了由于指針多位同時(shí)變化而無法直接同步的問題。圖3表示了一個(gè)三位地址的內(nèi)存用于格雷碼編碼的FIFO,。n位地址的內(nèi)存需要n+1位的格雷碼,。使用最高位(也就是第n-1位)作為狀態(tài)位,從第n-2到第0位作為地址的第n-2位到第0位,;對狀態(tài)位(也就是第n-1位)和第n-2位進(jìn)行位異或運(yùn)算產(chǎn)生地址的第n-2位(也就是地址的最高位),。通過對圖3的觀察可以得知,四位格雷碼編碼的指針和三位二進(jìn)制加狀態(tài)位編碼的指針具有同樣的功能:指針產(chǎn)生的地址循環(huán)遍歷" title="遍歷">遍歷8個(gè)內(nèi)存地址,, 每一次遍歷后狀態(tài)位取反,。值得注意的一點(diǎn),是當(dāng)指針從0100變化到1100的時(shí)候,,相應(yīng)的地址由100變?yōu)?00,,狀態(tài)位和一位地址同時(shí)發(fā)生了變化,所以不能同步由另一個(gè)時(shí)鐘域格雷碼指針產(chǎn)生的狀態(tài)位和地址位,,此時(shí)應(yīng)該直接由另一個(gè)時(shí)鐘域同步指針來完成,,由同步后的指針產(chǎn)生相應(yīng)的狀態(tài)位和地址位。
?
3 保守的滿空判斷
??? 對于異步FIFO設(shè)計(jì),,無論是采用握手還是直接同步的方法來獲取對方時(shí)鐘域的指針,,對滿空信號的判斷總是“保守”的。
??? (1)滿空信號的復(fù)位(滿信號復(fù)位表示FIFO非滿,, 空信號復(fù)位表示FIFO非空)和實(shí)際FIFO的情況相比有一定的延遲,。例如,,空信號是由讀者用讀指針與同步或握手后得到的寫指針進(jìn)行比較產(chǎn)生的。由于同步或握手需要一定的時(shí)間,,在這段時(shí)間,,寫者可能向FIFO寫入新的數(shù)據(jù),寫指針發(fā)生了變化,,此時(shí)FIFO已經(jīng)非空,,但此刻空信號仍然沒有復(fù)位。對于寫者而言,,滿信號的復(fù)位也會遇到相同的問題,。不過,在通常情況下,,F(xiàn)IFO只要確保不會向下溢出或向上溢出,,復(fù)位的延遲就不會導(dǎo)致向下溢出或向上溢出,是可以接受的,。
??? (2)滿空信號的置位(滿信號置位表示FIFO滿,, 空信號置位表示FIFO空)和FIFO的實(shí)際情況相比沒有延遲。例如,,同樣考慮FIFO為空的情況,,讀者使用讀指針和同步或握手后的寫指針進(jìn)行比較,由于FIFO為空,,寫動(dòng)作不會發(fā)生,,相應(yīng)的寫指針也保持不變,因此讀者獲得的就是當(dāng)時(shí)的寫指針值,。這樣就能馬上對空信號置位,。同樣地,在FIFO滿的情況下,,由于讀指針不發(fā)生變化,,寫者得到的是當(dāng)前的讀指針值,能夠馬上判斷FIFO為滿,。
??? 從以上兩點(diǎn)的討論可以得出結(jié)論,,F(xiàn)IFO滿空判斷是保守的,寫者可能在FIFO還有一定空間時(shí)停止寫數(shù)據(jù),,但不會在FIFO已經(jīng)滿了的情況下繼續(xù)寫數(shù)據(jù),;讀者可能在FIFO還有一些有效的數(shù)據(jù)時(shí)停止讀數(shù)據(jù),但是不會在FIFO已經(jīng)空的情況下繼續(xù)讀數(shù)據(jù),。保守的滿空判斷能夠滿足FIFO的功能要求,。
4? 二進(jìn)制指針和格雷碼指針的比較
??? 二進(jìn)制指針和格雷碼指針兩者各有優(yōu)缺點(diǎn):
??? (1)由于通過握手同步,指針可以有多位同時(shí)變化,二進(jìn)制指針每次移動(dòng)可以跳躍過任意的長度,,這樣給FIFO的某些功能的實(shí)現(xiàn)帶來了方便(例如,硬件直接控制FIFO從緩存的數(shù)據(jù)流中丟棄一個(gè)出錯(cuò)的包),;而格雷碼指針一般只能做遞增或遞減的移動(dòng),。
??? (2)二進(jìn)制指針可以用于任意大小的FIFO; 格雷碼指針只能用于大小為2的冪的FIFO。
??? (3)與直接同步相比,,通過握手同步需要多時(shí)鐘周期,,因此二進(jìn)制指針的滿空判斷比格雷碼指針的滿空判斷更“保守”;對于設(shè)計(jì)一個(gè)容量很大且由內(nèi)存構(gòu)成的FIFO來說,,由于保守判斷而損失的空間可以忽略,;但對于一個(gè)容量較小的FIFO而言,這種“保守”可能是無法接受的,。例如,,一個(gè)由8個(gè)寄存器組成的FIFO, 對于格雷碼編碼的指針,最壞情況下,,F(xiàn)IFO被寫者判斷為滿時(shí),,里面實(shí)際只存有五個(gè)數(shù)據(jù)(使用兩級同步器, 可能需要三個(gè)周期同步,,而在這三個(gè)周期內(nèi)都有讀動(dòng)作發(fā)生),;而對與二進(jìn)制編碼的指針,F(xiàn)IFO 被判為滿時(shí),,F(xiàn)IFO里可能只有三個(gè)數(shù)據(jù)或更少(使用兩級同步器,,最好的情況下,需要五個(gè)周期握手,,而在這五個(gè)周期里都有讀動(dòng)作發(fā)生),。
??? 設(shè)計(jì)者在兩種方法的比較選擇上應(yīng)該考慮到以上的幾點(diǎn)。
??? 本文介紹的異步FIFO的設(shè)計(jì)方法" title="設(shè)計(jì)方法">設(shè)計(jì)方法的兩種不同思路都能夠?qū)崿F(xiàn)功能正確的異步FIFO,。對這兩種方法設(shè)計(jì)的FIFO的優(yōu)缺點(diǎn)所做的簡要分析,,對FIFO的設(shè)計(jì)具有指導(dǎo)意義。
參考文獻(xiàn)
1 Victor P. Nelson, H. Troy Nagle,,Bill D.Carroll, J. David Irwin. Digital Logic Circuit Analysis & Design. PrenticeHall International Inc., 1997
2 William I. Fletcher. An Engineering Approach To Digital?Design. New Jersey: Prentice-Hall, 1980
3 FIFO Application Guide. IDT Inc., 1999
4 Clifford E.Cummings.Simulation and Synthesis Techniques for Asynchronous FIFO Design. SNUG 2002 (Synopsys?Users Group Conference, San Jose,CA,2002) User Papers,March 2002, Section TB2, 2nd paper.