• Xilinx FPGA----FIFO缓存IP核创建和使用


    一、创建IP核

     

     

     

     

     

    二、FIFO实例化 

     

             在工程中找到fifo IP核自动生成的.VEO后缀的文件,这里就是fifo使用时需要实例化的接口列表。

    • wr_clk :                      写时钟 
    • wr_en :                       fifo写请求
    • din      :                       写入FIFO的数据
    • rd_clk :                       读时钟
    • rd_en :                        fifo读请求
    • dout  :                         从FIFO输出的数据
    • empty:                         读空信号
    • almost_empty                将要空信号
    • full                                  写满信号
    • almost_full                     将要满信号

    三、fifo写

    1.  检测到写空,并且有数据要写入fifo   
    2. 进入延时状态,延时10拍 原因是FIFO IP核内部状态信号的更新存在延时 延迟10拍以等待状态信号更新完毕    
    3. 拉高写使能,并且想fifo写入数据
    4. 检测到fifo被写满,则停止写入,并等待fifo被读空(回到第一步)
    1. reg [1:0] state; // 状态流转计数
    2. always @(posedge sys_clk or negedge sys_rst_n) begin
    3. if(!sys_rst_n) begin
    4. fifo_wr_en <= 1'b0;
    5. fifo_wr_data <= 8'd0;
    6. state <= 2'd0;
    7. dly_cnt <= 4'd0;
    8. wr_fifo_cnt <=0;
    9. end
    10. else begin
    11. case(state)
    12. 2'd0: begin
    13. if(empty && /*数据有效标志*/) begin //如果检测到FIFO将被读空
    14. state <= 2'd1; //就进入延时状态
    15. end
    16. else
    17. state <= state;
    18. end
    19. 2'd1: begin
    20. if(dly_cnt == 4'd10) begin //延时10拍 原因是FIFO IP核内部状态信号的更新存在延时 延迟10拍以等待状态信号更新完毕
    21. dly_cnt <= 4'd0;
    22. state <= 2'd2; //开始写操作
    23. fifo_wr_en <= 1'b1; //打开写使能
    24. end
    25. else
    26. dly_cnt <= dly_cnt + 4'd1;
    27. end
    28. 2'd2: begin
    29. if(full) begin //等待FIFO将被写满
    30. fifo_wr_en <= 1'b0; //关闭写使能
    31. fifo_wr_data <= 8'd0;
    32. state <= 2'd0; //回到第一个状态
    33. end
    34. else begin //如果FIFO没有被写满
    35. fifo_wr_data <= /*要写的数据*/ ;
    36. fifo_wr_en <= 1'b1; //则持续打开写使能
    37. end
    38. end
    39. default : state <= 2'd0;
    40. endcase
    41. end
    42. end
    43. endmodule

     四、fifo读

    1.  检测到fifo已,
    2. 进入延时状态,延时10拍 原因是FIFO IP核内部状态信号的更新存在延时 延迟10拍以等待状态信号更新完毕    
    3. 拉高读使能
    4. 检测到fifo被读空,则停止读取,并等待fifo被写满(回到第一步)
    1. always @(posedge sys_clk or negedge sys_rst_n) begin
    2. if(!sys_rst_n) begin
    3. fifo_rd_en <= 1'b0;
    4. state <= 2'd0;
    5. dly_cnt <= 4'd0;
    6. data_fifo_en<= 1'b0;
    7. end
    8. else begin
    9. data_fifo_en<=1'b0;
    10. case(state)
    11. 2'd0: begin
    12. if(full) //如果检测到FIFO将被写满
    13. state <= 2'd1; //就进入延时状态
    14. else
    15. state <= state;
    16. end
    17. 2'd1: begin
    18. if(dly_cnt == 4'd10) begin //延时10拍, 原因是FIFO IP核内部状态信号的更新存在延时, 延迟10拍以等待状态信号更新完毕
    19. dly_cnt <= 4'd0;
    20. state <= 2'd2; //开始读操作
    21. end
    22. else
    23. dly_cnt <= dly_cnt + 4'd1;
    24. end
    25. 2'd2: begin
    26. data_fifo_en<=1'b0;
    27. if(empty) begin //等待FIFO将被读空
    28. fifo_rd_en <= 1'b0; //关闭读使能
    29. state <= 2'd0; //回到第一个状态
    30. end
    31. else begin //如果FIFO没有被读空
    32. fifo_rd_en <= 1'b1; //则持续打开读使能
    33. data_fifo_en<=1'b1;
    34. end
    35. end
    36. default : state <= 2'd0;
    37. endcase
    38. end
    39. end

  • 相关阅读:
    3.javase_运算符
    多目标蜉蝣优化算法(MOMA)附Matlab代码
    MOOS程序解析记录(7)pMarinePID解析
    Python 输入函数 input函数,map函数
    《已解决 Bug TypeError: Cannot read property ‘props‘ of undefined (React)》
    如何创建Maven项目
    C标准文档
    JeecgBoot 3.3.0 版本发布,基于代码生成器的企业级低代码平台
    PT_正态总体的抽样分布
    密码学基础 -- ECC
  • 原文地址:https://blog.csdn.net/qq_34301282/article/details/125635717