FIFO控制写入依次递增的数据并读出

FIFO写入依次递增的数据并读出(先入先出)

ctrl_fifo

module crtl_fifo(  
input wire clk,
input wire rst_n
    );
reg wr_en,rd_en,rd_start;
wire full,empty;
reg [8:0]wr_cnt,rd_cnt;
reg [7:0]wr_data;
wire [7:0] dout;
reg [1:0]empty_dly;

fifo_generator_1 inst_fifo
     (
      .wr_clk (clk),
      .rd_clk(clk),
       .din( wr_data ),
       . wr_en (wr_en),
       . rd_en ( rd_en),
       .dout(dout),
        .full(full),
        .empty(empty)
      );
//写使能 
always @(posedge clk or negedge rst_n) begin
          if (rst_n == 1'b0) begin
              wr_en <= 1'b0;
          end
          else if (wr_cnt== 'd0) begin
              wr_en <= 1'b1;
          end
          else if (wr_cnt== 'd258) begin
                     wr_en <= 1'b0;
           end
      end
//wr_cnt控制wr_en的宽度
always @(posedge clk or negedge rst_n) begin
          if (rst_n == 1'b0)  begin
               wr_cnt <= 1'b0;
             end
            else if (wr_cnt!='d258) begin
              wr_cnt <=  wr_cnt+1;
              end
          end
//wr_data写入的数据    
always @(posedge clk or negedge rst_n) begin
          if (rst_n == 1'b0) begin
               wr_data <= 1'b0;
             end
            else if (wr_en==1) begin
              wr_data  <= wr_data +1;
              end
          end    
//empty_dly寻找empty的下降沿,xilinx的移位寄存器不能有复位    
always @(posedge clk)
 begin
  empty_dly<={empty_dly[0],empty};
  end
//rd_start,读标志位
always @(posedge clk or negedge rst_n) begin
          if (rst_n == 1'b0) begin
               rd_start <= 1'b0;
             end
            else if (empty_dly==2'b10) begin
              rd_start <= 'b1;
              end
             else rd_start <= 1'b0;
          end    
//rd_en读使能
always @(posedge clk or negedge rst_n) begin
          if (rst_n == 1'b0) begin
              rd_en <= 1'b0;
          end
          else if (rd_start== 'b1) begin
              rd_en <= 1'b1;
              end
          else if (rd_cnt=='d257)
              rd_en <= 1'b0;
      end
//rd_cnt控制rd_en的宽度
always @(posedge clk or negedge rst_n) begin
          if (rst_n == 1'b0) begin
               rd_cnt <= 1'b0;
             end
            else if (rd_en==1) begin
              rd_cnt <=  rd_cnt+1;
              end
          end
endmodule

请添加图片描述

请添加图片描述

Standard 模式:读出的数据比读使能慢一个周期
请添加图片描述
请添加图片描述
First-Word Fall-Through 模式:读使能为1就读出数据。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值