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實(shí)現(xiàn)

FPGA設(shè)計(jì)論壇 ? 來源:CSDN技術(shù)社區(qū) ? 2025-04-09 09:55 ? 次閱讀

一、FIFO

1.1 定義

FIFO(First in First out)為先進(jìn)先出隊(duì)列,具有存儲(chǔ)功能,可用于不同時(shí)鐘域間傳輸數(shù)據(jù)以及不同的數(shù)據(jù)寬度進(jìn)行數(shù)據(jù)匹配。如其名稱,數(shù)據(jù)傳輸為單向,從一側(cè)進(jìn)入,再從另一側(cè)出來,出來的順序和進(jìn)入的順序相同。

1.2 實(shí)現(xiàn)方式

FIFO可由多種不同的實(shí)現(xiàn)方式,可以用塊狀RAM,分布式RAM來實(shí)現(xiàn),也可直接使用IP核,當(dāng)數(shù)據(jù)較小時(shí),建議使用分布式RAM實(shí)現(xiàn),數(shù)據(jù)較大時(shí),用塊狀RAM實(shí)現(xiàn)。

1.3 實(shí)現(xiàn)原理

FIFO組成包含存儲(chǔ)單元,寫時(shí)鐘,讀時(shí)鐘,滿標(biāo)志,空標(biāo)志,讀寫控制信號(hào),當(dāng)讀時(shí)鐘和寫時(shí)鐘都是同一個(gè)時(shí)鐘時(shí),則為同步FIFO,否則為異步FIFO。

a.首先,在復(fù)位操作后,在寫時(shí)鐘控制下,如果狀態(tài)非滿狀態(tài),數(shù)據(jù)可寫入到FIFO中。每寫一次數(shù)據(jù),寫指針加一,寫滿后將不允許再寫入;

b.當(dāng)FIFO中數(shù)據(jù)非空時(shí),在讀時(shí)鐘的控制下,數(shù)據(jù)可從FIFO中讀出。每讀一次數(shù)據(jù),讀時(shí)鐘加一,位于下一個(gè)讀取的位置,在空狀態(tài)下,將不能繼續(xù)讀數(shù)據(jù);

無論是同步FIFO還是異步FIFO,都是以雙口RAM為基礎(chǔ)來實(shí)現(xiàn)。

二、代碼實(shí)現(xiàn)

代碼為書籍《FPGA應(yīng)用技術(shù)及實(shí)踐》中5.3.3 FIFO設(shè)計(jì)中的代碼,相比原代碼中,對(duì)read/write為00時(shí),對(duì)count的值變化進(jìn)行了修改,修改為count<=count更合理,設(shè)計(jì)為實(shí)現(xiàn)4X16的同步FIFO

module FIFO_V(rst,clk,data_in,data_out,read,write,empty,full );

input rst,clk;

input [15:0] data_in;

output reg [15:0] data_out;

input read,write;

output empty,full;

parameter depth=2,max_count=2'b11;

reg empty,full;

reg [depth-1:0] tail;

reg [depth-1:0] head;

reg [depth-1:0] count;

reg [15:0] fifomem [0:max_count];

//讀空判斷

always@(posedge clk)

begin

if(rst==1)

begin

data_out<=16'h0000;

end

else if(read==1'b1&&empty==1'b0)

begin

data_out<=fifomem[tail];

end

end

//寫滿判斷

always@(posedge clk)

begin

if(rst==1'b0&&write==1'b1&&full==1'b0)

fifomem[head]<=data_in;

end

//寫操作

always@(posedge clk)

begin

if(rst==1)

head<=2'b00;

else

begin

if(write==1'b1&&full==1'b0)

head<=head+1;

end

end

//讀操作

always@(posedge clk)

begin

if(rst==1)

begin

tail<=2'b00;

end

else if(read==1'b1&&empty==1'b0)

begin

tail<=tail+1;

end

end

//讀寫操作下的計(jì)數(shù)

always@(posedge clk)

begin

if(rst==1)

begin

count<=2'b00;

end

else

begin

case({read,write})

2'b00:count<=count;

2'b01:if(count!=max_count) count<=count+1;

2'b10:if(count!=2'b00) count<=count-1;

2'b11:count<=count;

endcase

end

end

//隊(duì)列空狀態(tài)判斷

always@(posedge clk)

begin

if(count==2'b00)

empty<=1'b1;

else

empty<=1'b0;

end

//隊(duì)列滿狀態(tài)判斷

always@(posedge clk)

begin

if(count==max_count)

full<=1'b1;

else

full<=1'b0;

end

endmodule

測試代碼

對(duì)于read和write信號(hào),盡量避免在時(shí)鐘上升沿時(shí)進(jìn)行狀態(tài)變化,如此處write翻轉(zhuǎn)在201ns,read翻轉(zhuǎn)在#252,即避免了和時(shí)鐘的上升沿同步,也避免了和write翻轉(zhuǎn)的同步

`timescale 1ns / 1ps

module FIFO_tb( );

reg clk,rst,write,read;

reg [15:0] data_in;

wire [15:0] data_out;

wire empty,full;

FIFO_V FIFO_test (.clk(clk),.rst(rst),.data_in(data_in),.write(write),.read(read),.empty(empty),.full(full),.data_out(data_out));

//初始狀態(tài)賦值

initial

begin

clk=0;

rst=1;

data_in=16'h1111;

#51 rst=0;

end

//寫操作

initial

begin

write=1;

#201 write=1;

#30 write=0;

#200 write=1;

#85 write=0;

//#10 write=1;

//#60 write=0;

end

//讀操作

initial

begin

read=0;

#252 read=1;

#200 read=0;

#100 read=1;

end

//輸入信號(hào)與時(shí)鐘信號(hào)生成

always #20 data_in=data_in+16'h1111;

always #10 clk=~clk;

endmodule

三、仿真結(jié)果

3.1 復(fù)位階段

在起始的50ns內(nèi),復(fù)位信號(hào)rst(紅色標(biāo)注)為1時(shí),進(jìn)行復(fù)位操作,如黃色定位線所示,輸出data_out為0,empty和full標(biāo)志為0;

3fa3b540-1057-11f0-9310-92fbcf53809c.png

3.2 寫入階段

在110.1ns時(shí)開始寫入,時(shí)間點(diǎn)不是110ns而是多了0.1ns是由于modelsim默認(rèn)的開始時(shí)刻是0.1ns開始;因?yàn)閏ount原先一直處于初始化狀態(tài)2'b00,在此時(shí)因?yàn)閷懭脒M(jìn)行了empty的邏輯判斷,因?yàn)閑mpty為0;

在clk信號(hào)中1、2、3、4上升沿位置,即為寫入4個(gè)值:6666,7777,8888,9999,寫完后剛好寫滿,因此full標(biāo)志位在170.1ns處變?yōu)?,表示已寫滿無法再寫入。

3fb92ea2-1057-11f0-9310-92fbcf53809c.png

3.3 讀取階段

在270.1ns時(shí),read/write的值為1/0開始從FIFO中進(jìn)行數(shù)據(jù)讀取,在clk信號(hào)的1,2,3,4讀取了4個(gè)數(shù)值,根據(jù)data_out可知為6666,7777,8888,9999。讀出順序與寫入順序一致,即先入先出。

3fd07c06-1057-11f0-9310-92fbcf53809c.png

3.4 同時(shí)讀寫或不讀不寫

在450ns時(shí),read/write都為1,讀寫同時(shí)進(jìn)行,并且empty為1,可知不進(jìn)行讀操作,count的邏輯。但因full為0,可以進(jìn)行寫入,此時(shí)進(jìn)行寫入,在4個(gè)clk周期寫滿,因此在530.1ns時(shí)full標(biāo)志位為1

3ff1a958-1057-11f0-9310-92fbcf53809c.png

在530ns和550ns時(shí),read/write都為0,此時(shí)不讀也不寫入,因此輸出狀態(tài)不變,一直為9999,

4011bd56-1057-11f0-9310-92fbcf53809c.png

原文鏈接:https://blog.csdn.net/zyp626/article/details/131620099

聲明:本文內(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)注

    1643

    文章

    21975

    瀏覽量

    614405
  • 存儲(chǔ)
    +關(guān)注

    關(guān)注

    13

    文章

    4507

    瀏覽量

    87091
  • 仿真
    +關(guān)注

    關(guān)注

    51

    文章

    4242

    瀏覽量

    135341
  • fifo
    +關(guān)注

    關(guān)注

    3

    文章

    400

    瀏覽量

    44631
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4890

    瀏覽量

    70291

原文標(biāo)題:FPGA基礎(chǔ)之FIFO實(shí)現(xiàn)

文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

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

    基于FPGA的異步FIFO實(shí)現(xiàn)

    大家好,又到了每日學(xué)習(xí)的時(shí)間了,今天我們來聊一聊基于FPGA的異步FIFO實(shí)現(xiàn)。 一、FIFO簡介 FIFO是英文First In Fir
    的頭像 發(fā)表于 06-21 11:15 ?6803次閱讀
    基于<b class='flag-5'>FPGA</b>的異步<b class='flag-5'>FIFO</b>的<b class='flag-5'>實(shí)現(xiàn)</b>

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

    首先介紹異步FIFO 的概念、應(yīng)用及其結(jié)構(gòu),然后分析實(shí)現(xiàn)異步FIFO的難點(diǎn)問題及其解決辦法; 在傳統(tǒng)設(shè)計(jì)的基礎(chǔ)上提出一種新穎的電路結(jié)構(gòu)并對(duì)其進(jìn)行綜合仿真和FPGA
    發(fā)表于 04-16 09:25 ?46次下載

    基于PCI接口芯片外擴(kuò)FIFOFPGA實(shí)現(xiàn)

    介紹了PCI 9054 接口芯片的性能及數(shù)據(jù)傳輸特點(diǎn),提出了一種基于PCI 9054 外擴(kuò)異步FIFO(先進(jìn)先出)的FPGA(現(xiàn)場可編程門陣列)實(shí)現(xiàn)方法。由于PCI 9054 內(nèi)部FIFO
    發(fā)表于 01-06 15:20 ?44次下載

    高速異步FIFO的設(shè)計(jì)與實(shí)現(xiàn)

    本文主要研究了用FPGA 芯片內(nèi)部的EBRSRAM 來實(shí)現(xiàn)異步FIFO 設(shè)計(jì)方案,重點(diǎn)闡述了異步FIFO 的標(biāo)志信號(hào)——空/滿狀態(tài)的設(shè)計(jì)思路,并且用VHDL 語言
    發(fā)表于 01-13 17:11 ?40次下載

    基于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 ?2279次閱讀
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>FIFO</b>設(shè)計(jì)和應(yīng)用

    基于VHDL和FPGA的非對(duì)稱同步FIFO設(shè)計(jì)實(shí)現(xiàn)

    本文采用VHDL描述語言,充分利用Xilinx公司Spartan II FPGA的系統(tǒng)資源,設(shè)計(jì)實(shí)現(xiàn)了一種非對(duì)稱同步FIFO,它不僅提供數(shù)據(jù)緩沖,而且能進(jìn)行數(shù)據(jù)總線寬度的轉(zhuǎn)換。
    發(fā)表于 01-13 11:33 ?2058次閱讀

    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 ?7684次閱讀
    LabVIEW <b class='flag-5'>FPGA</b>模塊<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>FIFO</b>深度設(shè)定

    異步FIFOFPGA與DSP通信中的運(yùn)用

    文中給出了異步FIFO實(shí)現(xiàn)代碼和FPGA與DSP的硬件連接電路。經(jīng)驗(yàn)證,利用異步FIFO的方法,在FPGA與DSP通信中的應(yīng)用,具有傳輸速
    發(fā)表于 12-12 14:28 ?51次下載
    異步<b class='flag-5'>FIFO</b>在<b class='flag-5'>FPGA</b>與DSP通信中的運(yùn)用

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

    實(shí)現(xiàn)目標(biāo)識(shí)別與跟蹤的應(yīng)用目的 ,在基于 TMS320DM642 的 FIFO 基礎(chǔ)上擴(kuò)展存儲(chǔ)空間 ,提出一種基于 FPGA實(shí)現(xiàn) SDRAM 控制器的方法。分析所用 SDRAM 的特
    發(fā)表于 10-29 14:05 ?2次下載

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

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

    異步FIFOFPGA與DSP通信中的應(yīng)用解析

    摘要 利用異步FIFO實(shí)現(xiàn)FPGA與DSP進(jìn)行數(shù)據(jù)通信的方案。FPGA在寫時(shí)鐘的控制下將數(shù)據(jù)寫入FIFO,再與DSP進(jìn)行握手后,DSP通過E
    發(fā)表于 10-30 11:48 ?2次下載
    異步<b class='flag-5'>FIFO</b>在<b class='flag-5'>FPGA</b>與DSP通信中的應(yīng)用解析

    FPGAFIFO實(shí)現(xiàn)過程

    FIFO隊(duì)列有兩個(gè)位置指示指針。一個(gè)是寫指針,指向隊(duì)列的第一個(gè)存儲(chǔ)單元。一個(gè)讀指針,指向隊(duì)列的最后一個(gè)存儲(chǔ)單元。當(dāng)有寫命令的時(shí)候,數(shù)據(jù)寫入寫指針指向的存儲(chǔ)單元,然后指針加一。當(dāng)有讀命令的時(shí)候,讀指針
    發(fā)表于 06-29 08:51 ?1.6w次閱讀

    FPGA實(shí)現(xiàn)自行FIFO設(shè)計(jì)的方法

    設(shè)計(jì)工程師通常在FPGA實(shí)現(xiàn)FIFO(先進(jìn)先出寄存器)的時(shí)候,都會(huì)使用由芯片提供商所提供的FIFO。但是,由于其通用性使得其針對(duì)性變差,某些情況下會(huì)變得不方便或者將增加硬件成本。此時(shí)
    的頭像 發(fā)表于 11-28 08:10 ?8028次閱讀
    在<b class='flag-5'>FPGA</b>上<b class='flag-5'>實(shí)現(xiàn)</b>自行<b class='flag-5'>FIFO</b>設(shè)計(jì)的方法

    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ì)的源代碼

    如何在Altera FPGA中使用FIFO實(shí)現(xiàn)功能設(shè)計(jì)?

    一:fifo是什么 FIFO的完整英文拼寫為FirstIn First Out,即先進(jìn)先出。FPGA或者ASIC中使用到的FIFO一般指的是對(duì)數(shù)據(jù)的存儲(chǔ)具有先進(jìn)先出特性的一個(gè)存儲(chǔ)器,常
    的頭像 發(fā)表于 03-12 16:30 ?3548次閱讀
    如何在Altera <b class='flag-5'>FPGA</b>中使用<b class='flag-5'>FIFO</b><b class='flag-5'>實(shí)現(xiàn)</b>功能設(shè)計(jì)?