RM新时代网站-首页

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

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

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

FPGA FIFO深度計(jì)算的基本步驟和示例

CHANBAEK ? 來(lái)源:FPGA入門到精通 ? 作者: 未可知摩爾 ? 2023-08-07 15:39 ? 次閱讀

FIFO(First In First Out)是一種先進(jìn)先出的存儲(chǔ)結(jié)構(gòu),經(jīng)常被用來(lái)在FPGA設(shè)計(jì)中進(jìn)行數(shù)據(jù)緩存或者匹配傳輸速率。

本文主要介紹FIFO深度計(jì)算的方法,F(xiàn)IFO的一個(gè)關(guān)鍵參數(shù)是其深度,也就是FIFO能夠存儲(chǔ)的數(shù)據(jù)條數(shù),F(xiàn)IFO深度設(shè)計(jì)的合理,可以防止數(shù)據(jù)溢出,也可以節(jié)省FPGA資源的消耗。

一、FIFO深度計(jì)算影響因素

影響FIFO深度計(jì)算的主要因素包括:

  • FIFO的位寬:決定了每個(gè)FIFO存儲(chǔ)單元的大小
  • FIFO的數(shù)據(jù)字長(zhǎng):決定每個(gè)數(shù)據(jù)詞包含多少比特有效數(shù)據(jù)
  • FIFO的總存儲(chǔ)容量:決定最大可以存儲(chǔ)的數(shù)據(jù)條數(shù)

以32位位寬,8位字長(zhǎng)的FIFO為例,每個(gè)FIFO存儲(chǔ)單元需要32/8=4個(gè)字節(jié)。

如果FIFO總?cè)萘繛?28字節(jié),那么可以存儲(chǔ)128/4=32個(gè)數(shù)據(jù)。

此外,FIFO深度還需要考慮:

  • FPGA資源約束條件:過(guò)大的FIFO會(huì)占用過(guò)多資源
  • 實(shí)際應(yīng)用需求:深度過(guò)小可能導(dǎo)致數(shù)據(jù)丟失
  • 存儲(chǔ)密度:選擇2的整數(shù)次冪作為深度可以優(yōu)化資源利用

綜合考慮上述各因素后確定最佳的FIFO深度。

二、FIFO深度計(jì)算步驟

FPGA FIFO深度計(jì)算的基本步驟如下:

  • 根據(jù)傳輸最惡劣的情況(一段時(shí)間內(nèi)緩存數(shù)據(jù)量最大的時(shí)候),計(jì)算剩余數(shù)據(jù)量(寫數(shù)據(jù)量 - 讀數(shù)據(jù)量)。
  • 根據(jù)剩余數(shù)據(jù)總存儲(chǔ)容量/寫位寬,計(jì)算FIFO最大可存儲(chǔ)的數(shù)據(jù)量
  • 選擇大于等于最大數(shù)據(jù)量的2的冪作為FIFO深度
  • 將FIFO深度轉(zhuǎn)換為二進(jìn)制表示

如果寫比讀慢,那就不用擔(dān)心數(shù)據(jù)溢出,只有讀比寫慢的時(shí)候,需要考慮fifo深度設(shè)計(jì),以防止數(shù)據(jù)溢出。

三、Verilog代碼示例

下面是使用Verilog代碼計(jì)算FIFO深度的示例:

// FIFO參數(shù)  
parameter DATA_WIDTH = 32; // 32位
parameter WORD_SIZE = 8;  // 8位字長(zhǎng) 
parameter FIFO_SIZE = 128; // 總?cè)萘?28字節(jié)

// 每個(gè)FIFO存儲(chǔ)單元的大小
localparam FIFO_CELL_SIZE = DATA_WIDTH / WORD_SIZE;

// FIFO最大可存儲(chǔ)數(shù)據(jù)量
localparam FIFO_MAX_WORDS = FIFO_SIZE / FIFO_CELL_SIZE;  

// 選擇大于FIFO_MAX_WORDS的2的冪  
localparam FIFO_DEPTH = (FIFO_MAX_WORDS > 0) ?  
                       (2**$clog2(FIFO_MAX_WORDS)) : 1;

// FIFO深度比特寬
localparam FIFO_DEPTH_WIDTH = $clog2(FIFO_DEPTH);

這個(gè)示例中,根據(jù)位寬32位、字長(zhǎng)8位和容量128字節(jié),計(jì)算出FIFO深度為32,需要5比特表示。

四、SystemVerilog代碼示例

下面是使用SystemVerilog編寫的等價(jià)代碼:

// FIFO參數(shù)
localparam int DATA_WIDTH = 32; 
localparam int WORD_SIZE = 8;
localparam int FIFO_SIZE = 128;

// 每個(gè)FIFO存儲(chǔ)單元的大小  
localparam int FIFO_CELL_SIZE = DATA_WIDTH / WORD_SIZE;

// FIFO最大可存儲(chǔ)數(shù)據(jù)量
localparam int FIFO_MAX_WORDS = FIFO_SIZE / FIFO_CELL_SIZE;

// 選擇大于FIFO_MAX_WORDS的2的冪 
localparam int FIFO_DEPTH = (FIFO_MAX_WORDS > 0) ? 
                            2**(FIFO_MAX_WORDS.log2) : 1;

// FIFO深度比特寬            
localparam int FIFO_DEPTH_WIDTH = $clog2(FIFO_DEPTH);

SystemVerilog通過(guò)使用內(nèi)置的log2函數(shù)可以簡(jiǎn)化代碼。

五、FIFO深度計(jì)算實(shí)例

下面通過(guò)一些具體實(shí)例進(jìn)一步說(shuō)明FIFO深度計(jì)算過(guò)程。

1、匹配數(shù)據(jù)帶寬

如果FIFO需要匹配指定的數(shù)據(jù)帶寬,那么深度計(jì)算要考慮串行化因子的影響。

例如需要200MHz的串行LVDS接口,使用10位數(shù)據(jù),那么單位時(shí)間內(nèi)可以傳輸200MHz * 10位 = 2Gbps的數(shù)據(jù)。

如果后端接口是32位寬,100MHz,,那么其帶寬為100MHz * 32位 = 3.2Gbps。為匹配帶寬,前端數(shù)據(jù)需要緩存,此時(shí)FIFO深度計(jì)算如下:

后端帶寬 = 3.2Gbps  
前端帶寬 = 2Gbps
串行化因子 = 后端帶寬/前端帶寬 = 3.2/2 = 1.6  
FIFO深度 > 串行化因子 = 1.6

因此,選擇FIFO深度為2才能匹配帶寬需求。

2、防止數(shù)據(jù)溢出

如果寫入FIFO的數(shù)據(jù)速率可能高于讀取速率,那么需要增加FIFO深度來(lái)防止數(shù)據(jù)溢出。

場(chǎng)景1:如寫入速率是100MB/s,讀取速率是80MB/s,允許最大等待時(shí)間為50μs,那么需要的FIFO大小計(jì)算如下:

寫入速率 = 100MB/s
讀取速率 = 80MB/s 
最大等待時(shí)間 = 50μs
額外存儲(chǔ)量 = 寫入速率 × 最大等待時(shí)間  
          = 100MB/s × 50μs
          = 5000bit

因此,F(xiàn)IFO深度需要考慮額外存儲(chǔ)5000bit的數(shù)據(jù)量,也就是除了正常存儲(chǔ)量外還需要確保至少有5000bit的額外FIFO深度。

場(chǎng)景2:異步FIFO,寫時(shí)鐘100MHZ,讀時(shí)鐘80MHZ。讀寫位寬均為16bit。已知每100個(gè)寫周期最多寫入960bit數(shù)據(jù),讀側(cè)每時(shí)鐘讀取一個(gè)數(shù)據(jù)。問(wèn):FIFO深度至少為多少?

最惡劣情況:前100個(gè)周期的后連續(xù)60個(gè)周期寫入960bit數(shù)據(jù),后100個(gè)周期的前連續(xù)60個(gè)周期寫入960bit數(shù)據(jù)。

寫數(shù)據(jù):最大數(shù)量為連續(xù)120個(gè)寫周期內(nèi),寫入數(shù)據(jù)量960*2bit = 1920 bit,用時(shí)為120/100 ns。

讀數(shù)據(jù):這段時(shí)間內(nèi)的數(shù)據(jù)量為 120/100 * 80 * 16bit = 1536 bit 。

最大緩存數(shù)據(jù)量為 1920 - 1536 = 384 bit

寫數(shù)據(jù)最大緩存深度:384/16 = 24

最大深度需要是2的冪次方,即為32

3、優(yōu)化資源利用

有時(shí)為了優(yōu)化資源利用,可能需要降低FIFO深度。

例如根據(jù)帶寬計(jì)算,一個(gè)18Kb block RAM可以實(shí)現(xiàn)depth=512的FIFO,但考慮到資源限制,只能使用一個(gè)9Kb RAM,這時(shí)可以將FIFO設(shè)計(jì)為depth=256,節(jié)省block RAM資源。

同樣,為了優(yōu)化資源利用,F(xiàn)IFO深度通常設(shè)計(jì)為2的整數(shù)次冪,這可以減少地址解碼邏輯所需資源。

六、結(jié)論

FIFO深度計(jì)算并不復(fù)雜,但需要考慮許多實(shí)際因素,如帶寬匹配、防溢出和資源優(yōu)化等。一般來(lái)說(shuō),根據(jù)存儲(chǔ)需求計(jì)算出最大深度,再綜合考慮資源和性能約束,選擇大于等于該最大深度的2的冪次方作為最終FIFO深度,既能滿足存儲(chǔ)需求,又可以優(yōu)化FPGA資源利用。

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

    關(guān)注

    1629

    文章

    21729

    瀏覽量

    602977
  • fifo
    +關(guān)注

    關(guān)注

    3

    文章

    387

    瀏覽量

    43647
  • 存儲(chǔ)結(jié)構(gòu)

    關(guān)注

    0

    文章

    21

    瀏覽量

    9711
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    談一談FIFO深度

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

    FPGA的最大深度

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

    求助,FPGA fifo深度不夠怎么辦?

    圖像壓縮之后的數(shù)據(jù)存入fifo,然后經(jīng)過(guò)nrf2401發(fā)送。。但是由于圖片尺寸比較大,導(dǎo)致fifo深度不夠,受限于FPGA芯片尺寸的限制,fifo
    發(fā)表于 05-22 14:34

    如何計(jì)算異步FIFO深度和單獨(dú)的時(shí)鐘源

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

    如何利用LabVIEW FPGA模塊實(shí)現(xiàn)FIFO深度設(shè)定?

    數(shù)據(jù)進(jìn)入FPGA的速率高于傳出的速率,持續(xù)的傳輸會(huì)造成數(shù)據(jù)的溢出,斷續(xù)的傳輸可能會(huì)造成數(shù)據(jù)不連續(xù)。使用基于LabVIEW FPGA的DMA FIFO作為主控計(jì)算機(jī)和
    發(fā)表于 10-12 09:05

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

    `立即學(xué)習(xí)—60天FPGA工程師入門就業(yè)項(xiàng)目實(shí)戰(zhàn)特訓(xùn)營(yíng)(3月16日開(kāi)班) 談?wù)?b class='flag-5'>FIFO閾值的閾值設(shè)置及深度計(jì)算1.什么是FIFO2.什么情況下使用
    發(fā)表于 02-19 21:09

    【教程】“最惡劣”的FIFO深度計(jì)算

    FIFO內(nèi)緩存數(shù)據(jù)最多。計(jì)算此時(shí)寫入數(shù)據(jù)-該階段讀出數(shù)據(jù)即為FIFO的最小深度?! ?Nwr = 120x = Nwr - Nrd = 120 - 96 = 24.二.為保證數(shù)據(jù)連續(xù)輸
    發(fā)表于 02-22 20:37

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

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

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

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

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

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

    FIFO最小深度計(jì)算所有情況

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

    你們知道FIFO最小深度計(jì)算

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

    FIFO最小深度計(jì)算的方法

    由于平時(shí)我們工作中,FIFO都是直接調(diào)用IP核,對(duì)于FIFO深度選擇并沒(méi)有很在意,而在筆試面試過(guò)程中,經(jīng)常被問(wèn)及的問(wèn)題之一就是如何計(jì)算FIFO
    的頭像 發(fā)表于 07-03 17:25 ?2726次閱讀

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

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