0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于FPGA的FIFO实现

FPGA设计论坛 ? 来源:CSDN技术社区 ? 2025-04-09 09:55 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、FIFO

1.1 定义

FIFO(First in First out)为先进先出队列,具有存储功能,可用于不同时钟域间传输数据以及不同的数据宽度进行数据匹配。如其名称,数据传输为单向,从一侧进入,再从另一侧出来,出来的顺序和进入的顺序相同。

1.2 实现方式

FIFO可由多种不同的实现方式,可以用块状RAM,分布式RAM来实现,也可直接使用IP核,当数据较小时,建议使用分布式RAM实现,数据较大时,用块状RAM实现。

1.3 实现原理

FIFO组成包含存储单元,写时钟,读时钟,满标志,空标志,读写控制信号,当读时钟和写时钟都是同一个时钟时,则为同步FIFO,否则为异步FIFO。

a.首先,在复位操作后,在写时钟控制下,如果状态非满状态,数据可写入到FIFO中。每写一次数据,写指针加一,写满后将不允许再写入;

b.当FIFO中数据非空时,在读时钟的控制下,数据可从FIFO中读出。每读一次数据,读时钟加一,位于下一个读取的位置,在空状态下,将不能继续读数据;

无论是同步FIFO还是异步FIFO,都是以双口RAM为基础来实现。

二、代码实现

代码为书籍《FPGA应用技术及实践》中5.3.3 FIFO设计中的代码,相比原代码中,对read/write为00时,对count的值变化进行了修改,修改为count<=count更合理,设计为实现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

//读写操作下的计数

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

//队列空状态判断

always@(posedge clk)

begin

if(count==2'b00)

empty<=1'b1;

else

empty<=1'b0;

end

//队列满状态判断

always@(posedge clk)

begin

if(count==max_count)

full<=1'b1;

else

full<=1'b0;

end

endmodule

测试代码

对于read和write信号,尽量避免在时钟上升沿时进行状态变化,如此处write翻转在201ns,read翻转在#252,即避免了和时钟的上升沿同步,也避免了和write翻转的同步

`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));

//初始状态赋值

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

//输入信号与时钟信号生成

always #20 data_in=data_in+16'h1111;

always #10 clk=~clk;

endmodule

三、仿真结果

3.1 复位阶段

在起始的50ns内,复位信号rst(红色标注)为1时,进行复位操作,如黄色定位线所示,输出data_out为0,empty和full标志为0;

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

3.2 写入阶段

在110.1ns时开始写入,时间点不是110ns而是多了0.1ns是由于modelsim默认的开始时刻是0.1ns开始;因为count原先一直处于初始化状态2'b00,在此时因为写入进行了empty的逻辑判断,因为empty为0;

在clk信号中1、2、3、4上升沿位置,即为写入4个值:6666,7777,8888,9999,写完后刚好写满,因此full标志位在170.1ns处变为1,表示已写满无法再写入。

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

3.3 读取阶段

在270.1ns时,read/write的值为1/0开始从FIFO中进行数据读取,在clk信号的1,2,3,4读取了4个数值,根据data_out可知为6666,7777,8888,9999。读出顺序与写入顺序一致,即先入先出。

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

3.4 同时读写或不读不写

在450ns时,read/write都为1,读写同时进行,并且empty为1,可知不进行读操作,count的逻辑。但因full为0,可以进行写入,此时进行写入,在4个clk周期写满,因此在530.1ns时full标志位为1

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

在530ns和550ns时,read/write都为0,此时不读也不写入,因此输出状态不变,一直为9999,

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1646

    文章

    22069

    浏览量

    619731
  • 存储
    +关注

    关注

    13

    文章

    4542

    浏览量

    87590
  • 仿真
    +关注

    关注

    52

    文章

    4300

    浏览量

    136070
  • fifo
    +关注

    关注

    3

    文章

    402

    浏览量

    44893
  • 代码
    +关注

    关注

    30

    文章

    4905

    浏览量

    70989

原文标题:FPGA基础之FIFO实现

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于FPGA的异步FIFO实现

    大家好,又到了每日学习的时间了,今天我们来聊一聊基于FPGA的异步FIFO实现。 一、FIFO简介 FIFO是英文First In Fir
    的头像 发表于 06-21 11:15 ?6898次阅读
    基于<b class='flag-5'>FPGA</b>的异步<b class='flag-5'>FIFO</b>的<b class='flag-5'>实现</b>

    异步FIFO结构及FPGA设计

    首先介绍异步FIFO 的概念、应用及其结构,然后分析实现异步FIFO的难点问题及其解决办法; 在传统设计的基础上提出一种新颖的电路结构并对其进行综合仿真和FPGA
    发表于 04-16 09:25 ?46次下载

    基于PCI接口芯片外扩FIFOFPGA实现

    介绍了PCI 9054 接口芯片的性能及数据传输特点,提出了一种基于PCI 9054 外扩异步FIFO(先进先出)的FPGA(现场可编程门阵列)实现方法。由于PCI 9054 内部FIFO
    发表于 01-06 15:20 ?44次下载

    高速异步FIFO的设计与实现

    本文主要研究了用FPGA 芯片内部的EBRSRAM 来实现异步FIFO 设计方案,重点阐述了异步FIFO 的标志信号——空/满状态的设计思路,并且用VHDL 语言
    发表于 01-13 17:11 ?40次下载

    基于FPGAFIFO设计和应用

    基于FPGAFIFO设计和应用 引 言   在利用DSP实现视频实时跟踪时,需要进行大量高速的图像采集。而DSP本身自带的FIFO并不足以支持系统中大量数据的暂时存储
    发表于 11-20 11:25 ?2301次阅读
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>FIFO</b>设计和应用

    基于VHDL和FPGA的非对称同步FIFO设计实现

    本文采用VHDL描述语言,充分利用Xilinx公司Spartan II FPGA的系统资源,设计实现了一种非对称同步FIFO,它不仅提供数据缓冲,而且能进行数据总线宽度的转换。
    发表于 01-13 11:33 ?2098次阅读

    LabVIEW FPGA模块实现FIFO深度设定

    为了解决基于LabVIEWFPGA模块的DMAFIFO深度设定不当带来的数据不连续问题,结合LabVIEWFPGA的编程特点和DMA FIFO的工作原理,提出了一种设定 FIFO 深度
    发表于 09-26 13:45 ?7763次阅读
    LabVIEW <b class='flag-5'>FPGA</b>模块<b class='flag-5'>实现</b><b class='flag-5'>FIFO</b>深度设定

    异步FIFOFPGA与DSP通信中的运用

    文中给出了异步FIFO实现代码和FPGA与DSP的硬件连接电路。经验证,利用异步FIFO的方法,在FPGA与DSP通信中的应用,具有传输速
    发表于 12-12 14:28 ?51次下载
    异步<b class='flag-5'>FIFO</b>在<b class='flag-5'>FPGA</b>与DSP通信中的运用

    基于FPGAFIFO设计和应用

    实现目标识别与跟踪的应用目的 ,在基于 TMS320DM642 的 FIFO 基础上扩展存储空间 ,提出一种基于 FPGA实现 SDRAM 控制器的方法。分析所用 SDRAM 的特
    发表于 10-29 14:05 ?2次下载

    异步FIFO结构及FPGA设计

    异步FIFO结构及FPGA设计,解决亚稳态的问题
    发表于 11-10 15:21 ?4次下载

    异步FIFOFPGA与DSP通信中的应用解析

    摘要 利用异步FIFO实现FPGA与DSP进行数据通信的方案。FPGA在写时钟的控制下将数据写入FIFO,再与DSP进行握手后,DSP通过E
    发表于 10-30 11:48 ?3次下载
    异步<b class='flag-5'>FIFO</b>在<b class='flag-5'>FPGA</b>与DSP通信中的应用解析

    FPGAFIFO实现过程

    FIFO队列有两个位置指示指针。一个是写指针,指向队列的第一个存储单元。一个读指针,指向队列的最后一个存储单元。当有写命令的时候,数据写入写指针指向的存储单元,然后指针加一。当有读命令的时候,读指针
    发表于 06-29 08:51 ?1.6w次阅读

    FPGA实现自行FIFO设计的方法

    设计工程师通常在FPGA实现FIFO(先进先出寄存器)的时候,都会使用由芯片提供商所提供的FIFO。但是,由于其通用性使得其针对性变差,某些情况下会变得不方便或者将增加硬件成本。此时
    的头像 发表于 11-28 08:10 ?8453次阅读
    在<b class='flag-5'>FPGA</b>上<b class='flag-5'>实现</b>自行<b class='flag-5'>FIFO</b>设计的方法

    FPGA电路FIFO设计的源代码

    FPGA电路FIFO设计的源代码
    发表于 07-08 17:34 ?15次下载
    <b class='flag-5'>FPGA</b>电路<b class='flag-5'>FIFO</b>设计的源代码

    如何在Altera FPGA中使用FIFO实现功能设计?

    一:fifo是什么 FIFO的完整英文拼写为FirstIn First Out,即先进先出。FPGA或者ASIC中使用到的FIFO一般指的是对数据的存储具有先进先出特性的一个存储器,常
    的头像 发表于 03-12 16:30 ?3651次阅读
    如何在Altera <b class='flag-5'>FPGA</b>中使用<b class='flag-5'>FIFO</b><b class='flag-5'>实现</b>功能设计?