AMBA 系列之 AHB 协议
目录
5.1 没有等待状态的单次传输(Single Transfer)
5.2 Slave插入等待状态的单次传输(Single Transfer)
5.3 多个Single Transfer的流水线(pipeline)操作
5.5.1 四拍环回突发(Four-beat wrapping burst)
5.5.2 四拍增量突发(Four-beat incrementing burst)
5.5.3 八拍环回突发(Eight-beat wrapping burst)
5.5.4 八拍增量突发(Eight-beat incrementing burst)
5.5.5 未定义长度突发(Undefined-length burst)
1. 简介
AHB 总线规范是AMBA总线规范的一部分,AMBA总线规范是ARM公司提出的总线规范,被大多数SoC设计采用,它规定了AHB (Advanced High-performance Bus)、ASB (Advanced System Bus)、APB (Advanced Peripheral Bus)。AHB用于高性能、高时钟频率的系统结构,典型的应用如ARM核与系统内部的高速RAM、NAND FLASH、DMA、Bridge的连接。APB用于连接外部设备,对性能要求不高,而考虑低功耗问题。ASB是AHB的一种替代方案。
官方协议下载链接:
https://developer.arm.com/architectures/system-architectures/amba/specifications
1.1 AHB总线的架构
AHB总线的强大之处在于它可以将微控制器(CPU)、高带宽的片上RAM、高带宽的外部存储器接口、DMA总线master、各种拥有AHB接口的控制器等等连接起来构成一个独立的完整的SOC系统,不仅如此,还可以通过AHB-APB桥来连接APB总线系统。AHB可以成为一个完整独立的SOC芯片的骨架,下面的图摘抄至 AHB Specification:
AHB 高性能总线上可以接入 ARM 处理器核心,高带宽的片上 RAM,高速的内存总线,DMA master等等,通过 AHB2APB 桥接到 APB 总线;
1.2 AHB基本特性
- Burst传输
- Split事务处理
- 单周期master移交
- 单一时钟沿操作
- 无三态
- 更宽的数据总线配置(64/128)
- 流水线操作
- 可支持多个总线主设备(最多16个)
2. AHB总线的组成
AHB总线由AHB总线主机(Master)、AHB总线从机(Slave)和Infrastructure构成。Infrastructure由仲裁器、数据多路选择器、地址控制多路选择器、译码器构成。
AMBA AHB 总线协议设计使用一个中央多路选择器互联方案。该方案中,所有总线主机设备输出地址和控制信号来指示它们想执行的传输,同时仲裁器决定哪一个主机能够将它
的地址和控制信号连通到所有的从机。当然也需要一个译码器来控制读数据和响应多路信号选择器,多路信号选择器选中来自传输中所包含从机的适当信号。
下图实现包含三个主机和四个从机的 AMBA AHB 设计的结构要求。
典型的 AMBA AHB 系统设计包含以下的部分:
AHB 主机:总线主机能够通过提供地址和控制信息发起读写操作。任何时候只允许一个总线主机处于有效状态并能使用总线。
AHB 从机:总线从机在给定的地址空间范围内响应读写操作。总线从机将成功、失败或者等待数据传输的信号返回给有效的主机。
AHB 仲裁器:总线仲裁器确保每次只有一个总线主机被允许发起数据传输。即使仲裁协议已经固定,任何一种仲裁算法,比如最高优先级或者公平访问都能够根据应用要求而得到执行。AHB 必须只包含一个仲裁器,尽管在单总线主机系统中这显得并不重要。
AHB 译码器:AHB 译码器用来对每次传输进行地址译码并且在传输中包含一个从机选择信号。所有 AHB 执行都必须仅要求有一个中央译码器。
3. 信号描述
所有 AMBA 信号的命名都用名称的第一个字母来指示信号和哪个总线相关联。信号名称中用一个小写的 n 表示该信号低电平有效,否则信号的名称总是用大写字母来表示。
测试信号有一个前缀T而与总线类型无关。
AHB信号前缀:H 表示一个 AHB 信号。例如, HREADY 是用来指示 AHB 部分数据传输完毕的信号。该信号高电平有效。
关于控制信号,在下面聊传输的时候再详细描述
名称 | 来源 | 描述 |
HCLK 总线时钟 |
时钟源 | 时钟为所有总线传输提供时基。所有信号时序都和HCLK的上升沿相关。 |
HRESETn 复位 |
复位控制器 | 总线复位信号,低电平有效,用来复位系统和总线。这是唯一低电平有效的信号。 |
名称 | 来源 | 描述 |
HADDR[31:0] 地址总线 |
主机 | 32位地址总线 |
HTRANS[1:0] 传输类型 |
主机 | 表示当前传输的类型,可以是连续,不连续,空闲和忙 |
HWRITE 传输方向 |
主机 | 该信号为高表示一个写传输,为低表示一个读传输 |
HSIZE[2:0] 传输大小 |
主机 |
表示传输的大小,三位表示0…7,分别对应8bits(byte), 16bits(halfword),32bits(word), 64bits, 128bits,256bits, 512bits,1024bits |
HBRUST[2:0] 突发类型 |
主机 | 表示传输是否组成了突发的一部分。支持4个,8个,16个节拍的突发传输,突发传输可以使增量或回环。 |
HPROT[3:0] 保护控制 |
主机 |
提供总线访问的附加信息,主要是给那些希望执行某种保护级别的模块使用的。 这个信号指示当前传输是否为预取指令或者数据传输,同时也表示传输是保护模式访问还是用户模式访问。 对带存储器管理单元的总线主机而言这些信号也用来指示当前传输是高速缓存的(cache)还是缓冲的(buffer)。 |
HWDATA[31:0] 写总线数据 |
主机 |
写数据总线用来在写操作期间从主机到总线从机传输数据。建议最小的数据总线宽度为 32 位。 在要求高带宽运行时扩展(数据总线)还是很容易的。 |
HSELx 从机选择 |
译码器 |
每个 AHB 从机都有自己独立的从机选择信号并且用该信号来表示当前传输是否是打算送给选中的从机。 该信号是地址总线的简单组合译码。 |
HRDATA[31:0] 读数据总线 |
从机 |
读数据总线用来在读操作期间从总线从机向总线主机传输数据。建议最小的数据总线宽度为 32 位。 在要求高带宽运行时扩展(数据总线)还是很容易的。 |
HREDAY 传输完成 |
从机 |
当 HREADY 为高时表示总线上的传输已经完成。在扩展传输时该信号可能会被拉低。 |
HRESP[1:0] 传输响应 |
从机 |
传输响应给传输状态提供了附加信息。提供四种不同的响应: OKEY、 ERROR、 RETRY 和 SPLIT。 |
AMBA AHB也有许多信号请求支持多主机操作。这些仲裁信号用于点对点连接, 下表中后缀x用来表示信号来自模块x。例如,一个系统中会有许多的信号
HBUSREQx,比如HBUSREQarm, HBUSREQdma和HBUSREQtic。
名称 | 来源 | 描述 |
HBUSREQx |
主机 |
从总线主机 x 传向总线仲裁器用来表示该主机请求(控 |
HLOCKx |
主机 |
当该信号为高时表示主机请求锁定对总线的访问并且 |
HGRANTx |
仲裁器 |
该信号用来表示总线主机 x 目前是优先级最高的主机。 |
HMASTER[3:0] |
仲裁器 |
这些来自仲裁器的信号表示哪个总线主机正在执行传输和被支持分块传输的从机用来确定哪个主机正在尝 |
HMASTLOCK |
仲裁器 |
表示当前主机正在执行一个锁定顺序的传输。该信号 |
HSPLITx[15:0] |
从机(支持分块) |
从机用这 16 位的分块总线来指示仲裁器总线主机应该被允许重试一个分块传输。 |
3.1 AHB Slave 接口
作为 AHB Slave 信号接口定义如下所示:
3.2 AHB Master 接口
作为 AHB Master 信号接口定义如下所示:
3.3 AHB Arbiter 接口
AHB 仲裁器的定义如下:
仲裁机制保证了任意时刻只有一个master可以接入总线。arbiter决定哪个发出接入请求的master可以接入总线,这通过优先级算法实现。AHB规范并没有给出优先级算法,设计者需要根据具体的系统要求定义。一般情况下arbiter不会中断一个burst传输,将总线接入权让给其他master。当然未定义长度的burst传输是可以打断的,这要看优先级算法是如何规定的。如果一笔burst被打断,master再度获得接入权限时,会传递剩余的部分。如一笔长度为INCR8的传输在传递3 beat后被打断,master再次获得接入授权后,会继续传输剩余的5 beat,剩余部分可以由一个SINGLE和一个INCR4组成,或者一个INCR。
HBUSREQx:master向arbiter发出接入请求的信号。
HLOCKx:指示是否要进行不可中断的传输,这一信号与HBUSREQx同时由master向arbiter发出。
HGRANTx:arbiter产生指示master获得授权,当HGRANTx信号为高同时HREADY为高时,master可以向总线传输地址信号。
HMASTER[3:0]:arbiter产生指示哪个master获得授权,这一信号用于地址控制多路来选择哪个master接入总线。
HMASTERLOCK:arbiter产生指示当前传输是否为锁定序列传输。
HSPLIT:供支持SPLIT传输使用。
3.4 AHB Decoder 接口
AHB 地址译码器的接口定义如下,主要是根据地址信息进行选通信号的选择:
地址译码器用于为总线上每个slave提供选择信号HSELx,选择信号是通过组合逻辑对地址码译码产生的。只有当前的数据传输完成后(HREADY为高),slave才会采样地址和控制信号以及 HSELx。在一定条件下可能会出现这样的情况:产生HSELx信号而HREADY为低,在当前传输后slave会改变。
每个slave最小的地址空间为1KB,所有的master的burst传输上限也是1KB,如此设计保证了不会出现地址越界问题。当一个设计不会用到所有的地址空间时,可能出现访问到一个不存在的地址的情况,这就需要增加一个附加的默认slave来为上面的情况提供一个响应。当SEQ或NONSEQ传输访问到一个不存在的地址,默认slave应该提供ERROR响应;当IDLE或BUSY传输访问到一个不存在的地址,默认slave会响应OKAY。地址译码器会带有实现默认slave的功能
4. 总线操作
有需要占用总线的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剩余部分的传输。
5. 基本传输
一笔传输由如下两部分组成:
1、地址阶段:一个周期
2、数据阶段:一个或多个周期,由HBURST信号决定需要几个有效周期,可以由HREADY发出请求延长一个周期
传输分为:
单次传输(Singal)
突发传输(Burst)(Burst传输的含义为,多次连续传输)
5.1 没有等待状态的单次传输(Single Transfer)
信号波形如下所示:
交互描述为:
1、第一个周期的上升沿,主机将地址信息和控制信息发送到总线上;
2、第二个周期的上升沿,从机采样地址和控制信号,并将HREADY拉高;
如果是写操作,主机会在第二个周期的上升沿过后传输要写入的数据;如果是读操作,从机会在HREADY信号拉高后将读取的数据写入总线;
3、第三个周期的上升沿:
如果是写操作,主机获取HREADY高信号,表明从机已成功接收数据,操作成功;
如果是读操作,主机获取HREADY高信号,表明此时的读数据有效并且接收下来,操作成功。
需要注意,HREADY信号在数据有效期间必须为高,并且延续到第三个周期的上升沿之后,确保主机的正确采样。
5.2 Slave插入等待状态的单次传输(Single Transfer)
信号波形如下所示:
交互描述为:
从机可以及时处理主机请求,但也可能存在从机太慢不能立即处理的情况。这时需要让主机稍微等一等,需要从机插入一些等待的状态。如下图所示,HREADY信号在第二和第三周期拉低,意在告诉主机,从机不能立即处理,需要主机等待2个周期。在这里需要注意2点:
如果是写操作,主机要在等待期间保持写数据不变,直到本次传输完成;如果是读操作,从机不需要一开始就给出数据,仅当HREADY拉高后才给出有效数据。
5.3 多个Single Transfer的流水线(pipeline)操作
信号波形如下所示:
交互描述如下:
扩展数据周期的一个负效应是必需延长相应的下一笔传输的地址周期。A和C为零等待传输,B加入了一个等待周期,因此相应的C地址周期要进行扩展。
第一个周期,主机发起一个操作A,并驱动地址和控制信号;
第二个周期,从机收到了来自总线的请求,将HREADY信号拉高;
第二个周期上升沿后,主机发现有操作B需要执行,并且检查到上一周期的HREADY为高,则发起第二个操作B;
第三个周期,主机获取HREADY信号为高,表示操作A已经完成;
第三个周期上升沿后,主机发现有操作C需要执行,并且检查到上一周期的HREADY为高,则发起第三个操作C;
第三个周期上升沿后,从机由于繁忙插入了一个等待状态,将HREADY拉低;
第四个周期,主机获取HREADY信号为低,知道从机希望等待,于是主机保持和上一拍一样的信号;
第四个周期,从机处理完了事务,将HREADY信号拉高,表示可以继续处理;
第五个周期,主机获取HREADY信号为高,知道从机已经可以处理B操作;
第五个周期上升沿后,B操作完成;
第六个周期上升沿后,C操作完成。
需要注意几点:
HREADY在一定程度上表示了从机的 pipeline 能力,在AHB中是2个pipe,也就是总线上最多存在2个未处理完的transfer。只有当总线上未完成的 transfer 少于2个时,主机才能发起操作。
5.4 AHB控制信息
在介绍突发传输之前,我们再来看下AHB控制信息。
HWRITE - 这个信号是读写控制信号,也即transfer的方向控制信号。 高电平表示写操作,低电平表示读操作。
HSIZE - 这个信号是指明单次传输的数据宽度。
表示传输的大小,三位表示0…7,分别对应8bits(byte), 16bits(halfword),32bits(word),
64bits, 128bits,256bits, 512bits,1024bit
HPROT[3:0] - 为transfer提供额外的访问保护和控制权限信号。一般不用,在此不做介绍。
HTRANS[1:0] - 进行一次传输时的传输类型,这个信号由主机根据自己要进行的传输类型生成的控制信号。一共4种类型
HTRANS[1:0] |
传输类型 |
Description |
00 |
IDLE |
主设备占用总线,但没进行传输 |
01 |
BUSY |
主设备占用总线,但是在突发传输过程中还没有准备好进行下一次传输 |
10 |
NONSEQ |
表明一次单个数据的传输或者一次突发传输的第一个数据 |
11 |
SEQ |
突发传输中剩下的传输是连续传输并且地址是和前一次传输有关的。控制信息和前一次传输一样。地址等于前一次传输的地址加上传输大小(字节)。在回环突发的情况下传输地址在地址边界处回环,回环值等于传输大小乘以传输的次数(4、 8 或者 16 其中之一)。 |
这个信号只有在突发传输中出现。当从机收到这个信号时,表明当前的传输是一个突发中的某一拍。这时,总线上的控制信号应当与之前的保持一致,地址视情况递增或者回环。(这些信号其实是由主机决定的,从机不用考虑,只需要单方面接收即可)
比如:
上述交互为:
T1,主机传入地址和控制信号,因为是新的突发传输开始,所以传输的类型是NONSEQ;
T2,由于主机不能在第二个周期里处理第二拍,所以主机使用BUSY传输来为自己延长一个周期的时间。注意,虽然是延长了一个周期,但是主机需要给出第二个传输的地址和控制信号;T3,从机采集到了主机发来的BUSY,知道主机需要等待一拍,所以从机会忽略这个BUSY传输;
T3,主机发起了第二个传输,因为是同一个burst的第二个传输,所以传输的类型是SEQ;
T5,从机将HREADY信号拉低,告诉主机需要等待一个周期;
T8时刻完成最后一个传输。
需要注意的 虽然从机会忽略掉BUSY传输,但是主机也需要给出下一拍的地址和控制信号。
5.5 突发操作(Burst)
AMBA AHB 协议定义了 4、8 和 16 拍突发,也有未定长度的突发和信号传输。协议支持增量和回环操作:
1、增量突发访问连续地址并且突发中的每次传输地址仅是前一次地址的一个增量;
2、回环突发,如果传输的起始地址并未和突发(x 拍)中字节总数对齐那么突发传输地址将在达到边界处回环。例如,一个四拍回环突发的字(4 字节)访问将在16 字节边界回环。因此,如果传输的起始地址是 0x34,那么它将包含四个到地址
0x34、 0x38、 0x3C 和 0x30;
突发信息通过使用 HBURST[2:0]并且 8 种可能的类型在中定义如下:
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拍增量突发 |
突发禁止超过 1KB 的地址边界。因此重要的是主机不要尝试发起一个将要超过这个边界的定长增量突发。将执行单个传输时使用未指定长度的增量突发理解为长度为一的突发比较合理。
一个增量突发可以是任何长度,但是(长度)上限由地址不能超过 1KB 边界这个事实限定了。
注:突发大小表示突发的节拍数量,并不是一次突发传输的实际字节数量。一次突发传输的数据总量可以用节拍数乘以每拍数据的字节数来计算,每拍字节数由 HSIZE[2: 0]指示。所有突发传输必须将地址边界和传输大小对齐。例如,字传输必须对齐到字地址边界(也就是 A[1: 0] = 00),半字传输必须对齐到半字地址边界(也就是 A[0] = 0)。
当一个突发不允许完成的特定情况下对任一从机设计而言如果突发提前终止那么利用突发信息能够采取正确的动作显得很重要。从机能够通过监控 HTRANS 信号决定一个突发何时提前终止并且确保在突发开始之后每次传输有连续或者忙的标记。如果产生一个非连续或者空闲传输那么这表明一个新的突发已经开始因此前一次突发一定已经终止。
如果总线主机因为失去对总线的占有而不能完成一次突发那么它必须在下一次获取访问总线时正确地重建突发。例如,如果一个主机仅完成了一个四拍突发的一拍那么它必须用一个未定长度突发来执行剩下的三拍突发。
5.5.1 四拍环回突发(Four-beat wrapping burst)
下图表示了一个四拍回环突发并且第一次传输伴随一个附加等待状态。
作为一次四拍字突发传输,地址将会在 16 字节边界回环,因此传输到地址 0x3C之后接下来传输的地址是 0x30。 下图表示了(回环突发)和增量突发的唯一不同,既是地址连续通过了 16 字节边界,并不回环,而是递增。
5.5.2 四拍增量突发(Four-beat incrementing burst)
和上面的基本一致,只不过地址并不回环,而是递增。
5.5.3 八拍环回突发(Eight-beat wrapping burst)
下图表示了一个八拍回环突发传输。
可以看到在地址 0x30 的时候进行了环回
5.5.4 八拍增量突发(Eight-beat incrementing burst)
和上面的基本一致,只不过地址并不回环,而是递增。
5.5.5 未定义长度突发(Undefined-length burst)
下图为未定义长度的突发传输,可以看到,是增量传输,而且在 T3 时刻地址发生变化到 0x5C
5.6 响应信号 (RESP)
master 发起一笔传输后,slave 可以决定这笔传输的进程,而 master不能取消已经发出的传输。
slave 通过 HREADY 信号反映传输是否完成,并通过HRESP[1:0]反映传输的状态。slave 可以如下方式完成一笔传输:
1、立即完成一笔传输;
2、延迟一个或几个周期完成传输;(通过 HREADY)
3、传输失败返回 error;
4、延迟传输,释放总线。
HREADY 为高时传输完成,为低时传输需要延迟。
HRESP[1:0] 传输响应
00: OKAY
01: ERROR
10: RETRY传输未完成,请求主设备重新开始一个传输,arbiter会继续使用通常的优先级
11: SPLIT 传输未完成,请求主设备分离一次传输,arbiter会调整优先级方案以便其他请求总线的主设备可以访问总线
需要 Retry 的时候交互:
出现错误情况的交互:
参考文档:
https://blog.****.net/ivy_reny/article/details/78144785
https://blog.****.net/weixin_33875839/article/details/93521690
https://wenku.baidu.com/view/dc96a5b8561252d381eb6e54.html