国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

關(guān)于異步FIFO設(shè)計(jì),這7點(diǎn)你必須要搞清楚

這篇具有很好參考價(jià)值的文章主要介紹了關(guān)于異步FIFO設(shè)計(jì),這7點(diǎn)你必須要搞清楚。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

寫(xiě)在前面

? ? ? ? 在這篇文章,默認(rèn)您已經(jīng)對(duì)異步FIFO的設(shè)計(jì)方法有了基本的了解。

????????如果不了解異步FIFO設(shè)計(jì)的基本方法,可參考:異步FIFO的Verilg實(shí)現(xiàn)方法


1、什么是格雷碼(Gray Code)?

????????格雷碼是美國(guó)學(xué)者Frank Gray于1947年提出的一種二進(jìn)制編碼方式,后面這種編碼方式就以他的名字命名。實(shí)際上,格雷碼是有多種編碼形式的。根據(jù)定義,在一組數(shù)的編碼中,若任意兩個(gè)相鄰的代碼只有一位二進(jìn)制數(shù)不同,則稱這種編碼為格雷碼。

? ? ? ? 下表是不同形式的格雷碼:

異步fifo設(shè)計(jì)要素,FPGA設(shè)計(jì)與調(diào)試,fpga開(kāi)發(fā),FIFO,CDC,異步FIFO

????????表中典型格雷碼具有代表性。若不作特別說(shuō)明,格雷碼就是指典型格雷碼(后文將簡(jiǎn)稱格雷碼),它可從自然二進(jìn)制碼轉(zhuǎn)換而來(lái)。

? ? ? ? 好了,現(xiàn)在我問(wèn)你,根據(jù)格雷碼的性質(zhì)你能默寫(xiě)出16個(gè)4bit寬度的格雷碼來(lái)嗎?我想一般是比較難的,因?yàn)閱慰可鲜鲂再|(zhì)很難推導(dǎo)出來(lái)。比如說(shuō),0(0000)可以寫(xiě)出來(lái),1(0001)也可以寫(xiě)出來(lái),2(0011)也可以寫(xiě)出來(lái),但是3就不好寫(xiě)了,因?yàn)楦鶕?jù)只能變化一位的性質(zhì),可以是0111,也可以是0010,那么到底是哪個(gè)呢?如何不是經(jīng)常使用的話,我想是很難判斷的。

????????所以接下來(lái)就要介紹格雷碼的第二個(gè)性質(zhì)了:當(dāng)?shù)贜位從0變到1的時(shí)候,之后的數(shù)的N-1位會(huì)關(guān)于前半段軸對(duì)稱,而比N位高的位是相同的。

? ? ? ? 我們看一下4bit格雷碼的前四位的例子。示意圖如下:

  • 當(dāng)0001跳轉(zhuǎn)到下一位時(shí),毋庸置疑的是,第0位會(huì)維持1不變,而第1位會(huì)跳轉(zhuǎn)到1,所以可以據(jù)此畫(huà)出對(duì)稱軸
  • 高2位(第3、2位)這保持不變
  • 低位(該實(shí)例中只有第0位)關(guān)于對(duì)稱軸對(duì)稱

? ? ? ? 有了上述三點(diǎn)信息,那么就可以把剩下的2個(gè)格雷碼寫(xiě)出來(lái)了。

異步fifo設(shè)計(jì)要素,FPGA設(shè)計(jì)與調(diào)試,fpga開(kāi)發(fā),FIFO,CDC,異步FIFO

?????????

? ? ? ? 4bit格雷碼的前8位示意圖如下(這我就不啰嗦了,你們肯定看得懂):

異步fifo設(shè)計(jì)要素,FPGA設(shè)計(jì)與調(diào)試,fpga開(kāi)發(fā),FIFO,CDC,異步FIFO

? ? ? ? 格雷碼相關(guān)可參考:Verilog實(shí)現(xiàn)的格雷碼與二進(jìn)制碼的互相轉(zhuǎn)換

2、異步FIFO為什么要使用格雷碼?

? ? ? ? 異步FIFO設(shè)計(jì)最關(guān)鍵的點(diǎn)是什么?答案是“空”和“滿”的判斷。現(xiàn)在回想一下,我們是如何進(jìn)行狀態(tài)判斷的。很簡(jiǎn)單,分別構(gòu)建讀指針和寫(xiě)指針。寫(xiě)指針總是指向下一個(gè)要寫(xiě)的地址,而讀指針永遠(yuǎn)指向當(dāng)前要讀取的地址。再通過(guò)對(duì)讀、寫(xiě)指針的比較來(lái)判斷空、滿。

異步fifo設(shè)計(jì)要素,FPGA設(shè)計(jì)與調(diào)試,fpga開(kāi)發(fā),FIFO,CDC,異步FIFO

? ? ? ? 如上圖的FIFO深度為8,則其地址位寬應(yīng)該是3(2的三次方等于8)。當(dāng)寫(xiě)指針與讀指針都指向同一個(gè)位置(即相同)時(shí),可能是空狀態(tài),但也可能是滿狀態(tài)(寫(xiě)指針超過(guò)了讀指針一圈)。(這里說(shuō)句題外話,不可能是讀指針超過(guò)寫(xiě)指針一圈,因?yàn)榈x、寫(xiě)指針第一次相等時(shí),就應(yīng)該輸出空狀態(tài),然后停止對(duì)FIFO進(jìn)行讀取操作。)所以,究竟如何判斷FIFO是空還是滿呢?答案是無(wú)法判斷,只能通過(guò)在高位增加一位的方式來(lái)判斷,當(dāng)除了最高位MSB外的其他位都相同,最高位不同時(shí)則表明此時(shí)寫(xiě)指針超過(guò)了讀指針一圈,F(xiàn)IFO被寫(xiě)滿了;當(dāng)除了最高位MSB外的其他位都相同,最高位相同時(shí)則表明此時(shí)寫(xiě)指針等于讀指針,F(xiàn)IFO被讀空了。

? ? ? ? 這種方法用來(lái)對(duì)同步FIFO進(jìn)行判斷是沒(méi)有問(wèn)題的,因?yàn)橥紽IFO的讀、寫(xiě)指針是同一時(shí)鐘域下的信號(hào),可以直接對(duì)比。但是異步FIFO的讀、寫(xiě)指針是不同時(shí)鐘域下的信號(hào),如果直接對(duì)比則會(huì)有亞穩(wěn)態(tài)的問(wèn)題。為了對(duì)異步FIFO的讀、寫(xiě)指針進(jìn)行判斷,我們首先需要將其同步到統(tǒng)一的時(shí)鐘域下,而這就引發(fā)出了新的問(wèn)題----讀、寫(xiě)指針在大多數(shù)情況下都不是個(gè)單bit信號(hào),而是個(gè)多bit信號(hào)。如果讀、寫(xiě)指針直接使用2進(jìn)制的形式進(jìn)行同步,則難以避免同步過(guò)程中會(huì)出現(xiàn)的多個(gè)bit信號(hào)同時(shí)變化的問(wèn)題。如7(0111)跳轉(zhuǎn)到8(1000),此時(shí)有4個(gè)bit信號(hào)都發(fā)生了變化,如果直接同步,則由于不同信號(hào)之間的延遲(skew),可能導(dǎo)致亞穩(wěn)態(tài)、錯(cuò)采、漏采等等問(wèn)題。

? ? ? ? 此時(shí)不妨回想下格雷碼的性質(zhì):每相鄰位之間只有一個(gè)bit的變化。FIFO的指針是遞增的,這使得在傳輸遞增的多bit信號(hào)時(shí),格雷碼具有天然的優(yōu)勢(shì)。還是從7到8的例子,若使用格雷碼,則應(yīng)該是7(0100)--8(1100),這樣就只有1個(gè)bit的變化了(最高位),這樣就將多bit信號(hào)的跨時(shí)鐘域轉(zhuǎn)變成了單bit信號(hào)的跨時(shí)鐘域,而單個(gè)bit的跨時(shí)鐘域同步是很好實(shí)現(xiàn)的。

3、讀指針、寫(xiě)指針應(yīng)該被同步到哪個(gè)時(shí)鐘域?

????????異步FIFO的讀、寫(xiě)指針是不同時(shí)鐘域的信號(hào),那么就不能直接對(duì)比,而是需要將其同步到同一時(shí)鐘域才能進(jìn)行對(duì)比。現(xiàn)在問(wèn)題來(lái)了?指針應(yīng)該被同步到哪個(gè)時(shí)鐘域?可選項(xiàng)有第三方時(shí)鐘域、讀時(shí)鐘域和寫(xiě)時(shí)鐘域。接下來(lái)不妨逐個(gè)分析。

????????首先需要說(shuō)明的是,這說(shuō)的同步都是指使用2個(gè)(或者3個(gè),但此類情況不多)FF(觸發(fā)器)來(lái)進(jìn)行同步(俗稱“打兩拍”),這種同步方式是有延遲的(時(shí)序開(kāi)銷,可以看做是兩個(gè)目同步時(shí)鐘周期)。

????????第三方時(shí)鐘域不難知道一個(gè)信號(hào)從一個(gè)時(shí)鐘域同步到另一個(gè)時(shí)鐘域(被同步時(shí)鐘域)是需要時(shí)間的(這里僅考慮從滿到快,也就是暫時(shí)不考慮漏采的問(wèn)題),需要的時(shí)間取決于被同步時(shí)鐘域的周期以及需要同步的個(gè)數(shù)。假設(shè)這個(gè)時(shí)間是T,那么經(jīng)過(guò)T時(shí)間后,由于讀寫(xiě)時(shí)鐘不一致,原來(lái)的讀寫(xiě)時(shí)針增加(也可能不變)的量是不一致。比如說(shuō)實(shí)際上讀寫(xiě)時(shí)針都指向4(且最高位相同),那么這種情況實(shí)際上是出現(xiàn)了讀空的情況。但是同步到第三方時(shí)鐘域后,可能寫(xiě)指針成了6,而讀指針變成了8(讀時(shí)鐘比寫(xiě)時(shí)鐘快),那么在這種情況下FIFO就不會(huì)報(bào)“讀空”,從而造成功能錯(cuò)亂。所以該種方法不可取。

? ? ? ? 同步到寫(xiě)時(shí)鐘域讀指針同步到寫(xiě)時(shí)鐘域需要時(shí)間T,在經(jīng)過(guò)T時(shí)間后,可能原來(lái)的讀指針會(huì)增加或者不變,也就是說(shuō)同步后的讀指針一定是小于等于原來(lái)的讀指針的。寫(xiě)指針也可能發(fā)生變化,但是寫(xiě)指針本來(lái)就在這個(gè)時(shí)鐘域,所以是不需要同步的,也就意味著進(jìn)行對(duì)比的寫(xiě)指針就是真實(shí)的寫(xiě)指針。

????????????????現(xiàn)在來(lái)進(jìn)行寫(xiě)滿的判斷:也就是寫(xiě)指針超過(guò)了同步后的讀指針一圈。但是原來(lái)的讀指針是大于等于同步后的讀指針的,所以實(shí)際上這個(gè)時(shí)候?qū)懼羔樒鋵?shí)是沒(méi)有超過(guò)讀指針一圈的,也就是說(shuō)這種情況是“假寫(xiě)滿”。那么“假寫(xiě)滿”是一種錯(cuò)誤的設(shè)計(jì)嗎?答案是NO。前面我們說(shuō)過(guò)異步FIFO設(shè)計(jì)的關(guān)鍵點(diǎn)是產(chǎn)生合適的“寫(xiě)滿”和“讀空”信號(hào),那么何謂“合適”?該報(bào)的時(shí)候沒(méi)報(bào)算合適嗎?當(dāng)然不算合適。不該報(bào)的時(shí)候報(bào)了算不算合適?答案是算??梢韵胂笠幌拢僭O(shè)一個(gè)深度為100的FIFO,在寫(xiě)到第98個(gè)數(shù)據(jù)的時(shí)候就報(bào)了“寫(xiě)滿”,會(huì)引起什么后果?答案是不會(huì)造成功能錯(cuò)誤,只會(huì)造成性能損失(2%),大不了FIFO的深度我少用一點(diǎn)點(diǎn)就是的。事實(shí)上這還可以算是某種程度上的保守設(shè)計(jì)(安全)。

? ? ? ? ????????接著進(jìn)行讀空的判斷:也就是同步后的讀指針追上了寫(xiě)指針。但是原來(lái)的讀指針是大于等于同步后的讀指針的,所以實(shí)際上這個(gè)時(shí)候讀指針實(shí)際上是超過(guò)了寫(xiě)指針。這種情況意味著已經(jīng)發(fā)生了“讀空”,卻仍然有錯(cuò)誤數(shù)據(jù)讀出。所以這種情況就造成了FIFO的功能錯(cuò)誤。

????????同步到讀時(shí)鐘域?寫(xiě)指針同步到讀時(shí)鐘域需要時(shí)間T,在經(jīng)過(guò)T時(shí)間后,可能原來(lái)的讀指針會(huì)增加或者不變,也就是說(shuō)同步后的寫(xiě)指針一定是小于等于原來(lái)的寫(xiě)指針的。讀指針也可能發(fā)生變化,但是讀指針本來(lái)就在這個(gè)時(shí)鐘域,所以是不需要同步的,也就意味著進(jìn)行對(duì)比的讀指針就是真實(shí)的讀指針。

????????????????現(xiàn)在來(lái)進(jìn)行寫(xiě)滿的判斷:也就是同步后的寫(xiě)指針超過(guò)了讀指針一圈。但是原來(lái)的寫(xiě)指針是大于等于同步后的寫(xiě)指針的,所以實(shí)際上這個(gè)時(shí)候?qū)懼羔樢呀?jīng)超過(guò)了讀指針不止一圈,這種情況意味著已經(jīng)發(fā)生了“寫(xiě)滿”,卻仍然數(shù)據(jù)被覆蓋寫(xiě)入。所以這種情況就造成了FIFO的功能錯(cuò)誤。

? ? ? ? ????????接著進(jìn)行讀空的判斷:也就是讀指針追上了同步后的指針。但是原來(lái)的寫(xiě)指針是大于等于同步后的寫(xiě)指針的,所以實(shí)際上這個(gè)時(shí)候讀指針其實(shí)還沒(méi)有追上寫(xiě)指針,也就是說(shuō)這種情況是“假讀空”。那么“假讀空”是一種錯(cuò)誤的設(shè)計(jì)嗎?答案是NO。前面我們說(shuō)過(guò)異步FIFO設(shè)計(jì)的關(guān)鍵點(diǎn)是產(chǎn)生合適的“寫(xiě)滿”和“讀空”信號(hào),那么何謂“合適”?該報(bào)的時(shí)候沒(méi)報(bào)算合適嗎?當(dāng)然不算合適。不該報(bào)的時(shí)候報(bào)了算不算合適?答案是算。可以想象一下,假設(shè)某個(gè)FIFO,在讀到還剩2個(gè)數(shù)據(jù)的時(shí)候就報(bào)了“讀空”,會(huì)引起什么后果?答案是不會(huì)造成功能錯(cuò)誤,只會(huì)造成性能損失(2%),大不了我先不讀了,等數(shù)據(jù)多了再讀就是的。事實(shí)上這還可以算是某種程度上的保守設(shè)計(jì)(安全)。

? ? ? ? 現(xiàn)在我們可以總結(jié)一下:

  • “寫(xiě)滿”的判斷:需要將讀指針同步到寫(xiě)時(shí)鐘域,再與寫(xiě)指針判斷
  • “讀空”的判斷:需要將寫(xiě)指針同步到讀時(shí)鐘域,再與讀指針判斷

????????假讀空示意如下:

異步fifo設(shè)計(jì)要素,FPGA設(shè)計(jì)與調(diào)試,fpga開(kāi)發(fā),FIFO,CDC,異步FIFO

? ? ? ? 假寫(xiě)滿示意如下:

異步fifo設(shè)計(jì)要素,FPGA設(shè)計(jì)與調(diào)試,fpga開(kāi)發(fā),FIFO,CDC,異步FIFO

4、如何判斷異步FIFO的空和滿?

? ? ? ? 在同步FIFO的設(shè)計(jì)中,我們把讀、寫(xiě)指針的位寬拓寬了1bit,目的是區(qū)分原來(lái)的讀、寫(xiě)指針相等時(shí)判斷空、滿的問(wèn)題。同步FIFO的指針使用的是2進(jìn)制碼的形式,而異步FIFO為了減少多bit信號(hào)跨時(shí)鐘域傳輸?shù)膩喎€(wěn)態(tài)問(wèn)題,采用的是格雷碼形式的指針,那么格雷碼形式的指針應(yīng)該如何對(duì)比來(lái)判斷空和滿?

? ? ? ? 首先要說(shuō)明的是,將格雷碼轉(zhuǎn)換成2進(jìn)制再進(jìn)行對(duì)比是一種很好的辦法,但是會(huì)消耗多的組合邏輯資源,所以我們暫時(shí)不討論。

異步fifo設(shè)計(jì)要素,FPGA設(shè)計(jì)與調(diào)試,fpga開(kāi)發(fā),FIFO,CDC,異步FIFO

? ? ? ? 先觀察上圖,假定我們要設(shè)計(jì)的FIFO深度為8,那么指針寬度是4,因?yàn)閷挾葹?時(shí)無(wú)法區(qū)分空、滿。

????????空的判斷很好判斷,只要讀寫(xiě)指針?biāo)形蝗恳恢拢瑒t說(shuō)明此時(shí)是空狀態(tài)。

? ? ? ? 滿的判斷復(fù)雜一點(diǎn),假設(shè)采用同步FIFO的判斷方法----最高位不同,其他位一致。我們用實(shí)際的數(shù)值來(lái)看看是什么情況:當(dāng)讀指針的值為0100,則說(shuō)明此時(shí)讀指針指向最高的空間7,那么若是FIFO滿了,則寫(xiě)指針應(yīng)該是1100,那么1100對(duì)應(yīng)的二進(jìn)制是多少呢?是8。那么讀寫(xiě)指針、一個(gè)指向7,另一個(gè)卻指向8,這是滿?顯然不是。

? ? ? ? 如果真的是滿的話,寫(xiě)指針應(yīng)該是多少?應(yīng)該是15,也就是1000,此時(shí)寫(xiě)指針是超過(guò)讀指針8,也就是一圈的。那么0100和1000有什么聯(lián)系?很顯然,高兩位相反,低位相同。這種規(guī)律的形成原因是我們之前提到的,格雷碼的變化都關(guān)于某個(gè)對(duì)稱軸對(duì)稱。

? ? ? ? 總結(jié):

  • 當(dāng)最高位和次高位相同,其余位相同認(rèn)為是讀空
  • 當(dāng)最高位和次高位不同,其余位相同認(rèn)為是寫(xiě)滿

5、空和滿的判斷是準(zhǔn)確的嗎?

? ? ? ? 在第4點(diǎn)我們知道了----將讀指針同步到寫(xiě)時(shí)鐘域來(lái)判斷滿;將寫(xiě)指針同步到讀時(shí)鐘域來(lái)判斷空。既然是異步FIFO,那么讀寫(xiě)時(shí)鐘域的信號(hào)是不一致的,其中一個(gè)的頻率快,另一個(gè)的頻率這慢。那么在兩次同步過(guò)程中,一定是一次慢時(shí)鐘采快時(shí)鐘和一次快時(shí)鐘采慢時(shí)鐘??鞎r(shí)鐘采慢時(shí)鐘是不會(huì)有問(wèn)題的,因?yàn)檫@符合采樣定理。但是慢時(shí)鐘采快時(shí)鐘則會(huì)有問(wèn)題,因?yàn)椴蓸舆^(guò)程不符合采樣定理。

????????那么會(huì)造成什么問(wèn)題?答案是漏采。某些數(shù)值可能會(huì)被漏掉。例如原本是連續(xù)的0--1--2---3的信號(hào),從快時(shí)鐘同步到慢時(shí)鐘后,就變成了離散的0--3,其中的1、2被漏掉了。那么這樣一種現(xiàn)象會(huì)導(dǎo)致空、滿的判斷是準(zhǔn)確的嗎?答案是不準(zhǔn)確,但沒(méi)關(guān)系。

? ? ? ? 設(shè)想讀慢寫(xiě)快與讀快寫(xiě)慢兩種情況:

????????讀慢寫(xiě)快:

? ? ? ? ? ? ? ? 進(jìn)行寫(xiě)滿判斷的時(shí)候需要將讀指針同步到寫(xiě)時(shí)鐘域,因?yàn)樽x慢寫(xiě)快,所以不會(huì)有讀指針遺漏,同步消耗時(shí)鐘周期,所以同步后的讀指針滯后(小于等于)當(dāng)前讀地址,所以可能寫(xiě)滿會(huì)提前產(chǎn)生,并非真寫(xiě)滿。

? ? ? ? ? ? ? ? 進(jìn)行讀空判斷的時(shí)候需要將寫(xiě)指針同步到讀指針 ,因?yàn)樽x慢寫(xiě)快,所以當(dāng)讀時(shí)鐘同步寫(xiě)指針的時(shí)候,必然會(huì)漏掉一部分寫(xiě)指針,我們不用關(guān)心那到底會(huì)漏掉哪些寫(xiě)指針,我們?cè)诤醯氖锹┑舻闹羔槙?huì)對(duì)FIFO的讀空產(chǎn)生影響嗎?比如寫(xiě)指針從0寫(xiě)到10,期間讀時(shí)鐘域只同步捕捉到了3、5、8這三個(gè)寫(xiě)指針而漏掉了其他指針。當(dāng)同步到8這個(gè)寫(xiě)指針時(shí),真實(shí)的寫(xiě)指針可能已經(jīng)寫(xiě)到10 ,相當(dāng)于在讀時(shí)鐘域還沒(méi)來(lái)得及覺(jué)察的情況下,寫(xiě)時(shí)鐘域可能寫(xiě)了數(shù)據(jù)到FIFO去,這樣在判斷它是不是空的時(shí)候會(huì)出現(xiàn)不是真正空的情況,漏掉的指針也沒(méi)有對(duì)FIFO的邏輯操作產(chǎn)生影響。

? ? ? ? 讀快寫(xiě)慢:

? ? ? ? ? ? ? ? 進(jìn)行讀空判斷的時(shí)候需要將寫(xiě)指針同步到讀指針 ,因?yàn)樽x快寫(xiě)慢,所以不會(huì)有寫(xiě)指針遺漏,同步消耗時(shí)鐘周期,所以同步后的寫(xiě)指針滯后(小于等于)當(dāng)前寫(xiě)地址,所以可能讀空會(huì)提前產(chǎn)生,并非真讀空。

? ? ? ? ? ? ? ? 進(jìn)行寫(xiě)滿判斷的時(shí)候需要將讀指針同步到寫(xiě)時(shí)鐘域,因?yàn)樽x快寫(xiě)慢,所以當(dāng)寫(xiě)時(shí)鐘同步讀指針的時(shí)候,必然會(huì)漏掉一部分讀指針,我們不用關(guān)心那到底會(huì)漏掉哪些讀指針,我們?cè)诤醯氖锹┑舻闹羔槙?huì)對(duì)FIFO的寫(xiě)滿產(chǎn)生影響嗎?比如讀指針從0讀到10,期間寫(xiě)時(shí)鐘域只同步捕捉到了3、5、8這三個(gè)讀指針而漏掉了其他指針。當(dāng)同步到8這個(gè)讀指針時(shí),真實(shí)的讀指針可能已經(jīng)讀到10 ,相當(dāng)于在寫(xiě)時(shí)鐘域還沒(méi)來(lái)得及覺(jué)察的情況下,讀時(shí)鐘域可能從FIFO讀了數(shù)據(jù)出來(lái),這樣在判斷它是不是滿的時(shí)候會(huì)出現(xiàn)不是真正滿的情況,漏掉的指針也沒(méi)有對(duì)FIFO的邏輯操作產(chǎn)生影響。

? ? ? ? 現(xiàn)在我們會(huì)發(fā)現(xiàn),所謂的空滿信號(hào)實(shí)際上是不準(zhǔn)確的,在還沒(méi)有空、滿的時(shí)鐘就已經(jīng)輸出了空滿信號(hào),這樣的空滿信號(hào)一般稱為假空、假滿。假空、假滿信號(hào)本質(zhì)上是一種保守設(shè)計(jì),想象一下,一個(gè)深度為16的異步FIFO,在其寫(xiě)入14個(gè)數(shù)據(jù)時(shí),即輸出了寫(xiě)滿(假滿)標(biāo)志,這會(huì)對(duì)我們的設(shè)計(jì)造成影響嗎?會(huì),會(huì)削弱我們的效率,我們實(shí)際使用的FIFO深度成了14,但是會(huì)使得我們的設(shè)計(jì)產(chǎn)生錯(cuò)誤嗎?顯然不會(huì)。同樣的,在FIFO深度仍有2時(shí)即輸出了讀空(假空)標(biāo)志,也不會(huì)使得我們的設(shè)計(jì)出錯(cuò),但是會(huì)降低效率,因?yàn)槲覀兪褂玫腇IFO深度又少了2。

6、既然有假滿、假空,那么有沒(méi)有真滿、真空?

? ? ? ? 還真有,但是沒(méi)意義。既然我們可以將讀指針同步到寫(xiě)時(shí)鐘域來(lái)判斷假滿;將寫(xiě)指針同步到讀時(shí)鐘域來(lái)判斷假空。那么對(duì)應(yīng)地,可以讀指針同步到寫(xiě)時(shí)鐘域來(lái)判斷空;將寫(xiě)指針同步到讀時(shí)鐘域來(lái)判斷滿。

? ? ? ? 在寫(xiě)時(shí)鐘域判斷空:

? ? ? ? ? ? ? ? 讀指針被同步過(guò)來(lái)的信號(hào)(同步后讀指針)是滯后于真實(shí)讀指針的信號(hào),當(dāng)同步后讀指針等于寫(xiě)指針時(shí),真實(shí)讀指針實(shí)際上早就等于寫(xiě)指針了,也就是說(shuō)此時(shí)的空一定是空,甚至已經(jīng)空了一段時(shí)間了。這樣的空標(biāo)志顯然是沒(méi)有使用意義的,因?yàn)闀?huì)造成對(duì)FIFO的過(guò)讀操作,你來(lái)來(lái)回回讀個(gè)空FIFO有什么意義呢?也就是說(shuō)真空能實(shí)現(xiàn),但是沒(méi)實(shí)際使用意義。

? ? ? ? 在讀時(shí)鐘域判斷滿:

? ? ? ? ? ? ? ? 寫(xiě)指針被同步過(guò)來(lái)的信號(hào)(同步后寫(xiě)指針)是滯后于真實(shí)寫(xiě)指針的信號(hào),但同步后寫(xiě)指針超過(guò)讀指針一圈時(shí),真實(shí)寫(xiě)指針實(shí)際上早就超過(guò)讀指針一圈了,也就是說(shuō)此時(shí)的滿一定是滿,甚至已經(jīng)滿了一段時(shí)間了。這樣的滿標(biāo)志顯然是沒(méi)有使用意義的,因?yàn)闀?huì)造成對(duì)FIFO的過(guò)寫(xiě)操作,你來(lái)來(lái)回回寫(xiě)個(gè)滿FIFO有什么意義呢?也就是說(shuō)真滿也能實(shí)現(xiàn),但是同樣沒(méi)實(shí)際使用意義。

7、非2次冪深度的FIFO如何設(shè)計(jì)?

? ? ? ? 在第1點(diǎn)關(guān)于格雷碼的性質(zhì)中,我們闡述了:

  • 在一組數(shù)的編碼中,若任意兩個(gè)相鄰的代碼只有一位二進(jìn)制數(shù)不同,則稱這種編碼為格雷碼
  • 當(dāng)?shù)贜位從0變到1的時(shí)候,之后的數(shù)的N-1位會(huì)關(guān)于前半段軸對(duì)稱,而比N位高的位是相同的。

? ? ? ? 由這兩點(diǎn),我們發(fā)現(xiàn)格雷碼都可以關(guān)于某條對(duì)稱軸對(duì)稱。所以只有當(dāng)FIFO深度為2的冪次方時(shí),才能做到格雷碼繞一圈后,回到初始位置仍然只有1bit變化,如15(1000)----0(0000)。當(dāng)FIFO深度不為2的冪次方時(shí),顯然從最尾端跳轉(zhuǎn)到開(kāi)頭端,變化的就不止一個(gè)bit了。比如FIFO深度為7,顯然,從13(1011)----0(0000),變化了可不止1bit。這樣的話在這一次跳變就失去了格雷碼存在的意義了,所以得想點(diǎn)其他辦法解決。

? ? ? ? 前面說(shuō)過(guò),格雷碼相鄰每位只變化1bit,而且關(guān)于中軸對(duì)稱的。那么我們可以這樣編碼:針對(duì)深度為7的FIFO,從1(0001)開(kāi)始,一直到(14個(gè)數(shù)表示7深度,高位區(qū)分狀態(tài))14(1001),1(0001)與14(1001)是關(guān)于中軸對(duì)稱的(高位為變化位),所以也只有1bit的跳變。同樣的如果深度為6的FIFO,就從2(0011)開(kāi)始,到13(1011),同樣只跳變1bit。

異步fifo設(shè)計(jì)要素,FPGA設(shè)計(jì)與調(diào)試,fpga開(kāi)發(fā),FIFO,CDC,異步FIFO

? ? ? ? 空標(biāo)志只用判斷讀、寫(xiě)指針是否全部相等即可。但是滿標(biāo)志就不能用“高兩位相反,其他位相同來(lái)判斷了”,需要找其他規(guī)律了。從這里可以看出,格雷碼作為一種無(wú)權(quán)碼,在比較和運(yùn)算等方面不如有權(quán)碼二進(jìn)制靈活。所以,咱要不還是轉(zhuǎn)回二進(jìn)制再比較吧。

? ? ? ? 多啰嗦一句,實(shí)際上不管你設(shè)計(jì)FIFO用RAM還是直接調(diào)用IP也好,最終實(shí)現(xiàn)都是用的Block RAM資源,其生成的位寬肯定是2的冪次。所以啊,不用也是浪費(fèi)啊。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-730456.html

到了這里,關(guān)于關(guān)于異步FIFO設(shè)計(jì),這7點(diǎn)你必須要搞清楚的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 跨時(shí)鐘域設(shè)計(jì)方法-握手協(xié)議、異步FIFO

    跨時(shí)鐘域設(shè)計(jì)方法-握手協(xié)議、異步FIFO

    當(dāng)由快時(shí)鐘跨到慢時(shí)鐘時(shí),為了避免采不到信號(hào)這種情況,通常運(yùn)用電平展寬、脈沖同步器、或者是握手處理。 圖中所示,發(fā)送端時(shí)鐘是clk1,接收端時(shí)鐘是clk2,當(dāng)發(fā)送端接收到外部傳過(guò)的數(shù)據(jù)時(shí),準(zhǔn)備就緒時(shí)拉高t_req,向接收端發(fā)送該信號(hào)表示我準(zhǔn)備好傳輸了你準(zhǔn)備好接收了

    2024年02月12日
    瀏覽(19)
  • FPGA的Verilog設(shè)計(jì)(二)——異步FIFO

    FPGA的Verilog設(shè)計(jì)(二)——異步FIFO

    閱讀本文前,建議先閱讀下面幾篇文章: 同步FIFO 二進(jìn)制轉(zhuǎn)格雷碼的實(shí)現(xiàn) ??在上篇文章同步FIFO中簡(jiǎn)要介紹了FIFO的基本概念以及同步FIFO的實(shí)現(xiàn)。本篇文章將重點(diǎn)介紹異步FIFO的工作原理以及硬件實(shí)現(xiàn)。 ??異步FIFO的讀寫(xiě)時(shí)鐘不同,F(xiàn)IFO的讀寫(xiě)需要進(jìn)行異步處理, 異步FIFO常用

    2024年02月04日
    瀏覽(22)
  • 可綜合的異步FIFO的設(shè)計(jì)與仿真

    可綜合的異步FIFO的設(shè)計(jì)與仿真

    目錄 綜述 同步FIFO 異步FIFO 格雷碼與二進(jìn)制計(jì)數(shù)器 二進(jìn)制計(jì)數(shù)器 格雷碼 二進(jìn)制雙向箭頭?格雷碼之間的相互轉(zhuǎn)換 異步FIFO的代碼實(shí)現(xiàn) 整體框圖 格雷碼做多bit信號(hào)同步 空滿生成模塊 存儲(chǔ)器模塊 讀寫(xiě)指針同步模塊 頂層模塊 仿真 仿真情景1:寫(xiě)滿 仿真情景2:讀空 仿真情景3:

    2024年02月05日
    瀏覽(18)
  • 異步FIFO(Verilog)

    異步FIFO(Verilog)

    簡(jiǎn)介: ? ? ? ?FIFO(First In First Out)是異步數(shù)據(jù)傳輸時(shí)經(jīng)常使用的存儲(chǔ)器。該存儲(chǔ)器的特點(diǎn)是數(shù)據(jù)先進(jìn)先出(后進(jìn)后出)。其實(shí),多位寬數(shù)據(jù)的異步傳輸問(wèn)題,無(wú)論是從快時(shí)鐘到慢時(shí)鐘域,還是從慢時(shí)鐘到快時(shí)鐘域,都可以使用 FIFO 處理。異步FIFO 是指讀寫(xiě)時(shí)鐘不一致,讀寫(xiě)

    2024年02月08日
    瀏覽(22)
  • 跨時(shí)鐘域方法(同步器、異步FIFO、邊沿檢測(cè)器、脈沖同步器、同步FIFO)

    跨時(shí)鐘域方法(同步器、異步FIFO、邊沿檢測(cè)器、脈沖同步器、同步FIFO)

    目錄 1、跨時(shí)鐘域方法的原因 2、跨時(shí)鐘處理的兩種思路 3、跨時(shí)鐘域分類——單比特信號(hào)跨時(shí)鐘 3.1.1慢時(shí)鐘———快時(shí)鐘。(滿足三邊沿準(zhǔn)則,有效事件可以被安全采樣) 3.1.2慢時(shí)鐘———快時(shí)鐘。(不滿足三邊沿準(zhǔn)則,有效事件可以被安全采樣) 3.2.1有效事件傳輸背景下確

    2024年02月12日
    瀏覽(51)
  • 【小白入門】Verilog實(shí)現(xiàn)異步FIFO

    【小白入門】Verilog實(shí)現(xiàn)異步FIFO

    ? ?之前也在CSDN上面寫(xiě)過(guò)兩個(gè)FIFO相關(guān)的文章,不過(guò)代碼看起來(lái)比較復(fù)雜,且注釋也比較少,不利于新手入門。很多時(shí)候都沒(méi)有耐心繼續(xù)看下去。 http://t.csdn.cn/0dPX6 http://t.csdn.cn/lYvoY? 因?yàn)樽约罕旧硎且粋€(gè)初學(xué)者,就從初學(xué)者的視角來(lái)看待并學(xué)習(xí)FIFO。 為什么選擇學(xué)習(xí)FIFO? 在學(xué)

    2024年02月09日
    瀏覽(25)
  • 基于異步FIFO的串口回環(huán)測(cè)試

    基于異步FIFO的串口回環(huán)測(cè)試

    ??當(dāng)涉及到串口通信的硬件設(shè)計(jì)和軟件開(kāi)發(fā)時(shí),進(jìn)行有效的測(cè)試是至關(guān)重要的。串口回環(huán)測(cè)試是一種常見(jiàn)的測(cè)試方法,用于驗(yàn)證串口通信的功能和穩(wěn)定性。在許多應(yīng)用中,為了確保串口通信的正常運(yùn)行,往往需要使用緩沖區(qū)或FIFO來(lái)管理數(shù)據(jù)的傳輸和接收。 ??基于異步F

    2024年02月16日
    瀏覽(25)
  • <FPGA>異步FIFO的Verilg實(shí)現(xiàn)方法

    <FPGA>異步FIFO的Verilg實(shí)現(xiàn)方法

    ? ? ? ? 在上篇文章:同步FIFO的兩種Verilog設(shè)計(jì)方法(計(jì)數(shù)器法、高位擴(kuò)展法)中我們介紹了FIFO的基本概念,并對(duì)同步FIFO的兩種實(shí)現(xiàn)方法進(jìn)行了仿真驗(yàn)證。而異步FIFO因?yàn)樽x寫(xiě)時(shí)鐘不一致,顯然無(wú)法直接套用同步FIFO的實(shí)現(xiàn)方法,所以在本文我們將用Verilog實(shí)現(xiàn)異步FIFO的設(shè)計(jì)。

    2024年02月07日
    瀏覽(23)
  • Verilog功能模塊——讀寫(xiě)位寬不同的異步FIFO

    Verilog功能模塊——讀寫(xiě)位寬不同的異步FIFO

    FIFO系列文章目錄: Verilog功能模塊——異步FIFO-CSDN博客 Verilog功能模塊——同步FIFO-CSDN博客 Verilog功能模塊——讀寫(xiě)位寬不同的異步FIFO-CSDN博客 Verilog功能模塊——讀寫(xiě)位寬不同的同步FIFO-CSDN博客 Verilog功能模塊——標(biāo)準(zhǔn)FIFO轉(zhuǎn)FWFT FIFO-CSDN博客 前面的博文已經(jīng)講了異步FIFO和同步

    2024年02月01日
    瀏覽(25)
  • Verilog同步FIFO設(shè)計(jì)

    Verilog同步FIFO設(shè)計(jì)

    同步FIFO(synchronous)的 寫(xiě)時(shí)鐘和讀時(shí)鐘為同一個(gè)時(shí)鐘,F(xiàn)IFO內(nèi)部所有邏輯都是同步邏輯 ,常常用于交互數(shù)據(jù)緩沖。 異步FIFO:數(shù)據(jù)寫(xiě)入FIFO的時(shí)鐘和數(shù)據(jù)讀出FIFO的時(shí)鐘是異步的(asynchronous) 典型同步FIFO有三部分組成: (1) FIFO寫(xiě)控制邏輯; (2)FIFO讀控制邏輯; (3)FIFO 存儲(chǔ)實(shí)體(

    2024年02月12日
    瀏覽(48)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包