FIFO是一种先进先出的数据缓存器,他与普通存储器相比:

  优点:没有外部读写地址线,这样使用起来非常简单;

  缺点:只能顺序写入数据,顺序的读出数据, 其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。

根据FIFO工作的时钟域,可以将FIFO分为同步FIFO和异步FIFO。同步FIFO是指读时钟和写时钟为同一个时钟。在时钟沿来临时同时发生读写操作。异步FIFO是指读写时钟不一致,读写时钟是互相独立的。

FIFO设计的难点在于怎样判断FIFO的空/满状态。为了保证数据正确的写入或读出,而不发生溢出或读空的状态出现,必须保证FIFO在满的情况下不能进行写操作,在空的状态下不能进行读操作。

因此,怎样判断FIFO的满/空就成了FIFO设计的核心问题。

实现方法1:

 module fifo(
input clk,
input rst,
input din,
input wr_en, input rd_en,
output reg dout,
output empty,
output full
); parameter WIDTH='d8,DEPTH=7'd64;//假设位宽为8,深度为64,只考虑深度为2的幂次方的情况 reg [WIDTH- : ] ram [DEPTH- : ];//开辟存储区
reg [ : ] count; reg rp,wp;//定义读写指针 always@(posedge clk) begin   if(rst) begin
    wp <= ;
    rp <= ;
    dout <= ;
    empty <= ;
    full <= ;
    count <= ;
  end
  else begin
    case({rd_en,wr_en}) begin
      '00:count <= count;
      
      'b01:begin
        if(~full) begin
          ram(wp) <= din;
          wp <= wp + ;
          count <= count + ;
        end
      end       'b10:begin
        if(~empty) begin
          dout <= ram(rp);
          rp <= rp + ;
          count <= count - ;
        end  
      end       'b11:begin
        if(empty) begin
          ram(wp) <= din;
          wp <= wp + ;
          count <= count + ;
        end
        else begin
          ram(wp) <= din;
          wp <= wp + ;
          dout <= ram(rp);
          rp <= rp + ;
          count <= count;
        end
      end
    end
  end
end assign full = (count == 'd63) ? 1 : 0;
assign empty = (count == ) ? : ;

实现方法2:

 module fifo(
input clk,
input rst,
input din,
input wr_en, input rd_en,
output dout,
output reg empty,
output reg full
); parameter WIDTH='d8,DEPTH=7'd64;//假设位宽为8,深度为64,只考虑深度为2的幂次方的情况 reg [WIDTH- : ] ram [DEPTH- : ];//开辟存储区
reg [DEPTH- : ] count;
wire [WIDTH- : ] dout,din;//读写数据
reg rp,wp;//定义读写指针 //写入数据din
always@(posedge clk) begin
  if((wr_en & ~full) || (full & wr_en & rd_en)) begin
    ram(wp) <= din;
  end
end //读出数据dout
assign dout = (rd_en & ~empty)?ram(rp):; //写指针wp
always@(posedge clk)begin
  if(rst)begin
    wp <= ;
  end
  else if(wr_en & ~full) begin
    wp <= wp + ;
  end
  else if(full && (wr_en & rd_en)) begin
    wp <= wp + ;
  end
end //读指针rp
always@(posedge clk) begin
  if(rst) begin
    rp <= ;
  end
  else if(rd_en & ~empty) begin
    rp <= rp + ;
  end
end //满标志full
always@(posedge clk) begin
  if(rst) begin
    full <= ;
  end
  else if((wr_en & ~rd_en) && (wp == rp - )) begin
    full <= ;
  end
  else if(full & rd_en) begin
    full <=
  end
end //空标志empty
always@(posedge clk) begin
  if(rst) begin
    empty <= ;
  end
  else if(wr_en & empty) begin
    empty <= ;
  end
  else if((rd_en & ~wr_en) && (rp == wp - )) begin
    empty <= ;
  end
end

同步fifo的Verilog实现的更多相关文章

  1. 同步fifo与异步fifo

    参考以下帖子: https://blog.csdn.net/hengzo/article/details/49683707 https://blog.csdn.net/Times_poem/artic ...

  2. Verilog学习笔记简单功能实现(八)...............同步FIFO

    Part 1,功能定义: 用16*8 RAM实现一个同步先进先出(FIFO)队列设计.由写使能端控制该数据流的写入FIFO,并由读使能控制FIFO中数据的读出.写入和读出的操作(高电平有效)由时钟的上 ...

  3. 怎么用Verilog语言描述同步FIFO和异步FIFO

    感谢 知乎龚大佬 打杂大佬 网上几个nice的博客(忘了是哪个了....) 前言 虽然FIFO都有IP可以使用,但理解原理还是自己写一个来得透彻. 什么是FIFO? Fist in first out ...

  4. 同步FIFO学习

    在网上找的一个经典同步FIFO例子. 一.前言 FIFO (First-In-First-Out) 是一种先进先出的数据交互方式,在数字ASIC设计中常常被使用.FIFO按工作时钟域的不同又可以分为: ...

  5. 同步FIFO design and IP level verification

    一.前言 应聘IC前端相关岗位时,FIFO是最常考也是最基本的题目.FIFO经常用于数据缓存.位宽转换.异步时钟域处理.随着芯片规模的快速增长,灵活的system verilog成为设计/验证人员的基 ...

  6. 同步fifo的verilogHDL设计实例

    原创 设计一个fifo,输入16bit,输出16bit的data,寻址宽度5bit,有空满标志. top 层如下所示: /* date : 2014/10/14 version : modelsim ...

  7. 异步FIFO及verilog原码

    这几天看了Clifford E. Cummings的两篇大作<Simulation and Synthesis Techniques for Asynchronous FIFO Design&g ...

  8. E203 同步fifo

    1. 输入端, 输入信号, i_vld,表示输入请求写同步fifo,如果fifo不满,则fifo发送i_rdy 到输入端,开始写fifo.i_vld和i_rdy是写握手信号. 2.输出端 o_rdy表 ...

  9. CYPEESS USB3.0程序解读之---同步FIFO(slaveFifoSync)

    上一篇文章解读了CYPRESS FX3的GPIO的操作过程,下面解读同步FIFO的一个例子(slaveFifoSync). *生产者,消费者. 1.首先看DMA的回调函数(cyu3dma.h): ty ...

随机推荐

  1. TestNg学习

    参考:https://www.yiibai.com/testng/junit-vs-testng-comparison.html#article-start 1.JUnit缺点: 最初的设计,使用于单 ...

  2. Linux报“ '/usr/bin' is not included in the PATH environment variable”解决方法

    https://www.cnblogs.com/alvinwei1024/p/4811993.html https://blog.csdn.net/drbinzhao/article/details/ ...

  3. [OpenCV] Samples 17: Floodfill

    一种聚类方式,代码解析 #!/usr/bin/env python ''' Floodfill sample. Usage: floodfill.py [<image>] Click on ...

  4. 【代码审计】大米CMS_V5.5.3 任意文件读取漏洞分析

      0x00 环境准备 大米CMS官网:http://www.damicms.com 网站源码版本:大米CMS_V5.5.3试用版(更新时间:2017-04-15) 程序源码下载:http://www ...

  5. Spring实战 难懂的JavaBean

    bean中文解释为:豆; 豆形种子; 毫无价值的东西. 按照上面的意思,很难理解Bean是个什么鬼,Java豆? 我们先来看一个典型的JavaBean,直观地理解下: public class Per ...

  6. 设计模式学习--Prototype

    What Prototype:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. Why Prototype适用于在一个类的实例有几种不同的状态组合的一种时,建立相应的数目的原型并克隆她 ...

  7. jquery <img> 图片懒加载 和 标签如果没有加载出图片或没有图片,就显示默认的图片

    参考链接:http://www.jq22.com/jquery-info390 或压缩包下载地址:链接:http://pan.baidu.com/s/1hsj8ZWw 密码:4a7s    下面是没有 ...

  8. 微信小程序学习——框架视图层(view)

    视图层是有WXML与WXSS编写的,由组件来进行展示. WXML(WeiXin Markup Language)用于写页面结构的. WXSS(WeiXin Style Sheet)用于页面的样式. 组 ...

  9. python中的os.path.dirname(__file__)的使用

    在编程时,我们要获取当前文件所在的路径,以适合所有的工程,建立相对路径. python的os.path.dirname(__file__)非常好用,建议大家使用: import os FILE = o ...

  10. php之memcached存储session配置、存储、获取

    [session] ①.session.save_handler = memcache session.save_handler 定义了来存储和获取与会话关联的数据的处理器的名字,默认是files ② ...