在Vivado中配置FIFO-IP核

文章目录


一、FIFO是啥??

  • FIFO本质上还是RAM,可读可写,只不过是先写先读,核、就像数据结构里面的队列。
  • 其主要在多比特做跨时钟域处理、前后带宽不同步等情况下使用
  • 根据时钟可分为同步FIFO和异步FIFO

二、同步FIFO-IP核的配置和验证

在vivado的ip-catalog中找到FIFO0-IP核
在Vivado中配置FIFO-IP核选择同步时钟FIFO
在Vivado中配置FIFO-IP核
在Vivado中配置FIFO-IP核
在Vivado中配置FIFO-IP核
在Vivado中配置FIFO-IP核


三、使用

1.实例化FIFO

module fifo(
	input	wire				sys_clk		,
	input	wire				sys_rst_n	,
	input	wire	[7:0]		din			,
	input	wire				wr_en		,
	input	wire				rd_en		,
	
	output	wire	[7:0]		dout		,
	output	wire				full		,
	output	wire				empty		,
	output	wire	[7:0]		data_count
    );
    
    scfifo_8x256 scfifo_8_256_inst (
			  .clk			(sys_clk),      // input wire 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
			  .empty		(empty),  		// output wire empty
			  .data_count	(data_count)  	// output wire [7 : 0] data_count
		);
		
endmodule

2.仿真验证


module sim_fifo( );

	reg					sys_clk		;
	reg					sys_rst_n	;
	reg		[7:0]		din			;
	reg					wr_en		;
	reg					rd_en		;
	
	wire	[7:0]		dout		;
	wire				full		;
	wire				empty		;
	wire	[7:0]		data_count	;
	
	
	reg		[1:0]		cnt			;	// 计数器时间间隔


	fifo fifo_inst (
			.sys_clk	(sys_clk),
			.sys_rst_n	(sys_rst_n),
			.din		(din),
			.wr_en		(wr_en),
			.rd_en		(rd_en),
			
			.dout		(dout),
			.full		(full),
			.empty		(empty),
			.data_count	(data_count)
			
		);
	
	// 50MHz
	parameter	clk_period_50M	=	20;
	always # (clk_period_50M / 2)	sys_clk	=	~sys_clk;
	
	initial	begin
		sys_clk		=	0;
		sys_rst_n	=	0;
		#20
		sys_rst_n	=	1;
		
	end
	
	// cnt:计数器变量的赋值
	always @ (posedge sys_clk or negedge sys_rst_n)
		if (!sys_rst_n)
			cnt	<=	2'd0;
		else	if (cnt == 2'd3)
			cnt	<=	2'd0;
		else
			cnt	<=	cnt + 1'b1;
	
	// wr_en:写请求信号的赋值
	always @ (posedge sys_clk or negedge sys_rst_n)
		if (!sys_rst_n)
			wr_en	<=	1'b1;
		else	if ((cnt == 2'd0) && (rd_en == 1'b0))
			wr_en	<=	1'b1;
		else
			wr_en	<=	1'b0;
	
	// din:写数据
	always @ (posedge sys_clk or negedge sys_rst_n)
		if (!sys_rst_n)
			din	<=	8'd0;
		else if ((din == 8'd255) && (wr_en == 1'b1))
			din	<=	8'd0;
		else	if (wr_en == 1'b1)
			din	<=	din + 1'b1;
		else
			din	<=	din;
	
	// rd_en:读请求信号的赋值
	always @ (posedge sys_clk or negedge sys_rst_n)
		if (!sys_rst_n)
			rd_en	<=	1'b0;
		else	if (full == 1'b1)		// FIFO写满后开始读取
			rd_en	<=	1'b1;
		else	if (empty == 1'b1)		// FIFO取空后停止读
			rd_en	<=	1'b0;
				
endmodule

写满之后开始读
在Vivado中配置FIFO-IP核
读空之后开始写
在Vivado中配置FIFO-IP核

上一篇:匹配滤波器


下一篇:Vivado(2017.1)中 BRAM IP核的配置与使用