写在前面:
最近实习项目里用到这2个协议,因此简单整理一下,内容大多来自ARM官方文档与网络上的,我主要做一个整合,加上自己的理解补充,内容来源都会分别标出。如有侵权请指出,立刻删帖。
官方文档入口:AMBA(包括AHB, ASB, APB)
文章目录
1 AMBA总线
AMBA总线的全称为“高级微处理器总线架构(Advanced Microcontroller Bus Architecture)”,是ARM架构下SoC设计的一种总线架构。AMBA包括AHB(Advanced High-perfomance Bus,高级高性能总线),ASB(Advanced System Bus,高级系统总线),APB(Advanced Peripheral Bus,高级外设总线)。
2 AHB
内容来源:
- 知乎用户@桔里猫,AHB与APB总线你需要知道的事儿
- 博客园@feipeng8848,AMBA总线协议AHB、APB
- ARM官方文档AHB部分
AHB,Advanced High-performance Bus,高速总线,用来接高速外设。
2.1 一个典型的基于AHB的微控制器
如下图所示,AHB的强大之处在于可以将高速ARM微控制器(High-performance ARM processor)、高带宽的片上RAM(High-bandwidth on-chip RAM)、高带宽的外部存储器接口(High-bandwidth Memory Interface)、DMA总线master等各种拥有AHB接口的控制器连接起来构成一个完整的SoC系统。其中一个特殊的slave是AHB2APB的桥,用于连接APB总线系统。AHB可以成为一个完整独立的SoC芯片的骨架。
2.2 AHB总线互联结构:中心选择器连接master与slave

AHB总线里有:一个仲裁器(Arbiter)用于仲裁多个主设备(Master)同时访问总线的情况;三个多路选择器(地址选择,写数据选择,读数据选择)用于选通master和slave之间的data和addr。
AHB的ADDR没有分读和写的ADDR:AHB是半双工的,读和写不能同时进行,因此性能上比AXI一般来讲是要弱的。
补充:单工,半双工,全双工
- 单工:数据只在一个方向传播,不能实现双向通信。如电视,广播等。
- 全双工:允许数据在两个方向上同时传播。如手机通话。
- 半双工:允许数据在两个方向上传播,但同一时间数据只能在一个方向上传播(不能同时),本质上是切换的单工。如对讲机。
2.3 AHB的关键信号

| 信号名称 | 信号方向 | 信号描述 |
|---|---|---|
| HGRANTx | 输入 | 总线授权信号,设置为高表示可以用总线 |
| HREADY | 输入 | Slave的输出,表示传输完成了,可以进行下一次传输 |
| HRESP | 输入 | Slave的输出,一些额外信息,如成功、失败等 |
| BUSREQ | 输出 | 申请使用总线 |
| LOCK | 输出 | 直接锁定总线,设置为高且不再低之后仲裁器就不会把总线让给其他设备,属于霸道信号 |
| HTRANS | 输出 | 标识传输类型,有NONSEQUENTIAL, SEQUENTIAL, IDLE, BUSY四种状态 |
| HWRITE | 输出 | 标识数据方向,0为读,1为写 |
| HSIZE | 输出 | 标识数据位宽,典型的有8-bit(字节)、16-bit(半字,halfword)、32-bit(字,word),最多可以1024-bit |
| HBURST | 输出 | burst的长度,即一次连续传输要传多少个数 |

除前面表格里的,slave还有个信号HSELx,用于标识当前总线在访问这个slave。
2.4 典例:AHB的传输

上图是总线已经申请到了(BUSREQ -> HGRANTx=1),之后(T1)首先将HTRANS[1:0],HADDR[31:0],HBURST[2:0]设置好放到总线上,这里burst4个;(T2)把HWDATA[31:0]设置好放总线,即DATA是比ADDR慢一个周期的;(T3之后)每个数据传输完成都会收到HREADY=1。
发新的ADDR时,若HTRANS为BUSY,则要把ADDR保留/重复一个周期(T3上升沿检测到BUSY,则ADDR重复0x24)。T3之后检测到HREADY没有变高时,HTRANS、HADDR、HWDATA要保留当前值,等待slave传回来的HREADY变高了,再传新的信号(T6上升沿检测到HREADY=0,这几个都保留原值,没传新的)。
2.5 AHB的其他问题(持续更新)
(1)HSIZE是什么,怎么用?
HSIZE表示的是一次传输的数据包大小/位宽,有8/16/32/…/1024 bit。传输的数据位宽(Master -> slave,主要取决于slave的数据带宽)和总线位宽可以不一样,借助HSIZE可以实现总线和slave数据位宽的匹配。如下图,总线位宽比较低,是32bit,而我们需要一个高带宽的slave,是64bit的,HSIZE就设置为64bit来告诉总线一个数是64bit的。总线的处理就是,第一个数放到slave的DATA[31:0],第二个数放到slave的DATA[63:32](顺序可能相反),两个整合在一起再把64位整体传给slave。
(2)既然每次(每个beat)master都要传对应的地址,slave接收到地址之后对应进行读/写操作,为什么需要还要HBURST信号来告诉slave有几个burst?
一般来说,确实slave按部就班根据地址操作就行了。但是对于有的slave,提前知道了burst长度有助于提高效率,比如提前腾出burst长度的buffer。
(3)什么是AHB lite?
当总线只允许有一个主设备Master时,那么AHB只有一个master,也不需要仲裁器arbiter了,这就是AHB lite。
3 APB
内容来源:
- 知乎用户@桔里猫,AHB与APB总线你需要知道的事儿
- 博客园@feipeng8848,AMBA总线协议AHB、APB
- ARM官方文档AHB部分
APB,Advanced Peripheral Bus,高级外设总线,主要应用在低带宽的外设上,如UART,I2C,中断控制、定时器、GPIO等。对性能要求不高,主要是低功耗。
3.1 APB的接口信号
APB的架构不像AHB那样是多主设备的架构,APB只有唯一的主设备APB桥(与AXI或AHB相连),因此不需要仲裁一些BUSREQ,GRANT,接口信号很简单。下图是一个典型的慢速APB Slave需要的接口。
| 信号名称 | 信号方向 | 信号描述 |
|---|---|---|
| PSELx | 输入 | 总线选通 |
| PENABLE | 输入 | 标识可以访问该slave |
只有PSELx = 1 & PENABLE = 1时才可以读数据。APB只有一个master(APB桥),因此无需等待周期和回应信号,控制逻辑简单。
3.2 典例:APB传输状态机与信号图

IDLE状态:没有传输操作,也没有选中任何从设备。
SETUP状态:当有传输要进行时,PSELx = 1(PENABLE不变还是0),进入SETUP状态,该状态只持续一个周期。当PCLK的下一个上升沿到来时,PENABLE=1且进入ENABLE状态。
ENABLE状态:相比于SETUP状态,PADDR、PSEL、PWRITE不变,PENABLE设为1。ENABLE状态也只持续一个周期。
可以看到,APB固定两个周期完成一次读或写操作。在ENABLE状态之后,若没有传输要进行,则进入IDLE状态等待;若有连续的传输,则直接进入下一次SETUP状态。
下图是往外设写一个数据的例子:
4 AHB和APB的区别与联系
4.1 AHB与APB的特性
AHB:
- 高性能(High performance)
- 并发操作(Pipelined operation)
- 支持多个总线主设备(Multiple bus masters)
- 支持突发传输(Burst transfers)
- 支持分段传输(Split transactions)
- 单个时钟周期主设备接管(Single-clock bus master handover)
- 单个时钟边沿操作(Single-clock edge operation)
- 非三态的实现方式(non-tristate implementation)
- 可配置64位,128位总线宽度(wider data bus condigurations-64/128 bits)
- 支持字节、半字和字的传输
APB:
- 低功耗(Low power),尤其在非外设总线活动时APB的接口零功耗
- 锁存的地址和控制(Latched address and control)
- 接口简单(Simple interface),控制逻辑简单,只有4个控制信号
- 适用许多外设(Suitable for many peripherals)
- 两个时钟周期传输
- 无需等待周期和回应信号
4.2 AHB和APB的适用情况
AHB接口一般用于:
- 总线主设备(bus masters)
- 片上存储模块(on-chip memory blocks)
- 外部存储接口(external memory interfaces)
- 带有FIFO接口的高带宽外设(high-bandwidth peripherals with FIFO interfaces)
- DMA从设备外设(DMA slave peripherals)
APB接口一般用于: - 简单的寄存器分布的从设备(simple register-mapped slave devices)
- 非常低功耗的接口,尤其是时钟无法全局分布时(very low power interfaces where clocks cannot be globally routed)
- 集合总线为窄位宽的外设,来避免每次都加载系统总线(grouping narrow-bus peripherals to avoid loading the system bus)
4.3 AHB与APB的联系
APB架构上的master即APB桥,可以作为AHB的一个slave进行数据传输。下图表示AHB对APB的一次突发读数据: