AHB协议简介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的连接。
- AHB总线架构
AHB总线的强大之处在于它可以将微控制器(CPU)、高带宽的片上RAM、高带宽的外部存储器接口、DMA总线master、各种拥有AHB接口的控制器等等连接起来构成一个独立的完整的SOC系统,不仅如此,还可以通过AHB-APB桥来连接APB总线系统。AHB可以成为一个完整独立的SOC芯片的骨架。下图为典型的AHB结构示意图。
- AHB结构特点
Burst传输
Split事务处理
总线带宽:8/16/32/64/128bits
流水线操作
支持多个总线主设备
无三态(无Z态)
单一始终操作
单周期master移交
- AHB总线的基本组成
AHB总线主要有四部分组成:
主设备Master:发起一个读/写操作。某一时刻只允许一个master控制总线。
从设备Slave:响应一次读/写操作。 通过地址映射来选择使用哪一个从设备。
仲裁器Arbiter; 允许某一个主设备控制总线。
译码器Decoder; 通过地址译码来决定选择哪一个从设备。
AHB总线可以分为三组:
HADDR(地址控制总线);
HWDATA(读数据总线);
HRDATA(写数据总线);
- 总线操作概述
当有Master向arbiter发出请求控制总线传输时,arbiter授权给指定的master。同一时间周期只允许一个master可以控制总线,对其指定的slave进行读/写操作。获得授权的总线开始进行数据传输,首先发出地址和控制信号(提供地址信息、读/写操作、带宽和burst类型)。译码器根据地址和控制信号确定哪个slave与master进行数据通信。数据传输通过数据总线完成。AHB将读写总线分开(实现两级流水),写数据总线用于从master到slave的数据传输,读数据总线用于从slave到master的数据传输。
数据传输分为两个阶段:地址周期和数据周期。地址周期传输地址和控制信号,只占用一个时钟周期并且不能被扩展。因此slave必须在一个周期内采样地址信号。数据周期可以通过HREADY信号扩展,当HREADY为低时数据传输延长一个周期,另外slave通过响应信号HRESP反映传输状态。
- AHB总线传输时序
3.1信号描述
AHB总线控制信号:
信号名 | 含义 | 源 | 描述 |
---|---|---|---|
HCLK | 总线时钟 | clock source | 总线时钟,上升沿采样 |
HRESETn | 复位 | reset controller | 总线复位,低电平有效 |
HADDR[31:0] | 地址总线 | Master | 32位地址总线 |
HTRANS[1:0] | 传送类型 | Master | 当前传输类型NONSEQ, SEQ, IDLE, BUSY |
HWRITE | 传送方向 | Master | 1为写,0为读 |
HSIZE[2:0] | 传送大小 | Master | 每一个transfer传输的数据大小,以字节为单位,最高支持1024位 |
HBURST[2:0] | 批量传送 | Master | burst类型,支持4、8、16 burst,incrementing/wrapping |
HPROT[3:0] | 保护控制 | Master | 保护控制信号,需要slave带保护功能,一般不用 |
HWDATA[31:0] | 写数据总线 | Master | 写数据总线,Master到Slave |
HRDATA[31:0] | 读数据总线 | Slave | 读数据总线,Slave到Master |
HREADY | 传送完成 | Slave | 高:Slave指出传输结束 |
低:Slave需延长传输周期 | |||
HRESP[1:0] | 返回响应 | Slave | Slave发给Master的总线传输状态OKAY, ERROR, RETRY, SPLIT |
HSELx | 选择从设备 | Decoder | slave选择信号 |
AHB仲裁信号:
信号 | 含义 | 源 | 描述 |
---|---|---|---|
HBUSREQx | Bus请求 | Master | M向A发出的总线使用请求信号 |
HLOCKx | 锁定传送 | Master | 如果一个master希望自己在传输期间不希望丢掉总线,则需要向仲裁器发送这个锁定信号 |
HGRANTx | Bus同意 | Arbiter | master 授权信号,当前master x的优先级最高。当HREADY和HGRANTx同时为高时,master获取系统总线的控制权利 |
HMASTER [3:0] | 某个主设备 | Arbiter | 具有split功能的slave 仲裁器为每一个master分配的ID,指出哪个主设备正在进行传输,提供进行split的信息 |
HMASTLOCK | 锁序 | 具有split功能slave | 表示当前的master正在执行Locked操作。 |
HSPLITx[15:0] | 分段请求 | Slave | 从设备用这个信号告诉仲裁器哪个主设备运行重新尝试一次split传输,每一位对应一个主设备。 |
3.2基本传输
3.2.1一次无需等待传输(写操作和读操作)
第一个周期(地址控制周期)的上升沿,master驱动(发送)地址和控制信号(同时发出);
第二个周期(数据周期)的上升沿,slave采样地址和控制信号,并将HREADY拉高;
如果是写操作,master会在第二个周期的上升沿传输要写入的数据;
如果是读操作,slave会在HREADY信号拉高后将读取的数据写入总线;
第三个周期的上升沿,
如果是写操作,master获取HREADY高信号,表明slave已成功接收数据,操作成功;
如果是读操作,master获取HREADY高信号,表明此时的读数据有效并且接收下来,操作成功。HREADY信号在数据有效期间必须为高,并且延续到第三个周期的上升沿之后,确保master的正确采样。
3.2.2插入等待的传输
slave可以及时处理master请求,但也可能存在slave太慢不能立即处理的情况。这时需要让master稍微等一等,需要slave插入一些等待的状态。如上图所示,HREADY信号在第二和第三周期拉低,需要master等待2个周期。在这里需要注意2点:
如果是写操作,master需要在等待期间保持写数据不变,直到本次传输完成;
如果是读操作,slave不需要一开始就给出数据,仅当HREADY拉高后才给出有效数据。
3.2.3多数据传输流水线
AHB总线数据传输支持两级流水线传输,当在第一个数据的数据周期阶段可进行传送下一个数据的地址和控制数据。上图所示,A和C为零等待传输,B加入了一个等待周期。(上升沿操作)
第一个周期,master发起一个操作A,并驱动地址和控制信号;
第二个周期,slave收到了来自总线的请求,将HREADY信号拉高;
第二个周期上升沿后,master发现有操作B需要执行(在第三个周期上升沿发送),并且检查到上一周期的HREADY为高,则发起第二个操作B;
第三个周期,master获取HREADY信号为高,表示操作A已经完成;
第三个周期上升沿后,master发现有操作C需要执行,并且检查到上一周期的HREADY为高,则发起第三个操作C;
第三个周期上升沿后,slave由于繁忙插入了一个等待状态,将HREADY拉低;
第四个周期,master获取HREADY信号为低,知道slave希望等待,于是master保持和上一拍一样的信号;
第四个周期,slave处理完了事务,将HREADY信号拉高,表示可以继续处理;
第五个周期,master获取HREADY信号为高,知道slave已经可以处理B操作;
第五个周期上升沿后,B操作完成;
第六个周期上升沿后,C操作完成。
需要注意几点:
HREADY在一定程度上表示了slave的pipeline能力,在AHB中是2个pipe,也就是总线上最多存在2个未处理完的transfer。只有当总线上未完成的transfer少于2个时,master才能发起操作(当发送第三个地址和控制信号时,即该时刻的HREADY为高)。
3.3控制信号
3.3.1传送状态HTRANS[1:0](前两种很少用到,后两种表示有效状态)
00 | IDLE | 空闲状态 | 占用总线的master没有数据发送;两次burst传输中间主设备可发IDLE,此时就算slave被使能,也不会从总线上获取任何的数据信号。如果此时salve被选中,那么每一个IDLE周期slave都要通过HRESP[1:0]返回一个OKAY响应。 |
---|---|---|---|
01 | BUSY | 忙状态 | 主设备占用总线,但是在burst传输过程中还没有准备好进行下一次传输一次burst传输中间主设备可发BUSY,这时slave不会从总线上收取数据而是等待,并且通过HRESP[1:0]返回一个OKAY响应。需要注意的是,这个transfer需要给出下一拍的地址和控制信号,尽管slave不会去采样。 |
10 | NOSEQ | 非连续状态 | 表明一次单个数据的传输或者一次burst传输的第一个数据 地址和控制信号与上一次传输无关 |
11 | SEQ | 连续状态 | burst传输接下来的数据 地址和上一次传输的地址是相关的,这时总线上的控制信号应当与之前的保持一致,地址视情况递增或者回环。 |
3.3.2读写信号HWRITE
状态 | 含义 |
---|---|
1 | 写数据,M→S |
0 | 读数据,S→M |
HWRITE:表示传送方向(依读或写的动作来决定传送信号的方向)
HWRITE 拉高时(写),M 必须对写入动作初始化,数据会由 M 放到 HWDATA[31:0]
总线上。
HWRITE 拉低时(读),M 会对读取动作初始化,被寻址到的S会将数据放到 HRDATA[31:0]
总线上
3.3.3数据大小HSIZE[2:0]
通常的 AHB 从设备是 32 位数据线,所以它支持 8 位,16 位和 32 位 3 种大小。
000 | 8bits |
---|---|
001 | 16 |
010 | 32 |
011 | 64 |
100 | 128 |
101 | 256 |
110 | 512 |
111 | 1024 |
3.3.4批量传送HBURST[2:0](项目中很少用到)
HBURST传输不能跨越1K边界,支持两种传输方式:
递增传送(incrementing burst),会依上一次的地址加1。
回绕传送(wrapping burst),以4beat为例,如果第一个地址=0x34,0x34、
0x38、0x3C、0x30。
3.3.5保护控制HPORT[3:0]
HPROT[3:0] 为总线协议保护信号用来定义存取的型态与特性,并非所有的 M 都会传送出
HPROT[3:0],所以除非 S 有需要否则不会使用到
HPROT[3:0]信号。一般来讲该信号很少用到。
3.4响应信号
master发起一笔传输后,slave可以决定这笔传输的进程,而master不能取消已经发出的传输。slave通过
HREADY信号反映传输是否完成,通过HRESP[1:0]反映传输的状态。
1)、slave可以如下方式完成一笔传输:
立即完成一笔传输。
延迟一个或几个周期完成传输。
传输失败返回error。
延迟传输,释放总线。
2)、传输完成标志HREADY:
HREADY为高时传输完成。
HREADY为低时传输需要延迟。
3)、传输响应标志HRESP[1:0]:
00: OKAY—传输完成。
01: ERROR—传输错误。
10:
RETRY—传输未完成,请求主设备重新开始一个传输,arbiter会继续使用通常的优先级。
11:
SPLIT—传输未完成,请求主设备分离一次传输,arbiter会调整优先级方案以便其他请求总线的主设备可以访问总线。
4)、地址译码
地址译码器用于为总线上每个slave提供选择信号HSELx,选择信号是通过组合逻辑对地址码译码产生的。只有当前的数据传输完成后(HREADY为高),slave才会采样下一个地址和控制信号以及HSELx。在一定条件下可能会出现这样的情况:产生HSELx信号而HREADY为低,在当前传输后slave会改变。
每个slave最小的地址空间为1KB,所有的master的burst传输上限也是1KB,如此设计保证了不会出现地址越界问题。当一个设计不会用到所有的地址空间时,可能出现访问到一个不存在的地址的情况,这就需要增加一个附加的默认slave(default
slave)来为上面的情况提供一个响应。当SEQ或NONSEQ传输访问到一个不存在的地址,默认slave应该提供ERROR响应;当IDLE或BUSY传输访问到一个不存在的地址,默认slave会响应OKAY。地址译码器会带有实现默认slave的功能。
5)、仲裁
仲裁机制保证了任意时刻只有一个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产生指示当前传输是否为锁定序列传输。
Qx同时由master向arbiter发出。
HGRANTx:arbiter产生指示master获得授权,当HGRANTx信号为高同时HREADY为高时,master可以向总线传输地址信号。
HMASTER[3:0]:arbiter产生指示哪个master获得授权,这一信号用于地址控制多路来选择哪个master接入总线。
HMASTERLOCK:arbiter产生指示当前传输是否为锁定序列传输。
HSPLIT:供支持SPLIT传输使用。