[AXI][源码学习]axi_adapter系列之adapter[1]

8 篇文章 0 订阅

Adapter实现了一个AXI4宽度适配器,负责在具有不同数据总线宽度的AXI4主接口和从接口之间进行转换。以下是每个文件内容和功能的总结:

1. axi_adapter.v

这是顶层模块,实例化了读适配器(axi_adapter_rd.v)和写适配器(axi_adapter_wr.v)。它管理总体的AXI4协议信号和参数,确保宽度转换和信号转发的正确性。主要参数包括地址宽度、数据宽度、写选通(strobe)宽度、ID宽度、用户信号使能及突发转换设置。

2. axi_adapter_rd.v

该模块处理读事务,适配主接口和从接口之间的读地址、读数据和控制信号。主要功能包括:

  • 管理主接口和从接口之间不同的读数据总线宽度。
  • 处理读响应,并在启用用户信号时转发用户信号。
  • 在必要时支持突发转换。

3. axi_adapter_wr.v

该模块处理写事务,适配主接口和从接口之间的写地址、写数据和控制信号。主要功能包括:

  • 管理主接口和从接口之间不同的写数据总线宽度。
  • 处理写响应,并在启用用户信号时转发用户信号。
  • 支持突发转换和正确的数据对齐。

详细分析

axi_adapter.v
  • 参数:定义了总线宽度、ID宽度、用户信号使能及突发转换选项。
  • 实例化axi_adapter_rdaxi_adapter_wr 用于读和写通道。
  • 信号连接:将读和写通道连接到主接口和从接口,处理地址、数据、控制和用户信号。
axi_adapter_rd.v
  • 读地址处理:适配主接口和从接口之间的读地址总线宽度,考虑突发类型和大小。
  • 读数据处理:管理读数据宽度适配,确保正确的数据对齐并处理突发转换。
  • 状态机:实现状态机以控制读事务,管理响应,并在启用时处理用户信号。
axi_adapter_wr.v
  • 写地址处理:适配主接口和从接口之间的写地址总线宽度,考虑突发类型和大小。
  • 写数据处理:管理写数据宽度适配,确保正确的数据对齐并处理突发转换。
  • 状态机:实现状态机以控制写事务,管理响应,并在启用时处理用户信号。

关键功能模块

  • 突发转换:读和写模块都可以处理突发转换,在需要时适配窄突发到宽突发,反之亦然。
  • 用户信号转发:根据参数设置可选地转发用户信号(AWUSER、WUSER、BUSER、ARUSER、RUSER)。
  • 状态机:控制事务流程,确保主接口和从接口之间的正确握手和数据传输。

结论

这些文件共同实现了一个AXI4宽度适配器,支持不同的数据总线宽度、用户信号转发和突发转换。顶层模块(axi_adapter.v)协调读和写通道,确保适配和信号完整性。读和写模块处理数据宽度适配的具体细节,包括地址、数据和控制信号管理。

axi_adapter.v

下面是对axi_adapter.v文件的逐行分析:

/*
 * AXI4 width adapter
 */
module axi_adapter #
(
    // 参数列表定义了适配器的配置
    parameter ADDR_WIDTH = 32,               // 地址总线宽度(以位为单位)
    parameter S_DATA_WIDTH = 32,             // 输入(从接口)数据总线宽度(以位为单位)
    parameter S_STRB_WIDTH = (S_DATA_WIDTH/8), // 输入(从接口)写选通宽度(按字节计算)
    parameter M_DATA_WIDTH = 32,             // 输出(主接口)数据总线宽度(以位为单位)
    parameter M_STRB_WIDTH = (M_DATA_WIDTH/8), // 输出(主接口)写选通宽度(按字节计算)
    parameter ID_WIDTH = 4,                  // ID信号宽度
    parameter AWUSER_ENABLE = 1,             // 是否传递awuser信号
    parameter AWUSER_WIDTH = 1,              // awuser信号宽度
    parameter WUSER_ENABLE = 1,              // 是否传递wuser信号
    parameter WUSER_WIDTH = 4,               // wuser信号宽度
    parameter BUSER_ENABLE = 1,              // 是否传递buser信号
    parameter BUSER_WIDTH = 4,               // buser信号宽度
    parameter ARUSER_ENABLE = 1,             // 是否传递aruser信号
    parameter ARUSER_WIDTH = 4,              // aruser信号宽度
    parameter RUSER_ENABLE = 1,              // 是否传递ruser信号
    parameter RUSER_WIDTH = 4,               // ruser信号宽度
    parameter CONVERT_BURST = 0,             // 当适配到更宽的总线时,重新打包全宽度突发而不是通过窄突发
    parameter CONVERT_NARROW_BURST = 0,      // 当适配到更宽的总线时,重新打包所有突发而不是通过窄突发
    parameter FORWARD_ID = 1                 // 是否在适配器中转发ID
)
(
    // 端口定义,描述适配器与其他模块的连接方式
    input  wire                  clk,                // 时钟信号
    input  wire                  rst,                // 重置信号

    // Slave接口(输入接口)
    input  wire [ID_WIDTH-1:0]   s_axi_awid,         // 写地址ID
    input  wire [ADDR_WIDTH-1:0] s_axi_awaddr,       // 写地址
    input  wire [7:0]            s_axi_awlen,        // 突发长度
    input  wire [2:0]            s_axi_awsize,       // 突发大小
    input  wire [1:0]            s_axi_awburst,      // 突发类型
    input  wire                  s_axi_awlock,       // 锁信号
    input  wire [3:0]            s_axi_awcache,      // 缓存类型
    input  wire [2:0]            s_axi_awprot,       // 保护类型
    input  wire [3:0]            s_axi_awqos,        // 质量服务
    input  wire [AWUSER_WIDTH-1:0] s_axi_awuser,     // 写地址用户信号
    input  wire                  s_axi_awvalid,      // 写地址有效
    output wire                  s_axi_awready,      // 写地址准备好
    input  wire [S_DATA_WIDTH-1:0] s_axi_wdata,      // 写数据
    input  wire [S_STRB_WIDTH-1:0] s_axi_wstrb,      // 写选通
    input  wire                  s_axi_wlast,        // 写最后一拍
    input  wire [WUSER_WIDTH-1:0] s_axi_wuser,       // 写数据用户信号
    input  wire                  s_axi_wvalid,       // 写数据有效
    output wire                  s_axi_wready,       // 写数据准备好
    output wire [ID_WIDTH-1:0]   s_axi_bid,          // 写响应ID
    output wire [1:0]            s_axi_bresp,        // 写响应
    output wire [BUSER_WIDTH-1:0] s_axi_buser,       // 写响应用户信号
    output wire                  s_axi_bvalid,       // 写响应有效
    input  wire                  s_axi_bready,       // 写响应准备好

    // Master接口(输出接口)
    output wire [ID_WIDTH-1:0]   m_axi_awid,         // 写地址ID
    output wire [ADDR_WIDTH-1:0] m_axi_awaddr,       // 写地址
    output wire [7:0]            m_axi_awlen,        // 突发长度
    output wire [2:0]            m_axi_awsize,       // 突发大小
    output wire [1:0]            m_axi_awburst,      // 突发类型
    output wire                  m_axi_awlock,       // 锁信号
    output wire [3:0]            m_axi_awcache,      // 缓存类型
    output wire [2:0]            m_axi_awprot,       // 保护类型
    output wire [3:0]            m_axi_awqos,        // 质量服务
    output wire [AWUSER_WIDTH-1:0] m_axi_awuser,     // 写地址用户信号
    output wire                  m_axi_awvalid,      // 写地址有效
    input  wire                  m_axi_awready,      // 写地址准备好
    output wire [M_DATA_WIDTH-1:0] m_axi_wdata,      // 写数据
    output wire [M_STRB_WIDTH-1:0] m_axi_wstrb,      // 写选通
    output wire                  m_axi_wlast,        // 写最后一拍
    output wire [WUSER_WIDTH-1:0] m_axi_wuser,       // 写数据用户信号
    output wire                  m_axi_wvalid,       // 写数据有效
    input  wire                  m_axi_wready,       // 写数据准备好
    input  wire [ID_WIDTH-1:0]   m_axi_bid,          // 写响应ID
    input  wire [1:0]            m_axi_bresp,        // 写响应
    input  wire [BUSER_WIDTH-1:0] m_axi_buser,       // 写响应用户信号
    input  wire                  m_axi_bvalid,       // 写响应有效
    output wire                  m_axi_bready,       // 写响应准备好

    // Slave接口(输入接口)
    input  wire [ID_WIDTH-1:0]   s_axi_arid,         // 读地址ID
    input  wire [ADDR_WIDTH-1:0] s_axi_araddr,       // 读地址
    input  wire [7:0]            s_axi_arlen,        // 突发长度
    input  wire [2:0]            s_axi_arsize,       // 突发大小
    input  wire [1:0]            s_axi_arburst,      // 突发类型
    input  wire                  s_axi_arlock,       // 锁信号
    input  wire [3:0]            s_axi_arcache,      // 缓存类型
    input  wire [2:0]            s_axi_arprot,       // 保护类型
    input  wire [3:0]            s_axi_arqos,        // 质量服务
    input  wire [ARUSER_WIDTH-1:0] s_axi_aruser,     // 读地址用户信号
    input  wire                  s_axi_arvalid,      // 读地址有效
    output wire                  s_axi_arready,      // 读地址准备好
    output wire [ID_WIDTH-1:0]   s_axi_rid,          // 读数据ID
    output wire [M_DATA_WIDTH-1:0] s_axi_rdata,      // 读数据
    output wire [1:0]            s_axi_rresp,        // 读响应
    output wire                  s_axi_rlast,        // 读最后一拍
    output wire [RUSER_WIDTH-1:0] s_axi_ruser,       // 读数据用户信号
    output wire                  s_axi_rvalid,       // 读数据有效
    input  wire                  s_axi_rready,       // 读数据准备好

    // Master接口(输出接口)
    output wire [ID_WIDTH-1:0]   m_axi_arid,         // 读地址ID
    output wire [ADDR_WIDTH-1:0] m_axi_araddr,       // 读地址
    output wire [7:0]            m_axi_arlen,        // 突发长度
    output wire [2:0]            m_axi_arsize,       // 突发大小
    output wire [1:0]            m_axi_arburst,      // 突发类型
    output wire                  m_axi_arlock,       // 锁信号
    output wire [3:

0]            m_axi_arcache,      // 缓存类型
    output wire [2:0]            m_axi_arprot,       // 保护类型
    output wire [3:0]            m_axi_arqos,        // 质量服务
    output wire [ARUSER_WIDTH-1:0] m_axi_aruser,     // 读地址用户信号
    output wire                  m_axi_arvalid,      // 读地址有效
    input  wire                  m_axi_arready,      // 读地址准备好
    input  wire [ID_WIDTH-1:0]   m_axi_rid,          // 读数据ID
    input  wire [M_DATA_WIDTH-1:0] m_axi_rdata,      // 读数据
    input  wire [1:0]            m_axi_rresp,        // 读响应
    input  wire                  m_axi_rlast,        // 读最后一拍
    input  wire [RUSER_WIDTH-1:0] m_axi_ruser,       // 读数据用户信号
    input  wire                  m_axi_rvalid,       // 读数据有效
    output wire                  m_axi_rready        // 读数据准备好
);

    // 实例化读适配器
    axi_adapter_rd #(
        .ADDR_WIDTH(ADDR_WIDTH),
        .S_DATA_WIDTH(S_DATA_WIDTH),
        .S_STRB_WIDTH(S_STRB_WIDTH),
        .M_DATA_WIDTH(M_DATA_WIDTH),
        .M_STRB_WIDTH(M_STRB_WIDTH),
        .ID_WIDTH(ID_WIDTH),
        .ARUSER_ENABLE(ARUSER_ENABLE),
        .ARUSER_WIDTH(ARUSER_WIDTH),
        .RUSER_ENABLE(RUSER_ENABLE),
        .RUSER_WIDTH(RUSER_WIDTH),
        .CONVERT_BURST(CONVERT_BURST),
        .CONVERT_NARROW_BURST(CONVERT_NARROW_BURST),
        .FORWARD_ID(FORWARD_ID)
    ) axi_adapter_rd_inst (
        .clk(clk),
        .rst(rst),
        .s_axi_arid(s_axi_arid),
        .s_axi_araddr(s_axi_araddr),
        .s_axi_arlen(s_axi_arlen),
        .s_axi_arsize(s_axi_arsize),
        .s_axi_arburst(s_axi_arburst),
        .s_axi_arlock(s_axi_arlock),
        .s_axi_arcache(s_axi_arcache),
        .s_axi_arprot(s_axi_arprot),
        .s_axi_arqos(s_axi_arqos),
        .s_axi_aruser(s_axi_aruser),
        .s_axi_arvalid(s_axi_arvalid),
        .s_axi_arready(s_axi_arready),
        .s_axi_rid(s_axi_rid),
        .s_axi_rdata(s_axi_rdata),
        .s_axi_rresp(s_axi_rresp),
        .s_axi_rlast(s_axi_rlast),
        .s_axi_ruser(s_axi_ruser),
        .s_axi_rvalid(s_axi_rvalid),
        .s_axi_rready(s_axi_rready),
        .m_axi_arid(m_axi_arid),
        .m_axi_araddr(m_axi_araddr),
        .m_axi_arlen(m_axi_arlen),
        .m_axi_arsize(m_axi_arsize),
        .m_axi_arburst(m_axi_arburst),
        .m_axi_arlock(m_axi_arlock),
        .m_axi_arcache(m_axi_arcache),
        .m_axi_arprot(m_axi_arprot),
        .m_axi_arqos(m_axi_arqos),
        .m_axi_aruser(m_axi_aruser),
        .m_axi_arvalid(m_axi_arvalid),
        .m_axi_arready(m_axi_arready),
        .m_axi_rid(m_axi_rid),
        .m_axi_rdata(m_axi_rdata),
        .m_axi_rresp(m_axi_rresp),
        .m_axi_rlast(m_axi_rlast),
        .m_axi_ruser(m_axi_ruser),
        .m_axi_rvalid(m_axi_rvalid),
        .m_axi_rready(m_axi_rready)
    );

    // 实例化写适配器
    axi_adapter_wr #(
        .ADDR_WIDTH(ADDR_WIDTH),
        .S_DATA_WIDTH(S_DATA_WIDTH),
        .S_STRB_WIDTH(S_STRB_WIDTH),
        .M_DATA_WIDTH(M_DATA_WIDTH),
        .M_STRB_WIDTH(M_STRB_WIDTH),
        .ID_WIDTH(ID_WIDTH),
        .AWUSER_ENABLE(AWUSER_ENABLE),
        .AWUSER_WIDTH(AWUSER_WIDTH),
        .WUSER_ENABLE(WUSER_ENABLE),
        .WUSER_WIDTH(WUSER_WIDTH),
        .BUSER_ENABLE(BUSER_ENABLE),
        .BUSER_WIDTH(BUSER_WIDTH),
        .CONVERT_BURST(CONVERT_BURST),
        .CONVERT_NARROW_BURST(CONVERT_NARROW_BURST),
        .FORWARD_ID(FORWARD_ID)
    ) axi_adapter_wr_inst (
        .clk(clk),
        .rst(rst),
        .s_axi_awid(s_axi_awid),
        .s_axi_awaddr(s_axi_awaddr),
        .s_axi_awlen(s_axi_awlen),
        .s_axi_awsize(s_axi_awsize),
        .s_axi_awburst(s_axi_awburst),
        .s_axi_awlock(s_axi_awlock),
        .s_axi_awcache(s_axi_awcache),
        .s_axi_awprot(s_axi_awprot),
        .s_axi_awqos(s_axi_awqos),
        .s_axi_awuser(s_axi_awuser),
        .s_axi_awvalid(s_axi_awvalid),
        .s_axi_awready(s_axi_awready),
        .s_axi_wdata(s_axi_wdata),
        .s_axi_wstrb(s_axi_wstrb),
        .s_axi_wlast(s_axi_wlast),
        .s_axi_wuser(s_axi_wuser),
        .s_axi_wvalid(s_axi_wvalid),
        .s_axi_wready(s_axi_wready),
        .s_axi_bid(s_axi_bid),
        .s_axi_bresp(s_axi_bresp),
        .s_axi_buser(s_axi_buser),
        .s_axi_bvalid(s_axi_bvalid),
        .s_axi_bready(s_axi_bready),
        .m_axi_awid(m_axi_awid),
        .m_axi_awaddr(m_axi_awaddr),
        .m_axi_awlen(m_axi_awlen),
        .m_axi_awsize(m_axi_awsize),
        .m_axi_awburst(m_axi_awburst),
        .m_axi_awlock(m_axi_awlock),
        .m_axi_awcache(m_axi_awcache),
        .m_axi_awprot(m_axi_awprot),
        .m_axi_awqos(m_axi_awqos),
        .m_axi_awuser(m_axi_awuser),
        .m_axi_awvalid(m_axi_awvalid),
        .m_axi_awready(m_axi_awready),
        .m_axi_wdata(m_axi_wdata),
        .m_axi_wstrb(m_axi_wstrb),
        .m_axi_wlast(m_axi_wlast),
        .m_axi_wuser(m_axi_wuser),
        .m_axi_wvalid(m_axi_wvalid),
        .m_axi_wready(m_axi_wready),
        .m_axi_bid(m_axi_bid),
        .m_axi_bresp(m_axi_bresp),
        .m_axi_buser(m_axi_buser),
        .m_axi_bvalid(m_axi_bvalid),
        .m_axi_bready(m_axi_bready)
    );

endmodule

分析总结

  1. 模块声明和参数定义

    • 模块的参数定义了适配器的配置,包括总线宽度、用户信号使能及其他控制选项。
  2. 端口定义

    • 定义了与其他模块的连接方式,包括AXI4总线的地址、数据、控制和用户信号。
  3. 实例化读适配器

    • 实例化axi_adapter_rd模块,用于处理读通道的宽度适配和信号转换。
  4. 实例化写适配器

    • 实例化axi_adapter_wr模块,用于处理写通道的宽度适配和信号转换。

详细模块分析

axi_adapter_rd实例化
  • 参数传递:传递顶层模块的参数以配置读适配器。
  • 信号连接:将顶层模块的信号连接到读适配器的输入输出端口。
axi_adapter_wr实例化
  • 参数传递:传递顶层模块的参数以配置写适配器。
  • 信号连接:将顶层模块的信号连接到写适配器的输入输出端口。

结论

axi_adapter.v文件实现了AXI4宽度适配器的顶层模块,通过实例化读写适配器来处理不同数据总线宽度的适配。该模块确保了主接口和从接口之间的正确信号传递和数据对齐。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值