赞
踩
Adapter实现了一个AXI4宽度适配器,负责在具有不同数据总线宽度的AXI4主接口和从接口之间进行转换。以下是每个文件内容和功能的总结:
axi_adapter.v
这是顶层模块,实例化了读适配器(axi_adapter_rd.v
)和写适配器(axi_adapter_wr.v
)。它管理总体的AXI4协议信号和参数,确保宽度转换和信号转发的正确性。主要参数包括地址宽度、数据宽度、写选通(strobe)宽度、ID宽度、用户信号使能及突发转换设置。
axi_adapter_rd.v
该模块处理读事务,适配主接口和从接口之间的读地址、读数据和控制信号。主要功能包括:
axi_adapter_wr.v
该模块处理写事务,适配主接口和从接口之间的写地址、写数据和控制信号。主要功能包括:
axi_adapter.v
axi_adapter_rd
和 axi_adapter_wr
用于读和写通道。axi_adapter_rd.v
axi_adapter_wr.v
这些文件共同实现了一个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
模块声明和参数定义:
端口定义:
实例化读适配器:
axi_adapter_rd
模块,用于处理读通道的宽度适配和信号转换。实例化写适配器:
axi_adapter_wr
模块,用于处理写通道的宽度适配和信号转换。axi_adapter_rd
实例化axi_adapter_wr
实例化axi_adapter.v
文件实现了AXI4宽度适配器的顶层模块,通过实例化读写适配器来处理不同数据总线宽度的适配。该模块确保了主接口和从接口之间的正确信号传递和数据对齐。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。