2. AXI4-Full协议详解:通道定义、握手信号、读写事务、突发传输、原子访问
大家好,我是你们的FPGA设计老手。今天咱们来啃一块硬骨头——AXI4-Full协议。说实话,我刚入行那会儿,看到AXI的时序图就头大。但后来发现,只要把几个核心概念吃透了,这玩意儿其实挺顺手的。
AXI4-Full,说白了就是ARM公司搞的一套高性能总线协议。它跟AXI4-Lite和AXI4-Stream最大的区别在于——它支持突发传输和原子访问。嗯,这两个特性在DDR控制器、PCIe接口这些场景里特别有用。
2.1 五个独立通道
AXI4-Full最让我欣赏的设计,就是它把读写操作拆成了五个独立的通道。你想想看,这就像高速公路上的不同车道——读地址、写地址、写数据、读数据、写响应,各走各的道,互不干扰。
- AW通道(写地址通道):Master告诉Slave我要往哪个地址写数据
- W通道(写数据通道):Master把数据扔到总线上
- B通道(写响应通道):Slave写完后回个状态——写成功了还是出错了
- AR通道(读地址通道):Master告诉Slave我要从哪个地址读数据
- R通道(读数据通道):Slave把读到的数据返回给Master
2.2 握手信号——VALID和READY
AXI的握手,说白了就是"你准备好了吗?我准备好了!"这么个过程。每个通道都有两个核心信号:VALID和READY。
VALID:发送方说"我这里有数据,你赶紧来拿"
READY:接收方说"我准备好了,你发过来吧"
握手有三种情况:
- VALID先有效,READY后有效——发送方先准备好,接收方稍后响应
- READY先有效,VALID后有效——接收方先准备好,发送方稍后发送
- 两者同时有效——一拍搞定,效率最高
关键点:数据只在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允许它们解耦,你完全可以先发地址,等几个周期再发数据。
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字节。
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对你来说就不是什么难事了。
可可精品资料库