FPGA 进阶 10:AXI4-Stream 与 AXI4-Lite——数据流与寄存器接口入门
本文是
fpga/进阶层第 14 篇。在 Zynq、Vivado IP Integrator、Vitis 软件生态里,AXI 是 FPGA 工程师绕不开的片上接口。这篇聚焦两个最常用子集:AXI4-Stream(数据流)和 AXI4-Lite(寄存器配置)。协议完整规则(五通道、burst、ID 保序)见芯片设计进阶的 AXI4-Lite 从机、AXI4 完整协议,本篇讲 FPGA 里怎么接 IP、怎么和 PS/Block Design 配合。
本文要回答的问题
- AXI4-Stream 传什么?VALID/READY/LAST/KEEP 各是干嘛?
- Stream 和 valid/ready 握手、FIFO 什么关系?
- AXI4-Lite 怎么用来读写寄存器?五通道怎么简化?
- Zynq 里 PS 怎么通过它配置 PL?数据通路怎么搭?
一、两个子集定位
| AXI4-Stream | AXI4-Lite | |
|---|---|---|
| 用途 | 单向数据流(FIFO/DMA/视频/DSP 流水) | 内存映射寄存器配置/状态 |
| 地址 | 无地址 | 有地址(读/写地址通道) |
| 突发 | 概念上连续流,TLAST 分包 | 不支持 burst,一次一字 |
| 核心信号 | TVALID/TDATA/TREADY/TLAST/TKEEP | AW/W/B/AR/R 五通道 |
| 典型 | 传感器→FIFO→DMA、模块间数据 | CPU 读写控制/状态寄存器 |
二、AXI4-Stream:标准化的 valid/ready 数据流
Stream 就是把 valid/ready 握手标准化:主设备拉 TVALID 表示 TDATA 有效,从设备拉 TREADY 表示能接收,两者同高的时钟沿完成一次传输。
// Stream slave 简化:valid&ready 同拍时接收
always @(posedge clk) begin
if (rst_n && s_tvalid && s_tready) begin
buf <= s_tdata; // 握手成功才锁存
if (s_tlast) end_of_packet();
end
end
// 反压:没准备好就拉低 ready(FIFO 满时 ready=0)
assign s_tready = !fifo_full;信号含义:
- TVALID / TREADY:握手对,支持反压(slave 拉低 ready,master 必须保持 valid/data 不变直到成交);
- TDATA:数据(常 8/16/32/64 位宽);
- TLAST:标记一个包/帧的最后一个 beat(如以太网一帧、一行视频结束);
- TKEEP/TSTRB:标出 TDATA 里哪些字节有效(位宽非整包时的尾字节);
- TUSER 可带用户元信息(如字节起始、帧标记)。
握手铁律(和通用 valid/ready 一致):
- VALID 一旦拉高,在成交前不能撤、也不能等 READY 才决定输出;
- 不能用 READY 组合产生 VALID(会形成组合逻辑环路、死锁/振荡)——READY 可以依赖 VALID,VALID 不要依赖 READY;
- 跨模块间插一级 Skid Buffer(弹性寄存器)切断组合长路径,利于时序收敛。
Stream 天生适配 FIFO:master 的 valid 接 FIFO 写使能、ready 接 !full;Xilinx AXI-Stream Data FIFO IP 直接 Stream 进 Stream 出、内部自动反压。
三、AXI4-Lite:CPU 读写 FPGA 寄存器
AXI4-Lite 是完整 AXI4 的轻量版:保留五通道、去掉 burst(每次只传一个 32 位字),逻辑极简,专做寄存器接口。五通道:
| 通道 | 信号 | 作用 |
|---|---|---|
| 写地址 | AWVALID/AWADDR/AWREADY | 主机发要写的地址 |
| 写数据 | WVALID/WDATA/WSTRB/WREADY | 主机发数据 |
| 写响应 | BVALID/BRESP/BREADY | 从机回「写好了」 |
| 读地址 | ARVALID/ARADDR/ARREADY | 主机发要读的地址 |
| 读数据 | RVALID/RDATA/RRESP/RREADY | 从机回数据 |
寄存器块骨架(写):
// 写:AW 和 W 都握手后,按地址译码写寄存器,再回 BRESP
always @(posedge clk) begin
if (!rst_n) begin ctrl<=0; cfg<=0; bvalid<=0; end
else if (awvalid && awready && wvalid && wready) begin
case (awaddr[7:0])
8'h00: ctrl <= wdata;
8'h04: cfg <= wdata;
endcase
bvalid <= 1'b1; // 回写响应
end
else if (bvalid && bready) bvalid <= 1'b0;
end读通道在 AR 握手后按地址把对应寄存器放上 RDATA、拉 RVALID。软件侧就像读写内存:Xil_Out32(BASE+0x00, val) / Xil_In32(BASE+0x04)。
四、在 Zynq/Block Design 里怎么连
典型架构(后续 Zynq 篇 #26/#27 展开):

- 控制面:PS 的
M_AXI_GP经 AXI Interconnect 连到各 IP 的S_AXI_LITE,Block Design 自动分配地址,软件读写寄存器配置硬件; - 数据面:AXI DMA/VDMA 做 Stream↔内存映射桥:流侧 AXI4-Stream 接处理流水(带反压不丢数),内存侧 AXI4 burst 经
M_AXI_HP高速口搬 DDR;
五、典型坑与调试
| 坑 | 后果 | 正确做法 |
|---|---|---|
| 用 ready 组合生成 valid | 组合环路、死锁 | valid 不依赖 ready;ready 可等 valid |
| 反压时 master 撤 valid/改 data | 丢数 | ready 低时保持 valid/data 直到成交 |
| 忘记 TLAST | 包/帧边界错乱 | 包尾拉高 TLAST |
| AXI-Lite 不回 BRESP/RVALID | CPU 卡死等响应 | 写后回 bvalid、读后给 rvalid |
| 地址没在 Block Design 分配 | 软件访问错地址 | 让 IP Integrator 自动分配地址段 |
| Stream 模块间直连无缓冲 | 长组合路径时序差 | 插 Skid Buffer / AXI-Stream FIFO |
调试:用 ILA 抓 AXI 握手信号(valid/ready/last)和 Lite 五通道,看「valid 高但 ready 一直低」(反压/死锁)、「BRESP 不回」(从机没响应);Zynq 上可先用 Xil_Out32/Xil_In32 做寄存器回环自测。
相关与延伸
协议深讲(通用/芯片视角):AXI4-Lite 从机设计(五通道握手/寄存器读写)、AXI4 完整协议(burst/outstanding/ID)、valid/ready 握手与 Skid Buffer。 FPGA 展开:AXI4 完整与互联见规划 #16、Zynq SoC/AXI DMA 见 #26/#27、块设计 IP Integrator 见 #28。
一句话总结
AXI 在 FPGA 里最常用两个子集:AXI4-Stream 是标准化的单向数据流接口——TVALID/TDATA 主端发、TREADY 从端反压、两者同高才成交、TLAST 标包尾、TKEEP 标有效字节,本质就是 valid/ready 握手,铁律是 valid 一旦拉高不能撤、不能用 ready 组合产生 valid(防组合环路),天然适配 FIFO(ready=!full)和 DMA 流侧;AXI4-Lite 是去掉 burst 的轻量内存映射接口,五通道(写地址/写数据/写响应、读地址/读数据)每次传一个字,专门做 CPU 读写 FPGA 寄存器,按地址译码写寄存器/回 BRESP、读回 RDATA/RVALID。Zynq 里控制面走 PS 的 M_AXI_GP 经 AXI Interconnect 连各 IP 的 S_AXI_LITE(Block Design 自动分配地址,软件 Xil_Out32/In32 当内存访问),数据面走 AXI DMA/VDMA 做 Stream↔DDR 的桥(Stream 反压不丢数、内存侧 AXI4 burst)——Stream 管数据、Lite 管配置,是 Xilinx 生态最核心的两条接口范式。