FIFO是First Input First Output的缩写,先进先出队列,这是一种传统的按序执行方法,是一种先进先出的数据缓存器,它与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。
接下来我们学习如何在Quartus中使用FIFOIP核,我们常用的FIFO为双时钟的异步FIFO,在这里为了较为简单,方便大家理解,虽然我们使用的是异步FIFO,但两个时钟端口使用的确是同一个时钟。
首先,新建一个工程
然后建立起顶层文件
接下来我们需要调出FIFO,点击TOOLS->
点击NEXT
在Memory Compiler中选择FIFO,设置文件名称为my_fifo
点击NEXT
设置存储空间为1024*8
点击选中第二个选项
点击NEXT
点击NEXT
点击选中full和empty,如下图所示
点击NEXT
点击NEXT
点击NEXT
点击NEXT
点击Finish,配置结束。由于FIFO是一种存储器,所以我们可以建立两个FIFO控制器,一个写控制器负责把数据写入到FIFO,另一个读控制器负责把数据从FIFO中读出来,仿真验证读写是否正确
FIFO写控制器具体代码如下:
FIFO读控制器具体代码如下:
接下来我们需要通过顶层文件,实例化所有模块,具体代码如下
最后我们编写测试代码如下:
在软件中设置tb为测试文件之后,查看仿真波形
如上图可以看出,当写请求信号线为高电平的时候,有数据写入,输出端q保持初始值状态。当数据写入完毕以后,FIFO满标志信号线会置为高电平,同时读控制器开始读出数据,q端有数据输出。写入数据和读出数据完全一致,说明数据读写正确。