​同步FIFO

同步 FIFO 简介

FIFO 即先进先出队列,FIFO 一般作为不同时钟域的缓冲器。

FIFO 根据读和写的时钟是否为同一时钟分为同步 FIFO 和异步 FIFO 。异步 FIFO 相比同步 FIFO 来说,设计更加复杂一点。

设计 FIFO 的时候一般需要考虑的有两点:

FIFO 的大小

FIFO 的大小就是指双端口 ram 的大小,这个可以根据需要来设置。

FIFO空满状态的判断

FIFO 空满状态的判断通常有两种方法

  1. FIFO 中的 ram 一般是双端口 ram ,所以有独立的读写地址。因此可以一种设置读,写指针,写指针指向下一个要写入数据的地址,读指针指向下一个要读的地址,最后通过比较读指针和写指针的大小来确定空满状态。
  2. 设置一个计数器,当写使能有效的时候计数器加一;当读使能有效的时候,计数器减一,将计数器与 ram 的 size 进行比较来判断 FIFO 的空满状态。这种方法设计比较简单,但是需要额外的计数器,就会产生额外的资源,而且当 FIFO 较大时,会降低 FIFO 最终可以达到的速度。

程序实现

module fifo
(
    clk, rst, wr_en, rd_en, data_in, data_out, empty, full
);
input clk, rst;
input wr_en, rd_en;
input [7:0] data_in;
output [7:0] data_out;
output empty,full;

wire empty, full;
reg [7:0] data_out;

reg   [7:0] ram[15:0];    //双端口ram
reg   [3:0] wr_ptr, rd_ptr; //写和读指针
reg   [3:0] counter;     //用来判断空满

always @(posedge clk)
      begin
           if (!rst)
                begin
                     counter=0;
                     data_out=0;
                     wr_ptr=0;
                     rd_ptr=0;
                end
           else
                begin
                   case({wr_en, rd_en})
                       2’b00: counter=counter;
                       2’b01: 
                             begin
                                  data_out=ram[rd_ptr];  //先进先出,因此读的话依旧按照次序来
                                  counter=counter-1;
                                  rd_ptr=(rd_ptr==15) ?0: rd_ptr+1;
                                  end
                       2’b10:
                             begin
                                  ram[wr_ptr]=data_in;   //写操作
                                  counter=counter+1;
                                  wr_ptr=(wr_ptr==15) ?0: wr_ptr+1;
                                  end
                       2’b11
                             begin
                                  ram[wr_ptr]=data_in; //读写同时进行,此时counter不增加
                                  data_out=ram[rd_ptr];
                                  wr_ptr=(wr_ptr==15) ?0:wr_ptr+1;
                                  rd_ptr=(rd_ptr==15) ?0: rd_ptr+1;
                             end
                         endcase
                    end
                end
assign  empty=(counter==0)?1:0;
assign  full=(counter==15) ?1:0;
endmodule

本文来源于:https://blog.csdn.net/IamSarah/article/details/76022015?ops_request_misc=&request_id=&biz_id=&utm_source=distribute.pc_search_result.none-task

本文分享自微信公众号 - 数字ICer(Studying_Times)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • FIFO解析攻略

    First Input First Output的缩写,先入先出队列,这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令。是一种先进先出...

    数字芯片社区
  • AMBA、AHB、APB、AXI总线介绍及对比

    AMBA (Advanced Microcontroller Bus Architecture) 高级微处理器总线架构

    数字芯片社区
  • DDR3 接口分析

    下图为各种参数设定,有bank、column、rank等参数设置(其实你不用动他们,这些都是之前选好的,不记得自己选了什么?乖乖!不如再翻翻DDR3 IP 核配...

    数字芯片社区
  • 美国防部将投资6亿美元研发无人潜航器

    2016年2月3日,美国国防部部长阿什顿·卡特(Ashton Carter)对外表示,美国国防部未来五年将在各种型号的无人潜航器领域投入6亿美元。这种新武装力量...

    人工智能快报
  • Maven Waring : GroupId is duplicate of parent groupId 和 Version is duplicate of parent version

      新项目在创建的时候,因为用到了分模块的,所以导致子模块的pom文件,报了 如下警告:

    黑泽君
  • 利用“通用App营销活动”(UAC)助力移动应用推广

    译者:吕东昊 审校:朱玉雪 本文长度为1171字,预估阅读时间3分钟。我们今天要向大家介绍如何利用通用App营销活动(UAC)助力移动应用推广。 在一天当中...

    iCDO互联网数据官
  • 还不了解梯度下降法?看完这篇就懂了!

    那么其实可以总结出关于“如何找到函数f(x)”的方法论。可以看作是机器学习的“三板斧”:

    木东居士
  • 深度学习过程中的优化算法

    神经网络的训练过程实质是得到最优化目标函数的过程,常见的目标函数MSE Loss、Cross Entropy Loss、NLL Loss等,网络训练过程就是最小...

    CodeInHand
  • 在Java8的foreach()中使用return/break/continue

    今天使用lambda表达式处理集合时,发现对return、break以及continue的使用有点迷惑,于是自己动手测试了一下,才发现在使用foreach()处...

    Erwin
  • 一文看懂常用的梯度下降算法

    作者:叶 虎 编辑:祝鑫泉 一 概述 梯度下降算法(Gradient Descent Optimization)是神经网络模型训练最常用的优化算法。对于深...

    机器学习算法工程师

扫码关注云+社区

领取腾讯云代金券