当前位置:   article > 正文

32.同步FIFO-IP核的调用

32.同步FIFO-IP核的调用

        (1)FIFO(First In First Out,即先进先出),是一种数据缓冲器,用来实现数据先入先出的读写方式。

        (2)FIFO存储器主要是作为缓存,应用在同步时钟系统和异步时钟系统中,在很多的设计中都会被使用,比如:多比特数据做跨时钟域处理、前后带宽不同步等都用到了FIFO。

       (3)FIFO根据读写时钟是否相同,可以分为SCFIFO(同步FIFO)和DCFIFO(异步FIFO)。

 (4)scfifo配置过程:

(5)scfifo的调用:

  1. module scfifo
  2. (
  3. input clk ,
  4. input reset_n ,
  5. input [7:0]data_in ,
  6. input wr_en ,
  7. input rd_en ,
  8. output [7:0]data_out ,
  9. output full ,
  10. output empty ,
  11. output [7:0]data_count
  12. );
  13. scfifo_8x256 scfifo_8x256_inst (
  14. .clk (clk ), // input wire clk
  15. .srst (~reset_n ), // input wire srst
  16. .din (data_in ), // input wire [7 : 0] din
  17. .wr_en (wr_en ), // input wire wr_en
  18. .rd_en (rd_en ), // input wire rd_en
  19. .dout (data_out ), // output wire [7 : 0] dout
  20. .full (full ), // output wire full
  21. .empty (empty ), // output wire empty
  22. .data_count (data_count) // output wire [7 : 0] data_count
  23. );
  24. endmodule

(6)仿真文件代码:

  1. `timescale 1ns / 1ps
  2. module scfifo_tb;
  3. reg clk ;
  4. reg reset_n ;
  5. reg [7:0] data_in ;
  6. reg wr_en ;
  7. reg rd_en ;
  8. reg [1:0] cnt ;
  9. wire [7:0] data_out ;
  10. wire full ;
  11. wire empty ;
  12. wire [7:0] data_count ;
  13. scfifo scfifo_inst
  14. (
  15. .clk (clk ) ,
  16. .reset_n (reset_n ) ,
  17. .data_in (data_in ) ,
  18. .wr_en (wr_en ) ,
  19. .rd_en (rd_en ) ,
  20. .data_out (data_out ) ,
  21. .full (full ) ,
  22. .empty (empty ) ,
  23. .data_count (data_count)
  24. );
  25. initial clk = 1'd1;
  26. always #10 clk = ~clk;
  27. initial begin
  28. reset_n <= 1'd0;
  29. #21;
  30. reset_n <= 1'd1;
  31. #100_000;
  32. $stop;
  33. end
  34. always@(posedge clk or negedge reset_n)
  35. if(!reset_n)
  36. cnt <= 2'd0;
  37. else if(cnt == 2'd3)
  38. cnt <= 2'd0;
  39. else
  40. cnt <= cnt + 2'd1;
  41. always@(posedge clk or negedge reset_n)
  42. if(!reset_n)
  43. wr_en <= 1'd0;
  44. else if(cnt == 2'd3 && rd_en == 1'd0)
  45. wr_en <= 1'd1;
  46. else
  47. wr_en <= 1'd0;
  48. always@(posedge clk or negedge reset_n)
  49. if(!reset_n)
  50. data_in <= 8'd0;
  51. else if(data_in == 8'd255 && wr_en)
  52. data_in <= 8'd0;
  53. else if(wr_en && (!full))
  54. data_in <= data_in + 8'd1;
  55. else
  56. data_in <= data_in;
  57. always@(posedge clk or negedge reset_n)
  58. if(!reset_n)
  59. rd_en <= 1'd0;
  60. else if(full && wr_en == 1'd0)
  61. rd_en <= 1'd1;
  62. else if(empty)
  63. rd_en <= 1'd0;
  64. else
  65. rd_en <= rd_en;
  66. endmodule

(7)仿真波形:

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

闽ICP备14008679号