lcytms
发表于 2016-11-22 17:39:40
继续完成fifo_read控制模块。
编写fifo_read控制模块代码如下。
module fifo_read (clk, rst_n, rdfull, rdempty, rdreq);
input clk, rst_n;
input rdfull, rdempty;
output reg rdreq;
reg state;
always @ (posedge clk or negedge rst_n)
begin
if (!rst_n)
begin
rdreq <= 0;
state <= 0;
end
else
begin
case (state)
0 : begin
if (rdfull)
begin
rdreq <= 1;
state <= 1;
end
else
begin
state <= 0;
end
end
1 : begin
if (rdempty)
begin
rdreq <= 0;
state <= 0;
end
else
begin
rdreq <= 1;
state <= 1;
end
end
default : state <= 0;
endcase
end
end
endmodule
lcytms
发表于 2016-11-22 17:41:03
新建仿真模块Testbench。
新建fifo_tb.v模块,编写代码如下。
`timescale 1ns/1ps
module fifo_tb;
reg clk, rst_n;
wire q;
fifo dut (.clk(clk), .rst_n(rst_n), .q(q));
initial
begin
clk = 1;
rst_n = 0;
#200.1
rst_n = 1;
#20_000 $stop;
end
always #10 clk = ~clk;
endmodule
lcytms
发表于 2016-11-22 17:41:33
仿真运行结果
设置好仿真之后,可以看到仿真结果。
可以看到复位完成后,data依次写入0~255,然后q依次读出0~255,依次循环。
lcytms
发表于 2016-11-22 17:42:33
观察FIFO为读空(rdempty)的状态。
FIFO在复位完成后或者读出255后,rdempty为高,然后rdreq置0。随后wrempty变高(FIFO自身特性),然后wrreq置1,写入一个数据后,wrempty马上变低。
lcytms
发表于 2016-11-22 17:43:32
观察FIFO为写满(wrfull)的状态。
FIFO在写入255时,下一时钟wrfull变高,然后wrreq置0。随后rdfull变高(FIFO自身特性),然后rdreq置1,读出一个数据后,rdfull马上变低。
仿真运行结果表明读出结果与写入数据一致,与设计要求相符。
lcytms
发表于 2016-11-22 17:45:27
查看RTL视图——dcfifo
lcytms
发表于 2016-11-22 17:45:54
好了,今天的课程就讲到这里。
通过今天的课程,我们学习了FIFO(先进先出存储器)的基本概念,然后实际演示了一下应用FIFO的IP核来进行FIFO逻辑电路的建模与仿真,并通过仿真查看效果。
希望大家掌握FIFO的基本概念,并熟练运用Verilog语言调用对应的IP核编写相关逻辑。
更复杂的知识和技巧我们将逐步通过后面的课程展现给大家。
课程到此结束,谢谢大家的关注!
芙蓉王
发表于 2016-11-23 14:41:54
牛:):):)
zxopen08
发表于 2016-12-3 17:11:02
FPGA初级课程第十八讲 FIFO
Esmiamor
发表于 2016-12-27 17:39:21
感谢分享。