AHB总线(Advanced High-performance Bus)是AMBA(Advanced Microcontroller Bus Architecture) 片上总线体系的一部分。 在SOC芯片中,AHB总线主要应用于对性能要求较高的组件之间互联,如用于CPU和片内高速RAM、 Nand Flash、 DMA、 Bridge之间互联。
完整的AHB总线由四个部分组成:
① AHB主设备Master; 发起一次读/写操作;某一时刻只允许一个主设备使用总线;
② AHB从设备Slave; 响应一次读/写操作;通过地址映射来选择使用哪一个从设备;
③ AHB仲裁器Arbiter; 允许某一个主设备控制总线;
④ AHB译码器Decoder; 通过地址译码来决定选择哪一个从设备;
其结构图如下:
AHB总线的信号都是以H开头,以区别其他的AMBA总线信号
信号名 | 信号源 | 信号功能 |
---|---|---|
HCLK | clock source | 总线时钟信号 |
HRESETn | reset controller | 系统reset信号,低电平有效 |
HADDR | master | 地址总线 |
HTRANS | master | 传输类型,2比特,NONSEQUENTIAL, SEQUENTAL, IDLE 或者BUSY |
HSIZE | master | 每一个transfer传输的数据大小。以字节为单位 |
HBURST | master | 猝发类型,一共有8种 |
HPROT | master | 保护控制信号,一般不用 |
HWDATA | master | 写数据信号 |
HSELx | decoder | slave选择信号 |
HRDATA | slave | 读数据信号 |
HREADY | slave | 当这个信号为高时,表示当前transfer完成。 |
HRESP | slave | 响应信号,四种:OKAY,ERROR,RETRY和SPLIT |
下面是仲裁器的信号 | ||
HBUSREQx | master | master给仲裁器的请求获得总线使用权的请求信号 |
HLOCKx | master | 总线锁定信号 |
HGRANTx | arbiter | 授权信号,会传送给每一个master |
HMASTER | arbiter | 仲裁器为每一个master分配的ID |
HMASTLOCK | arbiter | 当前的master正在执行Locked操作 |
HSPLITx | slave | 这个信号是具有SPLIT操作的slave提供 |
AHB通信流程
有需要占用总线的Master向arbiter发出请求,arbiter授权给指定的master。任一时间周期只有一个master可以接入总线,对其指定的slave进行读写操作。 获得授权的总线开始AHB传输,首先发出地址和控制信号,提供地址信息、传输方向、带宽和burst类型。总线统一规划slave的地址,译码器根据地址和控制信号确定哪个slave与master进行数据通信。数据传输通过数据总线完成。为避免出现三态总线,AHB将读写总线分开,写数据总线用于从master到slave的数据传输,读数据总线用于从slave到master的数据传输。每次传输包括一个地址和控制周期,一个或多个数据周期。地址和控制周期不能被扩展,因此slave必须在一个周期内采样地址信号。数据周期可以通过HREADY信号扩展,但HREADY为低时给传输加入一个等待状态以使slave获得额外的时间来提供或采样数据,另外slave通过响应信号HRESP反映传输状态。
1. AHB的猝发类型
AHB一共有8种类型的传输模式,由HBURST[2:0]来决定,这个和axi总线有些区别,axi总线是由两个信号控制。
HBURST[2:0] | 类型 | 说明 |
---|---|---|
000 | SINGLE | 单一传输,一次只有一个地址和控制信号,一组数据 |
001 | INCR | 次数不限的递增burst传输。地址根据每拍数据的大小递增,可以传输任意次数。唯一的限制是地址不能超过1K边界 |
010 | WRAP4 | 4拍的回环burst传输。一共传4拍,地址会在地址边界回环。地址边界根据burst传输的次数和每次传输的数据大小来计算 |
011 | INCR4 | 4拍的递增burst传输。一共传4拍,地址根据每一拍的数据大小递增 |
100 | WRAP8 | 8拍的回环burst传输 |
101 | INCR8 | 8拍的递增burst传输 |
110 | WRAP16 | 16拍的回环burst传输 |
111 | INCR16 | 16拍的递增burst传输 |
2、传输类型
HTRANS[1:0] 进行一次传输时的传输类型,这个信号由master根据自己要进行的传输类型生成的控制信号。一共4种类型
HTRANS | 响应 | 描述 |
---|---|---|
00 | IDLE | 告知slave当前总线处于空闲状态,没有有效的transaction在进行,那么此时就算slave被使能,也不会从总线上获取任何的数据信号。如果此时salve被选中,那么每一个IDLE周期slave都要通过HRESP[1:0]返回一个OKAY响应(见HRESP) |
01 | BUSY | 如果slave收到了这个信号,表面当前的master正在进行一个burst传输但是在当前周期不能立刻给出下一次要传输的数据,这时slave不会从总线上收取数据而是等待,并且通过HRESP[1:0]返回一个OKAY响应。需要注意的是,这个transfer需要给出下一拍的地址和控制信号,尽管slave不会去采样。 |
10 | NONSEQ | Salve收到这个信号时,表示当前是一个single transfer(就是只传输一次)或者是burst 传输的第一个transfer。此时总线上的地址信号和控制信号与之前的毫不相干。可以理解为一个新的transaction的开始。 |
11 | SEQ | 这个信号只有在burst传输中出现。当slave收到这个信号时,表明当前的transfer是一个bursttransaction中的某一拍。这时,总线上的控制信号应当与之前的保持一致,地址视情况递增或者回环。(这些信号其实是由master决定的,slave不用考虑,只需要单方面接收即可) |
直接上时序图:
3、传输响应
HRESP由slave产生,用于对主机传输的响应。
HRESP[1] | HRESP[0] | 响应 | 描述 |
---|---|---|---|
0 | 0 | OKAY | 当 HREADY 为高表示传输已经成功完成。 OKAY 响应也被用来插入任意一个附加周期,当 HREADY 为低时,优先给出其他三种响应之一。 |
0 | 1 | ERROR | 该响应表示发生了一个错误。错误条件应该发信号给总线主机以便让主机意识到传输失败。一个错误条件需要双周期响应。 |
1 | 0 | RETRY | RETRY(重试)信号表示传输并未完成,因此总线主机应该重试传输。主机应该继续重试传输直到完成为止。要求双周期的 RETRY 响应。 |
1 | 1 | SPLIT | 传输并未成功完成。总线主机必须在下一次被授予访问总线时重试传输。当传输能够完成时从机将请求代替主机访问总线。要求双周期的 SPLIT 响应。 |
仅有 OKAY 响应可以在单个周期里给出。 ERROR、 SPLIT 和 RETRY 响应需要至少两个周期。为了完成这些响应中的任意一个那么在倒数第二个(最后一个的前一个)周期从机驱动 HRESP[1: 0]以表示 ERROR、 RETRY 或者 SPLIT 并同时驱动 HREADY 为低以给传输扩展一个额外的周期。在最后一个周期 HREADY 被驱动为高电平以结束传输,同时HRESP[1: 0]保持驱动以表示 ERROR、 RETRY 或者 SPLIT。
如果从机需要两个以上的周期以提供 ERROR、 SPLIT 或者 RETRY 响应那么额外的等待状态可能会在传输开始时被插入。在这段时间 HREADY 信号将为低电平同时响应必须被设为 OKAY。
需要双周期响应是因为总线通道的本质特征。在从机开始发出 ERROR、 SPLIT 或者RETRY 中任何一个响应时接下来传输的地址已经广播到总线上了。双周期响应允许主机有足够的时间来取消该地址并且在开始下一次传输之前驱动 HTRANS[1: 0]为空闲传输。
对于 SPLIT 和 RETRY 响应接下来的传输必须取消因为在当前传输完成之前禁止下一次传输发生。然而,对于 ERROR 响应,由于当前传输不被重复,所以可以选择完成接下来的传输。
下图表示了一次RETRY操作的例子。
4、总线请求与制裁
仲裁机制用来确保任意时刻只有一个主机能够访问总线。仲裁器的功能是检测许多不同的使用总线的请求和决定当前请求总线的主机中哪一个的优先级最高。仲裁器也接收来自从机需要完成 SPLIT 传输的请求。
总线主机使用 HBUSREQx 信号来请求访问总线并且可以在任何周期请求总线。仲裁器将在时钟的上升沿采样(主机的)请求然后使用内部优先级算法来决定哪个主机将会下一个获得访问总线。
如果主机请求锁定访问(总线),那么主机也必须断言 HLOCKx 信号来提示仲裁器其它主机不应该被授予总线。
当一个主机被授予总线并且正在执行一个固定长度的突发,那么就没有必要继续请求总线以便完成传输。仲裁器监视突发的进程并且使用 HBURST[2: 0]信号来决定主机请求了多少个输入。如果主机希望在当前正在进行的传输之后执行另一个突发那么主机需要在突发中重新断言请求信号。
如果主机在一次突发当中失去对总线的访问那么它必须重新断言 HBUSREQx 请求线以重新获取访问总线。
对未定长度的突发主机应该继续断言请求直到已经开始最后一次传输。在未定长度的突发结束时仲裁器不能预知何时改变仲裁。
对于主机而言有可能当它未申请总线时却被授予总线。这可能在没有主机请求总线并且仲裁器将访问(总线)授予一个默认的主机时发生。因此,如果一个主机并没请求访问总线那么它驱动传输类型 HTRANS 来表示空闲传输显得很重要。
仲裁器通过断言适当的 HGRANTx 信号来表示请求总线的主机中哪个是当前优先级最高的。当前传输完成后,由 HREADY 为高时所表示,那么主机将被授予(总线)并且仲裁器将改变 HMASTER[3: 0]信号来表示总线主机序号。
下图表示了当所有传输都为零等待状态并且HREADY信号为高时的处理过程。