本文首發(fā)于公眾號(hào) FPGA開源工坊
FIFO是FPGA/IC設(shè)計(jì)中經(jīng)常使用到的模塊,它經(jīng)常被用在兩個(gè)模塊之間進(jìn)行數(shù)據(jù)的緩存,以避免數(shù)據(jù)在傳輸過程中丟失。同時(shí)FIFO也經(jīng)常被用在跨時(shí)鐘域處理中。
FIFO深度的計(jì)算是FPGA和IC筆面試中經(jīng)常被問到的一個(gè)問題,在這篇文章里面我們就來討論一下FIFO的深度應(yīng)該怎么計(jì)算。
FIFO的深度如果設(shè)置的小了就會(huì)有丟數(shù)的風(fēng)險(xiǎn),設(shè)置的大了會(huì)有資源的浪費(fèi)。
在討論如何計(jì)算FIFO的深度之前,應(yīng)該先明白一個(gè)概念,那就是突發(fā)傳輸 ,也就是burst。
突發(fā)傳輸
為什么要明確突發(fā)傳輸?shù)母拍钅??我們假設(shè)有以下幾種開發(fā)場景。
場景一:讀比寫快
假如說一個(gè)FIFO在不間斷的向里面寫入數(shù)據(jù)和讀出數(shù)據(jù),并且向FIFO里面寫數(shù)據(jù)的速度比從FIFO里面讀數(shù)據(jù)的速度要慢,那么是不是這個(gè)FIFO永遠(yuǎn)都不會(huì)被寫滿了。
場景二:寫比讀快
假如說一個(gè)FIFO在不間斷的向里面寫入數(shù)據(jù)和讀出數(shù)據(jù),并且寫入的速度比讀出的速度快,那么是不是意味著這個(gè)FIFO的深度無論設(shè)置多少都終將會(huì)被寫滿。
所以不間斷在對FIFO不間斷的進(jìn)行讀寫的情形中討論FIFO深度是沒有意義的。
而我們要討論的FIFO深度其實(shí)是在突發(fā)傳輸中才是有意義的。
突發(fā)傳輸:就是說一個(gè)又一個(gè)的數(shù)據(jù)包,每一個(gè)數(shù)據(jù)包之間是有間隙的。
每一個(gè)數(shù)據(jù)包的長度叫做burst length 突發(fā)長度
FIFO的最小深度就與突發(fā)長度,讀寫速率有關(guān)系。
計(jì)算出來FIFO的深度關(guān)鍵就在于計(jì)算出來在讀寫突發(fā)的這段時(shí)間內(nèi),有多少數(shù)據(jù)沒有被讀走,這個(gè)數(shù)據(jù)的多少就是FIFO的最小深度。
計(jì)算公式
FIFO的深度可以用下面的公式計(jì)算出來
可以看到在上述公式里面的關(guān)鍵就是確定burst length。
下面就通過幾個(gè)例子來說明burst length的計(jì)算。
例子
例一
某大廠的筆試題:
設(shè)計(jì)同步FIFO,每100個(gè)cycle可以寫入80個(gè)數(shù)據(jù),每10個(gè)cycle可以讀出8個(gè)數(shù)據(jù),F(xiàn)IFO的深度至少為:
A: 16
B: 32
C: 64
D: 72
首先從題目中知道同步FIFO,所以rd_clk和wr_clk是一樣的。
第二每10個(gè)cycle中可以讀出8個(gè)數(shù)據(jù),那么rd_rate就是8/10也就是0.8
現(xiàn)在關(guān)鍵就是burst length的計(jì)算了。
每100個(gè)cycle可以寫入80個(gè)數(shù)據(jù),那么是不是意味著這80個(gè)數(shù)據(jù)可以在100個(gè)cycle的周期的任意時(shí)間寫進(jìn)FIFO里面。那么什么時(shí)候是連續(xù)寫入數(shù)據(jù)最多的極端情況呢,這個(gè)極端情況就是burst length最大的時(shí)候。
這個(gè)極端情況就是在連續(xù)的200個(gè)cycle中,是不是可以寫入160個(gè)數(shù)據(jù),那么這160個(gè)數(shù)據(jù)背靠背的連續(xù)寫入就是極端情況了。
如下圖所示:
在連續(xù)兩百個(gè)周期內(nèi),前20個(gè)周期空閑,中間160個(gè)時(shí)鐘向FIFO寫入數(shù)據(jù),最后20個(gè)時(shí)鐘再次空閑。
所以burst length就是160
所以FIFO的最小深度為
例二
有一個(gè)FIFO設(shè)計(jì),輸入時(shí)鐘100MHz,輸出時(shí)鐘80MHz,輸入數(shù)據(jù)模式是固定的,其中1000個(gè)時(shí)鐘中有800個(gè)時(shí)鐘傳輸連續(xù)數(shù)據(jù),另外200個(gè)空閑,請問為了避免FIFO下溢/上溢,最小深度是多少
A: 320
B: 80
C: 160
D: 200
根據(jù)題意wr_clk是100, rd_clk是800。
因?yàn)檩斎霐?shù)據(jù)的模式是固定的,所以不用考慮背靠背的情況,所以burst length是800
題目中沒有說明在輸出的時(shí)候讀使能是否會(huì)拉低,所以我們認(rèn)為FIFO一直在輸出,也就是rd_rate是1
所以FIFO的深度為:
-
FPGA
+關(guān)注
關(guān)注
1630文章
21799瀏覽量
606195 -
IC設(shè)計(jì)
+關(guān)注
關(guān)注
38文章
1302瀏覽量
104304 -
fifo
+關(guān)注
關(guān)注
3文章
389瀏覽量
43875 -
時(shí)鐘域
+關(guān)注
關(guān)注
0文章
52瀏覽量
9578
原文標(biāo)題:FPGA|IC筆面試--FIFO深度計(jì)算
文章出處:【微信號(hào):FPGA開源工坊,微信公眾號(hào):FPGA開源工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評(píng)論請先 登錄
相關(guān)推薦
FPGA學(xué)習(xí)-總結(jié)fifo設(shè)計(jì)中深度H的計(jì)算
求助,F(xiàn)PGA fifo深度不夠怎么辦?
FIFO深度怎么設(shè)計(jì)
如何計(jì)算異步FIFO深度和單獨(dú)的時(shí)鐘源
如何計(jì)算Async Fifo Depth
什么是fifo深度?
談?wù)?b class='flag-5'>FIFO閾值的閾值設(shè)置及深度計(jì)算
【教程】“最惡劣”的FIFO深度計(jì)算
LabVIEW FPGA模塊實(shí)現(xiàn)FIFO深度設(shè)定
![LabVIEW FPGA模塊實(shí)現(xiàn)<b class='flag-5'>FIFO</b><b class='flag-5'>深度</b>設(shè)定](https://file1.elecfans.com//web2/M00/A6/04/wKgZomUMO0qAXxOiAAAQM-Xwpus892.jpg)
基于LabVIEW FPGA模塊程序設(shè)計(jì)特點(diǎn)的FIFO深度設(shè)定詳解
![基于LabVIEW FPGA模塊程序設(shè)計(jì)特點(diǎn)的<b class='flag-5'>FIFO</b><b class='flag-5'>深度</b>設(shè)定詳解](https://file.elecfans.com/web1/M00/81/96/pIYBAFwu_raAAm8_AAC91_2ScZY480.png)
FIFO最小深度計(jì)算所有情況
![<b class='flag-5'>FIFO</b>最小<b class='flag-5'>深度計(jì)算</b>所有情況](https://file.elecfans.com/web1/M00/EE/E1/pIYBAGCaKCWAHyPVAAA5iyIR1js018.png)
你們知道FIFO最小深度計(jì)算嗎
![你們知道<b class='flag-5'>FIFO</b>最小<b class='flag-5'>深度計(jì)算</b>嗎](https://file.elecfans.com/web2/M00/14/2B/pYYBAGE6tEaAUHfTAAAIyvR5t3c229.png)
如何簡單快速地計(jì)算FIFO的最小深度
![如何簡單快速地<b class='flag-5'>計(jì)算</b><b class='flag-5'>FIFO</b>的最小<b class='flag-5'>深度</b>](https://file.elecfans.com/web2/M00/32/C8/poYBAGIZ9lCAadAkAADrVC_Q_S0989.png)
評(píng)論