炼狱传奇-FIFO之战

梦翼师兄   2015-7-17 11:28 楼主
FIFO是First Input First Output的缩写,先进先出队列,这是一种传统的按序执行方法,是一种先进先出的数据缓存器,它与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。
接下来我们学习如何在Quartus中使用FIFOIP核,我们常用的FIFO为双时钟的异步FIFO,在这里为了较为简单,方便大家理解,虽然我们使用的是异步FIFO,但两个时钟端口使用的确是同一个时钟。
首先,新建一个工程
1.png
然后建立起顶层文件
2.png
接下来我们需要调出FIFO,点击TOOLS-> 3.png
4.png
点击NEXT
5.png
在Memory Compiler中选择FIFO,设置文件名称为my_fifo
6.png
点击NEXT
7.png
设置存储空间为1024*8
8.png
点击选中第二个选项 9.png
10.png
点击NEXT
11.png
点击NEXT
12.png
点击选中full和empty,如下图所示
13.png
点击NEXT
14.png
点击NEXT
15.png
点击NEXT
16.png

点击NEXT
17.png
点击Finish,配置结束。由于FIFO是一种存储器,所以我们可以建立两个FIFO控制器,一个写控制器负责把数据写入到FIFO,另一个读控制器负责把数据从FIFO中读出来,仿真验证读写是否正确
FIFO写控制器具体代码如下:
18.png
19.png
FIFO读控制器具体代码如下:
20.png
21.png
接下来我们需要通过顶层文件,实例化所有模块,具体代码如下
22.png
23.png
最后我们编写测试代码如下:
24.png
在软件中设置tb为测试文件之后,查看仿真波形
25.png
如上图可以看出,当写请求信号线为高电平的时候,有数据写入,输出端q保持初始值状态。当数据写入完毕以后,FIFO满标志信号线会置为高电平,同时读控制器开始读出数据,q端有数据输出。写入数据和读出数据完全一致,说明数据读写正确。


回复评论 (3)

不知道梦翼师兄还在不在论坛,小弟有一事相问,为什么我做出来的仿真没有波形输出?图在下方,这是为什么呢?求解答 本帖最后由 LyleLance 于 2016-4-2 16:47 编辑
点赞  2016-4-2 16:45
仿真结果图就是这样,后面的全为0
  • 仿真结果图
点赞  2016-4-2 16:46
引用: LyleLance 发表于 2016-4-2 16:46
仿真结果图就是这样,后面的全为0

波形图给的不详细,最好拉出所有模块,进行分组以后查看。如果是层次化设计,最好是首先查看RTL视图,确定模块间连接是否正确,尤其要注意各端口位宽是否一致
点赞  2016-4-2 20:44
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复