FIFO的时序和应用——FPGA的个人笔记

FIFO即First in first out.就是先进先出。这种技术其实早已经不是什么新鲜东西。网上有关它的描述很多,但是还是想说一下自己的理解。本篇博客挖掘的不是太深入,只是介绍了一下FIFO的时序。将重点放在写空(wrempty)、写满(wrfull)、读空(rdempty)、读满(rdfull)等几个关键状态上。

笔者在用FPGA实现这个功能前,看了看原子哥的教程视频。有关FIFO的用途原理等,原子哥讲的已经很详细了,其它博客也有关于FIFO的介绍。但笔者觉得在写空、写满、读空、读满时序等细节方面原子哥没有说的太清楚(很可能是本人愚昧,没能理解其中的含义),因此写下了此文。

1.首先画一个FIFO模块如下图所示。在这个FIFO中包含了写时钟、读时钟、输入数据、输出数据、写请求、读请求、写空、读空、写满、读满等端口。

2.理解写空(wrempty)、写满(wrfull)、写请求(wrreq)之间的关系(以下用英文代替这几个专业术语)。

所谓wrempty,简单的理解就是FIFO内没有有效的数据了;wrfull与wrempty对应,意思是FIFO中没有多余的存储空间了当然就是full了。当FIFO在wrfull状态的时候,很自然地得出结论:当处于“写满(wrfull)”状态时,一定不要让“写请求(wrreq)”发出继续写入FIFO的信号至于wrempty与wrreq间的关系,我们不用关心,这是因为:只要不是wrfull状态,FIFO就有多余的存储空间,就有充分的责任欢迎数据的写入。那么有意思的问题来了,只要一根线能用两种状态(0和1)表示能否向FIFO中写入,为啥还需要两根线呢?这个问题俺也不知道了,希望有了解的大神,看到了帮俺解答一下。下边还是给出我自己画的时序图(Types表示FIFO上的端口类型是输出,没标记为输入)~

                                                                                        写时序图

3.理解读空(rdempty)、读满(rdfull)、读请求(rdreq)之间的关系(以下用英文代替这几个专业术语)。

所谓rdempty,简单的理解就是FIFO内有效数据都被设备读完了;rdfull与rdempty对应,意思是FIFO中现在没有多余的存储空间了。当FIFO在rdempty状态的时候,很自然地得出结论:当处于“读空(rdempty)”状态时,一定不要让“读请求(rdreq)”发出继续读出的信号。至于rdfull和rdreq的关系,我们不用关心,这是因为:只要不是rdempty状态,FIFO就有数据,有充分的义务向外部设备供应数据。那么有意思的问题来了,只要一根线能用两种状态(0和1)表示能否从FIFO中读出,为啥还需要两根线呢?这个问题俺还是不知道,希望有了解的大神,看到了帮俺解答一下。下边还是给出我自己画的时序图(Types表示FIFO上的端口类型是输出,没标记为输入)~

扫描二维码关注公众号,回复: 11270269 查看本文章

                                                                                          读时序图(show-ahead模式)

4.仿真验证。

下边附上Modelsim的仿真结果,向FIFO中写入随机的数据,再从FIFO中读出来。为了验证方便,将wr_clk与rd_clk设置成一模一样(第一行)。图中前4个标尺标明了在wr_clk上升沿的时候分别将第二行的0x2a,0x5c,0x4d,0x25四个随机数据写进了FIFO,第4、5、6、7个标尺标明了在rd_clk上升沿时,将FIFO中的数据按顺序读了出来(第三行),也是0x2a,0x5c,0x4d,0x25这四个数据。这证明了上述理解没有错误。FIFO的实现及其仿真的源码请点击这里下载


谢谢阅读,请各路大神批评指正。

猜你喜欢

转载自blog.csdn.net/a133760/article/details/103756036