0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

同步FIFO设计(上)

冬至子 来源:两猿社 作者:IC猿 2023-06-05 14:39 次阅读

1.介绍

FIFO ,First In First Out,先入先出队列,顾名思义,即第一个到达的数据也将会是第一个离开。由于同步FIFO的操作速度非常快,并且能 降低系统的复杂性 ,因此在很多高性能系统中是非常理想的选择。且同步FIFO相比异步FIFO来说实现起来更简单。所以在实际项目中用得相对较多。

UART项目中也使用了同步FIFO进行数据的缓存,本文主要对此进行讲解。

2.FIFO设计

图片

同步fifo架构,取自《硬件架构的艺术》

根据系统时钟和响应速度,需要确定 FIFO深度 。本设计中深度设置为15,数据宽度8bit。同步FIFO设计的关键在于空满信号的产生。

设计中rptr为 读指针 ,指向下一个要读的地址;wptr为 写指针 ,同样指向下一个要写的地址。有效的读写使能使读写指针递增。

wfull为 写满信号 ,表示FIFO空间已经写满,不能再写入数据;rempty为 读空信号 ,表示FIFO内没有可供读写的有效数据。空满信号的产生是根据读写指针(读写地址)产生的。

  • FIFO复位

此FIFO模块中有两个复位,一个是系统复位rst_,一个是FIFO复位fifo_rst。

系统复位为是整系统复位信号,该系统中所有寄存器会在此复位信号有效时有一个初始值,避免不定态的产生。

FIFO复位信号是同步FIFO的复位信号,只对此模块有效,该信号有效时读写指针会归0。

满足FIFO复位单独可控的设计要求。

  • 空满信号产生

当FIFO复位信号fifo_rst有效时,读写指针会归零,这时rempty信号会拉起,表示FIFO为空状态,此时往fifo中写数据;当fifo中没有空间可以写时,写地址是ram的深度即15,写指针指向下一个写地址会回到0,此时fifo为满状态,wfull信号拉起。

图片

空满产生

可以发现,在读写指针相等时,FIFO要么空要么满。那么我们怎么对空满状态进行区分呢?

FIFO深度为15,正常地址应该为4bit[3:0],为了区分空满状态,我们将指针设置为5bit[4:0]。

根据上述的空满状态产生原理,可以发现:

1) 当FIFO为空时,读写指针完全相等;

2) 当FIFO为满时,读写指针的最高位是相反的,而低4位一定相等。

图片

空满信号产生

  • FIFO数据状态指示

由于设计要求FIFO数据量需要可查询,所以增加一个fifo_cnt,它的值为写指针与读指针的差值。表示FIFO中剩余的数据量,作为输出传递到寄存器配置模块供系统查询。

最后附上本项目中所用到的同步FIFO代码,可将FIFO数据位宽和深度参数化,减少改动方便重复调用。另外要养成良好的代码习惯,多加注释。

同步FIFO Verilog代码:

1`timescale 1ns/1ps
 2
 3module    UART_FIFO(
 4    //inputs
 5    clk,
 6    rst_,
 7    fifo_rst,
 8    rinc,
 9    winc,
10    data_i,
11    //outputs
12    data_o,
13    wfull,
14    rempty,
15    fifo_cnt
16);
17
18input           clk;                 // ARM clock
19input           rst_;                // ARM reset
20input           fifo_rst;            // FIFO reset control signal.high active
21input           rinc;                // FIFO read enable signal
22input           winc;                // FIFO write enable signal
23input  [7:0]    data_i;              // in data line
24
25output          wfull;               // write full signal
26output          rempty;              // read empty signal
27output [7:0]    data_o;              // FIFO out data
28output [4:0]    fifo_cnt;            // FIFO statu register
29
30reg  [7:0]      data_o;
31reg  [4:0]      fifo_cnt;
32reg  [4:0]      wptr;                // write pointer
33reg  [4:0]      rptr;                // read pointer
34reg  [7:0]      ram[15:0];           // ram in FIFO
35
36// write data in ram
37always@(posedge clk or negedge rst_) begin
38    if(!rst_) begin
39        data_o <= 8'd0;
40        rptr   <= 5'd0;
41    end
42    else begin
43        if(fifo_rst) begin
44            rptr <= 5'd0;
45        end
46        else begin
47            if(rinc && !rempty) begin
48                data_o <= ram[rptr[3:0]];
49                rptr   <= rptr + 1'b1;
50            end
51        end
52    end
53end
54
55// read data from ram
56always@(posedge clk or negedge rst_) begin
57    if(!rst_) begin
58        wptr <= 5'd0;
59    end
60    else begin
61        if(fifo_rst) begin
62            wptr <= 5'd0;
63        end
64        else begin
65            if(winc && !wfull) begin
66                ram[wptr[3:0]] <= data_i;
67                wptr           <= wptr + 1'b1; 
68            end
69        end
70    end
71end
72
73// the number of data in the FIFO
74always@(posedge clk or negedge rst_) begin
75    if(!rst_) begin
76        fifo_cnt <= 5'd0;
77    end
78    else begin
79        fifo_cnt <= wptr - rptr;
80    end
81end
82
83// produce full and empty signal
84assign    wfull  = ({!wptr[4],wptr[3:0]}==rptr)? 1'b1 : 1'b0;
85assign    rempty = (wptr==rptr)? 1'b1:1'b0;
86
87endmodule
88
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5041

    浏览量

    117765
  • RAM
    RAM
    +关注

    关注

    7

    文章

    1322

    浏览量

    113715
  • FIFO存储
    +关注

    关注

    0

    文章

    102

    浏览量

    5895
  • UART接口
    +关注

    关注

    0

    文章

    123

    浏览量

    15068
收藏 人收藏

    评论

    相关推荐

    同步FIFO设计详解及代码分享

    FIFO (先入先出, First In First Out )存储器,在 FPGA 和数字 IC 设计中非常常用。 根据接入的时钟信号,可以分为同步 FIFO 和异步 FIFO
    发表于 06-27 10:24 1326次阅读
    <b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>设计详解及代码分享

    握手型接口的同步FIFO实现

    按照正常的思路,在前文完成前向时序优化和后向时序优化后,后面紧跟的应该是双向时序优化策略了,不过不急,需要先实现一下握手型同步FIFO
    的头像 发表于 12-04 14:03 300次阅读
    握手型接口的<b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>实现

    基于VHDL和FPGA的非对称同步FIFO设计实现

    本文采用VHDL描述语言,充分利用Xilinx公司Spartan II FPGA的系统资源,设计实现了一种非对称同步FIFO,它不仅提供数据缓冲,而且能进行数据总线宽度的转换。
    发表于 01-13 11:33 1778次阅读

    同步FIFO设计

    发表于 11-19 11:58 12次下载

    同步FIFO之Verilog实现

    FIFO的分类根均FIFO工作的时钟域,可以将FIFO分为同步FIFO和异步FIFO
    的头像 发表于 11-01 09:57 1359次阅读

    怎样设计一个同步FIFO?(1)

    今天咱们开始聊聊FIFO的设计。FIFO是一个数字电路中常见的模块,主要作用是数据产生端和接受端在短期内速率不匹配时作为数据缓存。FIFO是指First In, First Out,即先进先出,跟大家排队一样。越早排队的人排在越
    的头像 发表于 05-04 15:48 578次阅读

    怎样设计一个同步FIFO?(2)

    开始往下读之前,老李先问一个问题,假如现在让你设计一个深度为N的基于2port SRAM的同步FIFO,请问至少需要多大的SRAM? 假设SRAM的位宽就是你的数据宽度,那么问题就是问你需要的SRAM的行数至少是多少?如果你觉得答案是显而易见的N,那么你值得读完这一篇。
    的头像 发表于 05-04 15:55 681次阅读
    怎样设计一个<b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>?(2)

    怎样设计一个同步FIFO?(3)

    我们说这个结构之所以使得FIFO的输出Q在读完SRAM之后保持稳定,其实需要SRAM本身可以保持RDATA在读操作之后的多个周期保持稳定。即SRAM本身的读时序如下图所示:图中cycle 4,5,6都没有读操作,SRAM的RDATA依然保持D0不变。
    的头像 发表于 05-04 15:59 433次阅读
    怎样设计一个<b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>?(3)

    FIFO设计—同步FIFO

    FIFO是异步数据传输时常用的存储器,多bit数据异步传输时,无论是从快时钟域到慢时钟域,还是从慢时钟域到快时钟域,都可以使用FIFO处理。
    发表于 05-26 16:12 1068次阅读
    <b class='flag-5'>FIFO</b>设计—<b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>

    同步FIFO设计(下)

    在上升沿触发电路中,建立时间就是在时钟上升沿到来之前,触发器数据保持稳定的最小时间;而保持时间就是在时钟上升沿到来之后,触发器数据端数据还应该保持的最小时间。
    的头像 发表于 06-05 14:44 443次阅读
    <b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>设计(下)

    一个简单的RTL同步FIFO设计

    FIFO 是FPGA设计中最有用的模块之一。FIFO 在模块之间提供简单的握手和同步机制,是设计人员将数据从一个模块传输到另一个模块的常用选择。
    发表于 06-14 08:59 262次阅读

    基于寄存器的同步FIFO

      FIFO 是FPGA设计中最有用的模块之一。FIFO 在模块之间提供简单的握手和同步机制,是设计人员将数据从一个模块传输到另一个模块的常用选择。 在这篇文章中,展示了一个简单的 RTL
    的头像 发表于 06-14 09:02 498次阅读

    基于Verilog的同步FIFO的设计方法

    同步FIFO的设计主要包括读写地址的产生、数据的读写、以及状态的控制。下面我们将分别介绍这三个方面的设计。
    发表于 08-31 12:53 304次阅读

    同步FIFO设计分析

    模块虽小但是要有新意,首先写一个同步FIFO,这是一个烂大街的入门级项目,但是我肯定不会写的那么简单
    的头像 发表于 09-11 17:11 374次阅读
    <b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>设计分析

    同步FIFO和异步FIFO的区别 同步FIFO和异步FIFO各在什么情况下应用

    同步FIFO和异步FIFO的区别 同步FIFO和异步FIFO各在什么情况下应用? 1.
    的头像 发表于 10-18 15:23 1017次阅读