FIFO读写

在Vivado 2018.3 环境运行FIFO Generator IP**(该IP核是高电平复位,在写测试文件的时候请注意)**
FIFO读写_第1张图片
该模块的接口示意图,rst为高电平复位。

IP配置

接口类型Native
FIFO读写_第2张图片
读模式,First Word Fall Through,类似于altera的show-ahead模式,如果使用标准模式,在没有写入时,总线上的数据应该是默认值,使用该模式时,在为进行读操作时,总线上的数值为第一个数值。
数据接口是PCI,所以选择的写入宽度为32位,读位宽设置的是16位。
FIFO读写_第3张图片

FIFO读写_第4张图片

FIFO读写_第5张图片

FIFO读写_第6张图片

FIFO读写_第7张图片

module fifo_test(data_in, data_out, clk ,rst_n);

    input [31:0]data_in;
    input clk;
    input rst_n;
    
    output [15:0]data_out;
    
    reg fifo_rd_en;
    reg fifo_wr_en;
    wire fifo_wr_ack;
    wire fifo_rd_vaild;
    
    wire full;
    wire empty;
    wire almost_full;
    wire almost_empty;
    wire [10:0]wr_data_count;
    wire [11:0]rd_data_count;
    
	
	
    always@(*)begin
        if(almost_empty)begin
            fifo_rd_en = 1'b0;
        end
        else if(wr_data_count<10)begin
            fifo_rd_en = 1'b0;
        end
        else begin
            fifo_rd_en = 1'b1;
        end
    end
    
    always@(*)begin
        if(almost_full)begin
            fifo_wr_en = 1'b0;
        end
        else if(wr_data_count>800)begin
            fifo_wr_en = 1'b0;
        end
        else begin
            fifo_wr_en = 1'b1;
        end
    end
    
    
    /*always@(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            fifo_wr_en <= 1'b0;
        end
        else if(almost_full)begin
            fifo_wr_en <= 1'b0;
        end
        else if(wr_data_count>1000)begin
            fifo_wr_en <= 1'b0;
        end
        else begin
            fifo_wr_en <= 1'b1;
        end
    end
    
    always@(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            fifo_rd_en <= 1'b0;
        end
        else if(almost_empty)begin
            fifo_rd_en <= 1'b0;
        end
        else if(rd_data_count<10)begin
            fifo_rd_en <= 1'b0;
        end
        else begin
            fifo_rd_en <= 1'b1;
        end
    end
    */
        
    fifo_generator_0 m3 (
        .clk(clk) ,
        .srst(rst_n) ,
        .din(data_in) ,
        .wr_en(fifo_wr_en) ,
        .rd_en(fifo_rd_en) ,
        .dout(data_out) ,
        .full(full) ,
        .wr_ack(fifo_wr_ack),
        .almost_full(almost_full),
        .empty(empty) ,
        .valid(fifo_rd_vaild),
        .almost_empty(almost_empty),
        .rd_data_count(rd_data_count) ,
        .wr_data_count(wr_data_count) 
      );
endmodule

module fifo_test_tb;

      reg [31:0]data_in;
      reg  clk;
      reg  rst_n;
      wire [15:0]data_out;
      
      fifo_test ts  (
        .data_in(data_in), 
        .data_out(data_out), 
        .clk(clk),
        .rst_n(rst_n)
        );
        
      initial clk = 1;
      always#50 clk = ~ clk;
      
      initial begin
      rst_n = 1'b1;
      data_in = 32'b1;
      #100;
      rst_n = 1'b0;
      repeat(10)begin
      #10;
      data_in = {$random};
      end
      #3000;
      $stop;
      end
        
endmodule

你可能感兴趣的:(FPGA,FIFO)