3、AXI Interconnect IP核详解:架构、配置选项、地址映射

AXI Interconnect,说白了就是AXI总线上的“交通枢纽”。

我刚开始接触Vivado时,总觉得这玩意儿就是个简单的“连线器”。直到有一次,我在一个多主多从的项目里,遇到了数据冲突和时序收敛问题,折腾了整整三天。嗯,从那以后,我才真正开始认真研究这个IP核的内部门道。

3.1 架构:它到底长什么样?

AXI Interconnect的核心架构,可以理解为一个可配置的交叉开关矩阵。它内部主要包含三个关键模块:

  • Slave Interface (SI):连接主设备(如CPU、DMA)的接口。每个SI都有一组独立的读写通道。
  • Master Interface (MI):连接从设备(如DDR、BRAM)的接口。每个MI对应一个从设备端口。
  • Crossbar Switch:核心交换矩阵,负责将SI的请求路由到正确的MI上。

我个人习惯把它的架构想象成一个“电话总机”。主设备是打电话的人,从设备是接电话的人,而Interconnect就是那个接线员。接线员(Crossbar)根据你拨的号码(地址),把线路接通。

关键点:AXI Interconnect支持N对M的连接,即N个主设备可以同时访问M个从设备,只要它们访问的不是同一个从设备。

下面这张图,是我用SVG画的,帮你直观理解它的内部结构:

AXI Interconnect 内部架构图 Master 0 (CPU) Master 1 (DMA) Master 2 (GPU) SI 0 SI 1 SI 2 Crossbar 交换矩阵 地址译码 仲裁逻辑 MI 0 MI 1 MI 2 Slave 0 (DDR) Slave 1 (BRAM) Slave 2 (UART)

3.2 配置选项:这些参数到底怎么调?

在Vivado的IP Catalog里双击AXI Interconnect,你会看到一堆配置选项。别慌,我带你一个个捋清楚。

3.2.1 接口数量配置

  • Number of Slave Interfaces:主设备数量。比如你有CPU和DMA两个主设备,就设成2。
  • Number of Master Interfaces:从设备数量。比如你挂了DDR、BRAM、UART三个从设备,就设成3。

我的经验:接口数量不是越多越好。每增加一个接口,Crossbar的逻辑复杂度就会增加,时序也会变差。我一般控制在4个以内,超过这个数我会考虑用两级互联。

3.2.2 地址宽度与数据宽度

参数 说明 我的建议
Address Width 地址总线宽度,决定寻址范围 32位够用,64位留给DDR
Data Width 数据总线宽度,决定单次传输数据量 32位或64位,看你的从设备
ID Width 事务ID宽度,支持乱序传输 默认即可,除非你需要深度乱序

3.2.3 寄存器切片(Register Slice)

这个选项,说白了就是给总线加“缓存”。

  • Enable Register Slice on SI:在主设备侧插入寄存器,改善时序。
  • Enable Register Slice on MI:在从设备侧插入寄存器,改善时序。

避坑指南:我曾经在一个高频设计中,不加Register Slice,结果时序报告一片红。加了之后,时序收敛了,但延迟增加了2个时钟周期。所以,时序和延迟之间需要权衡。高频设计(>200MHz)建议至少加一级。

3.3 地址映射:怎么给每个从设备分配地址?

地址映射,是AXI Interconnect配置中最关键的一步。你想想看,主设备发出一个地址,Interconnect怎么知道该路由到哪个从设备?

答案就在Address Editor里。在Vivado的Block Design中,点击“Address Editor”标签页,你会看到类似下面的表格:

Slave Interface Master Interface Base Address Range High Address
SI_0 (CPU) MI_0 (DDR) 0x8000_0000 256M 0x8FFF_FFFF
SI_0 (CPU) MI_1 (BRAM) 0x0000_0000 64K 0x0000_FFFF
SI_1 (DMA) MI_0 (DDR) 0x8000_0000 256M 0x8FFF_FFFF

这里有几个关键点:

  • Base Address:每个从设备的起始地址。不能重叠,否则会冲突。
  • Range:地址空间大小。必须大于等于从设备的实际地址需求。
  • High Address:自动计算,等于Base Address + Range - 1。

核心原则:地址映射的本质是地址译码。Interconnect内部会有一个地址比较器,当主设备发出的地址落在某个从设备的地址范围内时,就把这个请求路由过去。

3.3.1 地址对齐问题

嗯,这里要注意。地址映射时,Base Address必须与Range对齐。比如Range是64K,那么Base Address必须是64K的整数倍。为什么?因为Interconnect内部用高位地址做译码,不对齐会导致译码逻辑出错。

我曾经遇到一个坑:把BRAM的Base Address设成了0x0000_1000,Range是64K。结果CPU访问0x0000_1000时,数据死活不对。查了半天,发现是地址没对齐。改成0x0000_0000后,一切正常。

3.3.2 多主设备共享从设备

多个主设备可以访问同一个从设备,比如CPU和DMA都可以访问DDR。这时,Interconnect内部的仲裁器会决定谁先访问。仲裁策略有:

  • Round Robin:轮流访问,公平但效率低。
  • Priority:优先级高的先访问,适合实时性要求高的场景。

我的习惯:CPU用高优先级,DMA用低优先级。因为CPU通常对延迟更敏感,而DMA可以忍受一些等待。

3.4 实战中的几个小技巧

  1. 减少Crossbar的复杂度:如果主设备只访问特定的从设备,可以在Interconnect的“Connection”配置中手动指定连接关系,而不是让所有主设备都能访问所有从设备。这样能减少逻辑资源消耗。
  2. 合理使用Register Slice:长走线(比如从FPGA的一侧到另一侧)一定要加Register Slice。我一般在SI和MI两侧都加一级,时序会好很多。
  3. 地址空间规划:建议把大容量设备(如DDR)放在高地址,小容量设备(如BRAM、寄存器)放在低地址。这样地址译码逻辑更简单。

好了,AXI Interconnect的架构、配置和地址映射,就聊到这儿。这些东西,你多用几次自然就熟了。刚开始可能会觉得参数多,但每个参数背后都有它的设计逻辑。理解了这些逻辑,你就能用好它。

一句话总结:AXI Interconnect就是帮你把多个主设备和多个从设备“优雅地”连在一起,同时处理好地址路由、仲裁和时序问题。

可可精品资料库