背景面試
無論從事FPGA哪一個方面避免不了使用FIFO,充當緩存,多bit數據跨時鐘處理等。緩存
說來慚愧,我長期使用的是Xilinx提供FIFO的IP核,認爲有現成的爲啥不用。直到後來以爲FIFO問題其實在筆試仍是面試中都會被說起spa
因此決定寫以此文,本身的見解,若有不對之處,請批評指出。blog
前提get
首先咱們來考慮2種場景it
①:假如模塊A不間斷的往FIFO中寫數據,模塊B一樣不間斷的從FIFO中讀數據,不一樣的是模塊A寫數據的時鐘頻率要大於模塊B讀數據的時鐘頻率,那麼在一段時間內老是有一些數據沒來得及被讀走,若是系統一直在工做,那麼那些沒有被讀走的數據會越累積越多,那麼FIFO的深度須要是無窮大的。(因此FIFO常判斷依據是空滿信號,有的是自定義閾值空滿)im
②:所以只有在突發數據傳輸過程當中討論FIFO深度纔是有意義的。什麼是突發傳輸,簡單的理解是FIFO的最小深度就等於沒有被讀走的數據個數。總結
假設狀況筆試
第一種:數據
CLKW>CLKR
CLKW = 100Mhz
CLKR = 50Mhz
BL(burst length)=120 (兩個package之間時間足夠長)
width = 8bit
求FIFO最小深度
分析:
- 寫一個數據所須要的時間 = 1/100MHz = 10.0ns
- 突發傳輸中,寫完全部數據所須要的時間 = 120*10.0ns = 1200ns
- 讀一個數據所須要的時間 = 1/50MHz = 20ns
- 因此寫完全部的突發傳輸數據須要花費1200ns
- 在1200ns內可以讀走的數據個數 = 1200ns/20ns = 60
- 因此在1200ns內尚未被讀走的數據個數 = 120-60 = 60
- 所以FIFO的最小深度爲60(因爲是2的n次冪,因此應該是64)
第二種:
CLKW>CLKR
CLKW = 100Mhz
CLKR = 50Mhz
BL(burst length)=120 (
每隔1個clk寫一次
每隔3個clk讀一次
)
width = 8bit
求FIFO最小深度
分析:
- 每隔1個cycle寫一次,意味着2個clk才寫一個數據
- 每隔3個cycle讀一次,意味着4個clk纔讀一個數據
- 寫一個數據所須要的時間 = 2*1/100MHz = 20ns
- 突發傳輸中,寫完全部數據所須要的時間 = 120*20ns = 2400ns
- 讀一個數據所須要的時間 = 4*1/50MHz = 80ns
- 因此寫完全部的突發傳輸數據須要花費2400ns
- 在2400ns內可以讀走的數據個數 = 2400ns/80ns = 30
- 因此在2400ns內尚未被讀走的數據個數 = 120-30 = 90
- 所以FIFO的最小深度爲90(因爲是2的n次冪,因此應該是128)
第三種:
CLKW<CLKR
CLKW = 40Mhz
CLKR = 50Mhz
BL(burst length)=120 (
每隔1個clk寫一次
每隔3個clk讀一次
)
width = 8bit
求FIFO最小深度
分析:
- 每隔1個cycle寫一次,意味着2個clk才寫一個數據
- 每隔3個cycle讀一次,意味着4個clk纔讀一個數據
- 寫一個數據所須要的時間 = 2*1/40MHz = 50ns
- 突發傳輸中,寫完全部數據所須要的時間 = 120*50ns = 6000ns
- 讀一個數據所須要的時間 = 4*1/50MHz = 80ns
- 因此寫完全部的突發傳輸數據須要花費6000ns
- 在2400ns內可以讀走的數據個數 = 6000ns/80ns = 75
- 因此在2400ns內尚未被讀走的數據個數 = 120-75 = 45
- 所以FIFO的最小深度爲45(因爲是2的n次冪,因此應該是64)
第四種:
CLKW=CLKR
CLKW = 50Mhz
CLKR = 50Mhz
BL(burst length)=120 (
每隔1個clk寫一次
每隔3個clk讀一次
)
width = 8bit
求FIFO最小深度
分析:
- 每隔1個cycle寫一次,意味着2個clk才寫一個數據
- 每隔3個cycle讀一次,意味着4個clk纔讀一個數據
- 寫一個數據所須要的時間 = 2*1/50MHz = 40ns
- 突發傳輸中,寫完全部數據所須要的時間 = 120*40ns = 4800ns
- 讀一個數據所須要的時間 = 4*1/50MHz = 80ns
- 因此寫完全部的突發傳輸數據須要花費6000ns
- 在2400ns內可以讀走的數據個數 = 4800ns/80ns = 60
- 因此在2400ns內尚未被讀走的數據個數 = 120-60 = 60
- 所以FIFO的最小深度爲60(因爲是2的n次冪,因此應該是64)
第五種:
CLKW>CLKR
CLKW = 80Mhz
CLKR = 50Mhz
在寫時鐘週期內,每100個週期就有40個數據寫入FIFO
在讀時鐘週期內,每10個週期能夠有8個數據讀出FIFO
width = 8bit
求FIFO最小深度
分析
- 首先這裏沒有給出數據的突發長度,從假設中能夠得出每100個週期就有40個數據寫入FIFO,這裏可能就有人會說突發長度就是40個數據,其實不是這樣的,由於數據是隨機寫入FIFO的,咱們須要考慮作壞的情形,即寫速率最大的情形,只有以下圖背靠背的情形纔是寫速率最高的情形,burst length爲80
-
- 注意:這裏須要驗證一下是否有解,即寫入burst數據時間必須大於等於讀出burst數據時間,否則數據就會越累積越多,使得FIFO的深度必須爲無窮大。
- 首先寫入80個數據須要的時間 = 1/80MHz*(80*100/40)=2500ns(100/40表示每一個數據花費的週期),讀出80個數據須要的時間 = 1/50MHz*(80*10/8)=2000ns,因爲寫入burst數據時間大於對出burst數據時間,所以有解。
- 下面來計算FIFO最小深度,連續寫入80個數據最快所須要時間 = 1/80MHz * 80 = 1000ns
- 從FIFO中讀出一個數據至少所需時間 = (1/50MHz) * (10/8) = 25ns
- 那麼在1000ns內可以讀出的數據 = 1000ns/25ns = 40
- 在1000ns內沒有讀出的數據 = 80 - 40 = 40
- 所以FIFO的最小深度爲40
總結
從上面分析來看,求FIFO的最小深度主要有如下要點:
- 在求解以前須要驗證一下在容許的最大時間長度內寫入的數據量是否等於讀出的數據量,保證有解;
- 求FIFO深度須要考慮最壞的情形,讀寫的速率應該相差最大,也就是說須要找出最大的寫速率和最小的讀速率;
- 無論什麼場景,要肯定FIFO的深度,關鍵在於計算出在突發讀寫這段時間內有多少個數據沒有被讀走;
- 因爲FIFO空滿標誌位的判斷延遲,在實際應用中須要預留一些餘量。
下面咱們來推導一下FIFO深度的求解公式,假設:
- 寫時鐘頻率爲fwr
- 讀時鐘頻率爲frd
- 在寫時鐘週期內,每m個週期內就有n個數據寫入FIFO
- 在讀時鐘週期內,每x個週期內能夠有y個數據讀出FIFO
那麼:
- 首先必須知足(1/fwr)*(m/n) ≥ (1/frd)*(x/y)
- 」背靠背「的情形下是FIFO讀寫的最壞情形,burst長度 B = 2*n
- 寫完burst長度數據最快所需時間 T = (1/fwr) * B
- 從FIFO中讀出一個數據至少須要時間 t= (1/frd) * (x/y)
- 在T時間內可以讀走的數據個數 = T/t = B * (frd/fwr) * (y/x)
- 在T時間內尚未讀走的數據個數 = B - B * (frd/fwr) * (y/x)
- 所以FIFO的最小深度爲 B - B * (frd/fwr) * (y/x)
- 注意保留一些餘量