【AXIS】AXI-Stream FIFO设计实现(四)——异步时钟

news/2024/5/19 20:24:04 标签: fpga开发, Systemverilog, AXI-Stream, fifo, Vivado, AXIS, AXI Stream

  前文介绍了几种同步时钟情况下的AXI Stream FIFO实现方式,一般来说,FIFO也需要承担异步时钟域模块间数据传输的功能,本文介绍异步AXIS FIFO的实现方式。

  如前文所说,AXI-Stream FIFO十分类似于FWFT异步FIFO,推荐参考前文FWFT异步FIFO的实现方式【FIFO】Standard / FWFT FIFO设计实现(二)——异步时钟,也可以参考同步AXIS FIFO的实现方式【AXISAXI-Stream FIFO设计实现(一)——基本模式。

  对于已经实现好的FWFT FIFO,只进行些许调整,将其写FIFO信号wr_en替换为s_axis_tvalid,将FIFO写满信号wfull替换为s_axis_tready,将读FIFO信号rd_en替换为m_axis_tvalid,将FIFO读空信号rempty替换为m_axis_tready。

`timescale 1ns / 1ps

module async_axis_fifo_tb(
    );
    
    localparam TDATA_WIDTH = 4;

    bit m_clk;
    bit s_clk;

    bit   [TDATA_WIDTH - 1 : 0]   m_axis_tdata;
    bit                           m_axis_tvalid; // wr_en
    bit                           m_axis_tready; // ~wfull

    bit   [TDATA_WIDTH - 1 : 0]   s_axis_tdata;  
    bit                           s_axis_tvalid; // ~rempty
    bit                           s_axis_tready;

    always #5 m_clk = ~m_clk;
    always #7 s_clk = ~s_clk;
    
    logic [TDATA_WIDTH - 1 : 0] send_queue[$], recv_queue[$];

    always_ff @(posedge m_clk) begin
        if (~m_axis_tvalid) begin
            `ifdef FLOW
                m_axis_tvalid <= 1;
            `else
                m_axis_tvalid <= $random();
            `endif
            m_axis_tdata <= $random();
        end else if (m_axis_tvalid & m_axis_tready) begin
            `ifdef FLOW
                m_axis_tvalid <= 1;
            `else
                m_axis_tvalid <= $random();
            `endif
            m_axis_tdata <= $random();
        end
    end
    
    initial begin 
        forever begin
            if (m_axis_tvalid & m_axis_tready) begin
                send_queue.push_back(m_axis_tdata);
            end

            @(posedge m_clk);
        end
    end

    initial begin
        forever begin

            if (s_axis_tvalid & s_axis_tready) begin
                recv_queue.push_back(s_axis_tdata);
            end

            if (send_queue.size != 0 && recv_queue.size != 0) begin
                if (send_queue[0] == recv_queue[0]) begin
                    send_queue.pop_front();
                    recv_queue.pop_front();
                end else begin
                    $error();
                    $stop();
                end
            end

            @(posedge s_clk);
        end
    end

    always_ff @(posedge s_clk) begin
        `ifdef FLOW
            s_axis_tready <= 1;
        `else
            s_axis_tready <= $random();
        `endif
    end

    logic wfull, rempty;
    assign m_axis_tready = ~wfull;
    assign s_axis_tvalid = ~rempty;
    async_fifo_huge #(
        .TDATA_WIDTH    (TDATA_WIDTH    ),
         .FIFO_DEPTH     (4) // 2 ** n
    ) async_fifo_huge_inst(
        .m_clk(m_clk),
        .s_clk(s_clk),
    
        .m_axis_tdata(m_axis_tdata),
        .wr_en(m_axis_tvalid), 
        .wfull(wfull),
       
        .s_axis_tdata(s_axis_tdata),  
        .rempty(rempty), 
        .rd_en(s_axis_tready)
    );
endmodule

  下图展示了通过调整利用FWFT FIFO作为AXI Stream FIFO进行数据传输的仿真波形,其中上半部分为FWFT FIFO,下半部分为AXIS Stream输入激励。

图片


http://www.niftyadmin.cn/n/5462067.html

相关文章

ESD保护二极管ESD9B3.3ST5G 以更小的空间实现强大的保护 车规级TVS二极管更给力

什么是汽车级TVS二极管&#xff1f; TVS二极管是一种用于保护电子电路的电子元件。它主要用于电路中的过电压保护&#xff0c;防止电压过高而损坏其他部件。TVS二极管通常被称为“汽车级”是因为它们能够满足汽车电子系统的特殊要求。 在汽车电子系统中&#xff0c;由于车辆启…

通天星CMSV6 车载定位监控平台 任意文件上传漏洞复现(XVE-2023-23454)

0x01 产品简介 通天星CMSV6车载定位监控平台拥有以位置服务、无线3G/4G视频传输、云存储服务为核心的研发团队,专注于为定位、无线视频终端产品提供平台服务,通天星CMSV6产品覆盖车载录像机、单兵录像机、网络监控摄像机、行驶记录仪等产品的视频综合平台。 0x02 漏洞概述 …

【C++庖丁解牛】自平衡二叉搜索树--AVL树

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 前言1 AVL树的概念2. AVL…

5人雨天参会,每人带一把伞,入场时随意挂在架子上,离场时每人随意拿走一把。求:

(1) 每人拿的都不是自己原伞的排列数&#xff1f; (2) 至少一人拿到自己原伞的概率&#xff1f; 解&#xff1a; (1) 5人错位排序 (2) 即全排列数减去5人错排的概率&#xff0c;为&#xff1a; 或从另一个角度考虑&#xff0c;即5人中最多有四人错排&#xff0c; 其概率为 …

【MySQL】4.MySQL日志管理与数据库的备份和恢复

备份的目的只要是为了灾难恢复&#xff0c;备份还可以测试应用&#xff0c;回滚数据&#xff0c;修改和查询历史数据&#xff0c;审计等 日志在备份、恢复中起着重要作用 一、数据库备份的重要性 在生产环境中&#xff0c;数据的安全性至关重要 任何数据丢失都可能产生严重的…

(文章复现)考虑分布式电源不确定性的配电网鲁棒动态重构

参考文献&#xff1a; [1]徐俊俊,吴在军,周力,等.考虑分布式电源不确定性的配电网鲁棒动态重构[J].中国电机工程学报,2018,38(16):4715-47254976. 1.摘要 间歇性分布式电源并网使得配电网网络重构过程需要考虑更多的不确定因素。在利用仿射数对分布式电源出力的不确定性进行合…

国内ip切换app,让切换ip变得简单

在数字化快速发展的今天&#xff0c;互联网已经成为我们生活中不可或缺的一部分。然而&#xff0c;随着网络应用的深入&#xff0c;用户对于网络环境的需求也日益多样化。其中&#xff0c;IP地址作为网络中的关键标识&#xff0c;其切换与管理显得尤为重要。为了满足用户对于IP…

【Linux】普通用户提升权限

概述 在Linux环境下&#xff0c;给普通用户提权的方式&#xff0c;su与sudo命令&#xff0c;su是将一个普通用户登录为root&#xff0c;而sudo则是将普通用户短暂提升权限 普通用户使用$ root使用# 使用su提升权限 如果我们使用su将用户提升为root&#xff0c;此时需要输入…