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設(shè)計(jì)過程中常用的FIFO

OpenFPGA ? 來源:OpenFPGA ? 作者:OpenFPGA ? 2022-09-20 09:10 ? 次閱讀

介紹

無論何時(shí),在復(fù)雜的 FPGA 設(shè)計(jì)過程中,都不可避免地需要在模塊之間發(fā)送數(shù)據(jù),實(shí)現(xiàn)這一點(diǎn)的常用的是 FIFO。

FIFO

寫入:當(dāng)寫入 FIFO 時(shí),需要確保不要寫入太多數(shù)據(jù)以致 FIFO 溢出。為了幫助解決這個(gè)問題,F(xiàn)IFO 通常有一個(gè)完整的計(jì)數(shù)標(biāo)志,有時(shí)還可以使用一個(gè)watermark端口。

watermark:本質(zhì)上告訴 FIFO 中的項(xiàng)目何時(shí)超過一定數(shù)量,這時(shí)候應(yīng)該放慢速度或不放入數(shù)據(jù)。但如果想發(fā)送特定數(shù)量的數(shù)據(jù),將需要添加額外的步驟在狀態(tài)機(jī)中管理“above watermark”的情況。在狀態(tài)機(jī)上工作時(shí),可能需要添加狀態(tài)和寄存器來管理邊緣情況(空滿情況)。

full flag:比較棘手的信號(hào),因?yàn)?full flag 可能會(huì)在輸入數(shù)據(jù)的同一時(shí)鐘變高。如果有流水線設(shè)計(jì),則需要在檢測到“full”狀態(tài)時(shí)緩沖這些數(shù)據(jù)。

count:計(jì)數(shù)可以大致了解可以進(jìn)入 FIFO 的數(shù)據(jù)量。計(jì)數(shù)的更新比watermark和full flag慢,并且會(huì)給你一個(gè)保守的 FIFO 內(nèi)的空間計(jì)數(shù)。我很想經(jīng)常使用它,但我發(fā)現(xiàn)我需要在狀態(tài)機(jī)中添加一些狀態(tài)來管理它。

Reading:從 FIFO 讀取通常不會(huì)那么糟糕,只要在空標(biāo)志不置位時(shí)不讀取即可。

Double Buffer

我?guī)煾底屛铱紤]使用雙端口block-ram 作為雙緩沖器。就像 FIFO 一樣,類似具有如下行為的讀取器和寫入器:

寫入器:將數(shù)據(jù)寫入block-ram,然后使用跨時(shí)鐘域技術(shù)將數(shù)據(jù)的大小和狀態(tài)發(fā)送給讀取器。

讀取器:讀取寫入器放入 RAM 的已知數(shù)據(jù)量。

這種方法的好處在于,寫入器知道它可以寫入多少空間,而讀取器知道它可以讀取多少數(shù)據(jù)。這非常適合流水線設(shè)計(jì)。另一個(gè)方面是寫入器可以在讀取器讀取數(shù)據(jù)時(shí)開始處理block-ram 的后半部分。不過,這種方法并不是自由操作。以下是現(xiàn)在需要由寫入器和讀取器管理的一些事情:

寫入器

ram中有多少空間(或ram的一半)

開始/結(jié)束地址指針

寫入了多少數(shù)據(jù)

讀取器

有多少數(shù)據(jù)可供讀取

開始/結(jié)束地址指針

我喜歡這種雙緩沖區(qū)給我的數(shù)據(jù)量的預(yù)知。這允許我編寫內(nèi)核,將已知數(shù)量的數(shù)據(jù)從雙緩沖區(qū)的輸出轉(zhuǎn)儲(chǔ)到另一個(gè)位置,如音頻視頻緩沖區(qū)。不幸的是,每個(gè)使用雙緩沖器的模塊都必須設(shè)計(jì)為能夠處理上述所有問題以及更多的跨時(shí)鐘域標(biāo)志。

如果不需要擔(dān)心 FIFO(滿/空)的邊緣情況,這將是最容易使用的機(jī)制。下面將這兩種機(jī)制結(jié)合起來可能是最佳方案。

Ping Pong FIFO

Ping Pong FIFO 本質(zhì)上是一個(gè)上面描述的雙緩沖區(qū),包裹起來看起來像一個(gè) FIFO。所有地址指針和跨時(shí)鐘域通信都包含在一個(gè)簡單的模塊中。模塊如下所示:

modulePPFIFO
#(parameterDATA_WIDTH=8,
ADDRESS_WIDTH=4
)(

//universalinput
inputreset,

//writeside
inputwrite_clock,
outputreg[1:0]write_ready,
input[1:0]write_activate,
output[23:0]write_fifo_size,
inputwrite_strobe,
input[DATA_WIDTH-1:0]write_data,
outputstarved,

//readside
inputread_clock,
inputread_strobe,
outputregread_ready,
inputread_activate,
outputreg[23:0]read_count,
output[DATA_WIDTH-1:0]read_data,

outputinactive
);

有單獨(dú)的寫入端和讀取端時(shí)鐘,選通用于寫入和讀取數(shù)據(jù)。不過也有一些新的信號(hào):

write_ready:這與雙緩沖區(qū)有關(guān),需要管理緩沖區(qū)的兩側(cè)。這2 bit信號(hào)告訴雙緩沖區(qū)的哪一側(cè)已準(zhǔn)備好。

0:緩沖區(qū)的下半部分準(zhǔn)備好

1:上半部分準(zhǔn)備好

write_activate:用戶告訴 Ping Pong FIFO 它想要擁有緩沖區(qū)的一側(cè)

write_fifo_size:表示用戶可以寫入 Ping Pong FIFO(PPFIFO) 的字?jǐn)?shù)。

注意:不需要在完成之前填充寫入端,PPFIFO 將跟蹤寫入的元素?cái)?shù)量并將此信息發(fā)送到讀取端,作為將遞增數(shù)字模式寫入 PPFIFO 的簡單模塊示例

/*Module:ppfifo_source
*
*Description:PopulateaPingPongFIFOwithanincrementingnumberpattern
*/

moduleppfifo_source#(
parameterDATA_WIDTH=8
)(
inputclk,
inputrst,
inputi_enable,

//PingPongFIFOInterface
input[1:0]i_wr_rdy,
outputreg[1:0]o_wr_act,
input[23:0]i_wr_size,
outputrego_wr_stb,
outputreg[DATA_WIDTH-1:0]o_wr_data
);

//LocalParameters
//Registers/Wires
reg[23:0]r_count;
//Submodules
//AsynchronousLogic
//SynchronousLogic
always@(posedgeclk)begin
//De-assertStrobes
o_wr_stb<=?0;

??if?(rst)?begin
????o_wr_act????????<=??0;
????o_wr_stb????????<=??0;
????o_wr_data???????<=??0;
????r_count?????????<=??0;
??end
??else?begin
????if?(i_enable)?begin
??????if?((i_wr_rdy?>0)&&(o_wr_act==0))begin
r_count<=??0;
????????if?(i_wr_rdy[0])?begin
??????????//Channel?0?is?open
??????????o_wr_act[0]??<=??1;
????????end
????????else?begin
??????????//Channel?1?is?open
??????????o_wr_act[1]??<=??1;
????????end
??????end
??????else?if?(o_wr_act?>0)begin
if(r_count

正如所看到的,通過添加一個(gè)額外的寄存器來跟蹤添加到 PPFIFO 的數(shù)據(jù)量,不必?fù)?dān)心full flags、water marks 或者counts。

閱讀方面更容易。PPFIFO 知道首先寫入哪個(gè)緩沖區(qū),因此用戶只需要觀察一個(gè)read_ready標(biāo)志,然后使用read_activate告訴它我們有控制權(quán)。以下是從 PPFIFO 讀取數(shù)據(jù)的示例:

這里有更具體的細(xì)節(jié):

用戶監(jiān)視“read_ready”位:當(dāng)“read_ready”信號(hào)為 1 時(shí),ppfifo 為用戶準(zhǔn)備好一個(gè)數(shù)據(jù)塊。

用戶使用“read_activate”信號(hào)激活該塊并使用“read_strobe”讀取 NEXT 數(shù)據(jù)

“read_count”是緩沖區(qū)中數(shù)據(jù)元素的總數(shù)。

用戶必須在將“read_activate”設(shè)置為低之前讀取所有數(shù)據(jù)

/*Module:ppfifo_sink
*
*Description:WheneverdataisavailablewithintheFIFOactivateitandreaditall
*/

moduleppfifo_sink#(
parameterDATA_WIDTH=8
)(
inputclk,
inputrst,

//PingPongFIFOInterface
inputi_rd_rdy,
outputrego_rd_act,
input[23:0]i_rd_size,
outputrego_rd_stb,
input[DATA_WIDTH-1:0]i_rd_data
);

//LocalParameters
//Registers/Wires
reg[23:0]r_count;
//Submodules
//AsynchronousLogic
//SynchronousLogic
always@(posedgeclk)begin
//De-AssertStrobes
o_rd_stb<=??0;

??if?(rst)?begin
????o_rd_act??????????<=??0;
????r_count???????????<=??0;
????o_rd_stb??????????<=??0;
??end
??else?begin
????if?(i_rd_rdy?&&?!o_rd_act)?begin
??????r_count?????????<=??0;
??????o_rd_act????????<=??1;
????end
????else?if?(o_rd_act)?begin
??????if?(r_count?

下面設(shè)計(jì)一個(gè)簡單的測試模塊來演示 Ping Pong FIFO。

源代碼地址:

https://github.com/CospanDesign/verilog_ppfifo_demo

下面是幾個(gè)簡單模擬的截圖:

a16db632-387c-11ed-ba43-dac502259ad0.png

在讀事務(wù)開始和下一個(gè)寫事務(wù)開始時(shí)放大仿真區(qū)域:

a21b79a2-387c-11ed-ba43-dac502259ad0.png

在讀取事務(wù)之間放大

a255998e-387c-11ed-ba43-dac502259ad0.png

半放大

a2bc99ea-387c-11ed-ba43-dac502259ad0.png

截圖可能不清晰,建議自己仿真。

總結(jié)

PPFIFO除了上面用于解決FIFO的“痛處”外,常見的還是處理高速數(shù)據(jù)流處理,下面是一個(gè)10M數(shù)據(jù)流分成兩個(gè)5M數(shù)據(jù)流的例子。

審核編輯:彭靜

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

    關(guān)注

    1629

    文章

    21729

    瀏覽量

    602977
  • FPGA設(shè)計(jì)
    +關(guān)注

    關(guān)注

    9

    文章

    428

    瀏覽量

    26506
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7002

    瀏覽量

    88938
  • fifo
    +關(guān)注

    關(guān)注

    3

    文章

    387

    瀏覽量

    43647

原文標(biāo)題:乒乓操作實(shí)例講解-FIFO

文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    FPGA中常用的存儲(chǔ)器資源

    本文主要介紹FPGA中常用的RAM、ROM、CAM、SRAM、DRAM、FLASH等資源,包括特性、工作原理、應(yīng)用場景等。
    發(fā)表于 08-15 15:41 ?2880次閱讀

    FPGA設(shè)計(jì)中常用的復(fù)位設(shè)計(jì)

    下面對(duì)FPGA設(shè)計(jì)中常用的復(fù)位設(shè)計(jì)方法進(jìn)行了分類、分析和比較。針對(duì)FPGA在復(fù)位過程中存在不可靠復(fù)位的現(xiàn)象,提出了提高復(fù)位設(shè)計(jì)可靠性的4種方法,包括清除復(fù)位信號(hào)上的毛刺、異步復(fù)位同步釋
    發(fā)表于 06-30 07:00

    平衡小車在移植過程中常見的問題有哪些?

    平衡小車在移植過程中常見的問題有哪些?
    發(fā)表于 11-10 06:19

    在嵌入式開發(fā)過程中常用的庫函數(shù)有哪些

    在嵌入式開發(fā)過程中常用的庫函數(shù)有哪些?有何優(yōu)勢?
    發(fā)表于 02-25 07:07

    基于FPGAFIFO設(shè)計(jì)和應(yīng)用

    基于FPGAFIFO設(shè)計(jì)和應(yīng)用 引 言   在利用DSP實(shí)現(xiàn)視頻實(shí)時(shí)跟蹤時(shí),需要進(jìn)行大量高速的圖像采集。而DSP本身自帶的FIFO并不足以支持系統(tǒng)中大量數(shù)據(jù)的暫時(shí)存儲(chǔ)
    發(fā)表于 11-20 11:25 ?2213次閱讀
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>FIFO</b>設(shè)計(jì)和應(yīng)用

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

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

    異步FIFO結(jié)構(gòu)及FPGA設(shè)計(jì)

    異步FIFO結(jié)構(gòu)及FPGA設(shè)計(jì),解決亞穩(wěn)態(tài)的問題
    發(fā)表于 11-10 15:21 ?4次下載

    繪制原理圖和PCB圖的過程中常遇到的一些問題

    繪制原理圖和PCB圖的過程中常遇到的一些問題.doc
    發(fā)表于 07-12 10:42 ?0次下載

    FPGA電路FIFO設(shè)計(jì)的源代碼

    FPGA電路FIFO設(shè)計(jì)的源代碼
    發(fā)表于 07-08 17:34 ?15次下載
    <b class='flag-5'>FPGA</b>電路<b class='flag-5'>FIFO</b>設(shè)計(jì)的源代碼

    FPGA設(shè)計(jì)中常用的復(fù)位設(shè)計(jì)資料下載

    電子發(fā)燒友網(wǎng)為你提供FPGA設(shè)計(jì)中常用的復(fù)位設(shè)計(jì)資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(fā)表于 04-10 08:40 ?40次下載
    <b class='flag-5'>FPGA</b>設(shè)計(jì)<b class='flag-5'>中常用</b>的復(fù)位設(shè)計(jì)資料下載

    FPGA調(diào)試中常用的TCL語法簡介

    使用Jtag Master調(diào)試FPGA程序時(shí)用到tcl語言,通過編寫tcl腳本,可以實(shí)現(xiàn)對(duì)FPGA的讀寫,為調(diào)試FPGA程序帶來極大的便利,下面對(duì)FPGA調(diào)試
    的頭像 發(fā)表于 02-19 19:44 ?2733次閱讀

    AXI FIFO和AXI virtual FIFO兩個(gè)IP的使用方法

    FIFO 是我們?cè)O(shè)計(jì)中常用的工具,因?yàn)樗鼈兪刮覀兡軌蛟谶M(jìn)行信號(hào)和圖像處理時(shí)緩沖數(shù)據(jù)。我們還使用異步FIFO來處理數(shù)據(jù)總線的時(shí)鐘域交叉問題。
    發(fā)表于 11-04 09:14 ?4852次閱讀

    FIFO使用及其各條件仿真介紹

    FIFO(First In First Out )先入先出存儲(chǔ)器,在FPG設(shè)計(jì)中常用于跨時(shí)鐘域的處理,FIFO可簡單分為同步FIFO和異步FIFO
    的頭像 發(fā)表于 04-25 15:55 ?4016次閱讀
    <b class='flag-5'>FIFO</b>使用及其各條件仿真介紹

    光模塊使用過程中常見的問題匯總

    光模塊是一種較為敏感的光學(xué)器件,在使用過程中常常會(huì)出現(xiàn)很多問題,在本文中將光模塊的一些常見問題進(jìn)行了匯總。
    的頭像 發(fā)表于 05-23 16:08 ?1575次閱讀
    光模塊使用<b class='flag-5'>過程中常</b>見的問題匯總

    封裝過程中常用的檢測設(shè)備

    封裝過程中常用的檢測設(shè)備 在軟件開發(fā)過程中,封裝是非常重要的一個(gè)概念。它不僅可以提高軟件的可維護(hù)性,還可以增加程序員代碼的復(fù)用性和安全性等。在封裝過程中,需要使用一些檢測設(shè)備對(duì)程序進(jìn)行檢測,以確保
    的頭像 發(fā)表于 08-24 10:42 ?891次閱讀
    RM新时代网站-首页