1.一个典型的基于 AMBA 总线的 SOC 系统架构
这种SOC架构以AHB或者ASB系统总线为主干,挂上CPU,片上内存,和其它DMA设备。AHB或者ASB 系统总线在需要做大量数据传送的模块之间提供了高带宽的接口。同时,外围总线APB在AHB或者ASB和 低带宽的外围设备之间提供了通信的桥梁。所以APB是AHB或者ASB的二级扩展总线
2.AHB 总线互连结构
3.AHB协议操作流程
- 在 AHB 传送开始之前,M 必须得到仲裁器的总线访问授权:M 向仲裁器发出总线请求信号,然后仲裁器指示这个 M 什么时候可以得到授权
- M 得到总线访问授权后,驱动地址与控制信号,来开始 AHB 传送。这些信号提供传送地址,传送方向,传送带宽,是否这次传送是 burst 传送等信息。
c. 在 AHB 上,一次传送包括给出地址、控制信号周期与数据周期。地址与控制信号周期最少需要一个周期,但是会因为数据的原因多出几个周期。数据周期可以由HREADY信号来延迟。
d.AHB 支持批量式数据传送,可以自动递增地址。递增地址方式分为:持续递增与回绕传送。
e.当HREADY 被S 拉低时,会发生等待状态。需要延迟传送的周期时,就会在数据期间将HREADY 拉低,此时地址与数据都必须延伸。
f.S 以 HRESP[1:0]信号表示传送的状态为:OKAY,ERROR,RETRY,或 SPLIT。
g. 在 AHB 总线上,M 的传送型态可由 HTRANS[1:0]来表示,有 IDLE ,BUSY ,NONSEQ ,SEQ 四种型态。
h. 在 AHB 总线上,HWRITE 表示传送方向,HWRITE 为 HIGH 时,M 做写入动作,数据会由 M 放到 HWDATA[31:0] 总线上。
i. HWRITE 为低时,M 做读取动作,被寻址到的 S 会将数据放到 HRDATA[31:0] 总线上。
j. 传送数据大小由 HSIZE[2:0] 表示每次传送的字节数目。
k. 在 AHB 上可使用大端摆放法或小端摆放法,由系统设计者决定。
l. 仲裁器以 HMASTER 表示当前是哪一个 M 在使用 bus,此信号也可用来控制地址多任务器。
m. 一个可执行分割传送的 S 以 HSPLIT[15:0]信号,让仲裁器知道要让哪一个 M 完成其未完成的分 割传送。
n. S 可以用 SPLIT 来解决延迟太长的存取,仲裁器必须观察响应信号并且遮掉已被分割传送的 M, 使其等候 HSPLIT 信号的通知后才 grant 其总线使用权
4.AHB传输模式
a.零等待传输(no wait state transfer)
如图所示,AHB 的传送模式包含二个阶段(2 个时钟周期完成),第一阶段为地址 的传递,另一阶段为数据的传递,没有额外的等待周期;
当 HCLK 正沿触发后,M 送出地址与控制信号,HCLK 由 CLOCK 驱动送至 AHB 接口。
S 在 HCLK 下一个正沿触发时,收到地址与控制信号。
在 HCLK 的第三个正沿触发时,M 收到 S 的响应信号,以及读数据
AHB 支持流水线的动作,在收上一笔数据的同时,可将下一笔数据的地址送出
b.等待传输(transfers with wait states)
c.多重传送(multiple transfer)
d.递增brust
T1,master传入地址和控制信号,因为是新的burst开始,transfer的类型 是NONSEQ;
T2,由于master不能在第二个周期里处理第二拍,所以master使用BUSY transfer来为自己延长一个周期的时间。注意,虽然是延长了一个周期,但是 master需要给出第二个transfer的地址和控制信号;
T3,slave采集到了master发来的BUSY,知道master需要等待一拍,所以 slave会忽略这个BUSY transfer;
T3,master发起了第二个transfer,因为是同一个burst的第二个 transfer,所以transfer的类型是SEQ;
T5,slave将HREADY信号拉低,告诉master需要等待一个周期;
T8,时刻完成最后一个transfer。
需要注意的 虽然slave会忽略掉BUSY transfer,但是master也需要给出下 一拍的地址和控制信号。
e.回环burst
跟之前唯一的区别在于地址的不同,在0x3C地址之后,根据回环的地址边界,第三拍的地址变为0x30。一共四拍,4个地址,每个地址各不相同,这四个 地址是一个回环范围。起始地址决定了回环操作的回环范围。
f.递增burst
5.控制信号--HTRANS[1:0]
HTRANS[1:0] | 传输类型 | Description |
00 | idle | 主设备占用总线,但没有进行传输。 在两次burst传输之间,主设备可以发送IDLE信号。 如果slave设备被使能,它不会从总线上获取任何数据信号 |
01 | busy | 主设备占用总线,但在burst传输过程中还没有准备好进行下一次传输。 在一次burst传输的中间,主设备可以发送BUSY信号。 Slave设备不会从总线上收取数据,而是等待,并通过HRESP[1:0]返回一个OKAY响应。 |
10 | nonseq | 表明一次单个数据的传输或一次burst传输的第一个数据。 地址和控制信号与上一次传输无关 |
11 | seq | 表示burst传输接下来的数据。 地址与上一次传输的地址是相关的,这时总线上的控制信号应当与之前的传输保持一致。 |
6.控制信号--burst[2:0]
AHB 从设备通常支持 SINGLE,INCR,INCR4,WRAP8,INCR8 和 INCR16。
AHB 对传送范围规定不可超过 1KB,递增传送的大小可为任意数目,但是不可超过 1KB 的范围。
7.控制信号--size[2:0]
HSIZE[2:0]与 HBURST[2:0]两个信号可合起来定义回绕地址的范围。
例如: HSIZE[2:0]= 32 位,HBURST[2:0]长度为 4 字节,则回绕地址须对齐在 16 字节。
通常的 AHB 从设备是 32 位数据线,所以它支持 8 位,16 位和 32 位 3 种大小
8.控制信号--prot[3:0]
HPROT[0] | 指令提取 | 当设置为0时,表示当前传输是指令提取 |
HPROT[0] | 数据存取 | 当设置为1时,表示当前传输是数据存取 |
HPROT[1] | 使用者存取 | 当设置为0时,表示当前传输是使用者(非特权)存取 |
HPROT[1] | 特权存取 | 当设置为1时,表示当前传输是特权存取 |
HPROT[2] | 不可有缓冲区 | 当设置为0时,表示传输的数据不应被缓冲 |
HPROT[2] | 可有缓冲区 | 当设置为1时,表示传输的数据可以被缓冲 |
HPROT[3] | 不可有快取 | 当设置为0时,表示传输的数据不应被缓存 |
HPROT[3] | 可有快取 | 当设置为1时,表示传输的数据可以被缓存 |
9.地址译码
在AHB中,中央译码器会依据地址的高位产生不同的选择信号HSELx,地址的低位送给 S 以寻址其的内部存储器或缓存器。而S只有在HREADY拉高时,才会将地址、控制信号与选择信号收下,因为 HREADY 拉高时,表示当前的数据传送已完成。
10.从传输应答resp[1:0]
HRESP[1:0] | 类型 | 描述 | 说明 |
00 | OKAY | 传送顺利进行 | 从端可以用 HREADY(拉高)与 OKAY 的信号响应,代表传送已成功完成。HREADY 被拉低,加上 OKAY 的信号可插入在任何的响应信号(ERROR、RETRY 或 SPLIT)之间,也就是 当 S 在未能正确的选择 ERROR、RETRY 或 SPLIT 时,可以插入 HREADY(拉低)与 OKAY 信号,但是等待状态最多只可使用 16 个周期。 |
01 | ERROR | 发生传送错误 | 此次数据传送有误,此信号必须维持两个周期 |
10 | RETRY | 传送不能立 即进行,但M 必须不断地 发起操作 | 此信号必须维持两个周期,M 必须重提数据传送的要求 |
11 | SPLIT | 同上 | 此信号必须维持两个周期,S 响应此信号表示此次的传送无法完成,要以分段传送方式来达成。等到 S 可以完成时,会知会仲裁器,让重提数据传送要求的 M,完成传送。 |
11.错误应答error
M 收到一个 ERROR 的信号时,它可以选择结束当前的批量数据传送,继续传送剩下的批量数据也是可接受的,但通常不这样做。
在S送出 ERROR的信号之前必须先送出OKEY + HREADY (LOW) 的信号,而 ERROR 信号至少需要维持两个周期。
在第二个周期S 送出OKAY+ low HREADY 信号,让S 有充分的时间决定是否需要发出 ERROR 的信号。在 M 收到 ERROR 信号后,立刻结束当前的数据传送。 „ 注意:S 必须维持 ERROR 至少两个周期
12.分段传送与重传的异同
RETRY :仲裁器使用一般的优先权;S 只要求 M 重提要求;
SPLIT :仲裁器会调整做分段传送 M 的优先权,所以即使该 M 的优先权比较低,还是可以及早得到总线使用权来完成数据的传送。
S 的数据准备好时,必须告知仲裁器,让相关 M 完成其要求。
段传送必须由 S 与仲裁器支持,总线可放出让其它的 M 使用。
RETRY时序图说明:
当 S 要求 M RETRY 时,会送出至少一个周期的 RETRY 加拉低的 HREADY 信号,M 收到此信号时,表示要重新送出地址。
在 T1 时,M 送出地址 0x68,而在下一个控制信号来之前就送出地址 0x72。
在 T2,S 送出 RETRY 加低 HREADY 信号,表示要 M 重新传送,则下一个地址 0x72 会先被忽略。
S 在 T2 就送出 HRESP[1:0]并且在 T3 时继续送出, HREADY 在 T3 结束前拉高。
当 M 收到 RETRTY 时必须以 IDLE 响应。
在 T4 时,M 重新送出地址 0x68,之后就如同 T1。当然这假设此 M 业已获得总线使用权。
13.数据总线
AHB 将读与写的数据总线分开,避免了三态的使用,最小的宽度为 32 位。
写出数据总线为 HWDATA[31:0]
写出数据由 M 发出。
M 必须将数据总线上的数据维持住,直到 S 完成数据的接收 (HREADY HIGH)。 所有传送所对应的地址都必须对齐,例如:32 位的传送地址 Addr[1:0] = 00。 大端摆放法(big endian)或小端摆放法(little endian)都可使用
读入数据总线为 HRDATA[31:0]
在执行读取动作时,数据是由 S 所送出。 „
当 S 将 HREADY 拉为 HIGH 时,S 会在传送的最后一个周期前将有效数据送出。 数据摆法与写的动作相同。
14.总线仲裁机制
仲裁机制目的: 确保任何时刻只有一个 M 在访问总线.
仲裁器功能:
a.通过观察不同的总线请求信号,通过仲裁算法来决定哪个 M 有最高优先级.
b. 接收 S 的完成分段传送的请求
无法完成分段传送的 S 不需要知道仲裁器的处理进程,但需要注意到如果总线占用发生变化, 批量传送可能无法完成.
仲裁信号包括:
HBUSREQx:
a.由 bus M 到仲裁器,M 透过此信号对仲裁器提出使用 bus 的要求。b
一个 M 可在任何时间要求仲裁器。
b.对于固定长度的传送,只要要求一次就可,仲裁器会依据 HBURST[2:0] 来判断传送的长度。
c.对于未定的传送长度,M 必须持续提出要求,直到完成全部的传送为止。
d.当所有 M 都不需要使用 bus 时,必须在 HTRANS 上送出 IDLE 信号,仲裁器就会将 bus 的使用权交给预设 M (default M)
HLOCKx: 此信号必须与 HBUSREQx 配合,表示一个不可分段的传送动作,HLOCKx 必须再指定地址之前使能一个周期。
HGRANTx: 由仲裁器输出到 M,仲裁器通知某个 M 表示此 M 得到 bus 的使用权。
HMASTER[3:0]: 仲裁器以此信号表示当前是哪一个 M 在使用 bus,此信号也可用来控制地址多任务器。
HMASTLOCK: 仲裁器以此信号表示当前的 bus 是被 lock 住的。
HSPLIT[15:0]:一个可执行分段传送的S以此信号让仲裁器知道要让哪一个M完成其未完成的分段传送。
总线访问请求
仲裁器通常会实现在地址译码器内,它会接收每个 M 所发出的地址与 bus 要求信号,仲裁器也会将 grant 讯后传给要求的 M,并且以 HMASTER[3:0]显示当前是哪一个 M 可以使用 bus。 „
译码器 (Decoder with arbiter) 使用 HMASTER[3:0]来控制中央地址与控制信号的多任务器
每个 M 在被允许之前就可将地址与控制信号送出
总线访问批准:
某个总线 M 通过 HBUSREQx 信号来向仲裁器请求总线访问权限,并可能在任何周期内都可以请求总线。仲裁器通过采样时钟的上升沿,然后使用内部的优先算法来决定下一个获得总线的访问权. „
通常在某个 burst 完成时,仲裁器只批准与之前不同的总线 M. „
如果需要,仲裁器可以提前结束某个 burst,而允许更高优先级的 M 来访问总线. 如果主设备要锁总线访问,需要声明 HLOCKx 给仲裁,这样就不会有其它主可以得到总线授权 „
当主得到总线授权,并且正在执行一个定长的 burst,它不需要继续总线请求去完成这个 burst. 仲裁观察 burst的进程,并使用 HBURST[2:0]来决定主有多少个传送。如果主希望在当前正在进行的 burst 之后继续 1 次 burst,它应在当前 burst 期间重新声明请求信号. „
如果主在 burst 中间失去了总线访问权,它必须重新声明 HBUSREQx 请求信号来重新获得总线访问权限. „
不定长的 burst,主应该继续声明请求直到它开始最后一个传送。仲裁不能预测不定长的 burst 什么时候结束,并切换授权. „
主没有请求,但有可能获得了总线控制权。这是因为当没有主去请求总线时,主会授权给一个默认的主 所以当某个主不需要总线访问,它需要把传送类型 HTRANS 设置为 IDLE 传送,这点很重要
分段传送HSPLIT:
S 可以用 SPLIT 来解决延迟太长的存取。
分段传送顺序 :
- 一 M 送出地址与控制信号,开始传送。
- 被寻址到的 S 立即提供数据,或者送出分段传送应答信号(如果需要等些周期来获得数据)。 在每次的传送,仲裁器会广播出当前是哪一个 M 在使用总线。S 需要记录 M 号,以便后面重传使用.
- 有 SPLIT 信号响应时,仲裁器会将总线使用权交给别的 M 使用,如果所有其它 M 都收到 SPLIT 信号,则移交给预设 M。
- 当 S 要完成分段传送时,S 会在 HSPLITx 上设定对应的 M ID,来指示哪个 M 可以被允许 再次访问总线。
- 仲裁器会在每个周期观察 HSPLITx 信号,如果有变化,就更改正确的 M 的优先权。
- 仲裁器将会允许重新要求使用权的 M,但如果有更高优先级的 M 在用总线,可能会延迟。
- S 会响应 OKAY 信号表示传送完成。
split 应答是由于 S 当前不能全部准备好 M 所请求的全部数据,从而给出该应答信号,从而使得仲裁器屏蔽掉该 M 的总线请求,使其不能获取总线,以给 S 留出准备数据的时间。 当 S 准备好数据之后,它将通过 HSPLITx 信号通知仲裁器取消前面对该 M 的请求屏蔽,使其能够重新请求总线,完成传送过程。SPLIT 操作需要 S 和仲裁器都提供硬件上的支持,实现起来有一定的复杂度。
分段传送之总线转换:
当 M 收到 SPLIT 或 RETRY 响应信号时,必须先进入 IDLE 状态并且重新要求 bus 使用权,一个新的 M 会在 IDLE 周期结束前由仲裁器决定出来。
M 在收到 SPLIT 或 RETRY 信号后须立刻进入 IDLE 状态。
在 T2 与 T3,S 会传两个周期的 SPILT 信号。
该 M 在 T3 正沿时发现有 SPLIT 响应信号,于是进入 IDLE 状态。
仲裁器在 T3 正沿时,决定下一个 bus 的使用者。
在 T4,新的 M 送出地址与控制信号
15.复位机制:
复位信号 HRESETn,是低电平有效,并且是所有总线单元的首要复位. 复位可能异步发起,但撤消是与 HCLK 的上升沿同步的. 异步复位同步释放
在复位期间,所有主必须确保地址与控制信号处于有效电平,并且 HTRANS[1:0]指示为 IDLE.
16.AHB从设备
仲裁器在决定出哪一个 M 拥有总线使用权之后,会将这个 M 数据地址、控制信号及欲写入 S 的数据选出,并且送至每一个 S,而所选出的数据地址会再经由 AHB 译码器产生唯一的 HSELx 使能信号来启动 一 S 的数据传送。M 启动一个数据传送之后,被使能的 S(即 HSELx 为 1 的 S) 会发出 HREADY 信号来决定是否要延长当前数据的传送,若 S 响应 HREADY 为 0,表示此笔数据的传递必须被延迟,若 S 送出的 HREADY 为 1,则表示 S 能够完成此笔数据的传递
如为 SPLIT 响应,仲裁器只允许其它 M 来对 S 作存取的动作,即使要求数据传送的 M 比当前 M 的优先权位来的低,也就是说 仲裁器不会选择当前的 M 来进行数据传送;
如果 S 响应的是 RETRY,那么仲裁器会用一般的权位算法去找出当前发出数据传递要求权位最高的 M 来进行数据传递
17.AHB主设备
在第二笔数据(HADDR[31:0]=0x24)的传送时,原本的传送型态应为 SEQ,但因 M 无法实时准备好第二笔数据的传送,此时的 M 会送出 BUSY 传送型态来延迟第二笔数据的传送