当前位置:   article > 正文

FPGA-FIFO核的调用_buffer full cnt:

buffer full cnt:

FIFO存储器

FIFO( First Input First Output)简单说就是指先进先出。由于微电子技术的飞速发展,新一代FIFO芯片容量越来越大,体积越来越小,价格越来越便宜。作为一种新型大规模集成电路,FIFO芯片以其灵活、方便、高效的特性,逐渐在高速数据采集、高速数据处理、高速数据传输以及多机处理系统中得到越来越广泛的应用。

中文名      FIFO存储器

外文名       First Input First Output

含    义       先进先出

功    能     数据集中起来进行进机和存储

简介

系统设计中,以增加数据传输率、处理大量数据流、匹配具有不同传输率的系统为目的而广泛使用FIFO存储器,从而提高了系统性能。FIFO存储器是一个先入先出的双口缓冲器,即第一个进入其内的数据第一个被移出,其中一个存储器的输入口,另一个口是存储器的输出口。对于单片FIFO来说,主要有两种结构:触发导向结构和零导向传输结构。触发导向传输结构的FIFO是由寄存器阵列构成的,零导向传输结构的FIFO是由具有读和写地址指针的双口RAM构成。

功能

FIFO存储器是系统的缓冲环节,如果没有FIFO存储器,整个系统就不可能正常工作,它主要有几方面的功能:

1)对连续的数据流进行缓存,防止在进机和存储操作时丢失数据;

2)数据集中起来进行进机和存储,可避免频繁的总线操作,减轻CPU的负担;

3)允许系统进行DMA操作,提高数据的传输速度。这是至关重要的一点,如果不采用DMA操作,数据传输将达不到传输要求,而且大大增加CPU的负担,无法同时完成数据的存储工作。

因此,选择合适的存储芯片对于提高系统性能很重要,在以往的设计中经常采用的是“乒乓型”存储方式,这种方式就是采用两片存储器,数据首先进入其中一片,当数据满时再让数据进入第二片存储器,同时通过逻辑控制,将第一片存储器中的数据取走,以此类推,两片轮流对数据进行缓存。这种方式有着较明显的缺点,首先是控制复杂,要有专门的逻辑来维护这种轮流机制;其次,数据流的流向要不断变化,限制了数据流的速率,还容易产生干扰。从数据传输上说,缓存芯片容量越大,对后续时序要求就越低,可减少总线操作的频次;但从数据存储上说,就意味着需要开辟更大的内存空间来进行进行缓冲,会增加计算机的内存开销,而且容量越大,成本也越高。因此,在综合考虑系统性能和成本的基础上,选择满足系统需要的芯片即可。

FIFO是First In/First-Out的缩写,是先入先出的意思。FIFO存储器分为写入专用区和读取专用区。读操作与写操作可以异步进行,写入区上写入的数据按照写入的顺序从读取端的区中读出,类似于吸收写入端与读出端速度差的一种缓冲器。计算机的串口,一般也都具有FIFO缓冲器(不是单一的FIFO存储器,而是嵌入在设备内部)。

FIFO存储器的连接模式如图所示。在FIFO存储器而不是地址总线上附加了表示内部缓冲器状态(Buffer Full,缓冲器已满;Buffer Empty,缓冲器为空)的状态引脚,连接于FIFO的双方利用该状态进行操作的控制。另外,还设计了在接通电源及复位(Reset)或由于操作中的某些异常等原因而重新初始化(无数据状态)FIFO的复位引脚,这可以说是FIFO存储器的特点

本质上是RAM

没有地址端口

分类:

同步FIFO     异步FIFO

读写位宽不同FIFO

模块设计信号列表:

  1. 写时钟   wrclk
  2. 写数据   datain
  3. 写使能   wren
  4. 读时钟   rdclk
  5. 读数据   dout
  6. 读使能   rden
  7. 复位       rst
  8. 满信号   full
  9. 空信号   empty

一般设计

1、要读的比写的能力强

2、full=1后,绝对不能写(外部要保证)

3、empty=1后,绝对不能读(外部保证)

4、不能丢也不能多读数据

深度的选取:(FIFO的设计的重点和难点)

这里看到一个设计思路提供大家参考:

设计fifo的时候一般需要考虑的有两点:

1.fifo的大小

 fifo的大小指就是双端口ram的大小,这个可以根据设计需要来设置。

2.fifo空满状态的判断

 fifo空满状态的判断通常有两种方法。

  a、fifo中的ram一般是双端口ram,所以有独立的读写地址。因此可以一种是设置读,写指针,写指针指向下一个要写入数据的地址,读指针指向下一个要读的地址,最后通过比较读指针和写指针的大小来确定空满状态。

 b、设置一个计数器,当写使能有效的时候计数器加一;当读使能有效的时候,计数器减一,将计数器与ram的size进行比较来判断fifo的空满状态。这种方法设计比较简单,但是需要的额外的计数器,就会产生额外的资源,而且当fifo比较大时,会降低fifo最终可以达到的速度。

  1. module fifo(clk,rst,wr_en,rd_en,data_in,data_out,empty,full);
  2. input clk,rst;
  3. input wr_en,rd_en;
  4. input [7:0]data_in;//输入数据
  5. output [7:0]data_out;//输出数据
  6. output empty,full;//空满标志
  7. wire empty,full;
  8. reg [7:0]data_out;
  9. reg [7:0] ram[15:0];//dual port RAM
  10. reg [3:0] wr_ptr,rd_ptr;//写和读指针
  11. reg [3:0] counter;//用来判断空满
  12. always@(posedge clk)
  13. begin
  14. if(!rst)
  15. begin
  16. counter=0;
  17. data_out=0;
  18. wr_ptr=0;
  19. rd_ptr=0;
  20. end
  21. else
  22. begin
  23. case({wr_en,rd_en})
  24. 2'b00: counter=counter;
  25. 2'b01:
  26. begin
  27. data_out=ram[rd_ptr];//先进先出,因此读的话依旧按照次序来
  28. counter=counter-1;
  29. rd_ptr=(rd_ptr==15)?0:rd_ptr+1;
  30. end
  31. 2'b10:
  32. begin
  33. ram[wr_ptr]=data_in;//写操作
  34. counter=counter+1;
  35. wr_ptr=(wr_ptr==15)?0:wr_ptr+1;
  36. end
  37. 2'b11:
  38. begin
  39. ram[wr_ptr]=data_in;//读写同时进行,此时counter不增加
  40. data_out=ram[rd_ptr];
  41. wr_ptr=(wr_ptr==15)?0:wr_ptr+1;
  42. rd_ptr=(rd_ptr==15)?0:rd_ptr+1;
  43. end
  44. endcase
  45. end
  46. end
  47. assign empty=(counter==0)?1:0;
  48. assign full =(counter==15)?1:0;
  49. endmodule
  50. ---------------------
  51. 作者:IamSarah
  52. 来源:CSDN
  53. 原文:https://blog.csdn.net/IamSarah/article/details/76022015

利用ip核来进行操作: 

  1. module fifo_test(clk,rst_n,fifo_full,fifo_empty,fifo_rdrdy,fifo_rddb
  2. );
  3. input clk;
  4. input rst_n;
  5. output fifo_full;
  6. output fifo_empty;
  7. output reg fifo_rdrdy;
  8. output [7:0]fifo_rddb;
  9. reg [7:0] fifo_wrdb;
  10. reg fifo_wren;
  11. reg fifo_rden;
  12. reg [9:0] cnt;
  13. always@(posedge clk or negedge rst_n)begin
  14. if(rst_n==1'b0)begin
  15. cnt<=1'b0;
  16. end
  17. else begin
  18. cnt<=cnt+1'b1;
  19. end
  20. end
  21. always@(posedge clk or negedge rst_n)begin
  22. if(rst_n==1'b0)begin
  23. fifo_wren<=1'b0;
  24. fifo_rden<=1'b0;
  25. fifo_wrdb<=1'b0;
  26. end
  27. else if((cnt>1'b0)&&(cnt<10'd40))begin
  28. else begin
  29. fifo_wren<=1'b1;
  30. fifo_rden<=1'b0;
  31. fifo_wrdb<=cnt;
  32. end
  33. else if((cnt>10'd100)&&(cnt<10'd133))begin
  34. fifo_wren<=1'b0;
  35. fifo_rden<=1'b1;
  36. fifo_wrdb<=1'b0;
  37. end
  38. else begin
  39. fifo_wren<=1'b0;
  40. fifo_rden<=1'b0;
  41. fifo_wrdb<=1'b0;
  42. end
  43. end
  44. always@(posedge clk or negedge rst_n)begin
  45. if(rst_n==1'b0)begin
  46. fifo_rdrdy<=1'b0;
  47. end
  48. else begin
  49. fifo_rdrdy<=fifo_rden;
  50. end
  51. end
  52. fifo_demo uut_fifo_demo (
  53. .clk(clk), // input clk
  54. .srst(!rst_n), // input rst
  55. .din(fifo_wrdb), // input [7 : 0] din
  56. .wr_en(fifo_wren), // input wr_en
  57. .rd_en(fifo_rden), // input rd_en
  58. .dout(fifo_rddb), // output [7 : 0] dout
  59. .full(fifo_full), // output full
  60. .empty(fifo_empty) // output empty
  61. );
  62. endmodule

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/539423
推荐阅读
相关标签
  

闽ICP备14008679号