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_rd
和axi_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
分析总结
-
模块声明和参数定义:
- 模块的参数定义了适配器的配置,包括总线宽度、用户信号使能及其他控制选项。
-
端口定义:
- 定义了与其他模块的连接方式,包括AXI4总线的地址、数据、控制和用户信号。
-
实例化读适配器:
- 实例化
axi_adapter_rd
模块,用于处理读通道的宽度适配和信号转换。
- 实例化
-
实例化写适配器:
- 实例化
axi_adapter_wr
模块,用于处理写通道的宽度适配和信号转换。
- 实例化
详细模块分析
axi_adapter_rd
实例化
- 参数传递:传递顶层模块的参数以配置读适配器。
- 信号连接:将顶层模块的信号连接到读适配器的输入输出端口。
axi_adapter_wr
实例化
- 参数传递:传递顶层模块的参数以配置写适配器。
- 信号连接:将顶层模块的信号连接到写适配器的输入输出端口。
结论
axi_adapter.v
文件实现了AXI4宽度适配器的顶层模块,通过实例化读写适配器来处理不同数据总线宽度的适配。该模块确保了主接口和从接口之间的正确信号传递和数据对齐。