复习AHB Spec,加深对ahbram、ahbmatrix的理解
0、AMBA AHB信号
AHB的所有信号都以字母前缀H开头,在系统设计时要确保AHB信号不同于其它相似命名的信号。
名称 | 来源 | 描述 |
系统总线 | ||
HCLK 总线时钟 | 时钟源 | 时钟为所有总线传输提供基准,所有信号时序都和HCLK上升沿有关 |
HRESTn 复位 | 复位控制器 | 总线复位信号低电平有效并用来复位系统和总线,是唯一低电平有效的信号 |
地址总线 | ||
HADDR[31 : 0] 地址总线 | Master | 32bit系统地址总线 |
数据总线 | ||
HWDATA[31 :0] 写数据总线 | Master | 写数据总线用来在写操作期间从Master到Slave端传输数据。建议最小的数据总线宽度为32位,当然要求高带宽运行时扩展数据总线也不难。 |
HRDATA[31 : 0] 读数据总线 | Slave | 读数据总线用来在读操作期间从总线Slave向总线Master传输数据。建议最小的数据总线宽度为32位,当然要求高带宽运行时扩展数据总线也不难。 |
命令总线 | ||
HTRANS[1 : 0] 传输类型 | Master | 表示当前传输类型,可以是NONSEQ、SEQ、IDLE、BUSY四种情况(不连续、连续、空闲、繁忙) |
HWRITE 传输方向 | Master | 高电平:写传输 低电平:读传输 |
HSIZE[2 : 0] 传输大小 | Master | 表示传输大小,典型情况是字节(8 bit)、半字(16 bit)、字(32 bit)。协议允许最大传输大小为1024bit。 |
HBURST[2 : 0] 突发类型 | Master | 表示传输是否组成了突发的一部分 |
HPROT[3 : 0] 保护控制 | Master | 指示当前传输是否为预取值或者数据传输,同时表示传输是保护模式访问还是用户模式访问。 对带存储器管理单元的总线主机而言这些信号也用来指示当前传输是高速缓存(cache)还是缓冲的(buffer)。 |
HSELx 从机选择 | Decoder译码器 | 每个AHB Slave都有自己独立的从机选择信号并且用该信号来表示当前传输是否打算送给选中的Slave。该信号是地址总线的简单组合译码。 |
HREADY 传输完成 | Slave | 当HREADY信号拉高时表示总线传输已经完成。在等待传输时该信号会被拉低。 注:总线上的Slave要求HREADY为输入输出信号。 |
HRESP[1 : 0] 传输响应 | Slave | 传输响应给传输状态提供了附加信息:OKEY、ERROR、RETRY、SPLIT。 |
仲裁总线 | ||
HBUSREQx 总线请求 | Master | 从总线Master x传向总线Arbiter用来表示该Master请求(控制)总线的信号。系统中每个Master都有一个HBUSREQx信号,最多16个总线Master。 |
HLOCKx 锁定传输 | Master | 当该信号为高时,表示Master请求锁定对总线的访问并且在该信号拉低之前其它主机不应该被允许授予总线。 |
HGRANTx 总线授予 | Arbiter | 表示总线Master x目前是优先级最高的Master。当HREADY拉高时传输完成,地址/控制信号的所有权发生改变。所以主机应在HREADY和HGRANTx都为高时获取对总线的访问。 |
HMASTER[3 : 0] 主机号 | Arbiter | 表示哪个Master正在执行传输。 支持分块传输的Slave用来确定哪个Master正在尝试对应访问。 HMASTER的时序和地址以及控制信号对齐。 |
HMASTERLOCK 锁定顺序 | Arbiter | 表示当前Master正在执行一个锁定顺序的传输。该信号和HMASTER有相同的时序。 |
HSPLITx[15 : 0] 分块完成请求 | Slave(支持分块) | 从机指示仲裁器,对应的主机应该重新发起一次SPLIT传输。 分块总线上的每一位对应一个总线主机。 |
1、基本理解
基于AMBA AHB2的系统由一个高性能系统中枢总线组成,能够支持外部存储器带宽,包括CPU,片上存储器和其它直接数据存取(DMA)设备,加上一个桥连接器连接到较窄的挂接着较低贷款外设的APB总线。
AHB总线协议设计采用中央多路选择器互联的方案。所有总线Master的输出地址和控制信号来指示它们想执行的传输同时Arbiter决定哪一个Master能够将其地址和控制信号连通所有的Slave。也需要一个Decoder来控制read data和响应多路信号选择器,多路信号选择器选中来自传输中包含Slave的适当信号。
AHB2架构支持多Master操作,因此架构中有一个Arbiter和三个mux。
Arbiter用于仲裁哪一个Master占据线权。因此AHB2协议中有一类Arbiter信号,如HBUSREQx、HLOCKx、HGRANTx、HSPLITx、HMASTERLOCK、HMASTER。
mux是多路选择器,Addr mux和Write Data mux由Arbiter信号来确定选择,而Read mux由Decoder来确定选择。
2、AHB的传输
2.1、基本传输
AHB基本传输包括两个部分:
(1)地址传输:只持续一个周期;
(2)数据相位:无反压时只持续一个周期,当HREADY信号反压时,持续多个周期。
2.1.1、无等待传输
该种传输是没有等待状态的简单传输:
◆主机在HCLK上升沿后将地址和控制信号驱动到总线上;
◆然后在时钟的下一个上升沿,slave采样地址和控制信息;
◆在slave采样了地址和控制信息后能够开始驱动适当的响应并且该响应被总线master在第三个时钟上升沿采样。
2.1.2、有等待传输
在反压状态时,下游的HREADY信号不拉高,表示忙碌,因此这笔数据传输不下去只能维持着直到HREADY拉高,才表示这笔数据传下去了。在反压状态时,地址周期需要保持,因此也称为等待传输。
由上图的多重传输可以看到,在T1时刻对地址相位做了采样,T2时刻写数据生效。T2时刻采样地址相位,T3时刻发现HREADY信号为低电,因此B这笔传输需要维持住,维持了一个周期。在T3时刻采样到了C的地址相位,因此T3时刻给出了C的传输,但此时B的传输还没有结束,只能在T4时刻B的传输完成以后,C的传输才能够生效,这便是反压等待的副作用,会对后面传输的地址相位产生影响。
2.2、传输类型HTRANS
AHB的传输类型分为四类,由HTRANS[1:0]控制。
HTRANS[1:0] | 类型 | 描述 |
2'b00 | IDLE | ·表示没有数据传输要求 ·Master在不想传输数据时使用IDLE传输 ·Slave必须为IDLE传输提供一个0等待状态的OKAY响应,且要忽略该传输 ·建议Master使用IDLE来终止Lock传输 |
2‘b01 | BUSY | ·BUSY传输允许总线Master在burst时插入IDLE ·BUSY表示Master要连续执行突发传输,但不能马上进行下一拍传输 ·当Master使用BUSY时,地址和控制信号必须是突发中的下一个传输 ·只有未定义长度的burst可以将BUSY作为burst的最后一个周期 ·Slave必须为BUSY传输提供一个0等待的OKAY响应,且要忽略该传输 |
2'b10 | NONSEQ | ·单次传输或burst的第一次传输 ·地址和控制信号与之前的传输无关 ·总线上单个传输被视为长度为1的burst,因此传输类型为NONSEQUENTIAL |
2'b11 | SEQ | ·burst剩余的传输是顺序的,地址与上一个传输有关 ·控制信号与上一次传输相同 ·地址 = 前一次传输的地址HADDR + 传输大小HSIZE,单位byte ·在回环突发(wrapping burst)时,地址在地址边界处回环 |
◆T0 - T1:NONSEQ传输一个四拍读操作
◆T1 - T2:BUSY,Master不能立即提供第二拍数据,插入BUSY延迟第二拍数据,Slave提供第一拍读数据
◆T2 - T3:Master开始第二拍的传输,因此发出SEQ传输。Master忽略Slave在读数据总线HRDATA的任何信息
◆T3 - T4:Master执行第三拍传输,Slave提供第二拍的读数据
◆T4 - T5:Master执行最后一拍传输,但此时Slave来不及完成传输,拉低HREADY插入一拍等待状态
◆T5 - T6:Slave提供第三拍的读数据
◆T6 - T7:Slave提供最后一拍读数据
2.3、突发传输HBURST
AHB Burst分为单拍突发、未定长度突发、固定长度突发(INCR、WRAP),固定长度突发的长度分为4拍、8拍、16拍。
HBURST[2 : 0] | 类型 | 描述 |
3'b000 | SINGLE | 单拍传输 |
3'b001 | INCR | 未定长度增量突发 |
3'b010 | WRAP4 | 4拍回环突发 |
3'b011 | INCR4 | 4拍增量突发 |
3'b100 | WRAP8 | 8拍回环突发 |
3'b101 | INCR8 | 8拍增量突发 |
3'b110 | WRAP16 | 16拍回环突发 |
3'b111 | INCR16 | 16拍增量突发 |
INCR突发: 访问连续地址并且突发中的每次传输地址都是签一个地址的递增
WRAP突发:在一定长度后如果跨越了地址边界,就会回环到起始地址。主要应用于cache中,因为cache是按照cache line进行操作,使用wrap突发传输可以实现从内存中取回整个cache line
WRAP回环的计算方法:
◆这里的地址边界指的是HBURST拍数 * HSIZE大小,即beats * size
Q:一个传输的HBURST为WRAP4,HSIZE为word(4Byte),如何计算回环地址边界?
A:地址边界 = beats * size = 4 * 4 = 16
Q:突发地址为0x34、0x38、0x3C、______ ?
A:我们分两种情况,每个地址除以地址边界,如果可以整除,则将目前地址减去地址边界,就是回环后的起始地址;如果不能整除,那么就继续按照传输大小进行传输。
可以看到0x34(52),0x38(56),0x3C(60)都不能被地址边界16乘除,而原本的下一位0x40(64)可以被16整除,因此0x3C的下一位发生回环,起始地址为 64 - 16 = 48(0x30)。