小梅哥FPGA:嵌入式块RAM使用之FIFO

小梅哥FPGA:嵌入式块RAM使用之FIFO

课程目标:学会调用QuartusⅡ软件中提供的FIFO核并通过仿真,了解其接口时序
实现现象:通过QuartusⅡ软件中调用FIFO核,通过仿真来验证其接口时序

一 什么是FIFO

First In First Out ,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。

二 FIFO的使用场景

FIFO一般用于输入与输出时钟频率不同的情况,例如打印机,输入的频率假如是100MHZ,输出的频率只有20MHZ,那么必然不可能输入一个输出一个,那么就存入到FIFO中,FIFO作为一个中间寄存器

三 FIFO核的调用(读写同时钟)

调用过程如下:
若没有的过程即为默认next即可
小梅哥FPGA:嵌入式块RAM使用之FIFO_第1张图片
其中wrreq为写入信号,如果wrreq=1,那么将为FIFO中写入data上的数据。
rdreq为读信号,如果rdreq = 1,那么将FIFO中读出一个数据到q端口。
full为满信号,当FIFO中数据写满时,full = 1,empty为空信号,当FIFO中没有数据时,empty = 1。
uwedw表示为当前FIFO中有几个数据
小梅哥FPGA:嵌入式块RAM使用之FIFO_第2张图片
小梅哥FPGA:嵌入式块RAM使用之FIFO_第3张图片
小梅哥FPGA:嵌入式块RAM使用之FIFO_第4张图片
自此之后都按默认next即可,FIFO核即创建成功,此时需将FIFO.v加入到file中且置于顶层

四 testbench的编写(读写同时钟)

以下为我编写的testbench,可自行编写;

`timescale 1ns/1ns
`define clk_period 20

module fifo_tb;
	//端口定义
	reg	  clk;
	reg	[7:0]  data;
	reg	  rdreq;
	reg	  sclr;
	reg	  wrreq;
	wire	  almost_empty;
	wire	  almost_full;
	wire	  empty;
	wire	  full;
	wire	[7:0]  q;
	wire	[7:0]  usedw;
	
	integer i;
	//例化
	fifo fifo(
						.clock(clk),
						.data(data),
						.rdreq(rdreq),
						.sclr(sclr),
						.wrreq(wrreq),
						.almost_empty(almost_empty),
						.almost_full(almost_full),
						.empty(empty),
						.full(full),
						.q(q),
						.usedw(usedw)
	);
	
	
	//initial模块
	initial clk = 1;
	always#(`clk_period/2) clk = ~clk;
	
	initial begin
		data = 0;
		rdreq = 0;
		sclr = 0;
		wrreq = 0;
		#(`clk_period *50+1);
		//写入
		for(i = 0; i < 256 ; i= i+1)begin
			data = i;
			wrreq = 1;
			#`clk_period;
		end
		wrreq = 0;
		#(`clk_period *50);
		//读出
		for(i = 0; i < 256 ; i= i+1)begin
			rdreq = 1;
			#`clk_period;
		end
		#(`clk_period *50);
		$stop;
	end


endmodule

五 仿真结果(读写同时钟)

小梅哥FPGA:嵌入式块RAM使用之FIFO_第5张图片
小梅哥FPGA:嵌入式块RAM使用之FIFO_第6张图片

六 FIFO核的调用(读写不同时钟)

小梅哥FPGA:嵌入式块RAM使用之FIFO_第7张图片
小梅哥FPGA:嵌入式块RAM使用之FIFO_第8张图片

七 testbench编写(读写不同时钟)

`timescale 1ns/1ns
`define wrclk_period 20
`define rdclk_period 10

module mydcfifo_tb;

	reg	[15:0]  data;
	reg	  rdclk;
	reg	  rdreq;
	reg	  wrclk;
	reg	  wrreq;
	wire	[7:0]  q;
	wire	  rdempty;
	wire	[8:0]  rdusedw;
	wire	  wrfull;
	wire	[7:0]  wrusedw;

	integer i;
	mydcfifio mydcfifio(
												.data(data),
												.rdclk(rdclk),
												.rdreq(rdreq),
												.wrclk(wrclk),
												.wrreq(wrreq),
												.q(q),
												.rdempty(rdempty),
												.rdusedw(rdusedw),
												.wrfull(wrfull),
												.wrusedw(wrusedw)
	);
	initial rdclk = 1;
	always#(`rdclk_period/2) rdclk = ~rdclk;
	
	initial wrclk = 1;
	always#(`wrclk_period/2) wrclk = ~wrclk;
	
	initial begin
		data = 0;
		rdreq = 0;
		wrreq = 0;
		#(`rdclk_period *50+1);
		//写入
		for(i = 0; i < 256 ; i= i+1)begin
			data = i+256;
			wrreq = 1;
			#`wrclk_period;
		end
		wrreq = 0;
		#(`rdclk_period *50);
		//读出
		for(i = 0; i < 512 ; i= i+1)begin
			rdreq = 1;
			#`rdclk_period;
		end
		#(`rdclk_period *50);
		$stop;
	end
endmodule

八 仿真结果(读写不同时钟)

小梅哥FPGA:嵌入式块RAM使用之FIFO_第9张图片

你可能感兴趣的:(小梅哥FPGA学习)