年轻人,多睡觉!工作业余之际,复习下曾经学过的。害怕忘记,于是记录下来,也有一段记忆。若有错误,欢迎指正。
altera 板子测试
程序设计
1.首先是一个计数器cnt计数到64。
2.然后在cnt取0-31时,开始写入数据,写入的数据都等于cnt。
3.开始在cnt取32-63时,开始读出数据。
module fifo_test(
clk,
rst_n,
wren,
rden,
wrdata,
rddata,
full_sig,
empty_sig
);
input clk;
input rst_n;
output reg wren;
output reg rden;
output reg [5:0] rddata;
output [5:0] wrdata;//使用wire型,这是自带fifo 的要求
output full_sig;
output empty_sig;
//counter
reg [5:0] cnt;
always@(posedge clk or negedge rst_n)
if(!rst_n)
cnt<=0;
else if(cnt==6'd63)
cnt<=0;
else
cnt<=cnt+1'b1;
// enable write
always@(posedge clk or negedge rst_n)
if(!rst_n)
wren<=0;
else if(cnt>=0&&cnt<=6'd31)
wren<=1'b1;
else
wren<=0;
//enable read
always@(posedge clk or negedge rst_n)
if(!rst_n)
rden<=0;
else if(cnt>=6'd32&&cnt<=6'd63)
rden<=1'b1;
else
rden<=0;
//write the data to the fifo
always@(posedge clk or negegdge rst_n)
if(rst_n)
wrdata<=0;
else if(wren)
wrdata<=cnt;
else
wrdata<=wrdata;
//在quartus 里面调用fifo,自动生成,可以根据需要自己修改
fifo fifo_inst(
.clock(clk),
.data(wrdata),
.rdreq(rden),
.wrreq(wren),
.empty(empty_sig),
.full(full_sig),
.q(rddata)
);
endmodule
最后是仿真文件
`timescale 1ns/1ps
module fifo_test_vlg_tst();
reg clk;
reg rst_n;
wire empty_sig;
wire full_sig;
wire [5:0] rddata;
wire [5:0] wrdata;
wire rden;
wire wren;
fifo_test i1(
.clk(clk),
.empty_sig(empty_sig),
.full_sig(full_sig),
.rddata(rddata),
.rden(rden),
.rst_n(rst_n),
.wrdata(wrdata),
.wren(wren)
);
initial
begin
clk=0;
rst_n=0;
#200
rst_n=1;
end
always
begin
#5 clk=~clk;
end
endmodule
最后利用modesim,可以看到波形
上图开始写的时候。
可以看出cnt是循环计数到63。
empty_sig表示fifo空 开始写的时候,由高拉低。同时wren开始拉高,开始存入wrdata数据0-31。
上图是写的时候。
可以看出在cnt=32时候,
在full_sig 由低拉高,说明fifo已经写满了。
同时rden从低到高。开始读取数据,rddata依次出来的数字,都是之前fifo存入的数字。
由此可见,fifo 先进先出作用。