这一篇来讲一下如何解决上一篇[如何设计一个同步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]
目前市场上常见的道闸防砸技术的介绍
江门尺寸检测服务三维激光扫描3D偏差检测技术服务
视频摄像系统的各种集成视频滤波放大器分析
测量神经网络的抽象推理能力
鸿海拟550亿日圆吞并夏普三工厂
怎样设计一个同步FIFO?(3)
电压跟随器反馈加电阻是为什么 电压跟随器的工作原理
工业机器人的X光视觉该如何有效的应用
三分钟带你了解金刚石散热片的生成方法及在微波射频领域的应用
GPU要超越CPU挤身一线主角还得靠AI
“娱乐圈最美笑容”献给海信“双十一”,唐艺昕直播大赞黑科技
影碟机的频率响应
村田陶瓷贴片电容知识
解决国产玩家出海之痛,亚马逊Alexa为海外生态合作带来更多可能性
苹果iPhone触摸屏需求或令其他厂商受损
SQLite数据库的特点 SQLite数据库简单介绍
盘点无人机飞控大脑与MEMS传感器
LL-SAW器件的设计要点
ups电池柜的尺寸_UPS电池柜为何要接地
电源220V熔断保险丝的指示灯电路