Xlinx的 FIFO IP核

近来在学习Xlinx的FIFO IP核,根据自己学习中遇到的一些问题以及解决的办法总结了自己学到的一些知识,作为自己的学习笔记,当然也作为一些初学者查阅的笔记。
FIFO无非就是一个输入输出的中间存储,一般用于不同时钟域之间的数据传输,下面主要介绍一下他的各个参数的作用以及设置。
prog_full:写FIFO将要满的时候,这个数值与你设置的数据相关,达到你设置的数据和以上时,此信号就会被拉高;
prog_empty:读FIFO将要空的时候,这个数值与你设置的数据相关,达到你设置的数据和以下时,此信号就会被拉高;
这两个信号是在status flag – programmable flag里面设置,如下图:
在这里插入图片描述
Rst:复位信号
wr_clk:写时钟
rd_clk:读时钟
在这里插入图片描述
din:输入的数据
wr_en:写使能
rd_en:读使能
dout:输出的数据
full:写入全满时的信号;
wr_rst_busy:写准备完成的标志,准备完成才能开写,也就是位0才能写入;
rd_rst_busy:读准备完成的标志,准备完成才能开读,也就是位0才能读取;
在这里插入图片描述
almost_full:写入全满前一个的信号,高有效,如果为高电平,在写一个数据FIFO将全满;
almost_empty:读出全空前一个的信号,高有效,如果为高电平,在读一个数据FIFO将全空;
wr_ack:写确认,表示前一个的写请求得到处理成功;
overflow:上溢标志,可选,表示前一个写的请求没有完成,因为已经写满,在写完之后会出现;
valid:有效的,可选,表示在输出总线DOUT上面有可用的数据;
underflow:下溢标志,可选,表示前一个读的请求没有完成,因为已经读空,在读完之后会出现;
在这里插入图片描述empty:FIFO全空时的信号;
rd_data_count:计数器,表示FIFO里面有多少数据可以读;
wr_data_count:计数器,表示FIFO里面已经写多少数据;
在这里插入图片描述
测试代码tb如下:

`timescale 1ns / 1ns
`define WR_CLK_PERIOD 10
`define RD_CLK_PERIOD 30

module dcfifo_tb();
	reg rst;
	reg wr_clk;
	reg rd_clk;
	reg [7:0]din;
	reg wr_en;
	reg rd_en;  
	wire [7:0]dout;
	wire full;
	wire almost_full;
	wire wr_ack;
	wire overflow;
	wire empty;
	wire almost_empty;
	wire valid;
	wire underflow;
	wire [7:0]rd_data_count;
	wire [7:0]wr_data_count;
	wire  wr_rst_busy;
	wire  rd_rst_busy;
	wire prog_full;        // output wire prog_full
    wire prog_empty;        // output wire prog_empty
  
	initial wr_clk = 1;
	always #(`WR_CLK_PERIOD/2) wr_clk = ~wr_clk;

	initial rd_clk = 1;
	always #(`RD_CLK_PERIOD/2) rd_clk = ~rd_clk;
  
	initial begin
		rst   = 1'b1;
		wr_en = 1'b0;
		rd_en = 1'b0;
		din   = 8'hff;
		#(`WR_CLK_PERIOD*8+1);
		rst = 1'b0;
    
		@(negedge wr_rst_busy);    
    //write data
		while(full == 1'b0)
		begin
		@(posedge wr_clk);
			#1;      
			wr_en = 1'b1;
			din   = din + 1'b1;
		end
    
    //多写一个数据,看overflow的变化
		din = 8'hff;
		@(posedge wr_clk);
		wr_en = 1'b0;

		wait(rd_rst_busy == 1'b0);
		#2000;
    
		while(empty == 1'b0)
		begin      
		@(posedge rd_clk);
			#1;
			rd_en = 1'b1;
		end
    //多给一个读使能,看underflow的变化
		@(posedge rd_clk);
		rd_en = 1'b0; 
    
    
		#200;
		rst   = 1'b1;
		#(`WR_CLK_PERIOD*3+1);
		rst = 1'b0;
		@(negedge wr_rst_busy);
		wait(rd_rst_busy == 1'b0);
		
		#2000;
		$stop;	
		end

	fifo_generator_0 dcfifo_inst (
		.rst(rst), // input wire rst
		.wr_clk(wr_clk), // input wire wr_clk
		.rd_clk(rd_clk), // input wire rd_clk
		.din(din), // input wire [7 : 0] din
		.wr_en(wr_en), // input wire wr_en
		.rd_en(rd_en), // input wire rd_en
		.dout(dout), // output wire [7 : 0] dout
		.full(full), // output wire full
		.almost_full(almost_full), // output wire almost_full
		.wr_ack(wr_ack), // output wire wr_ack
		.overflow(overflow), // output wire overflow
		.empty(empty), // output wire empty
		.almost_empty(almost_empty), // output wire almost_empty
		.valid(valid), // output wire valid
		.underflow(underflow), // output wire underflow
		.rd_data_count(rd_data_count), // output wire [7 : 0] rd_data_count
		.wr_data_count(wr_data_count), // output wire [7 : 0] wr_data_count
		.wr_rst_busy(wr_rst_busy), // output wire wr_rst_busy
		.rd_rst_busy(rd_rst_busy),  // output wire rd_rst_busy
		.prog_full(prog_full),         // output wire prog_full
        .prog_empty(prog_empty)        // output wire prog_empty
   
	);

endmodule

时序的分析我就不分析了,大家可以结合test_bench波形自己分析:
整体波形如下:
在这里插入图片描述
写入的波形放大:
在这里插入图片描述
读出的波形放大:
在这里插入图片描述

  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vivado FIFO IP核用于在Xilinx Vivado软件中实现FIFO(First-In-First-Out)功能。它是一种用于数据缓存和传输的IP核,可以用于解决数据读写速度不匹配的问题。使用Vivado FIFO IP核能够简化用户对FIFO的配置和设计过程。 Vivado提供了多种方式来使用FIFO IP核。第一种方式是用户根据需求自己编写FIFO逻辑,这种方式适用于用户对FIFO功能有特殊需求时。第二种方式是使用第三方提供的开源IP核,用户可以在此基础上进行修改以满足自己的系统需求。第三种方式是使用Vivado软件提供的免费FIFO IP核,它提供了友好的图形化界面,方便用户对FIFO的各种参数和结构进行配置,并且可以实现针对Xilinx不同系列器件的结构优化。建议在系统设计中使用该FIFO IP核,因为它已经提供了大部分设计所需的所有功能。 需要注意的是,在使用Vivado的FIFO Generator IP核时,输入的读写时钟频率不能超过500MHz。用户可以根据自己的实际需求选择合适的时钟频率进行配置。 关于Vivado FIFO IP核的具体系统应用,请参考文献和中的内容。文献介绍了使用Vivado软件配置FIFO IP核的三种方式,而文献则提供了创建空白工程和查找FIFO Generator IP核的步骤。 请注意,由于限制回答长度,我无法提供详细的每一步操作。但你可以参考Vivado软件的相关文档和教程来了解如何使用Vivado FIFO IP核进行系统应用。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值