全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 可编程逻辑 >

FPGA学习系列:24. FIFO控制器的设计

时间:2018-08-07 11:11

人气:

作者:admin

标签: FPGA 

导读:设计背景: First Input First Output的缩写,先入先出队列,这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令。FIFO是队列机制中最简单的,每个接口上都存...

设计背景:

First Input First Output的缩写,先入先出队列,这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令。FIFO是队列机制中最简单的,每个接口上都存在FIFO队列,表面上看FIFO队列并没有提供什么QoS(Quality of Service,服务质量)保证,甚至很多人认为FIFO严格意义上不算做一种队列技术,实则不然,FIFO是其它队列的基础,FIFO也会影响到衡量QoS的关键指标:报文的丢弃、延时、抖动。既然只有一个队列,自然不需要考虑如何对报文进行复杂的流量分类,也不用考虑下一个报文怎么拿、拿多少的问题,而且因为按顺序取报文,FIFO无需对报文重新排序。简化了这些实现其实也就提高了对报文时延的保证。

设计原理:

本次的设计主要通过调用FIFO的IP核来设置一个简单的单口FIFO,也就是说读写时钟为相同的时钟。其设置流程如下所示也如rom,ram,设置一样的打开步骤

如下如选择FIFO,然后写入生成的FIFO文件名,my_fifo,下一步

image.png

设置合适的数据位宽和深度,之后下一步

出现了空满标志位,full,emty,我们去掉数据个数标志usedw.下一步

之后不停的下一步,出现下面的界面选择生成的文件,然后就完成简单的FIFO设计

image.png

设计架构图:

设计代码:

顶层模块:

0moduletop (clk,rst_n,q);//输入输出端口

1 inputclk;

2 inputrst_n;

3 output[7:0]q;

4 wirewrreq; //写使能信号

5 wirerdreq; //读使能信号

6 wireempty; //空标志位

7 wirefull; //满标志位

8 wire[7:0]data;

9

10fifo_control fifo_control (//FIFO控制器的例化

11 .clk(clk),

12 .rst_n(rst_n),

13 .full(full),

14 .empty(empty),

15 .wrreg(wrreq),

16 .rdreg(rdreq),

17 .data(data)

18 );

19my_fifo my_fifo ( //生成IP核的例化

20 .clock (clk ),

21 .data (data ),

22 .rdreq (rdreq ),

23 .wrreq (wrreq ),

24 .empty (empty ),

25 .full (full),

26 .q (q )

27 );

28

29endmodule

设计模块

0modulefifo_control ( //端口列表

1 inputclk,

2 inputrst_n,

3 inputfull, //满标志

4 inputempty, //空标志

5 outputregwrreg, //写使能

6 outputregrdreg, //读使能

7 outputreg[7:0]data

8 );

9 regstate;

10always@(posedgeclk ornegedgerst_n)

11 if(!rst_n)

12 begin

13 data<=0;

14 wrreg<=0; //写使能关闭

15 rdreg<=0; //读使能关闭

16 state <=0;

17 end

18 else

19 begin

20 case(state)

21 0:if(empty) //判断是否为空,为空写

22 begin

23 wrreg<=1;

24 data <=data +1;

25 end

26 elseif(full) //判断否写满,为满不写

27 begin

28 state <=1;

29 wrreg<=0;

30 rdreg<=1;

31 data<=0;

32 end

33 else

34 begin

35 wrreg<=1;

36 data <=data +1;

37 end

38

39 1:begin

40 if(empty) //判断是否读空,读空关闭读使能

41 begin

42 rdreg<=0;

43 state <=0;

44 end

45 end

46 endcase

47 end

48

49endmodule

测试模块

0`timescale1ns/1ps

1modulefifo_tb;

2

3 regclk;

4 regrst_n;

5 wire[7:0]q;

6initialbegin

7 clk =0;

8 rst_n =0;

9

10 #200rst_n=1;

11

12 end

13always#10clk=~clk;

14top top(

15 .clk(clk),

16 .rst_n(rst_n),

17 .q(q)

18 );

19

20endmodule

仿真:

从仿真空可以看到。我们写入的数据是1--255--0,读出的数据也是从1开始读再到0。

这样就完成了一个简单的FIFO,如果要生成双口的结局跨时钟问题可以在设置时,下面页面选择

image.png来进行设置

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信