FPGA 中的 AXI 总线介绍

FPGA 中的 AXI 总线介绍

1. AXI 家族一张图

复制代码
AXI4      ------ 存储器映射,高带宽突发读写(DDR/HP端口)
AXI4-Lite ------ 存储器映射,低带宽寄存器读写(控制/状态寄存器)
AXI4-Stream------ 纯数据流,无地址,适合高速流水线(DMA/视频/ADC数据)

分层理念

  • 控制面:AXI4-Lite(寄存器、启动/停止、阈值等)

  • 数据面:AXI4(到内存)或 AXI4-Stream(流→DMA→内存/外设)

  • 中间衔接:DMA / Interconnect / SmartConnect / Clock Converter / Protocol Converter

2. AXI 通道与握手:VALID/READY 的"一进一出"

AXI4/AXI4-Lite 有 5 条通道(读写各自独立):

  • 写地址 AW*、写数据 W*、写响应 B*

  • 读地址 AR*、读数据 R*

AXI4-Stream 只有数据通道TVALID/TREADY/TDATA/TLAST/TKEEP/TUSER

黄金法则只有当 VALID=1READY=1 的那个周期,数据/地址才被"传送"

背压(Backpressure)由 从属端 通过拉低 READY 产生,上游必须_保持_当前拍数据与控制信号稳定直至握手达成。

3. 关键信号速查(常见子集)

3.1 AXI4/AXI4-Lite

  • 地址:AWADDR/ARADDR(字节地址),AWLEN/ARLEN(突发长度,AXI4)

  • 大小:AWSIZE/ARSIZE(一次 beat 的字节数编码)

  • 类型:AWBURST/ARBURST(固定/递增/环回)

  • 写数据:WDATAWSTRB(字节写使能)、WLAST

  • 读数据:RDATARRESPRLAST

  • ID/排序:AWID/ARID + BID/RID(并发与乱序完成)

  • 属性:PROT/CACHE/QOS(缓存、仲裁提示,SoC 上常用)

3.2 AXI4-Stream

  • TDATA[N-1:0]TKEEPTLAST(分帧)、TUSER(带外/副通道)

  • TID/TDEST(路由/多路)

4. 吞吐/时延估算(常用公式,便于选型)

  • 单口有效吞吐(以 beat 为单位):
    Throughput≈DataWidth(bits)×Utilization×fclk \text{Throughput} \approx \text{DataWidth(bits)} \times \text{Utilization} \times f_{\text{clk}} Throughput≈DataWidth(bits)×Utilization×fclk

  • WSTRB 的有效字节率(写):
    ByteRate≈(∑WSTRB_onesBeats)fclk \text{ByteRate} \approx \left(\frac{\sum \text{WSTRB\ones}}{\text{Beats}}\right) f{\text{clk}} ByteRate≈(Beats∑WSTRB_ones)fclk

  • 突发的平均利用率(读/写):
    Utilization≈BeatsBeats+WaitCycles \text{Utilization} \approx \frac{\text{Beats}}{\text{Beats}+\text{WaitCycles}} Utilization≈Beats+WaitCyclesBeats

  • 环形缓冲抗抖动容量:
    Buffer≥(Rin‾−Rout‾)+×Tburst \text{Buffer} \ge (\overline{R_{\text{in}}}-\overline{R_{\text{out}}})^{+}\times T_{\text{burst}} Buffer≥(Rin−Rout)+×Tburst

5. 设计套路:三大典型拓扑

5.1 "寄存器 + 流"的双面架构

  • AXI4-Lite:配置/状态(门槛、模式、计数器)

  • AXI4-Stream:数据面(ADC→DSP→FIFO→DMA)

5.2 "流→内存"的 DMA 架构

  • 流侧 AXIS:TVALID/TREADY/TLAST 分帧

  • DMA(如 Xilinx AXI DMA/Datamover、XDMA)把 AXIS 写入 DDR(AXI4),再由 CPU/PCIe 读

5.3 "内存→流"的回放架构

  • 读 DDR(AXI4)→ Datamover → AXIS → 下游 IP / DAC

建议 :控制面与数据面分时钟域 、分层清晰;跨域用 AXI Clock ConverterAXIS FIFO(CDC)

6. 时序与约束:稳定系统的底线

  • 保持规则 :当 VALID=1 且对端 READY=0所有负载信号必须保持不变(地址、数据、ID、LAST、KEEP...)。

  • Skid Buffer(单拍弹簧):在 READY 可能抖动的边界(如跨层/跨时钟)加一拍寄存器或小 FIFO,避免毛刺/违约。

  • 跨时钟域:优先用官方 CDC IP;手写 AXIS CDC 需用灰码计数 + 双口 RAM。

  • AXI4-Lite :地址与数据通道可乱序到达,但一次写的 AW/W 必须成对,常用"打拍对齐"以简化。

7. 常见突发(AXI4)与对齐

  • INCR 递增突发最常用,AWLEN/ARLEN 指定 beat 数(len+1)。

  • AWSIZE/ARSIZE 应与数据宽度匹配(如 64bit→SIZE=3'b011),否则注意字节对齐与掩码。

  • WLAST/RLAST 宣告突发最后一个 beat。

最佳实践 :对齐到缓存线/DDR 突发边界LEN 选择让控制器最省开销(例如 16 或 32 beats)。

8. AXI4-Lite:寄存器地图与最小从机骨架

8.1 典型寄存器地图(可直接套用)

复制代码
0x000 VERSION      R   固件版本
0x004 BUILD_TIME   R   构建时间戳
0x010 CTRL         RW  [0]start [1]stop [8]soft_rst
0x014 STATUS       R   [0]running [1]err [2]fifo_af
0x020 CFG0         RW  用户参数0
0x024 CFG1         RW  用户参数1
0x030 STAT_PKTS    R   包计数
0x034 STAT_DROP    R   丢包计数

8.2 Verilog:AXI-Lite 从机框架(片段,可直接改)

verilog 复制代码
// reply 2
module axil_regs #(
  parameter ADDR_W = 12
)(
  input  wire         ACLK,
  input  wire         ARESETN,
  // AXI-Lite Slave interface (简化命名)
  input  wire [ADDR_W-1:0] S_AWADDR, input wire S_AWVALID, output wire S_AWREADY,
  input  wire [31:0]       S_WDATA,  input wire [3:0] S_WSTRB,
  input  wire              S_WVALID, output wire S_WREADY,
  output reg  [1:0]        S_BRESP,  output reg  S_BVALID, input wire S_BREADY,
  input  wire [ADDR_W-1:0] S_ARADDR, input wire S_ARVALID, output wire S_ARREADY,
  output reg  [31:0]       S_RDATA,  output reg  [1:0] S_RRESP,
  output reg               S_RVALID, input  wire S_RREADY,

  output reg  [31:0] reg_ctrl,
  input  wire [31:0] reg_status,
  output reg  [31:0] reg_cfg0,
  output reg  [31:0] reg_cfg1,
  input  wire [31:0] stat_pkts,
  input  wire [31:0] stat_drop
);
  // 省略握手状态机:建议用"一拍写、一拍应答"模板 + skid buffer
  // 写通道
  // ...(AW/W 对齐、WSTRB 应用、BRESP=OKAY)
  // 读通道
  always @(*) begin
    case (S_ARADDR[ADDR_W-1:0])
      12'h010: S_RDATA = reg_ctrl;
      12'h014: S_RDATA = reg_status;
      12'h020: S_RDATA = reg_cfg0;
      12'h024: S_RDATA = reg_cfg1;
      12'h030: S_RDATA = stat_pkts;
      12'h034: S_RDATA = stat_drop;
      default: S_RDATA = 32'hDEAD_BEEF;
    endcase
  end
  // TODO: 完整握手与复位逻辑
endmodule

9. AXI4-Stream:分帧、背压与 TKEEP

  • 分帧用 TLAST;字节有效用 TKEEP;副通道/标记用 TUSER

  • 背压 :当下游 TREADY=0 时,上游必须保持当前 T*

  • 合规 FIFO:用官方 AXIS FIFO/RegSlice/SkidBuffer,既做 CDC 也做打拍。

Verilog:极简 AXIS 直连(带背压)

verilog 复制代码
// reply 2
assign m_tdata  = s_tdata;
assign m_tkeep  = s_tkeep;
assign m_tlast  = s_tlast;
assign m_tvalid = s_tvalid;
assign s_tready = m_tready; // 背压直通

10. AXI 到 DDR:Datamover/DMA 的"正确打开方式"

  • 写 DDR(S2MM):AXIS→Datamover 写通道→AXI4(AW/W/B)

  • 读 DDR(MM2S):AXI4(AR/R)→Datamover 读通道→AXIS

  • 描述符环 :主机/PS 侧准备物理地址+长度;FPGA 侧按 TLAST/帧界定填充

  • 性能关键 :突发对齐、LEN 合理、足够 outstanding、避免小包抖动

11. Interconnect/SmartConnect 仲裁与并发

  • 仲裁:固定优先级/轮询/加权;避免低优先级长期饥饿

  • 并发 :利用 ID 拆分/聚合事务;保证必要的顺序一致性(同 ID 保序)

  • 带宽规划 :上游峰值之和 > DDR 可承载 → 必须引入节流/缓存背压传播

12. 常见问题清单(踩坑速救)

  1. VALID 稳定性违规:READY 拉低时仍改变负载 → 随机丢/错

  2. WSTRB 误用:半字/字节写未掩码 → 覆盖邻近寄存器/数据

  3. WLAST/RLAST 漏/多:突发粘包或过早终止 → 下游状态机异常

  4. 突发未对齐:穿越 DDR 突发边界 → 带宽骤降

  5. CDC 漏做:跨时钟域直接连 → 间歇性死锁/毛刺

  6. Outstanding 太少:高延迟 DDR 下吞吐拉胯

  7. Interconnect 饥饿:固定优先级压死低优口,统计计数器飙升

  8. AXIS 无缓冲:READY 抖动导致上游气泡,速率不达标

13. 约束与验证建议

  • 时序约束:为 AXI/AXIS 时钟域分别建时钟、设置 IO 延时、跨域 false path 交给 CDC IP

  • 仿真:使用 AXI VIP/Bus Functional Model,覆盖:单拍、长突发、背压、乱序、错误响应

  • 硬件观测:ILA 插到关键握手与 FIFO 水位;统计寄存器记录丢包/背压时间

  • 压测:PRBS/计数器源,长时间跑(1h/24h),记录 Utilization/Drop

14. 可复用模块清单(建议直接用 IP/骨架)

  • Clock/Protocol Converter:AXI Clock Converter、Protocol Converter

  • 流水稳态:AXI/AXIS RegSlice、Skid Buffer、AXIS FIFO(CDC)

  • 存储搬运:AXI DMA / Datamover / CDMA / XDMA(PCIe)

  • 互连:AXI Interconnect / SmartConnect(多主多从)

  • 验证:AXI VIP、AXIS VIP、Scoreboard + Coverage

15. 迷你模板:AXIS 到 AXI4 的"打包写"控制器(思路)

  1. 累计 BeatCnt 与字节数,遇到 TLAST 或计数达阈值 → 触发一次写突发

  2. 生成 AW*(地址、LEN、SIZE、BURST),随后打出 W* 序列并在最后一拍置 WLAST

  3. 等待 B* 应答;统计 BRESP 错误

  4. 地址按固定步长递增,跨页换描述符

结合 Datamover 可显著简化,实现上尽量复用官方 IP,自己写控制层逻辑即可。

16. 收尾:一条"黄金路径"

  1. 确定数据面/控制面分工(AXI-Stream + AXI4-Lite)

  2. 规划带宽与突发参数(对齐缓存线/DDR 突发)

  3. 插足够的 RegSlice/FIFO/CDC 保证稳定与时序

  4. 利用 DMA/Datamover 落地"流↔内存"

  5. 用统计计数器 + ILA 做长期压测与定位

  6. 把寄存器地图/协议写成文档,与上位机脚手架一并版本化

相关推荐
仲南音2 天前
Xilinx FPGA——时钟IP核MMCM、PLL
fpga开发
I'm a winner2 天前
基于Xilinx FPGA的LVDS高速串行通信系统(三)--数据训练及握手机制【文末源码】
fpga开发
upper20203 天前
coremark移植坑之-nostartfiles -nostdlib参数
学习·fpga开发·coremark移植·riscv设计
Eloudy3 天前
Vivado 纯命令行构建 FPGA 项目教程
fpga开发
Rambo.xia3 天前
AXI跨时钟域与数据一致性——CDC FIFO深度不够、写后读冒险、多Master仲裁、乱序返回,出了Bug根本查不出来
fpga开发·bug
upper20203 天前
FPGA部署卷积神经网络识别MINST图片
fpga开发·卷积神经网络·minst·minst识别·部署神经网络·神经网络识别图片
你是我的解忧王子3 天前
嵌入式 ADC采样 原始数据分析上层(平均值 波动率 正态分布 线性补偿 系统误差)
fpga开发·数据挖掘·数据分析
9527华安4 天前
FPGA纯verilog代码ISP图像处理培训教程,基于IMX214,提供工程源码+视频教程+FPGA开发板
图像处理·fpga开发·isp·imx214·mipi
千寻xun5 天前
二、实战篇-NVME SSD控制之ZYNQ实现(六)-读写NVME SSD硬盘数据
fpga开发·nvme·nvme ssd
千寻xun5 天前
二、实战篇-NVME SSD控制之ZYNQ实现(三)
fpga开发·nvme ssd·nvme协议