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. 【转载】Ubuntu安装之,硬盘分区

    关于分区 如果你只是简单地想用上Ubuntu,可以这样操作:1)如果你是直接将整个硬盘都用来装Ubuntu,机器上没有需要保存的数据,或者已经做好备份的情况下,可以直接在Ubuntu分区时选择“向导─ ...

  2. VS 开发必用插件

    C# outline --代码折叠 Indent Guides 虚线对齐 productivity power tools 功能集中在编辑.浏览以及其他常见的构造代码时会使用到的任务 Web Esse ...

  3. windows 2008 r2 不能启用网络发现

    在win2008 R2里面,不能启用网络发现,查询资料,得知需开启一下三个服务: Function Discovery Resource Publication SSDP Discovery UPnP ...

  4. NHibernate中Session的处理 线程不安全

    NHibernate中Session是线程不安全的,而且每次数据库操作 请求创建Session时对性能有些影响.在Windows应用中可以通过 [ThreadStatic]特性很简单的就可以实现线程安 ...

  5. 【CF573D】Bear and Cavalry 线段树

    [CF573D]Bear and Cavalry 题意:有n个人和n匹马,第i个人对应第i匹马.第i个人能力值ai,第i匹马能力值bi,第i个人骑第j匹马的总能力值为ai*bj,整个军队的总能力值为$ ...

  6. easyui---editgrid

    on 点击新增用户,不是弹出一个一个dialog,而是直接在表格下面增加一行可编辑的,然后点击保存就可以新增 第一步:加一个toolbar,在handler中当点击新增用户,会调用datagrid的a ...

  7. 洛谷P3952 时间复杂度【字符串】【模拟】

    题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序 ...

  8. Codeforces 191A - Dynasty Puzzles - [DP]

    题目链接:https://codeforces.com/problemset/problem/191/A 题意: 给出 $n$ 个小写字母组成的字符串,两个字符串如果前者的最后一个字母与后者的首字母相 ...

  9. [No0000168]Excle只允许用户输入纯文本,禁止用户修改单元格样式、格式等

    背景:自己的模板给别人,让他填完信息上传到系统里,但别人经常不按模板的格式来填写,导致无法程序自动化.能不能在模板上把格式锁住,只允许输入纯文本,但不能改格式? 方法: 步骤一,创建你要的模板 其中, ...

  10. debian安装nodejs

    https://nodejs.org/en/download/ 二进制安装 sudo wget https://nodejs.org/dist/v10.15.1/node-v10.15.1-linux ...