关于AXI Slave IP核

AXI4_Full总线协议中从机Slave端的IP核详解
摘要由CSDN通过智能技术生成

目录

引言

一、信号申明

1、外部信号申明

2、内部信号申明

3、回环模式标志位申明

4、其他信号申明

5、RAM变量申明

6、IO外部连接和for循环变量

二、功能实现

1、回环模式判断

2、写地址通道

3、写数据通道

4、写响应通道

5、读地址通道

6、读数据通道

三、RAM端


引言

        使用的案例为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] 
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值