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位足够了。
2.2 握手协议:VALID/READY机制
AXI4-Lite的握手协议,说白了就是「你准备好了吗?我准备好了!」的对话。发送方拉高VALID表示数据有效,接收方拉高READY表示可以接收。当两者同时为高时,传输发生。
这里有个关键点:VALID不能依赖READY。也就是说,发送方一旦拉高VALID,就必须保持到握手完成。而READY可以等到VALID来了再拉高,也可以提前拉高。
我曾经在一个项目中踩过坑:从机设计时,我把READY信号跟VALID做了组合逻辑,结果时序跑不过。后来才意识到,READY最好用寄存器打一拍,避免组合路径过长。
握手有几种常见场景:
- VALID先到,READY后到:最常见的情况。主机先发地址,从机处理完后拉高READY。
- READY先到,VALID后到:从机提前准备好,主机随时可以发起传输。
- 同时到达:一拍完成传输,效率最高。
下面这张图展示了握手的基本流程:
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可以提前拉高,表示主机随时准备接收数据。这样从机准备好后可以直接返回,不用额外等待。
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代码,到时候你就知道这些信号怎么用了。
可可精品资料库