系列文章目录
AMBA协议介绍(1)——APB协议
AMBA协议介绍(2)——AHB协议
AMBA协议介绍(3)——AXI协议
目录
3.相关传输,涉及信号传输类型HTRANS[1:0]、数据尺寸HSIZE[2:0]、Burst传输类型
前言
V2.0 AHB是第二代AMBA协议最重要的一部分。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的一种替代方案。
- 相比于APB,区分了地址周期和数据周期。
一、v2.0什么是AHB协议?
AHB总线强大之处在于它可以将微控制器(CPU)、高带宽的片上RAM、高带宽的外部存储器接口、DMA总线控制器,以及各种AHB接口的控制器等连接起来构成一个独立的完整SOC系统,还可以通过AHB-APB桥来连接APB总线系统。
AHB总线由主设备Master、从设备Slave,内部包括仲裁器,译码器,数据多路和地址控制多路组成。
- 主设备发起一次读/写操作,某一时刻只允许一个主设备使用总线。
- 从设备响应一次读/写操作,通过地址映射选择使用哪一个从设备。
- 仲裁器允许某一个主设备控制总线
- 译码器通过地址译码决定选择哪一个从设备
仲裁机制 仲裁机制保证了任意时刻只有一个master可以接入总线。arbiter决定哪个发出接入请求的master可以接入总线,这通过优先级算法实现。AHB规范并没有给出优先级算法,设计者需要根据具体的系统要求定义。一般情况下arbiter不会中断一个burst传输,将总线接入权让给其他master。当然未定义长度的burst传输是可以打断的,这要看优先级算法是如何规定的。如果一笔burst被打断,master再度获得接入权限时,会传递剩余的部分。如一笔长度为INCR8的传输在传递3 beat后被打断,master再次获得接入授权后,会继续传输剩余的5 beat,剩余部分可以由一个SINGLE和一个INCR4组成,或者一个INCR。
地址译码器 地址译码器用于为总线上每个slave提供选择信号HSELx,选择信号是通过组合逻辑对地址码译码产生的。只有当前的数据传输完成后(HREADY为高),slave才会采样地址和控制信号以及HSELx。在一定条件下可能会出现这样的情况:产生HSELx信号而HREADY为低,在当前传输后slave会改变。每个slave最小的地址空间为1KB,所有的master的burst传输上限也是1KB,如此设计保证了不会出现地址越界问题。当一个设计不会用到所有的地址空间时,可能出现访问到一个不存在的地址的情况,这就需要增加一个附加的默认slave来为上面的情况提供一个响应。当SEQ或NONSEQ传输访问到一个不存在的地址,默认slave应该提供ERROR响应;当IDLE或BUSY传输访问到一个不存在的地址,默认slave会响应OKAY。地址译码器会带有实现默认slave的功能。
二、AHB信号描述
1.各个信号描述
Name | Source | To | Description |
HCLK | clock source | 各module | 总线时钟,上升沿采样 |
HRESETn | reset controller | 各module | 总线复位,低电平有效 |
HADDR[31:0] | Master | decoder | 32位系统地址总线 |
HTRANS[1:0] | Master | mux to slave | 当前传输类型NONSEQ, SEQ, IDLE, BUSY |
HWRITE | Master | mux to slave | 1为写,0为读 |
HSIZE[2:0] | Master | mux to slave | 每一个transfer传输的数据大小,以字节为单位,最高支持1024位 |
HBURST[2:0] | Master | mux to slave | burst类型,支持4、8、16 burst,incrementing/wrapping |
HPROT[3:0] | Master | mux to slave | 保护控制信号,需要slave带保护功能,一般不用 |
HWDATA[31:0] | Master | mux to slave | 写数据总线,Master到Slave |
HRDATA[31:0] | Slave | mux to master | 读数据总线,Slave到Master |
HREADY | Slave | mux to master | 高:Slave指出传输结束 |
HRESP[1:0] | Slave | mux to master | Slave发给Master的总线传输状态OKAY, ERROR, RETRY, SPLIT |
HSELx | Decoder | slave | slave选择信号 |
特别介绍一个小白容易混淆的信号HREADY,总结一下学到的大佬的经验
HREADY:S应答M是否读写操作传输完成,1-传输完成,0-需延长传输周期。需要注意的是HREADY作为总线上的信号,它是M和S的输入;同时每个S需要输出自HREADY。所以对于S会有两个HREADY信号,一个来自总线的输入,一个自己给到多路器的输出;一般作为AHB总线的Slave设备都有2根hready信号,一个为input类型(hready_in),另一个为output类型(hready_out)。
在AHB总线协议中,如果Master设备发起读写操作的时候,Slave设备不能及时响应的话,由Slave设备把hready_out信号拉低来拖延DataPhase周期。但是在Pipeline操作的时候,本次操作data phase是下一次操作的address phase,所以作为Slave设备在响应Master设备的时候,必须先判断一下Master设备对上一次其它Slave设备的操作是否已经完成。如果完成,则响应主设备的操作;如果没有完成,则等待完成,然后才响应操作。hready_in就是Slave设备用来判断Master设备是否对其它Slave设备的操作已经完成的信号。注:hready_in是所有slave的hready_out经过MUX后的信号。
由于ahb的addr phase和data phase是可以overlap的,当发生back-to-back操作的时候,会出现当前cycle是上一个slave的data phase,也是下一个slave的addr phase。
在这时如果S1的heady_out拉低,说此时我最后一个data还没准备好(read access)或还没有准备收(write access); 而此时S2已经看到访问自己的NONSEQ,而且我已经是准备好了的,我就把hready_out拉高了。如下图所示:
这时怎么办?master端只能看到一个hready,到底看S1还是S2的呢?如果看S1,那么他在下一T还会维持NONSEQ,那么S2会认为,我上一T已经收了一个NONSEQ,又来一个NONSEQ而且addr还没递增。在S2会发生protocol fail.如果看S2的,那么S1的最后一个data会被丢掉。
如果在AHB的slave端会多出一个input 的hready_in。这个hready_in在两种作法:
1.通过一个mux,把在data phase的salve的hready_out作为输入连接到所有的slave
2.所有的slave的hready_out相与,连接到所有的slave
slave必须看到自己in_hready&hready_out,才认为一次addrr phase/data phase的成功
PS.为了防止deadlock,一般设计中slave的hready_out的default value是1。slave的hready_out的default value是1,必须是master发起读操作后,slave在下一个cycle一定可以把数据准备好,才能这样设计。
一般作为AHB总线的Slave设备都有2根hready信号,一个为input类型(hready_in),另一个为output类型(hready_out)。在AHB总线协议中,如果Master设备发起读写操作的时候,Slave设备不能及时响应的话,由Slave设备把hready_out信号拉低来拖延DataPhase周期。
但是在Pipeline操作的时候,本次操作data phase是下一次操作的address phaze,所以作为Slave设备在响应Master设备的时候,必须先判断一下Master设备对上一次其它Slave设备的操作是否已经完成。如果完成,则响应主设备的操作;如果没有完成,则等待完成,然后才响应操作。hready_in就是Slave设备用来判断Master设备是否对其它Slave设备的操作已经完成的信号。
作为AHB slave的时候,如果hready_in 为低,则表明master没有完成对其他slave的access,此时slave出的hready_out 不能拉高, Protocol所对应的Slave->Master的HREADY 信号,是slave出的ready_out.
HRESP[1:0] 响应信号
传输响应HRESP[1:0]
00: OKAY
01: ERROR
10: RETRY
传输未完成,请求主设备重新开始一个传输,arbiter会继续使用通常的优先级
11: SPLIT
传输未完成,请求主设备分离一次传输,arbiter会调整优先级方案以便其他请求总线的主设备可以访问总线
AHB仲裁信号
Name | Source | To | Description |
HBUSREQx | Master | arbiter | master给仲裁器的请求获得总线使用权的请求信号,最多支持16个master |
HLOCKx | Master | arbiter | 如果一个master希望自己在传输期间不希望丢掉总线,则需要向仲裁器发送这个锁定信号 |
HGRANTx | arbiter | master | 授权信号,当前bus master x的优先级最高。当HREADY和HGRANTx同时为高时,master获取系统总线的权利 |
HMASTER [3:0] | arbiter | 具有split功能的slave | 仲裁器为每一个master分配的ID,指出哪个主设备正在进行传输,提供进行split的信息,用于地址控制多路选择哪个主设备接入总线。 |
HMASTLOCK | arbiter | 具有split功能的slave | 表示当前的master正在执行Locked操作。这个信号和HMASTER有这相同的时序 |
HSPLITx[15:0] | slave | arbiter | 从设备用这个信号告诉仲裁器哪个主设备运行重新尝试一次split传输,每一位对应一个主设备 |
2.总线操作过程
有需要占用总线的主设备向仲裁器发出请求,仲裁器授权给指定的总设备,任一时间周期只有一个主设备可以使用总线,对其指定的从设备进行读写操作。
获得授权的总线开始AHB传输,首先发出地址和控制信号,提供地址信息(HADDR)、传输方向、带宽(HSIZE)和burst类型信号(HBURST)。总线统一规划从设备的地址(HSELx),译码器根据地址和控制信号确定某个从设备与主设备进行通信。数据传输通过数据总线完成,不出现三态总线,AHB将读写总线分为读总线和写总线。每次传输包括一个地址和控制周期,一个或多个数据周期。地址和控制周期不能扩展,从设备必须在一个周期内采样地址信号,数据周期可以通过HREADY信号扩展,这点与前面的APB的PREADY信号实现有等待信号传输一样。HREADY为低时给传输加入一个等待状态以使从设备获得额外的时间提供或采样数据,从设备通过响应信号HRESP反映传输状态,AHB-APB桥连接APB总线系统时,PSLVERR被映射到HRESP = ERROR(PSLVERR -> HRESP[0])。
三、AHB传输时序
1、没有等待状态和有等待状态的单次传输
- 第一个周期的上升沿,主设备驱动地址和控制信号
- 第二个周期的上升沿,从设备采样地址和控制信号,并将HREADY拉高;
- 如果是写操作,主设备会在第二个周期的上升沿传输要写入的数据,
- 读操作,从设备会在HREADY信号拉高后将读取的数据写入总线;
- 第三个周期的上升沿,如果是写操作,主设备获取HREADY高信号,表面从设备接收成功;读操作,主设备获取HREADY高信号表明读数据有效并且接收成功。
- HREADY在数据有效期间必须始终为高,并且延续到第三个周期的上升沿之后,确保主设备正确采样。
- 右图可通过拉低HREADY信号扩展数据周期;写操作时主设备需要在等待时间内保持写数据不变。读数据时,从设备不需要一开始给出数据,等待HREADY信号拉高时给出数据即可。
2、多个单次传输的流水线操作(pipeline)
- 扩展数据周期的负效应是必须延长下一次传输的地址周期,A和C为零等待传输,B数据加入了一个控制周期,C的地址周期也进行了扩展。
- 第三个周期主设备发现有操作C需要执行,检查到上一周期的HREADY为高,就将地址和控制信号发送到总线上;同时此时第三个周期上升沿的HREADY信号为低,插入等待状态,B操作执行暂停。
- 等待状态时写操作已经将数据B写在数据总线上,读操作却不需要提前读取数据B,等检测到HREADY信号为高时,读取数据B到读数据总线上。
- 需要注意的是,总线上最多存在2个未处理完的传输,只有当总线上未完成的传输少于2个时,主设备才能发起新的操作。
3.相关传输,涉及信号传输类型HTRANS[1:0]、数据尺寸HSIZE[2:0]、Burst传输类型
HTRANS[1:0] | 传输类型 | Description | |||
00 | IDLE | 主设备占用总线,但没进行传输 | |||
01 | BUSY | 主设备占用总线,但是在burst传输过程中还没有准备好进行下一次传输 | |||
10 | NONSEQ | 表明一次单个数据的传输或者一次burst传输的第一个数据 | |||
11 | SEQ | burst传输接下来的数据 | |||
HSIZE[2:0](每一个transfer传输的数据大小,以字节为单位,最高支持1024位) | Size | Description | |||
000 | 8 bits | Byte | |||
001 | 16 bits | Halfword | |||
010 | 32 bits | Word | |||
011 | 64 bits | - | |||
100 | 128 bits | 4-word line | |||
101 | 256 bits | 8-word line | |||
110 | 512 bits | - | |||
111 | 1024 bits | - | |||
HBURST[2:0]Burst传输类型 | 类型 | Description |
000 | SINGLE | Single transfer单个传输数据传输 |
001 | INCR | Incrementing burst of unspecified length 任意长度的数据传输 |
010 | WRAP4 | 4-beat wrapping burst 打包4拍传输,四个地址是一个回环范围 |
011 | INCR4 | 4-beat increment burst 4拍传输,地址是增加的 |
100 | WRAP8 | 8-beat wrapping burst 打包8拍传输,八个地址是一个回环范围 |
101 | INCR8 | 8-beat increment burst 8拍传输,地址是增加的 |
110 | WRAP16 | 16-beat wrapping burst 打包16拍传输,十六个地址是一个回环范围 |
111 | INCR16 | 16-beat increment burst 16拍传输,地址是增加的 |
4、打包4拍传输
- HTRANS用来表示单次传输类型,SEQ的地址和上一次传输的地址是相关的
- HADDR是一个4拍回环地址,每个地址之间相差4个字节,HSIZE表示单次传输数据大小为“Word”为4个字节,HBURST为WRAP4。
5、无定长数据增量地址传输
- 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也需要给出下一拍的地址和控制信号。
6、增量4拍burst
- 地址并不是回环地址,HBURST为INCR4。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了AHB协议的内容,传输时序,信号端口等。
AHB基本传输
两个阶段
地址周期(AP),只有一个cycle
数据周期(DP),由HREADY信号决定需要几个cycle
流水线传送
先是地址周期,然后是数据周期
AHB突发传输与AXI突发传输的特点
AHB协议需要一次突发传输的所有地址,地址与数据锁定对应关系,后一次突发传输必须在前次传输完成才能进行;
AXI只需要一次突发的首地址,可以连续发送多个突发传输首地址而无需等待前次突发传输完成,并且多个数据可以交错传递,此特征大大提高了总线的利用率;
AHB总线与AXI总线均适用于高性能、高带宽的SoC系统,但AXI具有更好的灵活性,而且能够读写通道并行发送,互不影响;更重要的是,AXI总线支持乱序传输,能够有效地利用总线的带宽,平衡内部系统。因此SoC系统中,均以AXI总线为主总线,通过桥连接AHB总线与APB总线,这样能够增加SoC系统的灵活性,更加合理地把不同特征IP分配到总线上。