無(wú)論是數(shù)據(jù)通訊或者SOC(包括FPGA或者ASIC設(shè)計(jì))設(shè)計(jì),跨時(shí)鐘域(clock domain crossing)處理都是一件讓人很頭疼的事情,無(wú)論是在設(shè)計(jì)的前端或者步入設(shè)計(jì)的后端,都沒(méi)有很好的工具去做保證,只能靠設(shè)計(jì)人員的經(jīng)驗(yàn)進(jìn)行最大的保證,然而這個(gè)問(wèn)題如果處理不好,你的整個(gè)設(shè)計(jì)可能就完全報(bào)廢,而最怕的是你的設(shè)計(jì)時(shí)好時(shí)壞,有時(shí)穩(wěn)定,有時(shí)出錯(cuò),這個(gè)時(shí)候你甚至很難進(jìn)行定位(尤其是上了FPGA開(kāi)發(fā)板或者芯片已經(jīng)tapout了)。
一般而言,處理跨時(shí)鐘域的方法有這么幾種(大家在網(wǎng)上也都能找到資料,這些資料大都來(lái)自幾篇經(jīng)典的論文,中文方面的資料大都是翻譯過(guò)著理解這幾篇論文而來(lái)):少量的數(shù)據(jù)用邊沿檢測(cè)電路,或者脈沖檢測(cè)電路,或者電平檢測(cè)電路,或者兩級(jí)觸發(fā)器;比較多的數(shù)據(jù)時(shí)用異步FIFO。
本文側(cè)重講解本人對(duì)異步FIFO的深入理解,講解兩種經(jīng)典的異步FIFO的設(shè)計(jì)方案,這兩種方案來(lái)自一篇文章《simulation and synthesis techniques for asynchronous FIFO design》,大家可自行下載,設(shè)計(jì)思路這篇文章里面介紹的很詳細(xì),解釋的也很出色,我更多的是談?wù)勎业牟糠掷斫狻?/p>
1、異步FIFO設(shè)計(jì)的難點(diǎn)在哪里
1)寫(xiě)地址和讀地址處于不同的時(shí)鐘域,如何比對(duì)寫(xiě)地址和讀地址才能正確的產(chǎn)生空滿信號(hào);
2)當(dāng)讀寫(xiě)地址相同時(shí),究竟是讀空了還是寫(xiě)滿了(因?yàn)榇嬖谀阕肺亿s的情況,類(lèi)似于一個(gè)圓環(huán))。
2、處理思路
1)對(duì)于難點(diǎn)1大家自然想到采用同步處理的方式,具體為將寫(xiě)地址或者讀地址同步(例如利用兩級(jí)觸發(fā)器)到對(duì)方的時(shí)鐘域中,在相同的時(shí)鐘域中進(jìn)行地址的比對(duì),但是由于寫(xiě)地址和讀地址很多時(shí)候并不止1bit,同時(shí)進(jìn)行同步處理會(huì)增大錯(cuò)誤的概率(如地址按0111->1000跳變,此時(shí)4bit都在變化,DFF進(jìn)行同步時(shí)就很容易出錯(cuò)),因而可以先將地址(二進(jìn)制的)轉(zhuǎn)換為格雷碼(相鄰數(shù)據(jù)之間只有一個(gè)bit在變化),然后再進(jìn)行同步,最后進(jìn)行對(duì)比,這樣會(huì)大大減少錯(cuò)誤的概率。
2)對(duì)于難點(diǎn)2可以在地址前面添加1bit用于標(biāo)志位進(jìn)行區(qū)分,例如復(fù)位時(shí),讀寫(xiě)地址的標(biāo)志位都是0,如果寫(xiě)完1輪而開(kāi)始新的一輪時(shí)就將寫(xiě)地址的標(biāo)志位換為1(讀也同樣道理變換),這樣可以通過(guò)判斷標(biāo)志位加上對(duì)比地址判斷是空還是滿,具體為當(dāng)讀寫(xiě)地址的標(biāo)志位相同讀寫(xiě)地址相同時(shí)為讀空,具體為當(dāng)讀寫(xiě)地址的標(biāo)志位不同讀寫(xiě)地址相同時(shí)為寫(xiě)滿;另外也可以利用格雷碼的最高兩位00->01->10->11進(jìn)行相位的區(qū)分,具體參考我給出的文章或者網(wǎng)絡(luò)資料,其實(shí)本質(zhì)上和上面的是一個(gè)道理。
3、經(jīng)典FIFO設(shè)計(jì)方案的解讀
1)同步讀寫(xiě)地址(經(jīng)格雷碼轉(zhuǎn)換后)到對(duì)方的時(shí)鐘域
相比于直接同步二信號(hào)進(jìn)制地址(先用握手,然后同步二進(jìn)制地址)好處是格雷碼相鄰數(shù)據(jù)之間只有一個(gè)bit在變化,而二進(jìn)制由于寫(xiě)地址和讀地址很多時(shí)候并不止1bit,同時(shí)進(jìn)行同步處理會(huì)增大錯(cuò)誤的概率(如地址按0111->1000跳變,此時(shí)4bit都在變化,DFF進(jìn)行同步時(shí)就很容易出錯(cuò));利用格雷碼進(jìn)行同步,即使發(fā)生同步的時(shí)出錯(cuò)也不會(huì)造成overrun和underrun的情況(因?yàn)橥胶蟮臄?shù)據(jù)必定小于等于同步前的數(shù)據(jù),即只可能1被同步為0,而不可能0被同步為1),例如當(dāng)前的讀地址到了6,寫(xiě)地址到了8,地址8經(jīng)過(guò)同步后出錯(cuò)而變成了6,這時(shí)會(huì)出現(xiàn)地址相同而判斷為讀空,不過(guò)沒(méi)關(guān)系,讀空則不讀,至少不會(huì)出現(xiàn)underrun的情況,隨著時(shí)間的推移地址8總會(huì)被采樣到;然而格雷碼也有缺點(diǎn),只能連續(xù)變化遞增或者遞減(如果間隔變化就不符合格雷碼的特點(diǎn)了),所以設(shè)計(jì)的深度必須是2的n次冪,如果不是的話,需要重新產(chǎn)生編碼格雷碼,否則也會(huì)出現(xiàn)間隔變化不符合相鄰之間只有1bit變化的特點(diǎn)。
2)將讀寫(xiě)地址(經(jīng)格雷碼轉(zhuǎn)換后)同步到一個(gè)組合邏輯電路中(異步比較)直接比較空滿,然后將空滿信號(hào)同步到各自對(duì)應(yīng)的模塊中
雖然這種電路會(huì)給fifo帶來(lái)不好的狀態(tài),例如已經(jīng)滿了wfull==1,但是這個(gè)時(shí)候讀走一個(gè)數(shù)據(jù),由于同步的延時(shí)性,導(dǎo)致這一段時(shí)間內(nèi)wfull==1一直不變(如果沒(méi)有同步帶來(lái)的延時(shí)應(yīng)該變?yōu)?的),rempty也會(huì)遇到同樣的問(wèn)題,但是這種電路不會(huì)出現(xiàn)underrun和overrun的情況。
3)2)相比1)可能會(huì)節(jié)省面積,因?yàn)?)同步wptr[n-1:0]和rptr[n-1:0],2)只需要同步afull_n,aempty_n;1)的速率可能較2)會(huì)快些,2)中存在異步且組合邏輯比較,不利于時(shí)序的優(yōu)化。
-
fifo
+關(guān)注
關(guān)注
3文章
385瀏覽量
43464 -
數(shù)據(jù)通訊
+關(guān)注
關(guān)注
0文章
44瀏覽量
11776
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論