本文首發(fā)于公眾號(hào) FPGA開(kāi)源工坊
FIFO是FPGA/IC設(shè)計(jì)中經(jīng)常使用到的模塊,它經(jīng)常被用在兩個(gè)模塊之間進(jìn)行數(shù)據(jù)的緩存,以避免數(shù)據(jù)在傳輸過(guò)程中丟失。同時(shí)FIFO也經(jīng)常被用在跨時(shí)鐘域處理中。
FIFO深度的計(jì)算是FPGA和IC筆面試中經(jīng)常被問(wèn)到的一個(gè)問(wèn)題,在這篇文章里面我們就來(lái)討論一下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ù)母拍钅兀课覀兗僭O(shè)有以下幾種開(kāi)發(fā)場(chǎng)景。
場(chǎng)景一:讀比寫快
假如說(shuō)一個(gè)FIFO在不間斷的向里面寫入數(shù)據(jù)和讀出數(shù)據(jù),并且向FIFO里面寫數(shù)據(jù)的速度比從FIFO里面讀數(shù)據(jù)的速度要慢,那么是不是這個(gè)FIFO永遠(yuǎn)都不會(huì)被寫滿了。
場(chǎng)景二:寫比讀快
假如說(shuō)一個(gè)FIFO在不間斷的向里面寫入數(shù)據(jù)和讀出數(shù)據(jù),并且寫入的速度比讀出的速度快,那么是不是意味著這個(gè)FIFO的深度無(wú)論設(shè)置多少都終將會(huì)被寫滿。
所以不間斷在對(duì)FIFO不間斷的進(jìn)行讀寫的情形中討論FIFO深度是沒(méi)有意義的。
而我們要討論的FIFO深度其實(shí)是在突發(fā)傳輸中才是有意義的。
突發(fā)傳輸:就是說(shuō)一個(gè)又一個(gè)的數(shù)據(jù)包,每一個(gè)數(shù)據(jù)包之間是有間隙的。
每一個(gè)數(shù)據(jù)包的長(zhǎng)度叫做burst length 突發(fā)長(zhǎng)度
FIFO的最小深度就與突發(fā)長(zhǎng)度,讀寫速率有關(guān)系。
計(jì)算出來(lái)FIFO的深度關(guān)鍵就在于計(jì)算出來(lái)在讀寫突發(fā)的這段時(shí)間內(nèi),有多少數(shù)據(jù)沒(méi)有被讀走,這個(gè)數(shù)據(jù)的多少就是FIFO的最小深度。
計(jì)算公式
FIFO的深度可以用下面的公式計(jì)算出來(lái)
可以看到在上述公式里面的關(guān)鍵就是確定burst length。
下面就通過(guò)幾個(gè)例子來(lái)說(shuō)明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è)空閑,請(qǐng)問(wèn)為了避免FIFO下溢/上溢,最小深度是多少
A: 320
B: 80
C: 160
D: 200
根據(jù)題意wr_clk是100, rd_clk是800。
因?yàn)檩斎霐?shù)據(jù)的模式是固定的,所以不用考慮背靠背的情況,所以burst length是800
題目中沒(méi)有說(shuō)明在輸出的時(shí)候讀使能是否會(huì)拉低,所以我們認(rèn)為FIFO一直在輸出,也就是rd_rate是1
所以FIFO的深度為:
-
FPGA
+關(guān)注
關(guān)注
1625文章
21636瀏覽量
601308 -
IC設(shè)計(jì)
+關(guān)注
關(guān)注
37文章
1290瀏覽量
103699 -
fifo
+關(guān)注
關(guān)注
3文章
387瀏覽量
43500 -
時(shí)鐘域
+關(guān)注
關(guān)注
0文章
51瀏覽量
9524
原文標(biāo)題:FPGA|IC筆面試--FIFO深度計(jì)算
文章出處:【微信號(hào):FPGA開(kāi)源工坊,微信公眾號(hào):FPGA開(kāi)源工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論