前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >​同步FIFO

​同步FIFO

作者头像
数字芯片社区
发布2020-08-27 11:11:27
1.1K0
发布2020-08-27 11:11:27
举报
文章被收录于专栏:数字芯片数字芯片

同步 FIFO 简介

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

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

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

FIFO 的大小

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

FIFO空满状态的判断

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

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

程序实现

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数字ICer 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 同步 FIFO 简介
    • FIFO 的大小
      • FIFO空满状态的判断
      • 程序实现
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档