当前位置:   article > 正文

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

axi adapter

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
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253

分析总结

  1. 模块声明和参数定义

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

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

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

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

详细模块分析

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

结论

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/999953?site
推荐阅读
相关标签
  

闽ICP备14008679号