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. yizhihongqiang

    最新网址:https://www.     hongxingwangzhi           .com/

  2. Linux 下用 valgrind 查找内存泄漏小例子

    1.安装 valgrind yum install valgrind 2.测试用例 main.cpp #include <iostream> using namespace std; st ...

  3. H3C S5120-52P-WiNet交换机配置

    配置console口登录验证密码 <H3C>system-view [H3C]user-interface aux 0 [H3C-ui-aux0]authentication-mode p ...

  4. [Bayes] runif: Inversion Sampling

    runifum Inversion Sampling 看样子就是个路人甲. Ref: [Bayes] Hist & line: Reject Sampling and Importance S ...

  5. 三、K3 Cloud 开发插件《K3 Cloud插件开发新手指导 + K3 Cloud插件开发代码调试》

    案例需求:在销售订单上新增一个按钮,在订单明细中新增一个字段,命名[即时库存]. 点击按钮,弹出“Hello World!”,并获取订单明细物料的即时库存,填入字段[即时库存]. 开发工具:Visua ...

  6. mybatis与hibernate区别与应用场景

    hibernate:是一个标准化的ORM框架.入门的门槛较高,不需要程序写sql,语句就自动生成了.对sql进行优化.修改比较困难. 应用场景:适用于中小企业需求变化不多的项目,比如后台管理系统,er ...

  7. kubernetes-PetSet

    什么是Pet?Pet是一个有状态应用程序,本质上它是一个具有确定性名称以及唯一身份的Pod,身份内容包括: DNS中可以识别的固定hostname 顺序化索引(Pet名称组成:PetSetName-O ...

  8. File not found 错误 nginx

    这个错误很常见,很明显找不到文件. 原因是php-fpm找不到SCRIPT_FILENAME里执行的php文件,所以返回给nginx 404 错误. 那么两种情况要么文件真的不存在,要么就是路径错误. ...

  9. 【CF553E】Kyoya and Train 最短路+cdq分治+FFT

    [CF553E]Kyoya and Train 题意:有一张$n$个点到$m$条边的有向图,经过第i条边要花$c_i$元钱,经过第i条边有$p_{i,k}$的概率要耗时k分钟.你想从1走到n,但是如果 ...

  10. 10.4ORM回顾!

    2018-10-4 17:41:52 继续优化一下我的博客项目!! 贴上orm参考连接:https://www.cnblogs.com/yuanchenqi/articles/8963244.html ...