Verilog基础之十四、FIFO实现

这篇具有很好参考价值的文章主要介绍了Verilog基础之十四、FIFO实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、FIFO

1.1 定义

1.2 实现方式

1.3 实现原理  

二、代码实现

三、仿真结果

3.1 复位阶段

3.2 写入阶段

3.3 读取阶段

3.4 同时读写或不读不写

四、参考资料


一、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;

Verilog基础之十四、FIFO实现,Verilog学习笔记,FPGA所知所见所解,Vivado,fpga开发,FIFO,modelsim

 

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,表示已写满无法再写入。

Verilog基础之十四、FIFO实现,Verilog学习笔记,FPGA所知所见所解,Vivado,fpga开发,FIFO,modelsim

 

3.3 读取阶段

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

Verilog基础之十四、FIFO实现,Verilog学习笔记,FPGA所知所见所解,Vivado,fpga开发,FIFO,modelsim

3.4 同时读写或不读不写

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

Verilog基础之十四、FIFO实现,Verilog学习笔记,FPGA所知所见所解,Vivado,fpga开发,FIFO,modelsim

 

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

Verilog基础之十四、FIFO实现,Verilog学习笔记,FPGA所知所见所解,Vivado,fpga开发,FIFO,modelsim

 

四、参考资料

书籍《FPGA应用技术及实践》中5.3.3 FIFO设计章节

    文章来源地址https://www.toymoban.com/news/detail-543324.html

到了这里,关于Verilog基础之十四、FIFO实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • FPGA学习笔记(3):FIFO

    FPGA学习笔记(3):FIFO

    FIFO是First Input First Output的英文简写 代表先进的数据先出 ,后进的数据后出。 FIFO存储器是系统的缓冲环节,如果没有FIFO存储器,整个系统就不可能正常工作。 FIFO的功能可以概括为 (1)对连续的数据流进行缓存,防止在进机和存储操作时丢失数据; (2)数据集中起来进行

    2024年01月19日
    浏览(10)
  • FPGA学习笔记——FIFO读写

    FPGA学习笔记——FIFO读写

    【实验任务】向FIFO中以50MHz的频率按顺序写入0~254,再从FIFO中以5Hz的频率按顺序读出0~254,输出到LED中点亮。 FIFO全称为“First-In-First-Out”,是FPGA内部的存储数据的缓冲器,读写数据具有先入先出的特点,与数据结构中的“队列”有异曲同工之妙。 本博客例化紫光同创官方提

    2024年02月15日
    浏览(10)
  • Verilog基础之十一、移位寄存器实现

    Verilog基础之十一、移位寄存器实现

    目录 一、前言 二、工程设计 ​2.1 工程代码 2.2 综合结果 2.3 仿真结果     移位寄存器SRL在工程中属于使用频率较高个模块,可用于存储数据,实现串并转换;根据数据移动方向可分为左移寄存器,右移寄存器,左移是向数据高位移动,右移是向数据低位移动。  工程中包

    2024年02月11日
    浏览(11)
  • FPGA学习笔记:verilog基础代码与modelsim仿真(六)——vga显示模块

    FPGA学习笔记:verilog基础代码与modelsim仿真(六)——vga显示模块

    VGA显示 目标:实现屏幕红、橙、黄、绿、青、蓝、紫、黑、白、灰条形显示 1. 模块框图与波形图 vga_colorbar是实现目标功能的总体模块框图,为了实现对应的输出,我们使用三个具体功能模块实现功能。 (1) clk_gen——使用pll锁相环实现时钟分频 (2)vga_ctrl——图像控制与输出模

    2024年02月04日
    浏览(13)
  • FPGA 学习笔记:Verilog 实现LED流水灯控制

    在初步了解 Xilinx Vivado 的使用后,开启了FPGA Hello World 程序:LED 流水灯控制 在嵌入式MCU中,流水灯需要延时来实现,FPGA的延时,使用外部晶振来实现 实现 3个 LED 流水灯控制,也就是循环依次点亮, LED 低电平亮, 高电平灭,FPGA 有一个40MHz的外部晶振,作为系统时钟输入开

    2023年04月08日
    浏览(17)
  • FPGA学习笔记(1):使用Verilog实现常见的加法器

    FPGA学习笔记(1):使用Verilog实现常见的加法器

    本文使用VerilogHDL实现一些简单的加法器,本人水平有限,希望大佬能够多指证 Quartus Prime(18.0) Modelsim 半加器可以用于计算两个单比特二进制数的和,C表征进位输出,S表述计算的结果。 半加器的真值表 化简以后的逻辑表达式可以表达为: s = a’b+ab’ c = ab Verilog 代码块 全加

    2024年02月09日
    浏览(7)
  • FPGA的Verilog设计(二)——异步FIFO

    FPGA的Verilog设计(二)——异步FIFO

    阅读本文前,建议先阅读下面几篇文章: 同步FIFO 二进制转格雷码的实现   在上篇文章同步FIFO中简要介绍了FIFO的基本概念以及同步FIFO的实现。本篇文章将重点介绍异步FIFO的工作原理以及硬件实现。   异步FIFO的读写时钟不同,FIFO的读写需要进行异步处理, 异步FIFO常用

    2024年02月04日
    浏览(6)
  • FPGA的通用FIFO设计verilog,1024*8bit仿真,源码和视频

    FPGA的通用FIFO设计verilog,1024*8bit仿真,源码和视频

    名称:FIFO存储器设计1024*8bit 软件:Quartus 语言:Verilog 本代码为FIFO通用代码,其他深度和位宽可简单修改以下参数得到 代码功能: 设计一个基于FPGA的FIFO存储器,使之能提供以下功能  1.存储空间至少1024 储器  2.存储位宽8bit  3.拓展功能:存储器空、满报警 演示视频:http://

    2024年02月06日
    浏览(12)
  • FIFO设计笔记(双口RAM、同步FIFO、异步FIFO)Verilog及仿真

    FIFO设计笔记(双口RAM、同步FIFO、异步FIFO)Verilog及仿真

    0.1、FIFO FIFO (First-In-First-Out) 是一种先进先出的数据缓存器,在数字ASIC设计中常常被使用。在实际开发中,多数都是直接使用公司经过top-out验证的FIFO IP或者是ISE/Vivado工具自带的FIFO IP,并不需要自己造轮子。但是,作为设计者,必须要掌握FIFO的设计方法,这样可以适配于各种

    2023年04月09日
    浏览(39)
  • FPGA学习笔记:Verilog利用计数器发生信号

    FPGA学习笔记:Verilog利用计数器发生信号

    1.等占空比信号发生:计数器计时1ms,使LED灯每隔1ms状态翻转一次,实现LED灯闪烁,产生周期为2ms、占空比50%的方波信号; 2.非等占空比信号发生:计时器计时1.8ms,LED灯亮1ms,灭0.8ms,产生周期为1.8ms、非等占空比的方波信号; 3.序列型脉冲信号产生:生成1011010011的序列脉冲

    2024年02月22日
    浏览(7)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包