在現(xiàn)代ic設(shè)計(jì)中,特別是在模塊與外圍芯片的通信設(shè)計(jì)中,多時(shí)鐘域的情況不可避免。當(dāng)數(shù)據(jù)從一個(gè)時(shí)鐘域傳遞到另一個(gè)域,并且目標(biāo)時(shí)鐘域與源時(shí)鐘域不相關(guān)時(shí),這些域中的動(dòng)作是不相關(guān)的,從而消除了同步操作的可能性,并使系統(tǒng)重復(fù)地進(jìn)入亞穩(wěn)定狀態(tài)[1]。在有大量的數(shù)據(jù)需要進(jìn)行跨時(shí)鐘域傳輸且對(duì)數(shù)據(jù)傳輸速度要求比較高的場(chǎng)合,異步fifo是一種簡(jiǎn)單、快捷的解決方案。
異步fifo用一種時(shí)鐘寫(xiě)入數(shù)據(jù),而用另外一種時(shí)鐘讀出數(shù)據(jù)。讀寫(xiě)指針的變化動(dòng)作由不同的時(shí)鐘產(chǎn)生。因此,對(duì)fifo空或滿(mǎn)的判斷是跨時(shí)鐘域的。如何根據(jù)異步的指針信號(hào)產(chǎn)生正確的空、滿(mǎn)標(biāo)志,是異步fifo設(shè)計(jì)成敗的關(guān)鍵。本文提出一種新穎的異步fifo設(shè)計(jì)方案,它通過(guò)先比較讀寫(xiě)地址并結(jié)合象限檢測(cè)法產(chǎn)生異步的空/滿(mǎn)標(biāo)志,再把異步的空/滿(mǎn)標(biāo)志同步到相應(yīng)的時(shí)鐘域。通過(guò)仿真驗(yàn)證,該方法是穩(wěn)定有效的。
1異步信號(hào)傳輸問(wèn)題的分析
在一個(gè)asic或fpga庫(kù)中,每種觸發(fā)器都有時(shí)序要求。對(duì)于使用上升沿觸發(fā)的觸發(fā)器來(lái)說(shuō),建立時(shí)間(setup time)是在時(shí)鐘上升沿到來(lái)之前,觸發(fā)器數(shù)據(jù)保持穩(wěn)定的最小時(shí)間;而保持時(shí)間(hold time)是在時(shí)鐘上升沿到來(lái)之后,觸發(fā)器數(shù)據(jù)還應(yīng)該保持的最小時(shí)間[2]。如圖1所示,在時(shí)鐘上升沿前后的這個(gè)窗口內(nèi)數(shù)據(jù)應(yīng)該保持不變,否則會(huì)使觸發(fā)器工作在一個(gè)不確定的狀態(tài),即亞穩(wěn)態(tài)。當(dāng)觸發(fā)器處于亞穩(wěn)態(tài),且處于亞穩(wěn)態(tài)的時(shí)間超過(guò)了一個(gè)時(shí)鐘周期時(shí),這種不確定的狀態(tài)將會(huì)影響到下一級(jí)的觸發(fā)器,最終導(dǎo)致連鎖反應(yīng),從而使整個(gè)系統(tǒng)功能失常。當(dāng)一個(gè)信號(hào)跨越某個(gè)時(shí)鐘域時(shí),對(duì)新時(shí)鐘域的電路來(lái)說(shuō)它就是一個(gè)異步信號(hào)。由于異步信號(hào)之間的時(shí)序是毫無(wú)關(guān)系的,因此必然存在setup time/hold time沖突。為了避免亞穩(wěn)態(tài)問(wèn)題,采用如圖2所示的雙鎖存器法[3],即在一個(gè)信號(hào)進(jìn)入另一個(gè)時(shí)鐘域前,將該信號(hào)用兩個(gè)鎖存器連續(xù)鎖存兩次,最后得到的采樣結(jié)果就可以消除亞穩(wěn)態(tài)。


消除亞穩(wěn)態(tài)只是保證了信號(hào)電平的穩(wěn)定,要在不同時(shí)鐘域中準(zhǔn)確傳輸數(shù)據(jù)還需要一個(gè)接口電路。異步fifo就是一種不同時(shí)鐘域之間傳遞多位數(shù)據(jù)的常用方法。
2異步fifo設(shè)計(jì)
異步fifo是一種先進(jìn)先出電路,用在需要實(shí)時(shí)數(shù)據(jù)接口的部分,用來(lái)存儲(chǔ)、緩沖在兩個(gè)異步時(shí)鐘之間的數(shù)據(jù)傳輸。主要由雙口存儲(chǔ)器、讀地址產(chǎn)生邏輯、寫(xiě)地址產(chǎn)生邏輯、空/滿(mǎn)標(biāo)志產(chǎn)生邏輯四部分構(gòu)成。圖3是一種常用的異步fifo設(shè)計(jì)方案,其中,讀地址(rptr)和空標(biāo)志(rempty)由讀時(shí)鐘 (rclk)產(chǎn)生,而寫(xiě)地址(wptr)和滿(mǎn)標(biāo)志(wfull)由寫(xiě)時(shí)鐘(wclk)產(chǎn)生。把寫(xiě)地址與讀地址相互比較以產(chǎn)生空/滿(mǎn)標(biāo)志。由于讀寫(xiě)地址的變化由不同的時(shí)鐘產(chǎn)生,所以對(duì)fifo空或滿(mǎn)的判斷是跨時(shí)鐘域的。如何避免異步傳輸帶來(lái)的亞穩(wěn)態(tài)以及正確地產(chǎn)生空/滿(mǎn)標(biāo)志是設(shè)計(jì)異步fifo的難點(diǎn)。

2.1 讀寫(xiě)地址產(chǎn)生邏輯
讀寫(xiě)地址線(xiàn)一般有多位,如果在不同的時(shí)鐘域內(nèi)直接同步二進(jìn)制碼的地址指針,則有可能產(chǎn)生亞穩(wěn)態(tài)。例如,讀指針從011變化到100時(shí),所有位都要變化,讀指針的每一位在讀時(shí)鐘的作用下,跳變不一致,即產(chǎn)生毛刺。如果寫(xiě)時(shí)鐘恰好在讀指針的變化時(shí)刻采樣,得到的采樣信號(hào)可能是000~111中的任何一個(gè),從而導(dǎo)致空/滿(mǎn)信號(hào)判斷錯(cuò)誤。由實(shí)踐可知,同步多個(gè)異步輸入信號(hào)出現(xiàn)亞穩(wěn)態(tài)的概率遠(yuǎn)遠(yuǎn)大于同步一個(gè)異步信號(hào)的概率[3]。解決這一問(wèn)題的有效方法是采用格雷碼。格雷碼的主要特點(diǎn)是相鄰的兩個(gè)編碼之間只有一位變化。圖4是格雷碼產(chǎn)生的邏輯框圖。在讀使能或?qū)懯鼓苄盘?hào)有效、并且空/滿(mǎn)標(biāo)志無(wú)效的情況下,讀寫(xiě)指針開(kāi)始累加,進(jìn)行fifo讀或?qū)懖僮?。二進(jìn)制碼與格雷碼的轉(zhuǎn)換是一個(gè)“異或”運(yùn)算:gnext=(bnext>>1)^bnext。格雷碼gnext 經(jīng)寄存器輸出格雷碼指針ptr。這種方法采用了兩組寄存器,雖然面積較大,但是有助于提高系統(tǒng)的工作頻率。
2.2 空/滿(mǎn)標(biāo)志產(chǎn)生邏輯
正確地產(chǎn)生空/滿(mǎn)標(biāo)志是設(shè)計(jì)任何類(lèi)型fifo的關(guān)鍵點(diǎn)。空/滿(mǎn)標(biāo)志產(chǎn)生的原則是:寫(xiě)滿(mǎn)而不溢出,能讀空而不多讀。傳統(tǒng)的異步fifo把讀寫(xiě)地址信號(hào)同步后再進(jìn)行同步比較以產(chǎn)生空滿(mǎn)標(biāo)志,由于讀寫(xiě)地址的每一位都需要兩級(jí)同步電路,大量使用寄存器必然要占用很大的面積。這種方法不適合設(shè)計(jì)大容量的fifo。當(dāng)讀、寫(xiě)指針相等也就是指向同一個(gè)內(nèi)存位置時(shí),fifo可能處于滿(mǎn)或空兩種狀態(tài),必須區(qū)分fifo是處于空狀態(tài)還是滿(mǎn)狀態(tài)。傳統(tǒng)的做法是把讀、寫(xiě)地址寄存器擴(kuò)展一位,最高位設(shè)為狀態(tài)位,其余低位作為地址位。當(dāng)讀寫(xiě)指針的地址位和狀態(tài)位全部吻合時(shí),fifo處于空狀態(tài);當(dāng)讀寫(xiě)指針的地址位相同而狀態(tài)位相反時(shí),fifo處于滿(mǎn)狀態(tài)。傳統(tǒng)的異步fifo工作頻率低、面積大。下面將介紹一種產(chǎn)生空/滿(mǎn)標(biāo)志的新方法。

通過(guò)異步比較讀寫(xiě)指針ptr以及讀寫(xiě)指針的最高兩位 進(jìn)行判斷,產(chǎn)生兩個(gè)異步的空/滿(mǎn)標(biāo)志信號(hào)(aempty/afull)送入讀寫(xiě)模塊進(jìn)行同步,最后向外部輸出兩個(gè)同步的空/滿(mǎn)信號(hào)(rempty/wfull)???滿(mǎn)信號(hào)的產(chǎn)生過(guò)程:如圖5所示,對(duì)于深度是2n的異步fifo,按照其讀指針rptr[n:0]和寫(xiě)指針wptr[n:0]最高兩位的不同取值,可把地址空間分為四個(gè)像限[4]。當(dāng)寫(xiě)指針比讀指針落后一個(gè)像限時(shí),意味著寫(xiě)指針即將從后面追上讀指針,fifo處于“可能將滿(mǎn)”狀態(tài),在圖6所示的空滿(mǎn)信號(hào)產(chǎn)生邏輯框圖中聲明一個(gè) direction信號(hào)并把它置為1;當(dāng)讀寫(xiě)指針完全相等并且direction為1時(shí),則fifo處于滿(mǎn)狀態(tài)并且把滿(mǎn)信號(hào)afull置為0(低電平有效);當(dāng)讀指針比寫(xiě)指針落后一個(gè)像限時(shí),意味著讀指針即將追上寫(xiě)指針,fifo處于“可能將空”狀態(tài),或者當(dāng)寫(xiě)操作復(fù)位信號(hào)wrst有效時(shí),再進(jìn)行讀操作,則fifo也處于“可能將空”狀態(tài),此時(shí)把direction信號(hào)置為0;當(dāng)讀寫(xiě)指針完全相等并且direction為0時(shí),則fifo處于空狀態(tài),空標(biāo)志信號(hào)aempty置為0。


讀寫(xiě)地址異步相比較產(chǎn)生低電平有效的空/滿(mǎn)標(biāo)志,其中異步滿(mǎn)信號(hào)(afull)要同步到寫(xiě)時(shí)鐘域 (wclk),異步空信號(hào)(aempty)要同步到讀時(shí)鐘域(rclk),以消除亞穩(wěn)態(tài)的影響,并向外界輸出同步的空/滿(mǎn)信號(hào)。下面以滿(mǎn)信號(hào) (wfull)為例說(shuō)明同步信號(hào)的產(chǎn)生過(guò)程:滿(mǎn)信號(hào)afull是因?yàn)閷?xiě)地址追上了讀地址并比讀地址多循環(huán)一次所產(chǎn)生,此時(shí)不能再向fifo中寫(xiě)入數(shù)據(jù),否則會(huì)造成fifo寫(xiě)溢出。由于寫(xiě)地址(wptr)的變化產(chǎn)生fifo滿(mǎn)標(biāo)志afull,即afull的下降沿與wptr同屬于寫(xiě)時(shí)鐘域。當(dāng)讀地址增加時(shí),表明已經(jīng)從fifo中讀走了一個(gè)數(shù)據(jù),afull由有效的低電平變?yōu)闊o(wú)效的高電平,即afull的上升沿與rptr同屬于讀時(shí)鐘域。可見(jiàn),afull由高變低與寫(xiě)時(shí)鐘(wclk)同步,而由低變高則與讀時(shí)鐘(rclk)同步。由于滿(mǎn)標(biāo)志afull只影響fifo的寫(xiě)入,故將其同步到寫(xiě)時(shí)鐘域。如圖6所示,采用雙鎖存器法將afull過(guò)渡到寫(xiě)時(shí)鐘域,最后得到的滿(mǎn)信號(hào)wfull就屬于寫(xiě)時(shí)鐘域。同理可以得到空標(biāo)志信號(hào)rempty。用verilog代碼實(shí)現(xiàn)如下:
wire dirset=~((wptr[n]^rptr[n-1]) & ~(wptr[n-1]^rptr[n]));
wire dirrst=~((~(wptr[n]^rptr[n-1]) & (wptr[n-1]^rptr[n])) |~wrst);
always @(posedge high or negedge dirset or negedge dirrst)
if (!dirrst) direction <= 1′b0;
else if (!dirset) direction <= 1′b1;
else direction <= high;
assign aempty=~((wptr==rptr) && !direction);
assign afull=~((wptr==rptr) && direction);
always @(posedge rclk or negedge aempty)
if (!aempty) {rempty,rempty2} <= 2′b11;
else {rempty,rempty2} <= {rempty2,~aempty};
always @(posedge wclk or negedge afull)
if (!afull) {wfull,wfull2} <= 2′b11;
else {wfull,wfull2} <= {wfull2,~afull };
異步比較法的關(guān)鍵是用異步比較結(jié)果的信號(hào)的下降沿作為最終比較結(jié)果的復(fù)位信號(hào),而其上升沿則用傳統(tǒng)的雙鎖存器法進(jìn)行同步[5]。最終得到的信號(hào)的上升沿與下降沿都屬于同一個(gè)時(shí)鐘域。與傳統(tǒng)的先將地址信號(hào)同步再進(jìn)行同步比較的方法相比,異步比較法避免了使用大量的同步寄存器,而效率則更高,實(shí)現(xiàn)也更簡(jiǎn)單。
2.3 保守的空/滿(mǎn)標(biāo)志
設(shè)計(jì)中fifo空/滿(mǎn)標(biāo)志的設(shè)置是保守的,即fifo空/滿(mǎn)標(biāo)志的置位是立即有效的,而其失效則是在一段時(shí)間之后。例如一旦讀指針追上寫(xiě)指針,就會(huì)立即聲明一個(gè)低電平有效的異步空信號(hào)aempty。此信號(hào)會(huì)立即把圖6所示的set觸發(fā)器置位,使觸發(fā)器輸出為1,即向外部輸出同步的空信號(hào)rempty,并且保證了fifo一旦為空,讀指針就不增加,避免了fifo的讀溢出。當(dāng)寫(xiě)地址增加時(shí),表明fifo已經(jīng)非空,空標(biāo)志aempty由低變高,此時(shí) 可以進(jìn)行安全的讀操作。aempty信號(hào)的失效與寫(xiě)時(shí)鐘同步。空信號(hào)rempty是在讀時(shí)鐘域中同步aempty信號(hào)得到的。由于同步器使用了兩個(gè)觸發(fā)器,因此空信號(hào)rempty的失效要經(jīng)過(guò)至少兩個(gè)時(shí)鐘周期的延遲。所以,空信號(hào)的聲明是及時(shí)的,而空信號(hào)的失效是保守的。也就是說(shuō),雖然fifo已經(jīng)非空了,但是空信號(hào)rempty要經(jīng)過(guò)幾個(gè)周期的延遲才能變?yōu)闊o(wú)效。滿(mǎn)信號(hào)也有類(lèi)似的情況。
雖然空/滿(mǎn)標(biāo)志的設(shè)置是保守的,但這并不影響fifo功能的正確性,經(jīng)驗(yàn)證保守的空/滿(mǎn)標(biāo)志能夠滿(mǎn)足fifo的設(shè)計(jì)要求。
3 仿真驗(yàn)證和綜合
根據(jù)以上分析,以深度為16、數(shù)據(jù)寬度為8位的異步fifo為例,用veriloghdl編寫(xiě)了各個(gè)模塊,并采用synopsys公司的仿真工具vcs進(jìn)行了仿真驗(yàn)證。設(shè)寫(xiě)時(shí)鐘(wclk)周期為100mhz,讀時(shí)鐘(rclk)周期為 133mhz,fifo寫(xiě)、讀時(shí)序仿真結(jié)果分別如圖7、圖8所示。當(dāng)fifo寫(xiě)滿(mǎn)時(shí),滿(mǎn)標(biāo)志wfull馬上由0變1,禁止寫(xiě)數(shù)據(jù)并且寫(xiě)地址也不再增加,fifo只讀不寫(xiě);當(dāng)fifo讀空時(shí),空標(biāo)志rempty馬上由0變1,禁止讀數(shù)據(jù)并且讀地址也不再增加,fifo只寫(xiě)不讀???滿(mǎn)信號(hào)的變化情況滿(mǎn)足設(shè)計(jì)要求。

仿真驗(yàn)證通過(guò)后,采用synopsys公司的design compiler工具進(jìn)行綜合。把采用異步比較法設(shè)計(jì)的fifo與傳統(tǒng)的先將地址信號(hào)同步再進(jìn)行比較設(shè)計(jì)的fifo相比較,在中芯國(guó)際0.35μm庫(kù)上 dc綜合結(jié)果如表1所示??梢?jiàn)相對(duì)于傳統(tǒng)的異步fifo,改進(jìn)后的異步fifo電路速度快、面積小,從而降低了功耗,提高了系統(tǒng)的穩(wěn)定性。

為了解決數(shù)據(jù)在不同時(shí)鐘域間傳遞所產(chǎn)生的亞穩(wěn)態(tài)問(wèn)題,本文討論了一種新穎的異步fifo設(shè)計(jì)方案。采用veriloghdl以及由頂向下的模塊設(shè)計(jì)方法實(shí)現(xiàn)了這種方案。經(jīng)驗(yàn)證該方案能安全地實(shí)現(xiàn)數(shù)據(jù)跨時(shí)鐘域的傳遞,并且性能比傳統(tǒng)方案有了明顯的改善。
參考文獻(xiàn)
1 ciletti md. advanced digital design with the veriloghdl[m].影印版.北京:電子工業(yè)出版社,2004:1l5~ll9
2 朱永峰,陸生禮,茆邦琴.soc設(shè)計(jì)中的多時(shí)鐘域處理[j].電子工程師,2003;(11):60~61
3 cummings c e, alfke p. simulation and synthesis techniques for asynchronousfifodesign with asynchronous pointer comparisons [z]. snug, 2002;1~18
4 cummings c e. synthesis and scripting techniques for designing multi-asynchronous clock designs[z]. snug,2001:1~26
5 楊宗凱.數(shù)字專(zhuān)用集成電路的設(shè)計(jì)與驗(yàn)證[m].北京:電子工業(yè)出版社,2004:214~225