【FIFO】Standard / FWFT FIFO设计实现(一)——同步时钟

在这里插入图片描述

标准FIFO

  本文使用位扩展的方式实现标准FIFO,原理可参考【AXIS】AXI-Stream FIFO设计实现(一)——基本模式,核心代码如下:


    logic [FIFO_DEPTH_WIDTH : 0] rd_ptr_r = 'd0, wr_ptr_r = 'd0;
    
    always_ff @(posedge clk) begin
        if (wr_en & ~wfull) begin
            wr_ptr_r <= wr_ptr_r + 1;
        end
    end 
    
    always_ff @(posedge clk) begin
        if (rd_en & ~rempty) begin
            rd_ptr_r <= rd_ptr_r + 1;
        end
    end
    
    assign wfull = (wr_ptr_r[FIFO_DEPTH_WIDTH] != rd_ptr_r[FIFO_DEPTH_WIDTH]) && (wr_ptr_r[FIFO_DEPTH_WIDTH - 1 : 0] == rd_ptr_r[FIFO_DEPTH_WIDTH - 1 : 0]);
    assign rempty = rd_ptr_r == wr_ptr_r;

    logic [TDATA_WIDTH - 1 : 0] ram[FIFO_DEPTH - 1 : 0];

    always @(posedge clk) begin
        if (wr_en & ~wfull) begin
            ram[wr_ptr_r[FIFO_DEPTH_WIDTH - 1 : 0]] <= m_axis_tdata;
        end
    end
        
    always @(posedge clk) begin
        if (rd_en & ~rempty) begin
            s_axis_tdata <= ram[rd_ptr_r[FIFO_DEPTH_WIDTH - 1 : 0]];
        end
    end
    

在这里插入图片描述

FWFT FIFO简单实现

  基于标准FIFO,引入FWFT机制。一种简单做法即将ram输出改为组合逻辑输出,这种方式实现的FWFT延时最低。

    always_comb begin
        // if (rd_en & ~rempty) begin
            s_axis_tdata = ram[rd_ptr_r[FIFO_DEPTH_WIDTH - 1 : 0]];
        // end
    end

图片

FWFT FIFO优化

  然而,在FPGA中所有存储资源如(BRAM、URAM)均具有一个周期的读延时,在构造大容量fifo时,为了让综合工具将FIFO存储RAM综合为BRAM / URAM,更合适的做法为添加寄存器slice,这种方式会增加1个周期的延迟:

        initial rempty = 1'b1;
        
        assign wfull = sfifo_wfull;
        
        always_ff @(posedge clk) begin
            if (~sfifo_rempty & (rempty | rd_en)) begin
                s_axis_tdata <= ram[rd_ptr_r[FIFO_DEPTH_WIDTH - 1 : 0]];
            end
        end
        
        assign sfifo_rd_en = (rempty | rd_en);
        
        always @(posedge clk) begin
            if (~sfifo_rempty) begin
                rempty <= 1'b0;
            end else if (rd_en) begin
                rempty <= 1'b1;
            end
        end     

图片

完整代码

  完整工程代码可在同名微信公众号回复SYNC_FIFOs下载。

  • 14
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wjh776a68

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值