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

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

3天内不再提示

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

jf_78858299 来源:IC加油站 硅谷老李 作者:硅谷老李 2023-05-04 15:59 次阅读

这一篇来讲一下如何解决上一篇[如何设计一个同步FIFO(二)]最后提出的问题。

在上一篇中,我们设计的基于双端口SRAM的同步FIFO结构如下,

我们说这个结构之所以使得FIFO的输出Q在读完SRAM之后保持稳定,其实需要SRAM本身可以保持RDATA在读操作之后的多个周期保持稳定。即SRAM本身的读时序如下图所示:图中cycle 4,5,6都没有读操作,SRAM的RDATA依然保持D0不变。

但是如果SRAM的读时序不能保证这样,而是只能保证数据RDATA valid一个周期,那么我们就无法使用上面的结构。

那么要怎么做才能达到我们想要的FIFO时序呢?大家可以很容易想到,如果想保持数据稳定,那还是要借助一级Flop的帮忙,即将SRAM的输出RDATA锁在一个buffer flop里。不过大家也看到,在上一讲里我们下面的结构也还是有问题。

下面老李带领大家整理设计思路。我们看上面的SRAM的时序图,可以发现,我们周期T的时候读一次SRAM,数据在T+1周期到RDATA,我们再把这个数据存到一级flop中,那么要在T+2周期才能在flop的q上看见这个数据。这2个周期是无法避免的。所以说,当我们的FIFO要pop一次,然后下一个周期FIFO的Q数据要切换成最头上的数据(假设这个数据是head),那么我们可以得出结论,我们不能在pop的这一个cycle才去从SRAM中读head,而必须让head在这pop之前已经被读到了flop里,那么当pop来了之后,我们只需要让FIFO的q切换到这个flop输出就可以了。这是设计思路的第一层次。

下面大家再考虑,我们切换到了另一个flop,那么这个时候输出前一个Q的那个flop干什么去呢?当然不能闲着,它的任务是去接受此时存在SRAM里最头上的数据,相当于从SRAM里提前预支了这个数,缓存在这里,这样当下一个pop来的时候,可以在下一个周期再切换到它。

所以大家可以得出一个下面的结构。

要注意的点是我们这里有两级输出buffer flop,在上一讲当中我们说FIFO进来的第一个数不能存到RAM里,而是要直接存到输出级flop去。那么在上面的结构有相应的变化:FIFO进来的前两个数都不能存到RAM里,而是要从第3个数开始才把数据存到RAM里。

时序图建议大家自己画一下。

聪明的同学可能觉得这个思路很眼熟,没错,这里的解决的办法其实是数字电路设计中很常见的一个思路:乒乓Ping-pong buffer。

ping-pong buffer很常用,也是数字电路设计中的一个常考知识点。特别是valid/ready 握手协议中如何插入一级pipestage还能保证传输没有bubble,即每个周期都能够传输数据,老李当年面试被问到不止一次,老李自己做面试官也喜欢问这个问题。其实老李之前是想专门拿出来一篇来讲ping-pong buffer的,不过发现其他很多公众号博主已经写过相应的文章了,老李觉得大家看他们的文章就可以。所以这篇咱们只是简略讲一讲ping-pong buffer在这里的应用。

这里也给另外一个公众号“数字IC自修室”打个广告,上面也有很多很棒的文章,关于ping pong buffer大家可以看这一篇

[芯片设计小经验——乒乓buffer]

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • sram
    +关注

    关注

    6

    文章

    762

    浏览量

    114584
  • fifo
    +关注

    关注

    3

    文章

    386

    浏览量

    43484
收藏 人收藏

    评论

    相关推荐

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

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

    求大神帮忙给VHDL 写的同步FIFO

    急需同步FIFO,我这有,但是仿真图不对,我也不知道是不是代码有问题。
    发表于 03-15 09:25

    异步FIFO结构

    设计FIFO是ASIC设计者遇到的最普遍的问题之。本文着重介绍怎样设计FIFO——这是
    发表于 10-15 08:44 94次下载

    FPGA之FIFO练习3:设计思路

    根据FIFO工作的时钟域,可以将FIFO分为同步FIFO和异步FIFO同步
    的头像 发表于 11-29 07:08 1838次阅读

    同步FIFO之Verilog实现

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

    怎样设计同步FIFO?(1)

    今天咱们开始聊聊FIFO的设计。FIFO数字电路中常见的模块,主要作用是数据产生端和接受端在短期内速率不匹配时作为数据缓存。FIFO
    的头像 发表于 05-04 15:48 802次阅读

    怎样设计同步FIFO?(2)

    开始往下读之前,老李先问问题,假如现在让你设计深度为N的基于2port SRAM的同步FIFO
    的头像 发表于 05-04 15:55 960次阅读
    <b class='flag-5'>怎样</b>设计<b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>?(2)

    FIFO设计—同步FIFO

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

    FIFO设计—异步FIFO

    异步FIFO主要由五部分组成:写控制端、读控制端、FIFO Memory和两时钟同步
    发表于 05-26 16:17 1502次阅读
    <b class='flag-5'>FIFO</b>设计—异步<b class='flag-5'>FIFO</b>

    同步FIFO设计(上)

    FIFO,First In First Out,先入先出队列,顾名思义,即第一个到达的数据也将会是第一个离开。
    的头像 发表于 06-05 14:39 866次阅读
    <b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>设计(上)

    简单的RTL同步FIFO设计

    FIFO 是FPGA设计中最有用的模块之FIFO 在模块之间提供简单的握手和同步机制,是设计人员将数据从
    发表于 06-14 08:59 425次阅读

    基于寄存器的同步FIFO

      FIFO 是FPGA设计中最有用的模块之FIFO 在模块之间提供简单的握手和同步机制,是设计人员将数据从
    的头像 发表于 06-14 09:02 711次阅读

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

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

    同步FIFO设计分析

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

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

    简单的种,其特点是输入和输出都与时钟信号同步,当时钟到来时,数据总是处于稳定状态,因此容易实现数据的传输和存储。 而异步FIFO则是在波形的上升沿和下降沿上进行处理,在输入输出端口处分别增加输入和输出指针,用于管理数据的读写。
    的头像 发表于 10-18 15:23 1591次阅读