2. AXI4-Lite协议入门:接口信号定义、握手协议与读写事务时序

大家好,我是你们的FPGA设计讲师。今天我们来聊聊AXI4-Lite协议。说实话,我刚接触AXI总线时,也被那一大堆信号线搞得头晕。但别担心,AXI4-Lite是AXI家族里最轻量级的版本,特别适合用来做寄存器配置、状态查询这类控制类操作。

我个人习惯把AXI4-Lite看作一个「精简版」的AXI4。它去掉了突发传输、去掉了数据交织,只保留了最核心的读写能力。你想想看,对于按键消抖这种场景,我们只需要配置几个寄存器、读取按键状态,完全用不上那些复杂特性。

2.1 AXI4-Lite接口信号定义

AXI4-Lite的接口信号可以分为三组:写地址通道、写数据通道、写响应通道,以及读地址通道、读数据通道。嗯,这里要注意,读写是分离的,各自有独立的通道。

下面这张表是我整理的核心信号,你在项目中一定会用到:

信号名 方向 位宽 描述
AWADDR 主机→从机 32 写地址
AWVALID 主机→从机 1 写地址有效
AWREADY 从机→主机 1 从机准备好接收地址
WDATA 主机→从机 32 写数据
WVALID 主机→从机 1 写数据有效
WREADY 从机→主机 1 从机准备好接收数据
BRESP 从机→主机 2 写响应(OKAY=2'b00, SLVERR=2'b10)
BVALID 从机→主机 1 写响应有效
BREADY 主机→从机 1 主机准备好接收响应
ARADDR 主机→从机 32 读地址
ARVALID 主机→从机 1 读地址有效
ARREADY 从机→主机 1 从机准备好接收读地址
RDATA 从机→主机 32 读数据
RRESP 从机→主机 2 读响应
RVALID 从机→主机 1 读数据有效
RREADY 主机→从机 1 主机准备好接收数据

你可能注意到了,AXI4-Lite的数据位宽固定为32位,地址位宽也是32位。这跟AXI4全功能版不一样——全功能版支持64位甚至128位数据,还支持非对齐传输。但对我们做控制类应用来说,32位足够了。

我的经验: 在项目中,我习惯把AXI4-Lite从机的地址空间映射到系统总线的某个基地址上。比如按键消抖模块,我可能会分配0x4000_0000~0x4000_FFFF这段地址。这样CPU通过简单的load/store指令就能访问了。

2.2 握手协议:VALID/READY机制

AXI4-Lite的握手协议,说白了就是「你准备好了吗?我准备好了!」的对话。发送方拉高VALID表示数据有效,接收方拉高READY表示可以接收。当两者同时为高时,传输发生。

这里有个关键点:VALID不能依赖READY。也就是说,发送方一旦拉高VALID,就必须保持到握手完成。而READY可以等到VALID来了再拉高,也可以提前拉高。

我曾经在一个项目中踩过坑:从机设计时,我把READY信号跟VALID做了组合逻辑,结果时序跑不过。后来才意识到,READY最好用寄存器打一拍,避免组合路径过长。

握手有几种常见场景:

  • VALID先到,READY后到:最常见的情况。主机先发地址,从机处理完后拉高READY。
  • READY先到,VALID后到:从机提前准备好,主机随时可以发起传输。
  • 同时到达:一拍完成传输,效率最高。

下面这张图展示了握手的基本流程:

CLK T0 T1 T2 T3 T4 T5 VALID READY DATA 有效数据 握手成功 说明:T0-T1 VALID有效,T2-T3 READY有效,T2时刻握手成功,数据被传输
核心要点: 握手成功只发生在VALID和READY同时为高的时钟上升沿。在此之前,数据必须保持稳定。

2.3 写事务时序

AXI4-Lite的写事务需要三个步骤:发地址、发数据、收响应。这三个步骤是独立的通道,可以流水线执行。

我画个时序图帮你理解:

// 写事务伪代码描述
// 步骤1:主机发送写地址
AWADDR <= 目标地址;
AWVALID <= 1;
// 等待 AWREADY 为高

// 步骤2:主机发送写数据
WDATA <= 要写入的数据;
WVALID <= 1;
// 等待 WREADY 为高

// 步骤3:从机返回写响应
// 等待 BVALID 为高
BRESP = 2'b00;  // OKAY
BREADY <= 1;

实际项目中,地址和数据可以同时发送。我曾经做过一个优化:把AWVALID和WVALID在同一拍拉高,这样从机可以并行处理,减少等待周期。

注意: 写响应通道必须等写数据通道完成后才能返回。这是协议规定的顺序要求。如果你先返回响应再接收数据,从机可能会出问题。

2.4 读事务时序

读事务比写事务简单一些,只有两个步骤:发地址、收数据。没有响应通道——读响应是和数据一起返回的。

读事务的典型时序:

// 读事务伪代码描述
// 步骤1:主机发送读地址
ARADDR <= 目标地址;
ARVALID <= 1;
// 等待 ARREADY 为高

// 步骤2:从机返回读数据
// 等待 RVALID 为高
RDATA = 从寄存器读取的数据;
RRESP = 2'b00;  // OKAY
RREADY <= 1;

这里有个小技巧:RREADY可以提前拉高,表示主机随时准备接收数据。这样从机准备好后可以直接返回,不用额外等待。

我的建议: 在设计AXI4-Lite从机时,我通常把RREADY默认拉高。这样读操作只需要等待从机返回数据,延迟最小。但要注意,如果主机还没准备好接收,RREADY必须拉低,否则数据会丢失。

2.5 实战中的注意事项

最后分享几个我在项目中积累的经验:

  • 地址对齐: AXI4-Lite要求地址必须32位对齐。如果你要访问一个字节,也得用32位地址,然后通过字节使能(WSTRB)来选择。但AXI4-Lite没有WSTRB信号,所以只能按字访问。
  • 响应处理: 除了OKAY(2'b00),还有SLVERR(2'b10)和DECERR(2'b11)。SLVERR表示从机错误,比如访问了不存在的地址。DECERR是译码错误,一般由互联逻辑产生。
  • 超时处理: 如果从机一直不拉高READY,主机就会卡死。我建议在主机侧加一个超时计数器,比如等待256个时钟周期后强制终止传输,并返回超时错误。

好了,AXI4-Lite协议的基础知识就讲到这里。这些内容看起来有点枯燥,但它是你后面实现按键消抖模块的基础。下一章我们会动手写一个AXI4-Lite从机接口的RTL代码,到时候你就知道这些信号怎么用了。

可可精品资料库