99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

FIFO最小深度計算的方法

FPGA之家 ? 來源:CSDN技術(shù)社區(qū) ? 作者: Bunny9__ ? 2022-07-03 17:25 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

由于平時我們工作中,F(xiàn)IFO都是直接調(diào)用IP核,對于FIFO深度選擇并沒有很在意,而在筆試面試過程中,經(jīng)常被問及的問題之一就是如何計算FIFO深度。

當(dāng)讀數(shù)據(jù)的速率小于寫數(shù)據(jù)的速率時,我們需要先將數(shù)據(jù)緩存下來,那么我們需要開多大的空間緩存這些數(shù)據(jù)呢?緩存開大了會浪費資源,開小了會丟失數(shù)據(jù),如何去計算最小FIFO深度是本文的重點。

本文涵蓋了FIFO最小深度計算所有情況:

b67d833e-e3a1-11ec-ba43-dac502259ad0.png

假如模塊A不間斷的往FIFO中寫數(shù)據(jù),模塊B同樣不間斷的從FIFO中讀數(shù)據(jù),不同的是模塊A寫數(shù)據(jù)的時鐘頻率要大于模塊B讀數(shù)據(jù)的時鐘頻率,那么在一段時間內(nèi)總是有一些數(shù)據(jù)沒來得及被讀走,如果系統(tǒng)一直在工作,那么那些沒有被讀走的數(shù)據(jù)會越累積越多,那么FIFO的深度需要是無窮大的;

但是若寫操作是連續(xù)的數(shù)據(jù)流,那么再大的FIFO都無法保證數(shù)據(jù)不溢出。因此可以認(rèn)為這種情況下寫數(shù)據(jù)的傳輸是“突發(fā)Burst”的,即寫操作并不連續(xù);

要確定FIFO的深度,關(guān)鍵在于計算出在突發(fā)讀寫這段時間內(nèi)有多少個數(shù)據(jù)沒有被讀走。即FIFO的最小深度就等于沒有被讀走的數(shù)據(jù)個數(shù)。

Case1 fa>fb with no idle cycles in both write and read

即寫時鐘快于讀時鐘,寫和讀的過程中沒有空閑周期;

假設(shè):

寫數(shù)據(jù)時鐘頻率fa=80MHz

讀數(shù)據(jù)時鐘頻率fb=50MHz

突發(fā)長度= number of data to be transferred = 120

在突發(fā)傳輸過程中,數(shù)據(jù)都是連續(xù)讀寫的

那么:

寫一個數(shù)據(jù)所需要的時間 = 1/80MHz = 12.5ns

突發(fā)傳輸中,寫完所有數(shù)據(jù)所需要的時間 = 120*12.5ns = 1500ns

讀一個數(shù)據(jù)所需要的時間 = 1/50MHz = 20ns

所以寫完所有的突發(fā)傳輸數(shù)據(jù)需要花費1500ns

在1500ns內(nèi)能夠讀走的數(shù)據(jù)個數(shù) = 1500ns/20ns = 75

所以在1500ns內(nèi)還沒有被讀走的數(shù)據(jù)個數(shù) = 120-75 = 45

因此FIFO的最小深度為45

Case2 fa>fb with two clock cycle delay between two successive read and write

即寫時鐘頻率大于讀時鐘頻率,但在讀寫的過程中存在空閑周期;

Case2在Case1的基礎(chǔ)上增加了一個假設(shè),即讀比寫慢兩拍。這種假設(shè)是真正存在的,在異步FIFO設(shè)計中,我們需要去判斷FIFO的空滿來保證邏輯的正確性,判斷空滿標(biāo)志需要去比較讀寫指針,而讀指針與寫指針處在不同的時鐘域中,我們需要采用格雷碼和兩級同步寄存器去降低亞穩(wěn)態(tài)的概率,而兩級同步必然會導(dǎo)致空滿標(biāo)志位的判斷至少延遲2個cycle。對于空標(biāo)志位來說,將寫指針同步到讀時鐘域至少需要花費2個時鐘,而在同步這段時間內(nèi)有可能還會寫入新的數(shù)據(jù),因此同步后的寫指針一定小于或等于(當(dāng)且僅有同步時間內(nèi)沒有新數(shù)據(jù)寫入的情況下才會等于)當(dāng)前的寫指針,所以此時判斷不一定是真空;同理,對于滿標(biāo)志位來說,將讀指針同步到讀時鐘域至少需要花費2個時鐘,而在同步這段時間內(nèi)有可能還會讀出新的數(shù)據(jù),因此同步后的讀指針一定小于或等于當(dāng)前讀指針,所以此時判斷并不一定是真滿。

通過上述討論可以知道Case2的FIFO最小深度應(yīng)該比場景1的FIFO最小深度45略大。

Case3 fa > fb with idle cycles in both write and read

即寫時鐘頻率大于讀時鐘頻率,但在讀寫的過程中存在空閑周期;

假設(shè):

寫數(shù)據(jù)時鐘頻率fa=80MHz

讀數(shù)據(jù)時鐘頻率fb=50MHz

突發(fā)長度= number of data to be transferred = 120

連續(xù)寫入之間的空閑周期為1。

連續(xù)讀取之間的空閑周期為3。

那么:

兩個連續(xù)寫之間的空閑周期為1個時鐘周期。它的意思是,在寫入一個數(shù)據(jù)后,模塊A等待一個時鐘周期,開始下一個寫入。因此,可以理解為每兩個時鐘周期,一個數(shù)據(jù)被寫入;

兩個連續(xù)讀取之間的空閑周期為3個時鐘周期。即讀取一個數(shù)據(jù)后,B模塊等待3個時鐘周期,開始下一次讀取。因此,我們可以理解,每四個時鐘周期,讀取一個數(shù)據(jù);

寫一個數(shù)據(jù)所需要的時間 = 2*1/80MHz = 25ns

突發(fā)傳輸中,寫完所有數(shù)據(jù)所需要的時間 = 120*25ns = 3000ns

讀一個數(shù)據(jù)所需要的時間 = 4*1/50MHz = 80ns

所以寫完所有的突發(fā)傳輸數(shù)據(jù)需要花費3000ns

在3000ns內(nèi)能夠讀走的數(shù)據(jù)個數(shù) = 3000ns/80ns = 37.5

所以在3000ns內(nèi)還沒有被讀走的數(shù)據(jù)個數(shù) = 120-37.5 = 82.5

因此FIFO的最小深度為83

Case4 fa > fb with duty cycles given for wr_enb and rd_enb.

即寫時鐘頻率大于讀時鐘頻率,給定wr_enb和rd_enb的占空比;

假設(shè):

寫數(shù)據(jù)時鐘頻率fa=80MHz

讀數(shù)據(jù)時鐘頻率fb=50MHz

突發(fā)長度= number of data to be transferred = 120

寫使能信號占整個burst時間比重為1/2

讀使能信號占整個burst時間比重為1/4

那么:

此場景與前一個場景(場景3)沒有任何不同,因為在本例中,一個數(shù)據(jù)項將在2個時鐘周期內(nèi)寫入,而一個數(shù)據(jù)項將在4個時鐘周期內(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ù)據(jù)時鐘頻率fa=30MHz

讀數(shù)據(jù)時鐘頻率fb=50MHz

突發(fā)長度= number of data to be transferred = 120

在突發(fā)傳輸過程中,數(shù)據(jù)都是連續(xù)讀寫的

那么:

由于讀數(shù)據(jù)比寫數(shù)據(jù)要快,這種情況下永遠(yuǎn)也不會發(fā)生數(shù)據(jù)丟失的,因此FIFO只起到過時鐘域的作用,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).

即寫時鐘頻率小于讀時鐘頻率,給定wr_enb和rd_enb的占空比;

假設(shè):

寫數(shù)據(jù)時鐘頻率fa=40MHz

讀數(shù)據(jù)時鐘頻率fb=50MHz

突發(fā)長度= number of data to be transferred = 120

連續(xù)寫入之間的空閑周期為1。

連續(xù)讀取之間的空閑周期為3。

那么:

兩個連續(xù)寫之間的空閑周期為1個時鐘周期。它的意思是,在寫入一個數(shù)據(jù)后,模塊A等待一個時鐘周期,開始下一個寫入。因此,可以理解為每兩個時鐘周期,一個數(shù)據(jù)被寫入;

兩個連續(xù)讀取之間的空閑周期為3個時鐘周期。即讀取一個數(shù)據(jù)后,B模塊等待3個時鐘周期,開始下一次讀取。因此,我們可以理解,每四個時鐘周期,讀取一個數(shù)據(jù);

寫一個數(shù)據(jù)所需要的時間 = 2*1/40MHz = 50ns

突發(fā)傳輸中,寫完所有數(shù)據(jù)所需要的時間 = 120*50ns = 6000ns

讀一個數(shù)據(jù)所需要的時間 = 4*1/50MHz = 80ns

所以寫完所有的突發(fā)傳輸數(shù)據(jù)需要花費6000ns

在6000ns內(nèi)能夠讀走的數(shù)據(jù)個數(shù) = 6000ns/80ns = 75

所以在6000ns內(nèi)還沒有被讀走的數(shù)據(jù)個數(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ù)據(jù)時鐘頻率fa=50MHz

讀數(shù)據(jù)時鐘頻率fb=50MHz

突發(fā)長度= number of data to be transferred = 120

讀和寫都沒有空閑周期,這意味著突發(fā)中的所有項都將以連續(xù)的時鐘周期寫入和讀取

那么:

如果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).

即寫時鐘頻率等于讀時鐘頻率,給定wr_enb和rd_enb的占空比;

假設(shè):

寫數(shù)據(jù)時鐘頻率fa=50MHz

讀數(shù)據(jù)時鐘頻率fb=50MHz

突發(fā)長度= number of data to be transferred = 120

連續(xù)寫入之間的空閑周期為1。

連續(xù)讀取之間的空閑周期為3。

那么:

兩個連續(xù)寫之間的空閑周期為1個時鐘周期。它的意思是,在寫入一個數(shù)據(jù)后,模塊A等待一個時鐘周期,開始下一個寫入。因此,可以理解為每兩個時鐘周期,一個數(shù)據(jù)被寫入;

兩個連續(xù)讀取之間的空閑周期為3個時鐘周期。即讀取一個數(shù)據(jù)后,B模塊等待3個時鐘周期,開始下一次讀取。因此,我們可以理解,每四個時鐘周期,讀取一個數(shù)據(jù);

寫一個數(shù)據(jù)所需要的時間 = 2*1/50MHz = 40ns

突發(fā)傳輸中,寫完所有數(shù)據(jù)所需要的時間 = 120*40ns = 4800ns

讀一個數(shù)據(jù)所需要的時間 = 4*1/50MHz = 80ns

所以寫完所有的突發(fā)傳輸數(shù)據(jù)需要花費4800ns

在4800ns內(nèi)能夠讀走的數(shù)據(jù)個數(shù) = 4800ns/80ns = 60

所以在4800ns內(nèi)還沒有被讀走的數(shù)據(jù)個數(shù) = 120-60 = 60

因此FIFO的最小深度為60

Case9 如果數(shù)據(jù)速率如下所示

在前面幾種場景中,我們給的條件都是每隔幾個時鐘讀寫一次,這種周期性讀寫在實際中很常見。但是在工程設(shè)計中還存在這樣一種情形,只給出數(shù)據(jù)在一段時間內(nèi)的讀寫速率,怎么讀寫完全隨機,這種情況我們需要考慮最壞的一種情況避免數(shù)據(jù)丟失。

對于最壞的情況,讀寫之間的數(shù)據(jù)速率差異應(yīng)該是最大的。因此,對于寫操作,應(yīng)該考慮最大數(shù)據(jù)速率,對于讀操作,應(yīng)該考慮最小數(shù)據(jù)速率。

寫數(shù)據(jù)時鐘頻率fa=讀數(shù)據(jù)時鐘頻率fb

在寫時鐘周期內(nèi),每100個周期就有80個數(shù)據(jù)寫入FIFO

在讀時鐘周期內(nèi),每10個周期可以有8個數(shù)據(jù)讀出FIFO

以下是一些可能性:

b6d25bde-e3a1-11ec-ba43-dac502259ad0.png

下面是從上圖中觀察到的情況:

b72cb6e2-e3a1-11ec-ba43-dac502259ad0.png

寫操作的最大數(shù)據(jù)速率在上表格中case - 4。(寫操作在最小的時間內(nèi)完成)。因此,考慮case - 4來進(jìn)行進(jìn)一步的計算。

首先這里沒有給出數(shù)據(jù)的突發(fā)長度,從假設(shè)中可以得出每100個周期就有80個數(shù)據(jù)寫入FIFO,這里可能就有人會說突發(fā)長度就是80個數(shù)據(jù),其實不是這樣的,因為數(shù)據(jù)是隨機寫入FIFO的,我們需要考慮做壞的情形,即寫速率最大的情形,只有如下圖背靠背的情形才是寫速率最高的情形,burst length為160;

b7a92d62-e3a1-11ec-ba43-dac502259ad0.png

在讀時鐘周期內(nèi),每10個周期可以有8個數(shù)據(jù)讀出FIFO;即一個周期可以寫入 8/10 數(shù)據(jù)

所以160個時鐘讀了160*8/10 = 128個數(shù)據(jù);

考慮背靠背(20個clk不發(fā)數(shù)據(jù)+80clk發(fā)數(shù)據(jù)+80clk發(fā)數(shù)據(jù)+20clk不發(fā)數(shù)據(jù)的共200個clk)

因此FIFO的最小深度=160 - 128 = 32

總結(jié)

從上面分析來看,求FIFO的最小深度主要有以下要點:

在求解之前需要驗證一下在允許的最大時間長度內(nèi)寫入的數(shù)據(jù)量是否等于讀出的數(shù)據(jù)量,保證有解;

求FIFO深度需要考慮最壞的情形,讀寫的速率應(yīng)該相差最大,也就是說需要找出最大的寫速率和最小的讀速率;

不管什么場景,要確定FIFO的深度,關(guān)鍵在于計算出在突發(fā)讀寫這段時間內(nèi)有多少個數(shù)據(jù)沒有被讀走;

由于FIFO空滿標(biāo)志位的判斷延遲,在實際應(yīng)用中需要預(yù)留一些余量。

下面我們來推導(dǎo)一下FIFO深度的求解公式,假設(shè):

寫時鐘周期為clkw

讀時鐘周期為clkr

在讀時鐘周期內(nèi),每x個周期內(nèi)可以有y個數(shù)據(jù)讀出FIFO,即讀數(shù)據(jù)的讀數(shù)率

在寫時鐘周期內(nèi),每m個周期內(nèi)就有n個數(shù)據(jù)寫入FIFO

背靠背“的情形下是FIFO讀寫的最壞情形,burst長度 B = 2*n

由上得到:FIFO的最小深度為 B - B * (clkr/clkw) * (y/x)

原文標(biāo)題:FIFO深度計算

文章出處:【微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7256

    瀏覽量

    91925
  • fifo
    +關(guān)注

    關(guān)注

    3

    文章

    402

    瀏覽量

    44824
  • 計算
    +關(guān)注

    關(guān)注

    2

    文章

    453

    瀏覽量

    39353
  • 時鐘頻率
    +關(guān)注

    關(guān)注

    0

    文章

    50

    瀏覽量

    20689

原文標(biāo)題:FIFO深度計算

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    FPGA學(xué)習(xí)-總結(jié)fifo設(shè)計中深度H的計算

    對于fifo來說,H的設(shè)置至關(guān)重要。既要保證功能性,不溢出丟數(shù),也要保證性能流水。深度設(shè)置過小會影響功能,過大又浪費資源。因此,總結(jié)下fifo設(shè)計中深度H的
    發(fā)表于 08-29 11:19 ?1777次閱讀

    談一談FIFO深度

    最近加的群里面有些萌新在進(jìn)行討論**FIFO深度**的時候,覺得 **FIFO深度計算比較難以理解** 。所
    的頭像 發(fā)表于 11-28 16:19 ?1674次閱讀
    談一談<b class='flag-5'>FIFO</b>的<b class='flag-5'>深度</b>

    FPGA的最大深度

    被用作系統(tǒng)中的緩沖元件或隊列。因此FIFO的大小基本上暗示了所需緩存數(shù)據(jù)的容量,該容量取決于讀寫數(shù)據(jù)的速率。FIFO深度計算=B-B*F2/(F1*I), B為突發(fā)數(shù)據(jù)塊大小
    發(fā)表于 05-28 14:17

    FIFO深度怎么設(shè)計

    大家好,我有一個設(shè)計問題,我有兩個域之間的接口:輸入是50MHz的16位并行數(shù)據(jù)輸出為500 MHz的1位串行數(shù)據(jù),對于這種情況,我需要設(shè)計一個FIFO。任何人都可以幫助我設(shè)計FIFO,特別是最小
    發(fā)表于 01-10 10:45

    如何計算異步FIFO深度和單獨的時鐘源

    fifo不為空時,用rd clk = 50 MHz連續(xù)讀出數(shù)據(jù)。從模擬開始,在5次寫入后,fifo空置為空。如何正確計算深度?最初,我的深度
    發(fā)表于 04-09 06:25

    談?wù)?b class='flag-5'>FIFO閾值的閾值設(shè)置及深度計算

    (bust)*bw(write)且保證空閑時間內(nèi)slave 把FIFO讀空:T(空閑時間)*bw(read) >=fifo_dpeth (2)常用FIFO最小
    發(fā)表于 02-19 21:09

    【教程】“最惡劣”的FIFO深度計算

    FIFO內(nèi)緩存數(shù)據(jù)最多。計算此時寫入數(shù)據(jù)-該階段讀出數(shù)據(jù)即為FIFO最小深度?! ?Nwr = 120x = Nwr - Nrd = 12
    發(fā)表于 02-22 20:37

    LabVIEW FPGA模塊實現(xiàn)FIFO深度設(shè)定

    為了解決基于LabVIEWFPGA模塊的DMAFIFO深度設(shè)定不當(dāng)帶來的數(shù)據(jù)不連續(xù)問題,結(jié)合LabVIEWFPGA的編程特點和DMA FIFO的工作原理,提出了一種設(shè)定 FIFO 深度
    發(fā)表于 09-26 13:45 ?7736次閱讀
    LabVIEW FPGA模塊實現(xiàn)<b class='flag-5'>FIFO</b><b class='flag-5'>深度</b>設(shè)定

    基于LabVIEW FPGA模塊程序設(shè)計特點的FIFO深度設(shè)定詳解

    為了解決基于LabVIEWFPGA模塊的DMAFIFO深度設(shè)定不當(dāng)帶來的數(shù)據(jù)不連續(xù)問題,結(jié)合LabVIEWFPGA的編程特點和DMA FIFO的工作原理,提出了一種設(shè)定FIFO深度
    發(fā)表于 01-04 14:25 ?5009次閱讀
    基于LabVIEW FPGA模塊程序設(shè)計特點的<b class='flag-5'>FIFO</b><b class='flag-5'>深度</b>設(shè)定詳解

    銅導(dǎo)線在100℃時的趨膚效應(yīng)深度計算實用工具免費下載

    銅線 高頻趨膚效應(yīng)深度計算工具
    發(fā)表于 03-06 11:47 ?17次下載

    FIFO最小深度計算所有情況

    數(shù)據(jù)緩存下來,那么我們需要開多大的空間緩存這些數(shù)據(jù)呢?緩存開大了會浪費資源,開小了會丟失數(shù)據(jù),如何去計算最小FIFO深度是本文的重點。 本文涵蓋了F
    的頭像 發(fā)表于 05-11 14:37 ?2381次閱讀
    <b class='flag-5'>FIFO</b><b class='flag-5'>最小</b><b class='flag-5'>深度計算</b>所有情況

    你們知道FIFO最小深度計算

    FIFO 最小深度計算 例子 - 1:f_wr 》 f_rd,連續(xù)讀寫 寫時鐘80MHz。 讀時鐘50MHz。 Burst_Len = 120,也就是要求至少安全寫入120個數(shù)據(jù)。 連續(xù)寫入和連續(xù)
    的頭像 發(fā)表于 09-10 09:23 ?2313次閱讀
    你們知道<b class='flag-5'>FIFO</b><b class='flag-5'>最小</b><b class='flag-5'>深度計算</b>嗎

    如何簡單快速地計算FIFO最小深度

    的基礎(chǔ)上。連續(xù)無止境的突發(fā)不考慮。比如寫時鐘100M,讀時鐘50M,無限制的讀寫,那么FIFO深度只能是無窮大了,因為寫比讀快,FIFO一定永遠(yuǎn)都不夠用。所以在實際運用中,不會存在無限制的對
    的頭像 發(fā)表于 02-26 17:41 ?3880次閱讀
    如何簡單快速地<b class='flag-5'>計算</b><b class='flag-5'>FIFO</b>的<b class='flag-5'>最小</b><b class='flag-5'>深度</b>

    FIFO的結(jié)構(gòu)與深度計算介紹

    在IC設(shè)計中,模塊與模塊之間的通信設(shè)計中,多時鐘的情況已經(jīng)不可避免;數(shù)據(jù)在不同時鐘域之間的傳輸很容易引起亞穩(wěn)態(tài);異步FIFO就是一種簡單、快捷的解決方案。
    發(fā)表于 06-27 10:02 ?5039次閱讀
    <b class='flag-5'>FIFO</b>的結(jié)構(gòu)與<b class='flag-5'>深度計算</b>介紹

    FPGA FIFO深度計算的基本步驟和示例

    FIFO(First In First Out)是一種先進(jìn)先出的存儲結(jié)構(gòu),經(jīng)常被用來在FPGA設(shè)計中進(jìn)行數(shù)據(jù)緩存或者匹配傳輸速率。
    的頭像 發(fā)表于 08-07 15:39 ?1623次閱讀