2. AHB协议基础:传输阶段、流水线、突发与地址控制

大家好,我是你们的芯片架构讲师。今天我们来聊聊AHB协议最核心的几个概念。说实话,AHB协议在AMBA家族里算是“老大哥”了,但直到今天,很多高性能存储控制器还在用它。为什么?因为它简单、高效、好控制。

我个人习惯把AHB协议拆成四个部分来理解:传输阶段流水线操作突发传输、以及地址控制信号。把这四个吃透了,你写AHB master或slave基本不会出大问题。

2.1 AHB传输阶段:地址阶段 vs 数据阶段

AHB的每一次传输,都分成两个阶段:

  • 地址阶段:只持续一个时钟周期。master把地址和控制信号扔到总线上。
  • 数据阶段:可以是一个周期,也可以是多个周期(如果slave需要等待)。

说白了,地址阶段就是“告诉别人我要干什么”,数据阶段就是“真正干活”。我在项目中遇到过不少新手,把地址阶段搞得太复杂,其实它就是一个周期的事,别拖。

关键点:地址阶段不能插入等待周期。一旦HADDR、HWRITE这些信号在HCLK上升沿被采样,slave必须在下一个周期准备好响应。

2.2 流水线操作:地址与数据的重叠

AHB最漂亮的设计之一,就是流水线。当前传输的数据阶段,和下一笔传输的地址阶段,是重叠的。你想想看,这样总线利用率直接翻倍。

举个例子:

周期1: 地址A有效  |  数据X(来自上一笔)
周期2: 地址B有效  |  数据A(来自地址A)
周期3: 地址C有效  |  数据B(来自地址B)

嗯,这里要注意:如果slave在数据阶段插入了HREADY低电平(等待周期),那下一笔的地址阶段也会被冻结。我曾经调试过一个bug,就是slave的HREADY拉低时,master还在发新地址,结果地址和数据完全错位了。后来加了地址冻结逻辑才搞定。

个人经验:写AHB slave时,一定要把HREADY和地址采样逻辑绑在一起。HREADY为低时,master必须保持当前地址不变。这是协议规定的,但很多初学者会忽略。

2.3 突发传输:HBURST信号详解

突发传输,说白了就是一次地址请求,连续传多笔数据。AHB支持多种突发类型,我列个表给大家看:

HBURST[2:0] 类型 说明
000 SINGLE 单次传输,不突发
001 INCR 未指定长度的增量突发
010 WRAP4 4拍回环突发
011 INCR4 4拍增量突发
100 WRAP8 8拍回环突发
101 INCR8 8拍增量突发
110 WRAP16 16拍回环突发
111 INCR16 16拍增量突发

我个人建议:存储控制器里,优先用INCR4或INCR8。为什么?因为回环突发(WRAP)主要用于cache line fill,地址边界对齐要求严格。如果你只是做普通的DMA或寄存器访问,INCR更省心。

我记得有一次,一个同事用了WRAP4去访问一个非对齐的地址,结果地址回环到了错误的位置,数据全乱了。从那以后,我只要看到WRAP,都会多问一句:“地址对齐了吗?”

2.4 地址控制信号:HADDR、HWRITE、HSIZE、HTRANS

地址控制信号是AHB传输的“指挥棒”。我挑几个重点讲:

  • HADDR[31:0]:地址总线。注意,AHB地址是字节地址,但传输大小由HSIZE决定。
  • HWRITE:1表示写,0表示读。很简单,但别忘了在地址阶段就拉高或拉低。
  • HSIZE[2:0]:传输大小。8位、16位、32位、64位等。我习惯用HSIZE=010(32位)做默认,因为大多数存储控制器都是32位数据总线。
  • HTRANS[1:0]:传输类型。00=IDLE,01=BUSY,10=NONSEQ,11=SEQ。

避坑指南:我曾经在调试一个AHB-to-AXI桥时,发现master在突发中间插了一个BUSY传输(HTRANS=01)。结果slave以为突发结束了,直接终止了传输。后来查协议才发现:BUSY只允许在固定长度的突发中使用,而且不能改变地址方向。切记!

2.5 知识体系总览

下面我用一张SVG图,把AHB协议基础的核心逻辑串起来。你可以把它当作本章的“思维导图”:

AHB协议基础核心逻辑 AHB传输 传输阶段 流水线操作 突发传输 地址控制信号 地址阶段(1周期) 数据阶段(可等待) 地址与数据重叠 HREADY控制冻结 SINGLE/INCR/WRAP 4/8/16拍 HADDR/HWRITE HSIZE/HTRANS 实战要点 • 地址阶段不能插入等待 • 突发中不要随意插BUSY • 回环突发必须地址对齐 • HREADY低时冻结地址

2.6 小结

AHB协议基础,说白了就是“地址阶段定方向,数据阶段传内容,流水线提效率,突发省带宽”。我个人觉得,只要把传输阶段和流水线搞明白,AHB就掌握了七成。剩下的三成,是各种边界情况——比如slave插入等待时master该怎么反应,突发中途被终止怎么处理。这些我们后面章节会细讲。

嗯,今天就到这里。记住:写AHB代码时,多想想“如果slave拖我,我该怎么办?” 这个问题想通了,你的设计就稳了。


专注资料整理