淘先锋技术网

首页 1 2 3 4 5 6 7

Vivado中异步FIFO的实现和使用

FIFO应用:
  • 1、在千兆以太网数据写入,往DDR3里面写数据时候
  • 2、AD采样时钟和内部时钟不同时,需要FIFO进行转换
  • 3、同频异相时也需要用FIFO进行转换

Vivado中FIFO generator的配置方法

1、


2、 standard FIFO read mode读取时会延迟一个周期时钟,first word fall through read mode 读取时没有延时时钟周期,给使能就有数据,read latency=0。

3、


read data count表示fifo中有多少个数据了。


异步FIFO实现


具体实现代码:


    
  1. `timescale ns / ps
  2. //
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 2016/08/10 14:42:33
  7. // Design Name:
  8. // Module Name: fifo_timing
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //
  21. module fifo_timing(
  22. input wire sclk,
  23. input wire rst_n,
  24. input wire r_clk,
  25. input wire data_v,
  26. input wire [ : ] data_in,
  27. output wire data_ov,
  28. output wire [ : ] data_out,
  29. output wire fifo_w_clk,
  30. output wire fifo_r_clk,
  31. output wire fifo_w_en,
  32. output wire [ : ] fifo_w_data,
  33. input wire fifo_full,
  34. output wire fifo_r_en,
  35. input wire [ : ] fifo_r_data,
  36. input wire fifo_empty,
  37. input wire [ : ] fifo_rd_count
  38. );
  39. wire full;
  40. wire empty;
  41. // r_clk
  42. reg r_flag;
  43. wire [ : ] rd_data_count;
  44. reg [ : ] r_cnt;
  45. wire rd_en;
  46. assign fifo_w_clk = sclk;
  47. assign fifo_r_clk = r_clk;
  48. assign fifo_w_en = data_v & (~fifo_full);
  49. assign fifo_w_data = data_in;
  50. assign fifo_r_en = r_flag & (~fifo_empty);
  51. assign data_out = fifo_r_data;
  52. assign data_ov = r_flag;
  53. assign rd_en = r_flag;
  54. always @(posedge r_clk or negedge rst_n)
  55. if(rst_n == 'b0)
  56. r_flag <= 1'b0;
  57. else if(r_flag == 'b1 && r_cnt == 'd255 )
  58. r_flag <= 'b0;
  59. else if(fifo_rd_count >= 'd255 && r_flag == 'b0)
  60. r_flag <= 1'b1;
  61. always @(posedge r_clk or negedge rst_n)
  62. if(rst_n == 'b0)
  63. r_cnt <='d0;
  64. else if(r_flag == 'b1)
  65. r_cnt <= r_cnt + 1'b1;
  66. else
  67. r_cnt <= 'd0;
  68. assign data_ov = r_flag;
  69. endmodule