目录
引言
使用的案例为Vivado2018版本自带的AXI4_Slave IP核案例,对AXI4总线从机端的代码进行描述。
一、信号申明
1、外部信号申明
//****************************写地址通道********************************
// 写地址ID
input wire [C_S_AXI_ID_WIDTH-1 : 0] S_AXI_AWID,
// 写地址数据总线
input wire [C_S_AXI_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,
// Lock机制、未使用
input wire S_AXI_AWLOCK,
// CACHE模式,未使用
input wire [3 : 0] S_AXI_AWCACHE,
// 保护机制、未使用
input wire [2 : 0] S_AXI_AWPROT,
// QOS机制、未使用
input wire [3 : 0] S_AXI_AWQOS,
// 未使用
input wire [3 : 0] S_AXI_AWREGION,
// 用户通道、未使用
input wire [C_S_AXI_AWUSER_WIDTH-1 : 0] S_AXI_AWUSER,
// 写地址Valid信号
input wire S_AXI_AWVALID,
// 写地址READ信号
output wire S_AXI_AWREADY,
//****************************写数据通道********************************
// 写数据总线
input wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_WDATA,
// 写数据屏蔽
input wire [(C_S_AXI_DATA_WIDTH/8)-1 : 0] S_AXI_WSTRB,
// 写最后传输信号
input wire S_AXI_WLAST,
// 写数据用户总线
input wire [C_S_AXI_WUSER_WIDTH-1 : 0] S_AXI_WUSER,
// 写数据Valid信号
input wire S_AXI_WVALID,
// 写数据Read信号
output wire S_AXI_WREADY,
//****************************写响应通道********************************
// 响应通道ID
output wire [C_S_AXI_ID_WIDTH-1 : 0] S_AXI_BID,
// 写响应字符,表示本次突发传输状态
output wire [1 : 0] S_AXI_BRESP,
// 写响应用户通道总线
output wire [C_S_AXI_BUSER_WIDTH-1 : 0] S_AXI_BUSER,
// 写Valid信号
output wire S_AXI_BVALID,
// 写Read信号
input wire S_AXI_BREADY,
//****************************读地址通道********************************
// 读地址ID
input wire [C_S_AXI_ID_WIDTH-1 : 0] S_AXI_ARID,
// 读地址总线
input wire [C_S_AXI_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,
// LOCK
input wire S_AXI_ARLOCK,
// Cache
input wire [3 : 0] S_AXI_ARCACHE,
//
input wire [2 : 0] S_AXI_ARPROT,
//
input wire [3 : 0] S_AXI_ARQOS,
//
input wire [3 : 0] S_AXI_ARREGION,
//
input wire [C_S_AXI_ARUSER_WIDTH-1 : 0] S_AXI_ARUSER,
// 读地址Vaild信号
input wire S_AXI_ARVALID,
// 读地址Read信号
output wire S_AXI_ARREADY,
// 读地址ID
output wire [C_S_AXI_ID_WIDTH-1 : 0] S_AXI_RID,
//****************************读数据通道********************************
// 读数据总线
output wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_RDATA,
// 读响应
output wire [1 : 0] S_AXI_RRESP,
// 读最后传输信号
output wire S_AXI_RLAST,
//
output wire [C_S_AXI_RUSER_WIDTH-1 : 0] S_AXI_RUSER,
// 读Valid信号
output wire S_AXI_RVALID,
// 读数据Ready信号
input wire S_AXI_RREADY
2、内部信号申明
// 定义内部信号
reg [C_S_AXI_ADDR_WIDTH-1 : 0] axi_awaddr;
reg axi_awready;
reg axi_wready;
reg [1 : 0] axi_bresp;
reg [C_S_AXI_BUSER_WIDTH-1 : 0] axi_buser; //未使用
reg axi_bvalid;
reg [C_S_AXI_ADDR_WIDTH-1 : 0] axi_araddr;
reg axi_arready;
reg [C_S_AXI_DATA_WIDTH-1 : 0] axi_rdata;
reg [1 : 0] axi_rresp;
reg axi_rlast;
reg [C_S_AXI_RUSER_WIDTH-1 : 0] axi_ruser; //未使用
reg axi_rvalid;
3、回环模式标志位申明
// 给回环模式(WRAP)标志,下面都是给wrap用的
// 使能写回环和读回环
wire aw_wrap_en;
wire ar_wrap_en;
// aw_wrap_size是写传输的大小,如果达到了地址限制,写地址将自动包装到下一个地址
wire [31:0] aw_wrap_size ;
// ar_wrap_size是写传输的大小,如果达到了地址限制,写地址将自动包装到下一个地址
wire [31:0] ar_wrap_size ;
// axi_awv_awr_flag标志表示存在有效的写地址
reg axi_awv_awr_flag;
// axi_awr_awr_flag标志表示存在有效的读地址
reg axi_arv_arr_flag;
4、其他信号申明
// axi_awlen_cntr内部写地址计数器,用于跟踪突发事务中的节拍
reg [7:0] axi_awlen_cntr;
// axi_arlen_cntr内部读地址计数器,用于跟踪突发事务中的节拍
reg [7:0] axi_arlen_cntr;
reg [1:0] axi_arburst; //锁存突发类型
reg [1:0] axi_awburst; //锁存突发类型
reg [7:0] axi_arlen; //锁存突发长度
reg [7:0] axi_awlen;
//用于寻址32位/64位C_S_AXI_DATA_WIDTH的本地参数
//ADDR_LSB用于寻址32/64位寄存器/内存,即用来区分
//ADDR_LSB = 2 for 32 bits (n downto 2)
//ADDR_LSB = 3 for 64 bits (n downto 3)
localparam integer ADDR_LSB = (C_S_AXI_DATA_WIDTH/32)+ 1;//这个值在后面给地址赋值中使用
localparam integer OPT_MEM_ADDR_BITS = 5; //定义FIFO的地址位数
localparam integer USER_NUM_MEM = 1;
5、RAM变量申明
wire [OPT_MEM_ADDR_BITS:0]