FIFO宽度为8bit,深度为512,
测试代码如下:
module ip_fifo_test(clk,rst_n,dout);
input clk;
input rst_n;
output [7:0]dout;
wire clk50m;
wire clk100m;
wire clk75m;
/*
mypll i1(.refclk(clk),
.clk0_out(clk50m),
.clk1_out(clk100m),
.clk2_out(clk75m)
);
*/
assign clk50m=clk;
wire fifofull;// synthesis keep
//wire alfifofull;// synthesis keep
reg [7:0]fifodin;
reg fifowr;
wire [7:0]fifodout;
reg fifore;
wire fifoempty;
myfifo i2(
.rst(!rst_n),
.di(fifodin), .clkw(clk), .we(fifowr),
.do(dout), .clkr(clk50m), .re(fifore),
.empty_flag(fifofull),
.full_flag(fifoempty)
//.afull_flag(alfifofull)
);
parameter max=12;
reg [max:0]cnt;
always@(posedge clk or negedge rst_n)//write logic
if(!rst_n)
cnt<=1'd0;
else
cnt<=cnt+1'b1;
always@(posedge clk or negedge rst_n)//write logic
if(!rst_n)
begin
fifowr<=1'd0;
fifodin<=8'd0;
end
//else if(cnt==7'd8 && (fifofull==1'b0))
else if(cnt==7'd8)
begin
fifowr<=1'd1;
fifodin<=fifodin+1'b1;
end
else
begin
fifowr<=1'd0;
fifodin<=fifodin;
end
parameter max2=12;
reg [max2:0]cnt2;
always@(posedge clk50m or negedge rst_n)//read logic
if(!rst_n)
cnt2<=1'd0;
else
cnt2<=cnt2+1'b1;
always@(posedge clk50m or negedge rst_n)//read logic
if(!rst_n)
begin
fifore<=1'b0;
end
else if((cnt2==12'd100) && (fifoempty==1'b0))
begin
fifore<=1'b1;
end
else
fifore<=1'b0;
endmodule
代码的思路是:利用计数器cnt1周期性地往FIFO中写入数据,利用计数器cnt2周期性地重FIFO中读取数据,并将读出的数据直接输出到LED等。实验测试结果显示,led灯不断地加一计数。
Chipwatch功能类似于Altea的 FPGA的sigal tap的功能,用于抓取FPGA内部的一些信号;
1.首先需要新建文件.cwc : Tools-->Debug Tools--->chipwatcher.
2.选择采样时钟,设置采样深度,并在‘Setup’中添加需要采集的信号,如下图所示:(操作过程和Altera的基本一样)
3.保存文件,并将该文件添加到工程中,并重新编译综合。
抓出来的波形如下图所示:
最后,在测试过程中发现这个FIFO IP存在点问题,就是full信号一直拉高,这个现象不应该出现的。
而且需要在parameter max=20;parameter max2=20;的情况下,整个程序才能正常工作,在parameter max=6;parameter max2=6;的情况下,程序不能正常工作,感觉FIFO存在严重BUG。而且使用modelsim
仿真时,FIFO IP核输出的管脚,输出一直为高阻态,无法仿真。
上传我的工程: