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. 关于Unity中NGUI的Pivot和锚点

    Pivot 1.创建一个Sprite类型的Sprite1节点,关联一个图集和一张贴图,用图中的六个按钮调整这个贴图的Pivot点,一共有八个点可以选择 2.再创建一个Sprite类型的Sprite2节 ...

  2. mysql语法 -- concat函数

    mysql CONCAT(str1,str2,…)                        返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL.或许有一个或多个参 ...

  3. ORA-00001: unique constraint (...) violated并不一定是数据冲突

    原文链接:http://blog.163.com/jet_it_life/blog/static/205097083201301410303931/ 收到一位测试人员RAISE的JIRA,说在某张表上 ...

  4. Scala学习笔记——内建控制结构

    Scala的内建控制结构包括:if.while.for.try.match和函数调用 1.if表达式 //常见的写法 var filename = "name" if (!args ...

  5. 转:UML工具Astah的使用

    原文链接:http://blog.csdn.net/vipygd/article/details/9182247 前言 UML是软件工程中非常重要的知识点.我们经常要去展示各种UML图,当然,我们要将 ...

  6. SSM框架整合搭建教程

    自己配置了一个SSM框架,打算做个小网站,这里把SSM的配置流程详细的写了出来,方便很少接触这个框架的朋友使用,文中各个资源均免费提供! 一. 创建web项目(eclipse) File-->n ...

  7. react列表数据显示

    react的列表数据一般是用map循环显示的. 使用map注意:map的回调函数为箭头函数时,后面如果加大括号(箭头函数常规编写),必须要有return才可以,如果箭头函数后面没有大括号(箭头函数简写 ...

  8. c++ union内存

    看一个例子: #include <iostream> #include <stdio.h> using namespace std; union A { int a; stru ...

  9. 【SpringCloud微服务实战学习系列】服务治理Spring Cloud Eureka

    Spring Cloud Eureka是Spring Cloud Netflix微服务中的一部分,它基于NetFlix Sureka做了二次封装,主要负责完成微服务架构中的服务治理功能. 一.服务治理 ...

  10. Android数据解析——JSON

    示例一: 有这样一个JSON需要解析,比如: {"thresholds": {"1e-3": 65.3,"1e-5": 76.5," ...