由于平時(shí)我們工作中,F(xiàn)IFO都是直接調(diào)用IP核,對(duì)于FIFO深度選擇并沒有很在意,而在筆試面試過程中,經(jīng)常被問及的問題之一就是如何計(jì)算FIFO深度。
當(dāng)讀數(shù)據(jù)的速率小于寫數(shù)據(jù)的速率時(shí),我們需要先將數(shù)據(jù)緩存下來,那么我們需要開多大的空間緩存這些數(shù)據(jù)呢?緩存開大了會(huì)浪費(fèi)資源,開小了會(huì)丟失數(shù)據(jù),如何去計(jì)算最小FIFO深度是本文的重點(diǎn)。
本文涵蓋了FIFO最小深度計(jì)算所有情況:
假如模塊A不間斷的往FIFO中寫數(shù)據(jù),模塊B同樣不間斷的從FIFO中讀數(shù)據(jù),不同的是模塊A寫數(shù)據(jù)的時(shí)鐘頻率要大于模塊B讀數(shù)據(jù)的時(shí)鐘頻率,那么在一段時(shí)間內(nèi)總是有一些數(shù)據(jù)沒來得及被讀走,如果系統(tǒng)一直在工作,那么那些沒有被讀走的數(shù)據(jù)會(huì)越累積越多,那么FIFO的深度需要是無窮大的;
但是若寫操作是連續(xù)的數(shù)據(jù)流,那么再大的FIFO都無法保證數(shù)據(jù)不溢出。因此可以認(rèn)為這種情況下寫數(shù)據(jù)的傳輸是“突發(fā)Burst”的,即寫操作并不連續(xù);
要確定FIFO的深度,關(guān)鍵在于計(jì)算出在突發(fā)讀寫這段時(shí)間內(nèi)有多少個(gè)數(shù)據(jù)沒有被讀走。即FIFO的最小深度就等于沒有被讀走的數(shù)據(jù)個(gè)數(shù)。
Case1 fa>fb with no idle cycles in both write and read
即寫時(shí)鐘快于讀時(shí)鐘,寫和讀的過程中沒有空閑周期;
假設(shè):
寫數(shù)據(jù)時(shí)鐘頻率fa=80MHz
讀數(shù)據(jù)時(shí)鐘頻率fb=50MHz
突發(fā)長度= number of data to be transferred = 120
在突發(fā)傳輸過程中,數(shù)據(jù)都是連續(xù)讀寫的
那么:
寫一個(gè)數(shù)據(jù)所需要的時(shí)間 = 1/80MHz = 12.5ns
突發(fā)傳輸中,寫完所有數(shù)據(jù)所需要的時(shí)間 = 120*12.5ns = 1500ns
讀一個(gè)數(shù)據(jù)所需要的時(shí)間 = 1/50MHz = 20ns
所以寫完所有的突發(fā)傳輸數(shù)據(jù)需要花費(fèi)1500ns
在1500ns內(nèi)能夠讀走的數(shù)據(jù)個(gè)數(shù) = 1500ns/20ns = 75
所以在1500ns內(nèi)還沒有被讀走的數(shù)據(jù)個(gè)數(shù) = 120-75 = 45
因此FIFO的最小深度為45
Case2 fa>fb with two clock cycle delay between two successive read and write
即寫時(shí)鐘頻率大于讀時(shí)鐘頻率,但在讀寫的過程中存在空閑周期;
Case2在Case1的基礎(chǔ)上增加了一個(gè)假設(shè),即讀比寫慢兩拍。這種假設(shè)是真正存在的,在異步FIFO設(shè)計(jì)中,我們需要去判斷FIFO的空滿來保證邏輯的正確性,判斷空滿標(biāo)志需要去比較讀寫指針,而讀指針與寫指針處在不同的時(shí)鐘域中,我們需要采用格雷碼和兩級(jí)同步寄存器去降低亞穩(wěn)態(tài)的概率,而兩級(jí)同步必然會(huì)導(dǎo)致空滿標(biāo)志位的判斷至少延遲2個(gè)cycle。對(duì)于空標(biāo)志位來說,將寫指針同步到讀時(shí)鐘域至少需要花費(fèi)2個(gè)時(shí)鐘,而在同步這段時(shí)間內(nèi)有可能還會(huì)寫入新的數(shù)據(jù),因此同步后的寫指針一定小于或等于(當(dāng)且僅有同步時(shí)間內(nèi)沒有新數(shù)據(jù)寫入的情況下才會(huì)等于)當(dāng)前的寫指針,所以此時(shí)判斷不一定是真空;同理,對(duì)于滿標(biāo)志位來說,將讀指針同步到讀時(shí)鐘域至少需要花費(fèi)2個(gè)時(shí)鐘,而在同步這段時(shí)間內(nèi)有可能還會(huì)讀出新的數(shù)據(jù),因此同步后的讀指針一定小于或等于當(dāng)前讀指針,所以此時(shí)判斷并不一定是真滿。
通過上述討論可以知道Case2的FIFO最小深度應(yīng)該比場(chǎng)景1的FIFO最小深度45略大。
Case3 fa > fb with idle cycles in both write and read
即寫時(shí)鐘頻率大于讀時(shí)鐘頻率,但在讀寫的過程中存在空閑周期;
假設(shè):
寫數(shù)據(jù)時(shí)鐘頻率fa=80MHz
讀數(shù)據(jù)時(shí)鐘頻率fb=50MHz
突發(fā)長度= number of data to be transferred = 120
連續(xù)寫入之間的空閑周期為1。
連續(xù)讀取之間的空閑周期為3。
那么:
兩個(gè)連續(xù)寫之間的空閑周期為1個(gè)時(shí)鐘周期。它的意思是,在寫入一個(gè)數(shù)據(jù)后,模塊A等待一個(gè)時(shí)鐘周期,開始下一個(gè)寫入。因此,可以理解為每兩個(gè)時(shí)鐘周期,一個(gè)數(shù)據(jù)被寫入;
兩個(gè)連續(xù)讀取之間的空閑周期為3個(gè)時(shí)鐘周期。即讀取一個(gè)數(shù)據(jù)后,B模塊等待3個(gè)時(shí)鐘周期,開始下一次讀取。因此,我們可以理解,每四個(gè)時(shí)鐘周期,讀取一個(gè)數(shù)據(jù);
寫一個(gè)數(shù)據(jù)所需要的時(shí)間 = 2*1/80MHz = 25ns
突發(fā)傳輸中,寫完所有數(shù)據(jù)所需要的時(shí)間 = 120*25ns = 3000ns
讀一個(gè)數(shù)據(jù)所需要的時(shí)間 = 4*1/50MHz = 80ns
所以寫完所有的突發(fā)傳輸數(shù)據(jù)需要花費(fèi)3000ns
在3000ns內(nèi)能夠讀走的數(shù)據(jù)個(gè)數(shù) = 3000ns/80ns = 37.5
所以在3000ns內(nèi)還沒有被讀走的數(shù)據(jù)個(gè)數(shù) = 120-37.5 = 82.5
因此FIFO的最小深度為83
Case4 fa > fb with duty cycles given for wr_enb and rd_enb.
即寫時(shí)鐘頻率大于讀時(shí)鐘頻率,給定wr_enb和rd_enb的占空比;
假設(shè):
寫數(shù)據(jù)時(shí)鐘頻率fa=80MHz
讀數(shù)據(jù)時(shí)鐘頻率fb=50MHz
突發(fā)長度= number of data to be transferred = 120
寫使能信號(hào)占整個(gè)burst時(shí)間比重為1/2
讀使能信號(hào)占整個(gè)burst時(shí)間比重為1/4
那么:
此場(chǎng)景與前一個(gè)場(chǎng)景(場(chǎng)景3)沒有任何不同,因?yàn)樵诒纠?,一個(gè)數(shù)據(jù)項(xiàng)將在2個(gè)時(shí)鐘周期內(nèi)寫入,而一個(gè)數(shù)據(jù)項(xiàng)將在4個(gè)時(shí)鐘周期內(nèi)讀取。
因此FIFO的最小深度也為83
Case5 fA < fB with no idle cycles in both write and read( the delay between two consecutive writes and reads is one clock cycle)
即寫時(shí)鐘頻率小于讀時(shí)鐘頻率,且讀寫過程中沒有空閑周期;
假設(shè):
寫數(shù)據(jù)時(shí)鐘頻率fa=30MHz
讀數(shù)據(jù)時(shí)鐘頻率fb=50MHz
突發(fā)長度= number of data to be transferred = 120
在突發(fā)傳輸過程中,數(shù)據(jù)都是連續(xù)讀寫的
那么:
由于讀數(shù)據(jù)比寫數(shù)據(jù)要快,這種情況下永遠(yuǎn)也不會(huì)發(fā)生數(shù)據(jù)丟失的,因此FIFO只起到過時(shí)鐘域的作用,F(xiàn)IFO的最小深度為1即可;
Case6 fa < fb with idle cycles in both write and read(duty cycles of wr_enb and rd_enb can also be given in these type of questions).
即寫時(shí)鐘頻率小于讀時(shí)鐘頻率,給定wr_enb和rd_enb的占空比;
假設(shè):
寫數(shù)據(jù)時(shí)鐘頻率fa=40MHz
讀數(shù)據(jù)時(shí)鐘頻率fb=50MHz
突發(fā)長度= number of data to be transferred = 120
連續(xù)寫入之間的空閑周期為1。
連續(xù)讀取之間的空閑周期為3。
那么:
兩個(gè)連續(xù)寫之間的空閑周期為1個(gè)時(shí)鐘周期。它的意思是,在寫入一個(gè)數(shù)據(jù)后,模塊A等待一個(gè)時(shí)鐘周期,開始下一個(gè)寫入。因此,可以理解為每兩個(gè)時(shí)鐘周期,一個(gè)數(shù)據(jù)被寫入;
兩個(gè)連續(xù)讀取之間的空閑周期為3個(gè)時(shí)鐘周期。即讀取一個(gè)數(shù)據(jù)后,B模塊等待3個(gè)時(shí)鐘周期,開始下一次讀取。因此,我們可以理解,每四個(gè)時(shí)鐘周期,讀取一個(gè)數(shù)據(jù);
寫一個(gè)數(shù)據(jù)所需要的時(shí)間 = 2*1/40MHz = 50ns
突發(fā)傳輸中,寫完所有數(shù)據(jù)所需要的時(shí)間 = 120*50ns = 6000ns
讀一個(gè)數(shù)據(jù)所需要的時(shí)間 = 4*1/50MHz = 80ns
所以寫完所有的突發(fā)傳輸數(shù)據(jù)需要花費(fèi)6000ns
在6000ns內(nèi)能夠讀走的數(shù)據(jù)個(gè)數(shù) = 6000ns/80ns = 75
所以在6000ns內(nèi)還沒有被讀走的數(shù)據(jù)個(gè)數(shù) = 120-75 = 45
因此FIFO的最小深度為45
Case7 fA = fB with no idle cycles in both write and read( the delay between two consecutive writes and reads is one clock cycle).
即寫時(shí)鐘頻率等于讀時(shí)鐘頻率,且讀寫過程中沒有空閑周期;
假設(shè):
寫數(shù)據(jù)時(shí)鐘頻率fa=50MHz
讀數(shù)據(jù)時(shí)鐘頻率fb=50MHz
突發(fā)長度= number of data to be transferred = 120
讀和寫都沒有空閑周期,這意味著突發(fā)中的所有項(xiàng)都將以連續(xù)的時(shí)鐘周期寫入和讀取
那么:
如果clkA和clkB之間沒有相位差,則不需要FIFO;
如果clkA和clkB之間存在相位差,深度“1”的FIFO就足夠了。
Case8 fA = fB with idle cycles in both write and read(duty cycles of wr_enb and rd_enb can also be given in these type of questions).
即寫時(shí)鐘頻率等于讀時(shí)鐘頻率,給定wr_enb和rd_enb的占空比;
假設(shè):
寫數(shù)據(jù)時(shí)鐘頻率fa=50MHz
讀數(shù)據(jù)時(shí)鐘頻率fb=50MHz
突發(fā)長度= number of data to be transferred = 120
連續(xù)寫入之間的空閑周期為1。
連續(xù)讀取之間的空閑周期為3。
那么:
兩個(gè)連續(xù)寫之間的空閑周期為1個(gè)時(shí)鐘周期。它的意思是,在寫入一個(gè)數(shù)據(jù)后,模塊A等待一個(gè)時(shí)鐘周期,開始下一個(gè)寫入。因此,可以理解為每兩個(gè)時(shí)鐘周期,一個(gè)數(shù)據(jù)被寫入;
兩個(gè)連續(xù)讀取之間的空閑周期為3個(gè)時(shí)鐘周期。即讀取一個(gè)數(shù)據(jù)后,B模塊等待3個(gè)時(shí)鐘周期,開始下一次讀取。因此,我們可以理解,每四個(gè)時(shí)鐘周期,讀取一個(gè)數(shù)據(jù);
寫一個(gè)數(shù)據(jù)所需要的時(shí)間 = 2*1/50MHz = 40ns
突發(fā)傳輸中,寫完所有數(shù)據(jù)所需要的時(shí)間 = 120*40ns = 4800ns
讀一個(gè)數(shù)據(jù)所需要的時(shí)間 = 4*1/50MHz = 80ns
所以寫完所有的突發(fā)傳輸數(shù)據(jù)需要花費(fèi)4800ns
在4800ns內(nèi)能夠讀走的數(shù)據(jù)個(gè)數(shù) = 4800ns/80ns = 60
所以在4800ns內(nèi)還沒有被讀走的數(shù)據(jù)個(gè)數(shù) = 120-60 = 60
因此FIFO的最小深度為60
Case9 如果數(shù)據(jù)速率如下所示
在前面幾種場(chǎng)景中,我們給的條件都是每隔幾個(gè)時(shí)鐘讀寫一次,這種周期性讀寫在實(shí)際中很常見。但是在工程設(shè)計(jì)中還存在這樣一種情形,只給出數(shù)據(jù)在一段時(shí)間內(nèi)的讀寫速率,怎么讀寫完全隨機(jī),這種情況我們需要考慮最壞的一種情況避免數(shù)據(jù)丟失。
對(duì)于最壞的情況,讀寫之間的數(shù)據(jù)速率差異應(yīng)該是最大的。因此,對(duì)于寫操作,應(yīng)該考慮最大數(shù)據(jù)速率,對(duì)于讀操作,應(yīng)該考慮最小數(shù)據(jù)速率。
寫數(shù)據(jù)時(shí)鐘頻率fa=讀數(shù)據(jù)時(shí)鐘頻率fb
在寫時(shí)鐘周期內(nèi),每100個(gè)周期就有80個(gè)數(shù)據(jù)寫入FIFO
在讀時(shí)鐘周期內(nèi),每10個(gè)周期可以有8個(gè)數(shù)據(jù)讀出FIFO
以下是一些可能性:
下面是從上圖中觀察到的情況:
寫操作的最大數(shù)據(jù)速率在上表格中case - 4。(寫操作在最小的時(shí)間內(nèi)完成)。因此,考慮case - 4來進(jìn)行進(jìn)一步的計(jì)算。
首先這里沒有給出數(shù)據(jù)的突發(fā)長度,從假設(shè)中可以得出每100個(gè)周期就有80個(gè)數(shù)據(jù)寫入FIFO,這里可能就有人會(huì)說突發(fā)長度就是80個(gè)數(shù)據(jù),其實(shí)不是這樣的,因?yàn)閿?shù)據(jù)是隨機(jī)寫入FIFO的,我們需要考慮做壞的情形,即寫速率最大的情形,只有如下圖背靠背的情形才是寫速率最高的情形,burst length為160;
在讀時(shí)鐘周期內(nèi),每10個(gè)周期可以有8個(gè)數(shù)據(jù)讀出FIFO;即一個(gè)周期可以寫入 8/10 數(shù)據(jù)
所以160個(gè)時(shí)鐘讀了160*8/10 = 128個(gè)數(shù)據(jù);
考慮背靠背(20個(gè)clk不發(fā)數(shù)據(jù)+80clk發(fā)數(shù)據(jù)+80clk發(fā)數(shù)據(jù)+20clk不發(fā)數(shù)據(jù)的共200個(gè)clk)
因此FIFO的最小深度=160 - 128 = 32
總結(jié)
從上面分析來看,求FIFO的最小深度主要有以下要點(diǎn):
在求解之前需要驗(yàn)證一下在允許的最大時(shí)間長度內(nèi)寫入的數(shù)據(jù)量是否等于讀出的數(shù)據(jù)量,保證有解;
求FIFO深度需要考慮最壞的情形,讀寫的速率應(yīng)該相差最大,也就是說需要找出最大的寫速率和最小的讀速率;
不管什么場(chǎng)景,要確定FIFO的深度,關(guān)鍵在于計(jì)算出在突發(fā)讀寫這段時(shí)間內(nèi)有多少個(gè)數(shù)據(jù)沒有被讀走;
由于FIFO空滿標(biāo)志位的判斷延遲,在實(shí)際應(yīng)用中需要預(yù)留一些余量。
下面我們來推導(dǎo)一下FIFO深度的求解公式,假設(shè):
寫時(shí)鐘周期為clkw
讀時(shí)鐘周期為clkr
在讀時(shí)鐘周期內(nèi),每x個(gè)周期內(nèi)可以有y個(gè)數(shù)據(jù)讀出FIFO,即讀數(shù)據(jù)的讀數(shù)率
在寫時(shí)鐘周期內(nèi),每m個(gè)周期內(nèi)就有n個(gè)數(shù)據(jù)寫入FIFO
背靠背“的情形下是FIFO讀寫的最壞情形,burst長度 B = 2*n
由上得到:FIFO的最小深度為 B - B * (clkr/clkw) * (y/x)
原文標(biāo)題:FIFO深度計(jì)算
文章出處:【微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
審核編輯:湯梓紅
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
6808瀏覽量
88743 -
fifo
+關(guān)注
關(guān)注
3文章
386瀏覽量
43492 -
計(jì)算
+關(guān)注
關(guān)注
2文章
442瀏覽量
38704 -
時(shí)鐘頻率
+關(guān)注
關(guān)注
0文章
49瀏覽量
20310
原文標(biāo)題:FIFO深度計(jì)算
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論