這一篇來講一下如何解決上一篇[如何設(shè)計(jì)一個(gè)同步FIFO(二)]最后提出的問題。
在上一篇中,我們設(shè)計(jì)的基于雙端口SRAM的同步FIFO結(jié)構(gòu)如下,
我們說這個(gè)結(jié)構(gòu)之所以使得FIFO的輸出Q在讀完SRAM之后保持穩(wěn)定,其實(shí)需要SRAM本身可以保持RDATA在讀操作之后的多個(gè)周期保持穩(wěn)定。即SRAM本身的讀時(shí)序如下圖所示:圖中cycle 4,5,6都沒有讀操作,SRAM的RDATA依然保持D0不變。
但是如果SRAM的讀時(shí)序不能保證這樣,而是只能保證數(shù)據(jù)RDATA valid一個(gè)周期,那么我們就無法使用上面的結(jié)構(gòu)。
那么要怎么做才能達(dá)到我們想要的FIFO時(shí)序呢?大家可以很容易想到,如果想保持?jǐn)?shù)據(jù)穩(wěn)定,那還是要借助一級(jí)Flop的幫忙,即將SRAM的輸出RDATA鎖在一個(gè)buffer flop里。不過大家也看到,在上一講里我們下面的結(jié)構(gòu)也還是有問題。
下面老李帶領(lǐng)大家整理設(shè)計(jì)思路。我們看上面的SRAM的時(shí)序圖,可以發(fā)現(xiàn),我們周期T的時(shí)候讀一次SRAM,數(shù)據(jù)在T+1周期到RDATA,我們再把這個(gè)數(shù)據(jù)存到一級(jí)flop中,那么要在T+2周期才能在flop的q上看見這個(gè)數(shù)據(jù)。這2個(gè)周期是無法避免的。所以說,當(dāng)我們的FIFO要pop一次,然后下一個(gè)周期FIFO的Q數(shù)據(jù)要切換成最頭上的數(shù)據(jù)(假設(shè)這個(gè)數(shù)據(jù)是head),那么我們可以得出結(jié)論,我們不能在pop的這一個(gè)cycle才去從SRAM中讀head,而必須讓head在這pop之前已經(jīng)被讀到了flop里,那么當(dāng)pop來了之后,我們只需要讓FIFO的q切換到這個(gè)flop輸出就可以了。這是設(shè)計(jì)思路的第一層次。
下面大家再考慮,我們切換到了另一個(gè)flop,那么這個(gè)時(shí)候輸出前一個(gè)Q的那個(gè)flop干什么去呢?當(dāng)然不能閑著,它的任務(wù)是去接受此時(shí)存在SRAM里最頭上的數(shù)據(jù),相當(dāng)于從SRAM里提前預(yù)支了這個(gè)數(shù),緩存在這里,這樣當(dāng)下一個(gè)pop來的時(shí)候,可以在下一個(gè)周期再切換到它。
所以大家可以得出一個(gè)下面的結(jié)構(gòu)。
要注意的點(diǎn)是我們這里有兩級(jí)輸出buffer flop,在上一講當(dāng)中我們說FIFO進(jìn)來的第一個(gè)數(shù)不能存到RAM里,而是要直接存到輸出級(jí)flop去。那么在上面的結(jié)構(gòu)有相應(yīng)的變化:FIFO進(jìn)來的前兩個(gè)數(shù)都不能存到RAM里,而是要從第3個(gè)數(shù)開始才把數(shù)據(jù)存到RAM里。
時(shí)序圖建議大家自己畫一下。
聰明的同學(xué)可能覺得這個(gè)思路很眼熟,沒錯(cuò),這里的解決的辦法其實(shí)是數(shù)字電路設(shè)計(jì)中很常見的一個(gè)思路:乒乓Ping-pong buffer。
ping-pong buffer很常用,也是數(shù)字電路設(shè)計(jì)中的一個(gè)??贾R(shí)點(diǎn)。特別是valid/ready 握手協(xié)議中如何插入一級(jí)pipestage還能保證傳輸沒有bubble,即每個(gè)周期都能夠傳輸數(shù)據(jù),老李當(dāng)年面試被問到不止一次,老李自己做面試官也喜歡問這個(gè)問題。其實(shí)老李之前是想專門拿出來一篇來講ping-pong buffer的,不過發(fā)現(xiàn)其他很多公眾號(hào)博主已經(jīng)寫過相應(yīng)的文章了,老李覺得大家看他們的文章就可以。所以這篇咱們只是簡略講一講ping-pong buffer在這里的應(yīng)用。
這里也給另外一個(gè)公眾號(hào)“數(shù)字IC自修室”打個(gè)廣告,上面也有很多很棒的文章,關(guān)于ping pong buffer大家可以看這一篇
[芯片設(shè)計(jì)小經(jīng)驗(yàn)——乒乓buffer]
-
sram
+關(guān)注
關(guān)注
6文章
785瀏覽量
115946 -
fifo
+關(guān)注
關(guān)注
3文章
401瀏覽量
44806
發(fā)布評論請先 登錄
同步FIFO設(shè)計(jì)詳解及代碼分享

異步FIFO結(jié)構(gòu)
FPGA之FIFO練習(xí)3:設(shè)計(jì)思路
同步FIFO之Verilog實(shí)現(xiàn)
怎樣設(shè)計(jì)一個(gè)同步FIFO?(1)
怎樣設(shè)計(jì)一個(gè)同步FIFO?(2)

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

FIFO設(shè)計(jì)—異步FIFO

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

評論