2. AXI4-Full协议详解:通道定义、握手信号、读写事务、突发传输、原子访问

大家好,我是你们的FPGA设计老手。今天咱们来啃一块硬骨头——AXI4-Full协议。说实话,我刚入行那会儿,看到AXI的时序图就头大。但后来发现,只要把几个核心概念吃透了,这玩意儿其实挺顺手的。

AXI4-Full,说白了就是ARM公司搞的一套高性能总线协议。它跟AXI4-Lite和AXI4-Stream最大的区别在于——它支持突发传输和原子访问。嗯,这两个特性在DDR控制器、PCIe接口这些场景里特别有用。

AXI4-Full协议知识体系 AXI4-Full 核心 5个独立通道 AW / AR / W / R / B 握手机制 VALID / READY 握手机制 读写事务 读事务 / 写事务 突发传输 FIXED / INCR / WRAP 原子访问 独占访问 / 锁定访问 应用场景 DDR / PCIe / DMA AXI4-Full = 5通道 + 握手 + 突发 + 原子操作

2.1 五个独立通道

AXI4-Full最让我欣赏的设计,就是它把读写操作拆成了五个独立的通道。你想想看,这就像高速公路上的不同车道——读地址、写地址、写数据、读数据、写响应,各走各的道,互不干扰。

  • AW通道(写地址通道):Master告诉Slave我要往哪个地址写数据
  • W通道(写数据通道):Master把数据扔到总线上
  • B通道(写响应通道):Slave写完后回个状态——写成功了还是出错了
  • AR通道(读地址通道):Master告诉Slave我要从哪个地址读数据
  • R通道(读数据通道):Slave把读到的数据返回给Master
我的小经验:刚开始设计AXI接口时,我总搞混AW和AR。后来我记了个口诀——"A"是地址,"W"是写,"R"是读。AW就是写地址,AR就是读地址。简单吧?

2.2 握手信号——VALID和READY

AXI的握手,说白了就是"你准备好了吗?我准备好了!"这么个过程。每个通道都有两个核心信号:VALID和READY。

VALID:发送方说"我这里有数据,你赶紧来拿"
READY:接收方说"我准备好了,你发过来吧"

握手有三种情况:

  1. VALID先有效,READY后有效——发送方先准备好,接收方稍后响应
  2. READY先有效,VALID后有效——接收方先准备好,发送方稍后发送
  3. 两者同时有效——一拍搞定,效率最高

关键点:数据只在VALID和READY同时为高的时钟上升沿传输。少一个都不行。

我记得有一次调试一个AXI接口,数据死活传不过去。查了半天,发现是VALID信号拉高后,READY一直没响应。后来发现Slave的ready逻辑里有个bug——它要等两个周期才能准备好。嗯,这种问题在复杂系统里特别容易遇到。

2.3 读写事务流程

咱们先看读事务。读事务其实挺直白的:

// 读事务时序(简化描述)
// 1. Master在AR通道上发地址
// 2. Slave在R通道上返回数据
// 3. 一拍一拍传完所有数据

// 写事务稍微复杂点:
// 1. Master在AW通道上发地址
// 2. Master在W通道上发数据
// 3. Slave在B通道上返回写响应

写事务有个坑——地址和数据可以同时发,也可以地址先发、数据后发。我见过不少新手把地址和数据绑在一起,结果时序跑不顺。其实AXI允许它们解耦,你完全可以先发地址,等几个周期再发数据。

注意:写响应B通道必须等所有数据都传完才能返回。别想着数据还没传完就回响应,那会出大问题。

2.4 突发传输

突发传输是AXI4-Full的看家本领。说白了,就是一次地址请求,连续传多笔数据。这比一笔一笔传效率高太多了。

AXI支持三种突发类型:

突发类型 说明 典型应用
FIXED 所有数据都访问同一个地址 FIFO操作、状态寄存器轮询
INCR 地址递增,每次加一个数据宽度 内存拷贝、DMA传输
WRAP 地址递增到边界后回绕 Cache line填充

突发长度由ARLEN或AWLEN决定,最大支持256笔数据。突发大小由ARSIZE或AWSIZE决定,可以是1、2、4、8、16、32、64、128字节。

避坑指南:我曾经在一个项目中,突发长度设成了256,结果Slave端buffer不够大,数据直接丢了。后来我学乖了——突发长度一定要跟Slave的buffer深度匹配。你想想看,Slave一次只能收16笔,你非要发256笔,那不是找麻烦吗?

2.5 原子访问

原子访问,说白了就是"要么全做,要么全不做"。在多核系统里,两个Master可能同时访问同一个地址,这时候就需要原子操作来保证数据一致性。

AXI4-Full支持两种原子访问:

  • 独占访问(Exclusive Access):Master先读一个地址,标记为"独占"。然后写的时候检查这个地址有没有被别人改过。没改过就写成功,改过了就写失败。
  • 锁定访问(Locked Access):Master锁定总线,不让其他Master访问。等自己的操作完了才解锁。

独占访问在ARM的LDREX/STREX指令里用得特别多。我做过一个双核系统,两个核共享一片内存。如果不加原子操作,一个核写数据的时候另一个核也在写,数据就乱套了。

实际案例:我在一个视频处理项目里,用独占访问实现了帧缓冲区的同步。两个核一个写帧数据,一个读帧数据。通过独占访问保证读的时候写操作不会打断,画面就不会出现撕裂。

2.6 总结一下

AXI4-Full协议,说白了就是五个通道加一套握手规则。突发传输让你一次传多笔数据,原子访问让你在多核环境里安全操作共享资源。这些特性加在一起,让AXI4-Full成了高性能SoC设计的首选总线。

我个人觉得,学AXI最好的方法就是动手写一个简单的Master和Slave。不用太复杂,先实现一笔读、一笔写,然后加上突发,最后试试原子访问。等你把这些都跑通了,AXI对你来说就不是什么难事了。

最后提醒一句:Vitis平台里很多IP核都用AXI接口。你理解了AXI协议,用起这些IP来就顺手多了。下次咱们可以聊聊怎么在Vitis里搭一个AXI互联的系统。

可可精品资料库