0.前言
AHB是在APB之上的新一级的总线,AHB用于高性能、高时钟频率的系统结构,典型的应用如ARM核与系统内部的高速RAM、NAND FLASH、DMA、Bridge的连接。
AHB总线的强大之处在于它可以将微控制器(CPU)、高带宽的片上RAM、高带宽的外部存储器接口、DMA总线master、各种拥有AHB接口的控制器等等连接起来构成一个独立的完整的SOC系统,不仅如此,还可以通过AHB-APB桥来连接APB总线系统。AHB可以成为一个完整独立的SOC芯片的骨架,下图是典型的AHB总线架构:
下图是AHB总线的组成:
AHB总线由Master、Slave和Infrastructure构成。Infrastructure由arbiter、数据多路、地址控制多路、译码器构成。
需要注意的是,ADDR没有分读和写的ADDR,因此AHB不是全双工的,读写是不可以同时进行的,所以性能上比AXI一般来讲是要弱的。
主设备Master
发起一次读/写操作
某一时刻只允许一个主设备使用总线
从设备Slave
响应一次读/写操作
通过地址映射来选择使用哪一个从设备
仲裁器arbiter
允许某一个主设备控制总线
译码器decoder
通过地址译码决定选择哪一个从设备
总线可以分为三组
写数据总线(HWDATA)
读数据总线(HRDATA)
地址控制总线(HADDR)
1.信号列表
仲裁信号:
2.总线操作
有需要占用总线的Master向arbiter发出请求,arbiter授权给指定的master。任一时间周期只有一个master可以接入总线,对其指定的slave进行读写操作。
获得授权的总线开始AHB传输,首先发出地址和控制信号,提供地址信息、传输方向、带宽和burst类型。总线统一规划slave的地址,译码器根据地址和控制信号确定哪个slave与master进行数据通信。数据传输通过数据总线完成。为避免出现三态总线,AHB将读写总线分开,写数据总线用于从master到slave的数据传输,读数据总线用于从slave到master的数据传输。每笔传输包括一个地址和控制周期,一个或多个数据周期。地址和控制周期不能被扩展,因此slave必须在一个周期内采样地址信号。数据周期可以通过HREADY信号扩展,但HREADY为低时给传输加入一个等待状态以使slave获得额外的时间来提供或采样数据,另外slave通过响应信号HRESP反映传输状态。
一般情况下master完成完整的burst传输,arbiter才会授权给其他的master接入总线,然而为避免过大的判决延迟,arbiter也可能打断burst传输。在这种情况下master必须再次接入总线以进行中断的burst剩余部分的传输。
3.基本传输
AHB的基本传输时序和APB基本一致.
一笔传输由如下两部分组成:
地址阶段:一个周期
数据阶段:一个或多个周期,由HBURST信号决定需要几个有效周期,可以由HREADY发出请求延长一个周期。
3.1 无等待的基本传输:
1.在第一个周期上升沿:master驱动地址和控制信号给slave
2.第二个周期的上升沿:slave采样地址和控制信号,并将HREADY拉高;
如果是写操作,master会在第二个周期的上升沿传输要写入的数据;
如果是读操作,slave会在HREADY信号拉高后将读取的数据写入总线;
3.第三个周期的上升沿:
如果是写操作,master获取HREADY高信号,表明slave已成功接收数据,操作成功
如果是读操作,master获取HREADY高信号,表明此时的读数据有效并且接收下来,操作成功
需要注意,HREADY信号在数据有效期间必须为高,并且延续到第三个周期的上升沿之后,确保master的正确采
3.2 有等待的基本传输
1.在第一个周期上升沿:master驱动地址和控制信号给slave
2.第二个周期的上升沿:
slave采样master的地址和控制信号,但slave忙于处理其它事务不能接收该master的数据或者给master发数据,因此HREADY拉低
如果是写操作master给出data并一致保持到被slave采样
3.第三个周期上升沿:
slave依然忙碌
master的data继续保持
4.第四个周期上升沿:
slave忙完了,HREADY拉高,但master采样到的任然是低电平信号
如果是读操作,则slave同时给出data
5.第五个周期上升沿:
如果是写操作,则master获取HREADY高信号,表明slave已成功接收数据,操作成功
如果是读操作,master获取HREADY高信号,表明此时的读数据有效并且接收下来,操作成功
3.3 pipeline传输
1.第一个周期中:
master发起操作A,驱动地址A和控制A
2.第二个周期上升沿:
slave采样总线操作A的请求,且其HREADY一直为高
如果是写操作,master给出数据A;如果是读操作,slave给出数据A
3.第二个周期中:
master有操作B需要执行,并且检查到上一周期的HREADY为高,master又发起了操作B
4.第三个周期上升沿:
slave采样master的操作B
如果是写操作,则master获取HREADY高信号,表明slave已成功接收数据A,操作成功
如果是读操作,master获取HREADY高信号,表明此时的读数据A有效并且接收下来,操作成功
5.第三个周期中:
master给出第二个周期操作B的数据B
master发现有操作C需要执行,并且检查到上一周期的HREADY为高,则发起第三个操作C
slave由于繁忙HREADY信号拉低
6.第四个周期上升沿:
master检测到slave繁忙,知道slave需要等待,不能接收或者发送数据B,也不能接收操作C,则此时slave将上一个周期的数据B延长和操作C等信号延长
7.第四个周期中:
slave处理完了事务,HREADY信号拉高
8.第五个周期上升沿:
slave采样master的操作C
如果是写操作,则master获取HREADY高信号,表明slave已成功接收数据B,操作成功
如果是读操作,master获取HREADY高信号,表明此时的读数据B有效并且接收下来,操作成功
9.第五个周期:
写操作,给出上一个周期操作C的数据C;读操作,slave给出数据C
10.第六个周期上升沿:
如果是写操作,则master获取HREADY高信号,表明slave已成功接收数据C,操作成功
如果是读操作,master获取HREADY高信号,表明此时的读数据C有效并且接收下来,操作成功
通过以上分析可以看出AHB支持的pipeline操作即允许在同一时间总线上给出上一操作的数据和下一个操作的地址等信号,如下图:
这种地址与数据的交叠可以提高吞吐率,提高处理数据的能力。
需要注意的是,AHB中是2个pipe,也就是总线上最多存在2个未处理完的transfer。只有当总线上未完成的transfer少于2个时,master才能发起操作
4.突发burst操作
首先来看一下和burst操作有关的信号:
4.1 传送状态
在 AHB 总线上,M 的传送状态可由 HTRANS[1:0]来表示,这两位所代表的意义如下:
4.2 批量传送 HBURST[2:0]
批量传送是以群组为单位的传送方式,主要依地址的给法来区分:
- 递增传送(incrementing burst),会依上一笔的地址来递增
- 回绕传送(wrapping burst),如:回绕长度 = 4;每 4 个字节要对齐在 16 字节的范围内。如果第一个地址=0x64,则传送的顺序为 0x68、0x6C、0x60(关于wrap burst的算法可见AHB、AXI地址卷回wrap计算方法)
每次传送数据的大小由 HBURST[2:0]定义:
需要注意的是,burst不能超过1K地址边界。
4.3 传送大小 HSIZE[2:0]
传送数据大小由 HSIZE[2:0] 信号控制,表示每次传送的字节数目
4.4 递增burst
Δ地址1bit与1bit之间容纳了1Byte的数据
1.T1:
master传入地址和控制信号,burst类型是增量传输,因为是新的burst开始,transfer的类型是NONSEQ
2.T2:
Master:给出地址0x20操作的数据,同时由于master不能在第二个周期里处理第二拍,所以master使用BUSY transfer来为自己延长一个周期的时间。注意,虽然是延长了一个周期,但是master需要给出第二个transfer的地址和控制信号(即master告知slave下一笔事务的地址,但在下一周期无法给出或者接收数据)
Slave:采样地址0x20的操作,给出或者接收数据
3.T3:
slave采集到了master发来的BUSY,知道master需要等待一拍,所以slave会忽略这个BUSY transfer(需要注意的 虽然slave会忽略掉BUSY transfer,但是master也需要给出下一拍的地址和控制信号)
master发起了第二个transfer,因为是同一个burst的第二个transfer,所以transfer的类型是SEQ
4.T4:
master给出上一笔因为BUSY未给出的data,或者slave给出因为master忙而未给出的数据,同时给出下一笔事务0x28的地址
slave采集到了master发来的SEQ和地址,知道下一笔事务要接收或者发送0x24的数据
5.T5:
master给出0x28的数据,同时给出下一笔事务0x2C的地址
slave采样到0x28地址的事务,然后slave将HREADY信号拉低,告诉master需要等待一个周期
6.T6:
slave没有准备好,master采集到pready为低电平,则addr,wdata,transfer延长一个周期,过了一会儿slave准备好了,给出0x28的数据
7.T7:
slave采样到0x28的数据
master给出0x2C的数据
8.T8:
slave采样最后一笔事务0x2C的数据或者发出最后一笔事务0x2C的数据
同理,还可以有INCR8和未定义长度的burst:
4.5wrapping burst
跟之前唯一的区别在于地址的不同,在0x3C地址之后,根据回环的地址边界,第三拍的地址变为0x30。一共四拍,4个地址,每个地址各不相同,这四个地址是一个回环范围。起始地址决定了回环操作的回环范围。
按照前述文章,地址计算方法如下:
同理,也可以有WRAP8 burst: