FPGA|CPLD|ASICwilliam hill官网
直播中

h1654155132.8813

12年用户 52经验值
擅长:可编程逻辑 控制/MCU
私信 关注
[经验]

【EG4S20-MINI-DEV 试用体验】安路FPGA EG4S20试用4:FIFO的测试与使用,并用chipwatch来观察

  这一次对安路FPGA片上FIFO进行测试使用,首先列化FIFO,如下图所示:
捕获1.JPG
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的基本一样)
2.JPG
      3.保存文件,并将该文件添加到工程中,并重新编译综合。
     抓出来的波形如下图所示:
3.JPG
     最后,在测试过程中发现这个FIFO IP存在点问题,就是full信号一直拉高,这个现象不应该出现的。
而且需要在parameter max=20;parameter max2=20;的情况下,整个程序才能正常工作,在parameter max=6;parameter max2=6;的情况下,程序不能正常工作,感觉FIFO存在严重BUG。而且使用modelsim仿真时,FIFO IP核输出的管脚,输出一直为高阻态,无法仿真。
    上传我的工程:
FIFO_test.zip (5.27 MB)
(下载次数: 14, 2019-6-14 20:38 上传)



回帖(2)

田建祥

2019-6-19 10:33:12
受到警告
提示: 作者被禁止或删除 内容自动屏蔽
1 举报

lgchen

2019-7-2 23:31:17
同学,不是IP有严重问题,是你的代码有严重问题, max2=6的时候,判断条件不能满足。
parameter max2=20;
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;
举报

更多回帖

发帖
×
20
完善资料,
赚取积分