Vivado中异步FIFO的实现和使用

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 1ns / 1ps
  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 [ 7: 0] data_in,
  27. output wire data_ov,
  28. output wire [ 15: 0] data_out,
  29. output wire fifo_w_clk,
  30. output wire fifo_r_clk,
  31. output wire fifo_w_en,
  32. output wire [ 7: 0] fifo_w_data,
  33. input wire fifo_full,
  34. output wire fifo_r_en,
  35. input wire [ 15: 0] fifo_r_data,
  36. input wire fifo_empty,
  37. input wire [ 8: 0] fifo_rd_count
  38. );
  39. wire full;
  40. wire empty;
  41. // r_clk
  42. reg r_flag;
  43. wire [ 8: 0] rd_data_count;
  44. reg [ 8: 0] 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 == 1 'b0)
  56. r_flag <= 1'b0;
  57. else if(r_flag == 1 'b1 && r_cnt == 'd255 )
  58. r_flag <= 1 'b0;
  59. else if(fifo_rd_count >= 'd255 && r_flag == 1 'b0)
  60. r_flag <= 1'b1;
  61. always @(posedge r_clk or negedge rst_n)
  62. if(rst_n == 1 'b0)
  63. r_cnt <='d0;
  64. else if(r_flag == 1 'b1)
  65. r_cnt <= r_cnt + 1'b1;
  66. else
  67. r_cnt <= 'd0;
  68. assign data_ov = r_flag;
  69. endmodule


### 回答1: Vivado异步FIFO IP核是一种用于实现异步FIFO的IP核。它可以用于在FPGA实现异步数据传输,具有高性能和低延迟的特点。使用该IP核可以简化设计流程,提高设计效率。在使用时需要注意时序和数据宽度等参数的设置,以确保正确的数据传输。 ### 回答2: 异步 FIFO IP核是 Vivado 一种重要的IP核,它主要用于在异步信号传输过程,控制 FIFO 内部的信号数据同步,并且能够实现在不同的主机之间相互传输数据。在Vivado使用异步 FIFO IP核需要以下步骤。 第一步,IP核生成。 在 Vivado 环境,我们需要先生成异步 FIFO IP核。这里我们可以使用 Vivado 的 IP核生成器来创建异步 FIFO IP核,或者使用 Xilinx 官方提供的异步 FIFO IP核代码进行建立。建议您通过IP核生成器来生成IP核,便于参数设置。 第二步,IP核配置。 生成 IP核以后,需要对其进行配置。我们需要确定 FIFO 的类型以及需要的缓存空间,选择下边附带的管脚,并对 FIFO 深度、读写数据宽度等参数进行设置,并且可以对IP核进行一定的自定义设计。 第三步,连接到设计文件。 生成和配置 IP 核之后,需要将其连接到设计文件,这可以通过运行自动链接引擎或手动将 IP 核与其他 VHDL、Verilog 或其他语言的文件连接来实现。 第四步,对IP核进行仿真和调试。 完成 IP 核的创建和配置后,可以对其进行仿真和调试。 能够以 RTL 级仿真或者通过硬件一体化的方案来完成仿真调试。 总结:异步 FIFO IP核是 Vivado 一种非常重要的 IP核,可以方便地实现异步信号传输和数据缓存的功能。它需要通过 IP核生成器来进行生成,然后在 Vivado 配置其参数,接着连接到设计文件,最后就可以对其进行仿真和调试。同时在使用异步 FIFO IP核时,应当注意管脚的连接和参数的设置,以避免出现不必要的错误。 ### 回答3: Vivado异步FIFO IP核是一种常用的IP核,能够应用于FPGA或者SoC系统设计实现高效的异步数据传输。异步FIFO IP核能够自动生成FIFO的逻辑结构,包括写指针、读指针、计数器等。FIFO的深度、宽度、信号级别和占空比等参数都可以通过IP核的配置界面进行设置。 在使用异步FIFO IP核时,需要按照以下步骤进行设计: 第一步:在Vivado的IP核仓库选择异步FIFO IP核,并添加到IP库。 第二步:在IP核配置界面设置FIFO的参数。包括深度、宽度、输入和输出信号的名称及宽度、写使能信号的名称及宽度、读使能信号的名称及宽度等。其,深度可以按照实际需求设置,但是要考虑到FIFO的面积和时序等因素。输入和输出信号的名称和宽度要与设计的信号名称和宽度一致,以便于后续的连接和使用。 第三步:在FIFO的读写逻辑添加时钟域异步互锁逻辑。这是为了解决异步读写数据的时序问题。在写数据时需要将数据写入FIFO,并更新写指针;而在读数据时需要将数据读出FIFO,并更新读指针。为了避免读指针和写指针同时更新导致读写冲突,需要在时钟域异步互锁逻辑进行控制。 第四步:将FIFO的读写逻辑和时钟域异步互锁逻辑分别与相应的时钟域和复位信号进行连接。这是为了保证FIFO的时序正确性和复位可靠性。 第五步:最后,将FIFO的输入和输出信号与外部模块进行连接,并进行必要的校验和测试。 总之,使用Vivado异步FIFO IP核可以快速实现异步数据传输的设计,同时能够保证时序正确性和复位可靠性,提高设计的可靠性和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值