axi4-lite-slave 时序分析及代码解读

本文详细描述了AXI4-Lite接口在内存映射通信中的写入和读取过程,涉及地址发送、数据写入、响应接收以及读取时序,包括信号如awvalid、awready、wvalid、wready、arvalid、arready等的作用和交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AXI4-Lite :( For simple, low-throughput memory-mapped communication )是一个轻量级的地址映射单次传输接口,占用很少的逻辑单元。

写数据

一:地址发送阶段

在写数据过程中,主机的地址连接在s_axi_awaddr总线上,同时将s_axi_awvalid信号拉高,表示主机的有效地址信息已经在信道上等待从机完成接收。同时等待从机发出的接受响应,当从机发送的s_axi_awready有效(拉高)时表示从机允许接收地址信息。从接口只在s_axi_awvaild和s_axi_awready同时有效时才能完成地址信息的接收,即完成主接口的写地址发送。 **awvalid**写地址有效是主机发出的,主机来定义写入的数据是否是有效

**awready**地址接收有效是从机发出的,从机来定义是否可以为有效接收

二:数据写入阶段

主接口发送完地址信息后,准备写入数据,将待写入的数据置于s_axi_wdata总线上(s_axi_wstrb表示写入选通吸信号,默认为11,表示写入数据均可用),并将s_axi_wvalid置为有效(拉高),表示数据已经在信道上等待从机发出的写入响应信号,进而写入从接口。从接口将s_axi_wready信号拉高,表示从接口可以被写入数据了。**当s_axi_wavaild和s_axi_wready信号同时为1后,表示完成了数据写入**

三:响应接收阶段【响应信号表示接收数据是否为有效数据,但完成响应被主机知晓,也需要有响应的有效信号】

主接口完成数据写入后,主机把 s_axi_bready信号拉高(给从机一个我可以接收响应了 的信号),等待从机接口的响应信号。从接口的响应信号s_axi_bresp[1:0]用2‘b00表示数据信道的数据写入成功,即OKEY,从机接口发出的s_axi_bresp响应信号 的有效信号s_axi_bvaild为1时才表示响应有效。

主机的s_axi_bready=1,从机的s_axi_bresp[1:0]=2‘b00,s_axi_bvaild=1,同时满足表示主机接口确认从接口完成了数据的写入。

以上过程的结束表示一次完整的基于AXI4_Lite接口的写寄存器过程。

读数据

一:地址发送:

**主机将要读入的地址输入到s_axi_araddr总线上,同时将**s_axi_arvalid**信号拉高。表示主机的地址已经在信道上等待从接口完成接收,同时等待接口发出s_axi_arready**信号,当从接口发出的s_axi_arready信号有效时,表示从接口允许接收地址信息。**从接口只在s_axi_arvaild信号和s_axi_arready同时有效时才能完成信息接收,即完成主接口的读地址发送。**

二:数据接收:

**主机**发送完地址请求后,发送接收数据请求信号,将**s_axi_rready**信号拉高,表示主机可以接收数据了。从接口接收到主接口的准备ready信号后给出响应,在s_axi_rdata总线上发送主机请求的数据,同时把**s_axi_rvaild信号拉高**,表示s_axi_rdata数据有效,主机根据s_axi_rvaild信号 有效 接收数据,完成数据的读过程。

以上即为AXI4-Lite的读写时序。

浅谈AXI总线_s03_axi_wdata-优快云博客

assign	S_AXI_BRESP = 2'b00;
assign	S_AXI_RRESP = 2'b00;
读写的有效响应信号均有从机发出【从机告诉主机】,00表示为无误

代码分析

写寄存器

是否可以写入寄存器取决于四个信号

assign slv_reg_wren = axi_wready && S_AXI_WVALID && axi_awready && S_AXI_AWVALID;
  • [ ] 因为本实现中写地址通道和写数据通道是严格一对一的关系,**所以 wready 的信号的产生和 awready 信号在同一个周期中进行**,判断 wvalid 与 awvalid 同时为高 。
  • [ ] 如果实现的是支持突发传输的 AXI-Full 协议,那么写数据将和写地址就失去了这种一一对应的关系。(一次地址传输对应多次数据传输)

所以**wready 和 awready** 同时有效,使得数据传输使能slv_reg_wren 有效,在下一个时钟周期的上升沿发生数据写入

在下一个时钟周期上升沿,axi_bvalid 开始有效,然后等待主机发来S_AXI_BREADY

axi_awready 在一个 S_AXI_ACLK 时钟周期内被置位
**always @( posedge S_AXI_ACLK )
	begin
	  if ( S_AXI_ARESETN == 1'b0 )
	    begin
	      axi_awready <= 1'b0;
	      aw_en <= 1'b1;
	    end 
	  else
	    begin    
	      if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID && aw_en)
	        begin
	          axi_awready <= 1'b1;
	          aw_en <= 1'b0;
	        end
	        else if (S_AXI_BREADY && axi_bvalid)
	            begin
	              aw_en <= 1'b1;
	              axi_awready <= 1'b0;
	            end
	      else           
	        begin
	          axi_awready <= 1'b0;
	        end
	    end 
	end**
与此同时 axi_awaddr 实现地址写入 ,地址来源于 S_AXI_AWADDR
**always @( posedge S_AXI_ACLK )
	begin
	  if ( S_AXI_ARESETN == 1'b0 )
	    begin
	      axi_awaddr <= 0;
	    end 
	  else
	    begin    
	      if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID && aw_en)
	        begin
	          // Write Address latching 
	          axi_awaddr <= S_AXI_AWADDR;
	        end
	    end 
	end
————————————————————————————————————————————————————————————————————————————————————————**
axi_wready //axi_wready is asserted for one S_AXI_ACLK clock cycle when both
					 //S_AXI_AWVALID and S_AXI_WVALID are asserted.
always @( posedge S_AXI_ACLK )
	begin
	  if ( S_AXI_ARESETN == 1'b0 )
	    begin
	      axi_wready <= 1'b0;
	    end 
	  else
	    begin    
	      if (~axi_wready && S_AXI_WVALID && S_AXI_AWVALID && aw_en )
	        begin
	          // slave is ready to accept write data when 
	          // there is a valid write address and write data
	          // on the write address and data bus. This design 
	          // expects no outstanding transactions. 
	          axi_wready <= 1'b1;
	        end
	      else
	        begin
	          axi_wready <= 1'b0;
	        end
	    end 
	end
**————————————————————————————————————————————————————————————————————————————————————————**
在完成传输,即写数据/地址通道完成握手后的下一周期,从机置起 bvalid 信号,
并在 bresp 信号上给出 'OK' 信号。在响应通道完成握手后,置低 bvalid 完成响应操作。
always @( posedge S_AXI_ACLK )
	begin
	  if ( S_AXI_ARESETN == 1'b0 )
	    begin
	      axi_bvalid  <= 0;
	      axi_bresp   <= 2'b0;
	    end 
	  else
	    begin    
	      if (axi_awready && S_AXI_AWVALID && ~axi_bvalid && axi_wready && S_AXI_WVALID)
	        begin
	          // indicates a valid write response is available
	          axi_bvalid <= 1'b1;
	          axi_bresp  <= 2'b0; // 'OKAY' response 
	        end                   // work error responses in future
	      else
	        begin
	          if (S_AXI_BREADY && axi_bvalid) 
	            //check if bready is asserted while bvalid is high) 
	            //(there is a possibility that bready is always asserted high)   
	            begin
	              axi_bvalid <= 1'b0; 
	            end  
	        end
	    end
	end

读寄存器



assign slv_reg_rden = axi_arready & S_AXI_ARVALID & ~axi_rvalid;
	always @(*)
	begin
	      // Address decoding for reading registers
	      case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
	        2'h0   : reg_data_out <= slv_reg0;
	        2'h1   : reg_data_out <= slv_reg1;
	        2'h2   : reg_data_out <= slv_reg2;
	        2'h3   : reg_data_out <= slv_reg3;
	        default : reg_data_out <= 0;
	      endcase
	end
always @( posedge S_AXI_ACLK )
	begin
	  if ( S_AXI_ARESETN == 1'b0 )
	    begin
	      axi_rvalid <= 0;
	      axi_rresp  <= 0;
	    end 
	  else
	    begin    
	      if (axi_arready && S_AXI_ARVALID && ~axi_rvalid)//在slv_reg_rden 读使能有效时
	        begin//告知完读取的地址,axi_rvalid 有效,一直保持到主机发出S_AXI_RREADY
	          // Valid read data is available at the read data bus
	          axi_rvalid <= 1'b1;
	          axi_rresp  <= 2'b0; // 'OKAY' response
	        end   
	      else if (axi_rvalid && S_AXI_RREADY)
	        begin
	          // Read data is accepted by the master
	          axi_rvalid <= 1'b0;
	        end                
	    end
	end

	// Output register or memory read data
	always @( posedge S_AXI_ACLK )
	begin
	  if ( S_AXI_ARESETN == 1'b0 )
	    begin
	      axi_rdata  <= 0;
	    end 
	  else
	    begin    
	      // When there is a valid read address (S_AXI_ARVALID) with 
	      // acceptance of read address by the slave (axi_arready), 
	      // output the read dada 
	      if (slv_reg_rden)
	        begin
	          axi_rdata <= reg_data_out;     // register read data
	        end   
	    end
	end**

<think>好的,用户想了解AXI4协议的时序关系或解决与AXI4时序相关的问题,特别是时序图解释和时序约束设计指导。首先,我需要回忆AXI4协议的基本结构和通道分离的特点。根据引用[1],AXI4有三种协议,这里可能主要关注AXI4AXI4-LiteAXI4的通道包括读地址、写地址、读数据、写数据和写响应,每个通道都是独立的,这会影响时序设计。 接下来,用户提到时序图解释,我需要参考引用[5]中的示意图,描述主机发送地址控制信号,然后数据传输,最后应答信号的过程。需要分读和写操作分别说明,比如读操作中,主机发送ARVALID,从机回复ARREADY,然后数据通过R通道返回。写操作类似,但涉及AW、W和B通道。 关于时序约束,需要考虑各个通道之间的独立性,比如读和写通道可以并行。关键点包括握手机制(VALID和READY信号)、突发传输的时序(如地址和数据的对齐,引用[4]提到不对齐地址的处理),以及各个信号的时序关系,比如数据信号在地址之后。 用户可能需要具体的设计指导,比如如何设置时钟周期,如何确保VALID和READY的握手不发生冲突,以及如何优化时序路径。需要提到AXI4-LiteAXI4-Stream的区别,比如AXI4-Lite不支持突发,时序更简单,而AXI4-Stream是单向流,时序可能更连续。 此外,引用[3]提到信号命名规则,比如AR开头是读地址,AW是写地址,这有助于识别各个通道的信号。时序约束中需要注意这些信号组的同步。 可能的问题点包括握手机制的正确实现,突发传输中的时序偏移,以及跨时钟域的处理。需要指导用户如何在这些方面进行约束,比如使用适当的时钟同步策略,设置合理的时序例外(如多周期路径),或者优化逻辑以减少关键路径的延迟。 最后,生成相关问题时,需要考虑用户可能进一步想了解的细节,比如如何验证AXI4时序,常见错误案例,或者不同协议的对比。这有助于用户深入学习和解决问题。</think>### AXI4协议时序关系与设计指导 #### 一、AXI4时序基础 AXI4协议采用**通道分离**机制,通过独立的地址通道、数据通道和响应通道实现并行操作[^1]。关键时序关系如下: 1. **地址与数据通道分离**:地址通道(AR/AW)和数据通道(R/W/B)可独立工作,例如主机可先发送写地址,再延迟发送写数据[^5]。 2. **握手信号时序**:每个通道使用`VALID`和`READY`信号进行握手: - `VALID`由发送方驱动,表示数据有效 - `READY`由接收方驱动,表示准备接收数据 $$ \text{传输完成条件:VALID \&\& READY} $$ 3. **突发传输时序**:支持增量突发(INCR)和回环突发(WRAP),突发长度由`AxLEN`信号指定[^4]。 #### 二、典型时序图解析 **读操作时序示例**(以AXI4-Lite为例): ``` __ __ __ __ CLK |__| |__| |__| |__| ARVALID _______________/ ARREADY ___________ RDATA _______________ RRESP ___________ ``` 1. 主机在T1周期置高`ARVALID` 2. 从机在T2周期响应`ARREADY` 3. 数据在T3周期通过`RDATA`传输,响应信号`RRESP`同步返回 **写操作时序约束要点**: - `AWVALID`与`WVALID`可同时或异步置高 - 写响应通道`BVALID`必须在最后一次写数据传输完成后置高[^3] #### 三、时序约束设计指导 1. **建立/保持时间约束**: ```tcl set_input_delay -clock CLK -max 2 [get_ports AWVALID] set_output_delay -clock CLK -max 1.5 [get_ports WREADY] ``` 2. **跨时钟域处理**: - 异步桥接需插入同步器 - 使用`set_clock_groups -asynchronous`声明异步时钟关系 3. **突发传输优化**: - 保持地址通道相位超前数据通道至少1个周期 - 对齐突发边界:`AxADDR[3:0]`应匹配首字节位置 4. **关键路径优化**: - 将握手信号逻辑保持在单一时钟域 - 使用流水线寄存器分割长组合逻辑 #### 四、常见时序问题解决方案 | 问题现象 | 诊断方法 | 解决方案 | |---------|----------|----------| | 死锁状态 | 检查所有通道的VALID/READY依赖关系 | 添加超时计数器强制释放信号 | | 数据错位 | 验证突发长度与STRB信号对齐 | 使用AXI协议检查器IP核 | | 时序违例 | 分析关键路径报告 | 插入寄存器或优化组合逻辑 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值