数字ic设计——AMBA总线(2)AHB
AMBA AHB 是一种适用于高性能可综合设计的总线接口。它定义了组件之间的接口,例如主设备、互连设备和从设备。
参考
AMBA总线协议(一)——一文看懂APB总线协议_摆渡沧桑的博客-CSDN博客_amba总线协议
AMBA总线—APB总线协议详解_SD.ZHAI的博客-CSDN博客_apb总线
AMBA 3 APB 协议规范
Introduction to AMBA Bus System 工研院 / 系統晶片技術㆗心工程師 吳欣龍
典型的AMBA系统:
一个以 AMBA 架构的 SOC,一般来说包含了
- AHB(high-performance 的 system bus ): 负责连接例如 ARM 之类的 embedded processor 与 DMA controller,on-chip memory 和其他 interface,或其他需要 high bandwidth 的元件。
- APB(low-power 的 peripheral bus ):用来连接系统的周边元件,其protocol 相对AHB 来讲较为简单, 与 AHB 之间则透过 Bridge 相连,期望能减少 system bus 的 loading。
AHB
AMBA AHB 是一种适用于高性能可综合设计的总线接口。它定义了组件之间的接口,例如主设备、互连设备和从设备。
ARM 当初订定 AHB (Advanced High-Performance Bus)主要是想让它能够用来当作 SOC 的 on-chip system bus。
AHB的一些特性:
AMBA AHB 实现了高性能、高时钟频率系统所需的功能,包括:
- 高速总线,高性能
- 非三态实现。
- 2及流水线操作
- 可支持多个总线主设备(最多16个)
- 支持Burst transfers
- 宽数据总线配置,64、128、256、512 和 1024 位
- 上升沿触发操作。单时钟沿操作。
- 对于一个新设计建议使用AHB
AHB System组成
AHB System三部分:
- Master
- Slave
- interconnect component (Infrastructure)
整个AHB bus上的传输(transfer) 都是由 master 所发出,由 slave 负责回应。
AHB 还通过使用互连组件来支持多主机设计,该互连组件提供从不同主机到适当从机的仲裁和传输信号。
例子:单主机 AHB 系统设计
注意:仅显示主要地址和数据总线以及典型的数据传输。并未显示所有信号。
具有 一个AHB 主机(master)和三个 AHB 从机(slave)。
总线互连逻辑由一个 address decoder和一个slave-to-master multiplexor组成。
- 解码器(decoder)监视来自主机的地址,以便选择适当的从机,
- 多路复用器( multiplexor)将相应的从机输出数据传回主机。
AHB主设备(master )
master提供地址和控制信息来启动读写操作 。
- 初始化一次读/写操作
- 某一时刻只允许一个主设备使用总线
- CPU、DMA、DSP、LCDC ...
master interface
AHB从设备( slave )
slave响应系统中master发起的传输。
slave使用来自解码器的 HSELx 选择信号,来控制它何时响应总线传输。
从机向主机发回信号:
- 总线传输的完成或扩展
- 总线传输的成功或失败
slave
- 响应一次读/写操作
- 通过地址映射来选择使用哪一个从设备
- 外部存储器控制器EMI、APB bridge
slave interface
最常见的 AHB 从设备是
- 内部存储器设备
- 外部存储器接口
- 高带宽外设
尽管可以将低带宽外设作为 AHB 从设备包含在内,但出于系统性能原因,它们通常驻留在 AMBA 高级外设总线 (APB) 上。
高性能 AHB 和 APB 之间的桥接是使用 AHB 从设备完成的,称为 APB 桥。
Interconnect
单主机系统:
- decoder:(负责地址的解码,从 multiple slave 中选择要回应 transfer 的 slave)
- slave to master multiplexor(负责 bus 的 routing(为了不使用 tristate bus),将 bus 上的信号在 master 和 slave 中传送)
多主机系统:
- arbiter:(AHB使用 multiple master,因此需要 arbiter 来仲裁)
- master to slave multiplexor
- slave to master multiplexor(两个 multiplexor 则是负责 bus 的 routing(为了不使用 tristate bus),将 bus 上的信号在 master 和 slave 中传送)
- decoder:(负责地址的解码,从 multiple slave 中选择要回应 transfer 的 slave)
系统还需要:
- dummy slave: 是虚拟Slave。
- dummy master :是虚拟Master。一个只执行IDLE传输的master。它在一个系统中是必需的,以便arbiter可以授予一个master仲裁,但是并保证不执行任何真正的传输。
AHB译码器( decoder )
通过地址译码来决定选择哪一个从设备。
- 对每次传输的地址进行解码,为传输中涉及的slave提供选择信号。
- 向多路复用器提供控制信号。
Multiplexor :
slave-to-master multiplexor:
- 多路复用从slave到master 的读取数据总线
- 响应从slave-to-master的信号。
解码器为多路复用器提供控制。
在使用两个或更多slave的所有实现中,都需要一个集中式多路复用器.
AHB仲裁器( arbiter )
- 允许某一个主设备控制总线
- 在AMBA协议中没有定义仲裁算法
Dummy/Default Master
Dummy Master
当没有任何一个真正的master与总线通信时,Dummy master使总线保持同步。
虚拟主机在被授权时,只会将传输类型驱动到空闲状态,不会进行真正的传输。确保总线持续运行。
dummy master是master 0。
以下状况Dummy master会被授权:
- 当先前被授权的master收到split响应,传输被锁定时。
- 当default master接收到Split响应且没有其他主机请求总线时
- 当所有主机都收到split响应时
dummy master特点:
- 当所有masters SPLIT 时授予(Granted)
- 仅生成空闲周期(IDLE cycles)
- 通常是Master #0
- 当 Locked master 获得 SPLIT 响应时授予
- 作为 Address/Control Mux的一部分实施
Default Master
当没有任何一个master请求总线时,仲裁所选择到的master被称为default master。
default master不用通过请求、授权阶段就能直接与总线进行通信。
通常最有可能和总线通信的master被设置成default master 。
Default Master特点
- 当没有master 需要 bus时授予(Granted )
- 一般master最有可能需要bus
- 不请求总线时生成空闲周期(IDLE cycles )
- 避免最少 2 个周期的仲裁期
- 立即访问 bus
dummy master和default master有什么区别?
default master用于描述当系统中没有任何一个master请求访问总线时被仲裁选择到的master。通常,最有可能请求总线的master设置成default master。
dummy master是一个只执行IDLE传输的master。它在一个系统中是必需的,以便arbiter可以授予一个master仲裁,但是并保证不执行任何真正的传输。
default slave
用来反馈给master,选用了未定义的地址区间,没有一个slave被选中。
对空闲或繁忙传输进行零等待正常响应,如果执行非顺序或顺序传输,则生成错误响应。
AHB Operation
Ⅰ、 master通过驱动地址和控制信号开始传输。
这些信号提供有关地址、方向、传输宽度的信息,并指示传输是否构成 burst的一部分。
transfers(传输)可以是:
- Single
- Incrementing bursts that do not wrap at address boundaries.
- Wrapping bursts that wrap at particular address boundaries.
Ⅱ、write data bus将数据从master传送到slave,read data bus将数据从 slave传送到 master。
每次transfer 包括:
- Address phase: One address and control cycle(一个地址和控制周期)
- Data phase :One or more cycles for the data.(数据的一个或多个周期。)
注意:
- slave不能请求扩展address phase,因此所有slave必须能够在这段时间内对address进行采样。
- slave可以请求master通过使用 HREADY 扩展 data phase。
ADDR没有分读和写的ADDR?
是的。
AHB不是全双工的,读写是不可以同时进行的。所以性能上比AXI一般来讲是要弱的。
Ⅲ、slave使用 HRESP 来指示传输的成功或失败。
AHB信号及其用途
基本上 bus 上传输的信号,可以分成:
- clock
- arbitration
- address
- control signal
- write data
- read data
- response signal
除了 clock 与 arbitration 信号之外,其余的信号皆会经过 multiplexor。
(1)经过 master to slave multiplexor 的信号:
- address
- control signal
- write data
(2)经过 slave to master multiplexor 的信号:
- read data
- response signal
AHB 大概的 bus interconnection
省略的部分
(1)control signal (HBURST, HTRANS 等)的连接,其实他们的连线与 HADDR 一致。
(2)Master 与 Arbiter 之间的 Request/Grant 讯号。
(3)Decoder 与各个 Slave 间会 有 Selection 的信号。
(4)control mux 的 output 会有部分 control 信号除了接到 Slave 外也会接到 Arbiter (HTRANS/HBURST)。
(5)Response signal(HREADY, HRESP)的 mux。
(6)Arbiter 会输 出 HMASTER 信号,这个信号会接到 master-to-slave multiplexor,以作为 selection signal。
Global signals
Name | Source | Description |
HCLK | Clock source | The bus clock times all bus transfers. All signal timings are related to the rising edge of HCLK |
HRESETn | Reset controller | The bus reset signal is active LOW and resets the system and the bus. This is the only active LOW signal |
Master signals
Slave signals
Decoder signal
Multiplexor signals
基本的AHB信号:
HRESET: 低电平有效
HADDR[31:0]: 32位系统地址总线
HWDATA[31:0]:写数据总线,从主设备写到从设备
HRDATA[31:0]:读数据总线,从从设备读到主设备
HTRANS: 指出当前传输的状态
- NONSEQ
- SEQ
- IDLE
- BUSY
HSIZE: 指出当前传输的大小
HBURST: 指出传输的burst类型
HRESP: 从设备发给主设备的总线传输状态
- OKAY
- ERROR
- RETRY:重新传不影响master优先级
- SPLIT:重新授权重新传,可能会降低优先级
HREADY
- 高电平:从设备指出传输结束
- 低电平:从设备需延长传输周期
AHB传输
在 AHB bus 上,一次完整的 transfer 可以分成两个 phase:
- address phase:传送 address 与 control signal(持续一个 HCLK 周期,除非它被先前的总线传输扩展。)
- data phase:传送 write/read data 与 response signal(可能需要几个 HCLK 周期。 使用 HREADY 信号控制完成传输所需的时钟周期数)
流水线传送
- 先是地址周期,然后是数据周期
最简单的传输
最简单的传输是没有等待状态的传输,因此传输由一个地址周期和一个数据周期组成。
AHB 上的 basic transfer
这个简单的示例演示了传输的地址和数据阶段如何在不同的时钟周期内发生。
在 AHB bus 上,一次完整的 transfer 可以分成两个 phase:
- address phase:传送的是 address 与 control signal
- data phase: 传送的是 write/read data 与 response signal。
在没有等待状态的简单传输中:
1. 在 HCLK 上升沿后,主机将address和control signals驱动到总线上。
2. 在 HCLK 的下一个上升沿上,从机采样address和control signals。
3. 从机采样 address和control signals后,它可以开始驱动 HREADYOUT 响应。 该响应由主机在 HCLK 的第三个上升沿采样。
简单的读传输 (Read transfer)
简单的写传输(Write transfer)
最简单的传输(延长transfer)
问题: transfer 在 data phase 时若无法在 1 个 clock cycle 内完成,怎么办?
slave 可用 HREADY 信号去延长 (extend) transfer。
当 HREADY 为 LOW 时,
表示 transfer 尚未结束;
当 HREADY 为 HIGH 时,
表示目前的 transfer 结束了。
但结束时的 status 则需看 Slave 回应的 HRESP 信号(可能 是 OKAY, ERROR 等)
例子:transfer with two wait state
最简单的传输(延长transfer, 增进 bus 的 performance)
增进 bus 的 performance
由于一次 transfer 需要两个 phase 才能完成,为了增进 bus 的 performance,AHB 将 multiple transfer 给 pipeline 起来,transfer 间的 address phase 和 data phase 是 overlap 在一起的。
例子:
由于目前 transfer 的 data phase 与下一次 transfer 的 address phase 是 overlap 的,所以当目前 transfer 的 data phase 被 extend 时,address phase 也得跟着延长。
任何传输的地址阶段都发生在前一次传输的数据阶段。 地址和数据的这种重叠是总线流水线特性的基础,它可以实现高性能操作,同时仍然为从设备提供足够的时间来提供对传输的响应
AHB传输信号详解
Control signal :
HTRANS[1:0] :Transfer Type
HBURST[2:0] : Burst Type
HPROT[3:0] : Protection Control
HSIZE[2:0] : Transfer Size
HWRITE :Transfer Direction
Transfer Type(HTRANS[1:0])
IDLE:(HTRANS[1:0])=0b 00)
指示 slave 需忽略目前的 transfer。
用于当 master 没有资料需要传送时,而此时 slave 需在 transfer 的 data phase 回应 zero wait cycle 的 OKAY response。
BUSY :(HTRANS[1:0])=0b 01)
在 burst transfer 时,master 传送连续的 transfer 给 slave。
若 master 因某些原因无 法及时将资料准备好,则发出使用此 transfer type 通知 slave,slave 的 response 应该与回应 IDLE transfer 时相同,也就是 zero wait cycle 的 OKAY response。
NONSEQ (Non-sequential) : (HTRANS[1:0])=0b10)
指示目前 transfer 的 address 和 control 信号与上一个 transfer 无关。
SEQ (Sequential)):(HTRANS[1:0])=0b11)
指示 address 和上一个 transfer 相关,而 control 信号则和上一个 transfer 相同,通常用在 burst transfer 中。
例子: transfer type 的 example。
- T0-T1 4-beat 读取以 NONSEQ transfer开始。(第一个 burst transfer 的 type 一定为 NONSEQ)
- T1-T2 master无法执行第二拍,并插入BUSY transfer以延迟第二拍的开始。 slave提供第一拍的 read data 。(因为 master 无法把下一个资料在第二个 cycle 准备好,因此使用 BUSY type 去延迟第二个 transfer。)
- T2-T3 master现在准备开始第二个节拍,因此发出SEQ transfer信号。 master忽略 slave在 read data bus上提供的任何数据。
- T3-T4 master执行第三拍。 slave提供第二拍的read data。
- T4-T5 master执行最后一拍。 slave无法完成transfer,并使用 HREADYOUT 插入单个等待状态。
- T5-T6 slave提供第三拍的read data。
- T6-T7 slave提供最后一拍的read data。
Burst Type(HBURST[2:0])
Burst type 是用来让 AHB master 发出 address 彼此相关的连续 transfer(control 信号需相同)。
Burst type用来指示 burst 的长度与 address 间的关系。
burst 的长度(transfer 的个数,在 AHB Spec中使用 beat这个英文字)
AHB 支持的 burst type:
incrementing burst:
每一个的 transfer address 必定是前一个 transfer 的 address 加上transfer size。
wrapping burst :
将 memory 切割成了 (transfer size X transfer beat)大小的一个个 memory boundary。
当 transfer address 要跨越 boundary 时,下一个 transfer address 会绕回 boundary 起点。
例子:
现在我们要传送 4 笔 wrapping burst,transfer size 为 word (4 byte),
第一笔 transfer 的 address 为 0x34,
此时(4 byte x 4 transfer)则transfer会在16-byte boundary绕回,
所以4笔transfer的address分别是0x34, 0x38, 0x3C, 0x30。
Transfer Direction(HWRITE)
HWRITE 控制与主机之间的数据传输方向:
HWRITE为高电平
表示写传输,主机在写数据总线上传播数据,HWDATA[31:0]。
HWRITE为低电平
执行读取传输,从机必须在读取数据总线上生成数据, HRDATA[31:0]
Transfer Size(HSIZE[2:0])
Protection Control(HPROT[3:0])
HPROT[3:0]可以让 master 提供额外的 protection information,例如:指示 transfer 是 opcode fetch 或 data access 等。
由于 AHB Spec并未规定所有 的 master 都要指示精确的 protection information,所以 slave 在设计时若非必须,尽量不要使 用 HPROT 信号。
(若 master 没有 protection transfer 的考虑, HPROT 可以 output 4’b0001 信号)
Slave Response
(1)slave 使用 HREADY 信号去 extend transfer(插入几个 wait cycle)
(2)在 transfer 结束时(HREADY 在 data phase 为 high),Slave 使用 HRESP[1:0]去告诉 master transfer 结束时的 status。
在 AHB 里 transfer 结束时,可以表示的 status 共有4种:
- OKAY:transfer 成功的完成了
- ERROR: transfer 失败了(例如,企图写入 read-only 的 memory location,或读写根本不存在的 memory location 等。)
- RETRY
- SPLIT
RETRY 和 SPLIT :
用在当 slave 判断目前的 transfer 将需要很多的 bus cycle 来完成, 为了避免因为目前的 transfer 将 bus 一直 lock 住,而回应 RETRY/SPLIT response 给 master, 表示目前的 transfer 尚未完成,master 需要重新发出相同的 transfer 再试一次,而此时 arbiter 就能将bus release 给其他有需要的master 使用。
Retry 和Split 的差别:在于arbiter 的master 优先权管理(Priority Scheme)
RETREY response :
arbiter 内 master 的优先权不变,当有更高优先权的 master 发出 request 时,bus access 的权力会由高优先权的 master 取得,但如果原来得到 RETRY response 的 master 是当时 request bus 的 master 中拥有最高优先权者,则 bus 还是会继续被占住而无 法 release 给其他有需要的 master。
SPLIT response :
当 arbiter 观察到 master 收到 SPLIT response 时,则会将 master 的优先权 给 mask 起来,当 mask 后,master 将无法再获得 bus access 的权力,即使已经没有其他 master 向 arbiter 发出 request 也一样。
若所有的 master 都收到 SPLIT response,则 arbiter 会把 bus access 的权力给 dummy master (只会发出 IDLE transfer 的 master)。
当回应 SPLIT 的 slave 处理完 transfer 的要求后,会发出 HSPLIT 讯号给 arbiter,则 arbiter 会将 master 的优先权 unmask,如此 master 的优先权就回复原状而有机会 access bus 了。
SPLIT response优点:
SPLIT response能让低优先权的master在合理的情况下(无更高优先权 master 要求 bus 时)取得 bus 的拥有权,因此可以让 AHB bus 有更好的设计。
SPLIT response缺点:
硬体设计的复杂。
1、 arbiter 必须要去观察 HRESP 讯号,且要有当收到 SPLIT 时更动 master 优先权的设计。
2、 Slave 需要纪录 master 的 number 以便以后要通知 arbiter 恢复那个 master 的优先权,Slave 可以从 arbiter 发出的 HMASTER 信号查得。(在 AHB 系统里最多可以有 16 个master,所以HMASTER是4个bit,然而通知arbiter可以unmask的信号HSPLIT因是one-hot 的表示方式,所以需要 16 bit。)
注意:
- AHB 并没有强制规定 Slave 需支持 Retry 或 Split response,Slave 可以只用 HREADY 去 delay 对 transfer 的回应(delay 的时间无上限值,但 Spec中建议不要超过 16 个 cycle)。
- master 则需要支持对 Retry 或 Split response 的处理:重新再发出相同的 transfer。
完成4个 response status需要的cycle:
- OKAY : one –cycle
- ERROR or RETRY or SPLIT:two-cycle 。【在这两个 cycle 中 HRESP 维持想要回应的 status 不变,而 HREADY 则在第一个 cycle 为 low,第二个 cycle 为 HIGH】
需要两个 cycle原因:
AHB 为 pipeline operation,current transfer 的 data phase 与 next transfer 的 address phase 是 overlap 的。
而这3种 Response 皆可能因为目前的 transfer 并未成功而影响了下一个transfer的存取,使的master 需要cancel预备要进行的下一个transfer。
(在 AHB 的规定里,因为 Retry/SPLIT 是代表目前 transfer 尚在处里,所以下一个 transfer 必 须一定要取消,而 ERROR response 表示 transfer failed,在某些情况下,master 仍然会尝试下一笔 transfer,因此当 master 收到 ERROR response 时,继续存取下一笔 transfer 是允许的, 不过 ERROR response 此时还是需要花 two-cycle)
例子:
master 原本预备进行 address A/A+4 的两个 transfer,
可是在transfer A 的 data phase(同时也是 A+4 transfer 的 address phase)的第一个 cycle,
master 侦测到retry 的 response,
由于这个 cycle 的 HREADY 为 LOW,不仅将 data phase 给 extend,同时也表示 address A+4 的 transfer 并没有开始,
所以 master 才有机会在下个 cycle 将 address A+4的 transfer 给替换成 IDLE transfer。
如果 RETRY response 只有 one-cycle,则 transfer A 收到 retry的同时,transfer A+4 也开始进行了,而它很有可能也收到 RETRY response(因为 slave 还在处理 transfer A),如此下去,以后的 transfer 可能都无法完成了。
在 RETRY response 的第二个 cycle 里,我们看到 master 改成发出 IDLE transfer,这其实是为了让 arbiter 能顺利的完成 arbitration。
在 slave 决定要回应何种 response 给 master 前,slave 可能会需要多几个 wait cycle 去衡量,此时的 wait cycle 除了将 HREADY 给 drive LOW 之外,还需要将 HRESP 给 drive 成 OKAY
response。
例子:
transfer A 的slave 在回应ERROR response 之前还多extend1个 cycle,而此时的 response 为 OKAY。
Arbitration
由于 AHB 为 Multi-Master 的系统,而同一时间只允许一个 master 去 access bus,因此需要arbiter 去做 Arbitration。
AHB Arbitration 的机制:
当 master 想要 access bus 时,master 将 HBUSREQ signal 给 drive high
同一时间可能有多个 master 都想要 access bus,
因此 arbiter 在 HCLK 的rising edge 去 sample 各个 master 的 HBUSREQ 信号后,
需决定哪个发出 request 的 master 有最高的 priority,
然后将此 master 的HGRANT 信号 drive high,表示他可以 access bus 了。
(每个 master 都有自己的 HBUSREQ 信号)
( AHB 并无规定 priority algorithm,由系统设计者自订),
(若原本已有 master 在 access bus,arbiter会将原本 master 的 HGRANT 信号给 drive LOW 表示他已丧失 access 的权力了
当 master 正进行 fixed-length burst transfer 时,如果有更高 priority 的 master 发出了 request:(两种执行情况)
(1)arbiter 等待 burst 完成后再将 bus grant 给新的 master。
(2)在 burst 进行中,中断原有 master 的 bus 拥有权(ownership),让高 priority 的master 去 access bus。而被中断的 master就需要重新发出 request,等待下次 Grant bus 时继续完成 burst 了。
若 master 想要进行的连续 transfer 是不可被中断的(譬如在 access shared memory 时)
master 可以在 request 时,同时将 HLOCK 给 drive high,
告诉 arbiter 我要进行的是不可被中断的 transfer,
则当 master 获得access bus 权力后,arbiter 将不会再把bus release 给其他master,
直到 master 自行将 HLOCK 给 drive LOW,arbiter 才会再进行 arbitration 的动作
AHB协议的verilog实现(无等待/单次传输)
AHB协议的verilog实现(无等待/单次传输) - 知乎 (zhihu.com)
参考
AMBA总线协议(一)——一文看懂APB总线协议_摆渡沧桑的博客-CSDN博客_amba总线协议
AMBA总线—APB总线协议详解_SD.ZHAI的博客-CSDN博客_apb总线
AMBA 3 APB 协议规范
Introduction to AMBA Bus System 工研院 / 系統晶片技術㆗心工程師 吳欣龍
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)