• 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)仿真波形:

  • 相关阅读:
    2018Java面试
    贪心算法-Huffman算法
    使用DataSecurity Plus可以快速检测威胁并自动响应事件
    VUE学习:vue简介、vue指令
    arcgis前端(2)----->基础篇--发布一个自定义地图及加载自定义地图/底图
    爬虫_爬虫守则,反爬,反反爬和爬虫开发流程
    3D全景模型展示可视化技术演示
    高效搜索,提升编程效率
    热腾腾的大厂面试总结,想进大厂的必看!
    设计模式(9) 观察者模式
  • 原文地址:https://blog.csdn.net/2301_80417284/article/details/140378763