今天經(jīng)過與HR的交談意識(shí)到自己對(duì)于異步FIFO的理解還不深,因此回來之后又其結(jié)構(gòu)進(jìn)行了一些理解,于此分享。 異步FIFO的設(shè)計(jì):http://blog.csdn.net/moon9999/article/details/77822606 疑問1:進(jìn)行數(shù)據(jù)空滿的對(duì)比時(shí),讀寫時(shí)鐘域都有讀寫指針,此時(shí)應(yīng)該怎么對(duì)比?為什么? 另外一篇博客中有這樣的話: 同步rd_cntr至clk_write時(shí)鐘域,再與wr_cntr進(jìn)行對(duì)比來決定FIFO是否滿;(判斷滿是wr_cntr - rd_cntr) 這是結(jié)論,那現(xiàn)在我們必須要仔細(xì)的思考這句話為什么是這么做的。 首先畫個(gè)示意圖。
那現(xiàn)在我們來設(shè)想各種情況下會(huì)發(fā)生什么,在此我們暫時(shí)不考慮亞穩(wěn)態(tài)的事情,認(rèn)為信號(hào)通過同步模塊都被采到了但是會(huì)有信號(hào)丟失。 第一種情況我們假定寫時(shí)鐘特別快,讀時(shí)鐘都采不齊寫指針。 那么此時(shí)空邏輯會(huì)不會(huì)出錯(cuò)呢?假設(shè)寫指針已經(jīng)跑了1 2 3 4 5 6 7 8 9,而讀時(shí)鐘采到了1 2 6 8;那么如果此時(shí)讀指針就在8,兩邊一對(duì)比發(fā)現(xiàn)一樣(當(dāng)然了這只是假設(shè)的一種情況)則會(huì)報(bào)“空”!那么實(shí)際空沒空呢,沒有因?yàn)槲覍懙?了寫進(jìn)去了一個(gè)數(shù),不過沒關(guān)系之后必然會(huì)采到9(或者采到10一類的),狀態(tài)會(huì)很快恢復(fù)正常,或者說沒有空而報(bào)了空我們還可以接受,因?yàn)檫@樣對(duì)于一個(gè)將要空的FIFO會(huì)停止讀數(shù)旋即恢復(fù)正常,不會(huì)使其數(shù)據(jù)發(fā)生紊亂。那會(huì)不會(huì)有空了而報(bào)不空使得讀出數(shù)據(jù)出現(xiàn)問題的情況呢?不會(huì)的,你想想看寫指針跑的比你采樣的快,是趨向與“不空”(越寫數(shù)據(jù)越多嘛)的,因此不會(huì)出現(xiàn)這樣的錯(cuò)誤。 讀指針被同步到寫時(shí)鐘域本身不會(huì)出現(xiàn)漏采的情況,因此“滿”邏輯的判斷不會(huì)出現(xiàn)問題。 第二種情況我們假定讀時(shí)鐘域特別快,寫時(shí)鐘都采不齊讀指針。 此時(shí)的滿邏輯會(huì)出錯(cuò)么?我們來看下。我們同樣假設(shè)讀指針從1跑到了9,而只被采樣到了7。如果此時(shí)寫指針也寫到了7,那么二者一比較發(fā)現(xiàn)寫“滿”了,實(shí)際呢沒有滿,不過此時(shí)也會(huì)停止外部寫入(傳出了滿的信號(hào)),這是不會(huì)對(duì)FIFO中的數(shù)據(jù)產(chǎn)生影響的,并且很快會(huì)恢復(fù)到“不滿”。如果此時(shí)寫指針到了5,那么二者對(duì)比會(huì)得出“不滿”的邏輯傳出,真實(shí)情況呢同樣是不滿,因?yàn)樽x到7就已經(jīng)不滿了真實(shí)情況讀到了9自然更加“不滿”。這樣就解釋清楚了。 寫指針被同步到讀時(shí)鐘域本身不會(huì)出現(xiàn)漏采的情況,因此“空”邏輯的判斷不會(huì)出現(xiàn)問題。 受到HR的點(diǎn)播或許我們可以選擇一種記法: “滿”邏輯是要給誰的——給寫信號(hào)告訴他你別寫了——那么寫指針能多跑出去么?跑多了不就把數(shù)據(jù)覆蓋了!——所以必須在寫時(shí)鐘域進(jìn)行對(duì)比; “空”邏輯是要給誰的——給讀信號(hào)告訴他你別讀了——那么讀指針能多跑出去么?跑多了不就讀出來錯(cuò)誤的數(shù)了!——所以在讀時(shí)鐘域進(jìn)行對(duì)比; 我現(xiàn)在先理解到這一步吧。 疑問2:為什么要用格雷碼進(jìn)行同步傳輸? 我覺得使用格雷碼的優(yōu)勢(shì)體現(xiàn)在讀寫時(shí)鐘差異不是特別大的時(shí)候,不能一個(gè)是1000M一個(gè)是10M那誰也救不了了,無限加長(zhǎng)FIFO深度吧。那么我們假定讀寫時(shí)鐘頻率差異沒有過大,例如一個(gè)133M一個(gè)100M這樣的。 我們要知道這個(gè)異步時(shí)鐘采樣,再不經(jīng)過特殊處理的情況下采錯(cuò)了是在所難免的。單個(gè)信號(hào)可能采錯(cuò)或者沒采到,那多個(gè)信號(hào)的讀寫指針就更加有可能出問題了。我們來看下如果此時(shí)的指針是1011(二進(jìn)制=2),那么在向1100(2)跳變時(shí)候,由于信號(hào)走的距離不一樣啦觸發(fā)事件或者邏輯門延時(shí)不同啦等等原因,在另外一段時(shí)鐘域就可能采出多種情況例如1011(2)、1110(2)、1101(2)等,總之每個(gè)信號(hào)都可能是正確值或者未跳變時(shí)候的值。那么在得到“空”“滿”邏輯時(shí)候很大可能概率會(huì)出錯(cuò),這個(gè)我們不能忍。過程如下圖所示。 所以說我們就要選擇格雷碼了,來看下格雷碼發(fā)生了什么事。1011(2)=1110(g),1100(2)=1010(g),因此格雷碼跳變?yōu)?110(g)->1010(g)。同樣考慮采樣出問題了,由于我們提前說好了讀寫時(shí)鐘頻率差距不是太大,因此采樣可能得到兩種情況:1110(g)和1010(g),到另外的時(shí)鐘域后會(huì)轉(zhuǎn)換為二進(jìn)制的1011(2)和1100(2)??吹竭@里是不是想到了什么!你看如果得到的是1100那沒問題呀,這就是真是的值。如果是得到1011呢?我實(shí)際跑到了1100你采到了1011是不是類似于上一個(gè)問題的“指針實(shí)際已經(jīng)跑到了9而你只采到了7,會(huì)不會(huì)出問題”,答案是不會(huì)呀!原因就在于我們進(jìn)行對(duì)比時(shí)時(shí)鐘域的選擇已經(jīng)解決了這個(gè)問題。因此可知使用格雷碼即時(shí)出現(xiàn)了采樣錯(cuò)誤的情況,也不會(huì)時(shí)“空滿”判定出現(xiàn)問題。
|
|