AXI4-Lite 从机设计:寄存器读写、五通道握手与地址解码
更新时间:2026-09-06。本文是「集成电路大类 · 芯片设计」**进阶层(intermediate)**第五篇新正文(#07)。入门层 寄存器表与地址解码 讲了软件怎么靠一组寄存器驱动硬件,AMBA 入门 给了 AXI/AHB/APB 的一句话区别,上一篇 valid/ready 握手 练熟了握手规则——这一篇把三者合起来,手写一个 CPU 能真正读写的 AXI4-Lite 从机。
本文要回答的问题
- AXI4-Lite 的五个通道各传什么?一笔写/一笔读分别怎么走?
- 从机 RTL 里地址、数据、响应怎么配对?WSTRB 干什么用?
- OKAY / SLVERR / DECERR 三种响应什么区别?
- 为什么叫「Lite」,它和完整 AXI4 差在哪?
一、五通道:两条地址、两条数据、一条响应
AXI4-Lite 是 AXI4 的精简子集:每笔传输只传一个数据、不支持 burst,但通道结构与完整 AXI4 一致(完整协议见 AXI4 完整协议 #08):
| 通道 | 方向 | 关键信号 | 干什么 |
|---|---|---|---|
| AW 写地址 | 主机→从机 | AWADDR/AWVALID/AWREADY | 告诉从机「写哪个地址」 |
| W 写数据 | 主机→从机 | WDATA/WSTRB/WVALID/WREADY | 送数据,WSTRB 标哪些字节有效 |
| B 写响应 | 从机→主机 | BRESP/BVALID/BREADY | 从机回执「写好了/出错」 |
| AR 读地址 | 主机→从机 | ARADDR/ARVALID/ARREADY | 告诉从机「读哪个地址」 |
| R 读数据 | 从机→主机 | RDATA/RRESP/RVALID/RREADY | 从机把数据和响应送回 |
每个通道都是一套独立的 valid/ready 握手,规则与进阶 #06 完全相同:valid 举起不放、ready 随时可拉、同拍为 1 完成传输。读写通道互相独立——可以一边写一边读,这是 AXI 比老总线(AHB 共用一组线)带宽高的原因之一。
二、一笔写的完整时序

关键次序:AW 和 W 谁先到都行(协议允许),但从机必须在两者都握手后才能执行写入并回 B。新手常错在假设「AW 一定先于 W」——仿真器里 CPU 模型确实常常先发地址,但 VIP/验证环境会故意打乱次序,所以从机要分别暂存:AW 握手后锁存 awaddr,W 握手后锁存 wdata/wstrb,两个都齐了再写寄存器、拉 BVALID。BVALID 举起后同样保持到 BREADY 握手。
三、从机 RTL 骨架
// 写通路:暂存地址与数据,齐了就执行
always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
aw_done <= 1'b0; w_done <= 1'b0; bvalid <= 1'b0;
ctrl <= 32'h0; // 0x10: 控制寄存器(RW)
end else begin
if (awvalid && awready) begin aw_addr <= awaddr; aw_done <= 1'b1; end
if (wvalid && wready) begin w_data <= wdata; w_strb <= wstrb; w_done <= 1'b1; end
if (aw_done && w_done && !bvalid) begin
// 地址解码 + 按字节使能写
case (aw_addr[11:0])
12'h010: begin
if (w_strb[0]) ctrl[ 7:0] <= w_data[ 7:0];
if (w_strb[1]) ctrl[15:8] <= w_data[15:8];
// ...WSTRB 逐字节,支持字节/半字写
end
default: ; // 未实现地址 -> 响应 SLVERR/DECERR
endcase
bvalid <= 1'b1; bresp <= OKAY;
aw_done <= 1'b0; w_done <= 1'b0;
end
if (bvalid && bready) bvalid <= 1'b0;
end
end
// ready 可以简单组合:空闲即能收
assign awready = !aw_done;
assign wready = !w_done;读通路更简单:AR 握手锁存地址,下一拍(或同拍,组合读出时)给 RDATA/RVALID。读数据建议寄存一拍输出——组合读会把寄存器堆的读译码变成 AR 到 R 的长组合路径,拖慢频率。
四、地址解码与三种响应
- 地址解码:SoC 级 decoder 看高位地址(基地址 + 掩码)选中哪个从机;从机内部看低位偏移选哪个寄存器(呼应入门层 地址解码)。访问到不存在的地址,decoder/从机回 DECERR(decode error);
- SLVERR:地址合法但访问被拒(写只读寄存器、未初始化、从机内部错误状态);
- OKAY:正常。Lite 还有 EXOKAY 但不用。
32 位 Lite 要求访问自然对齐(32 位访问按 4 字节对齐),非对齐访问会报 SLVERR——软件侧由驱动保证。WSTRB 在 Lite 里用于字节写(如只写 1 字节配置位),写全字时全 1。
五、Lite 的定位与什么时候用什么
| AXI4-Lite | AXI4 完整版 | AXI4-Stream | |
|---|---|---|---|
| 传输 | 单数据、无 burst | burst 最长 256 拍、outstanding | 连续流、无地址 |
| 典型用途 | 配置寄存器(UART/SPI/时钟/中断控制器) | CPU↔内存、DMA 搬数 | 数据流(DMA/网络/视频) |
| 从机复杂度 | ~100–200 行 RTL | 复杂(ID、burst、缓冲) | 极简(valid/ready+data) |
一个 SoC 里三者各司其职:CPU 用 Lite(经 AXI-to-APB bridge,见 AHB/APB 与桥接 #09)配置外设,DMA 用完整 AXI4 搬数据,模块间流用 Stream(#06)。手写的第一个总线从机几乎必然是 Lite——每个带寄存器的模块都需要一个。
相关与延伸
上一篇:valid/ready 握手。下一篇:AXI4 完整协议:五通道、burst、outstanding 与 ID 序。入门铺垫:寄存器表与地址解码、AMBA 入门、片上总线 AMBA 枢纽页;低速外设侧见 AHB/APB 与桥接,外设实例见进阶 #29 常见外设 RTL,验证总线用 VIP 见进阶 #40。
总结
AXI4-Lite 从机 = 五通道各自 valid/ready 握手 + AW/W 分别暂存配对后写寄存器 + B/R 回执;地址解码分两级(SoC 选从机、从机选寄存器),未实现地址回 DECERR、非法访问回 SLVERR,它是每个带配置寄存器模块的标准前门。