AHB
AHB总线介绍
AHB总线是AMBA总线的一部分,AMBA总线是ARM公司提出的总线规范,被大多SOC设计采用,AHB、ASB、APB。AHB用于高性能、高时钟频率的系统结构,典型的应用就是系统内部高速RAM、NAND FLASH、DMA、Bridge的连接。APB用于连接外部设备,对性能要求不高,主要考虑功耗问题。ASB是AHB的一种替代方案。
AHB可以将CPU、RAM、高带宽外部存储器接口、DMA总线master、Bridge等连接起来构成一个独立完整的SOC系统。如下图所示:
AHB基本特性:
BURST传输--split事务处理--单周期master移交--单一时钟沿操作--无三态--更宽的数据总线配置(64/128)--流水线操作--支持多个总线主设备(最多16个)
AHB总线组成
AHB总线由master、slave、infrastructure构成。infrastructure由arbiter、数据多路、地址控制多路、译码器构成。
主设备master
发起一次读写操作;某一时刻只允许一个设备使用总线。
从设备slave
响应一次读写操作;通过地址映射来选择使用哪一个从设备
仲裁器arbiter
允许某一个主设备控制总线
译码器decoder
通过地址译码决定哪一个从设备
总线分为三组
写数据总线(HWDATA)
读数据总线(HRDATA)
地址控制总线(HADDR)
AHB示例图
name | source | to | description |
HCLK | clk source | 各module | 总线时钟,上升沿采样 |
HRESETn | reset controller | 各module | 总线复位,低电平有效 |
HADDR[31:0] | master |
decoder mux to slave arbiter |
32位地址控制总线 |
HTRANS[1:0] | master | mux to slave | 当前传输类型NONSEQ SEQ IDLE BUSY |
HWRITE | master | mux to slave | 1:write 0:read |
HSIZE[2:0] | master | mux to slave |
每一个transfer传输的数据的大小, 2^hsize=传输的字节数,byte为单位,最高支持1024位 |
HBURST[2:0] | master | mux to slave | burst类型,4、8、16burst,incr或wrap |
HPROT[3:0] | master | mux to slave | 保护控制信号,需要slave带保护功能,一般不用 |
HWDATA[31:0] | master | mux to slave | 写数据总线 master to slave |
HRDATA[31:0] | slave | mux to master | 读数据总线 slave to master |
HREADY | slave | mux to master arbiter | 1:slave 传输结束 0:slave 需要延长传输周期 |
HRESP[1:0] | slave | mux to master arbiter | slave发给master总线的传输状态 OKAY,ERROR,RETRY,SPLIT |
HSELx | Decoder | slave | slave选择信号 |
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传输,每一位对应一个主设备 |
总线操作
有需要占用总线的master向arbiter发出请求,arbiter授权给指定的master。任何一个时钟周期只允许一个master接入总线,对其指定的slave进行读写操作。
获得授权的总线开始AHB传输,首先发出地址和控制信号,提供地址信息,传输方向、带宽、burst类型。总线统一规划slave地址,译码器根据地址和控制信号确定那个slave与master进行数据通信。数据传输通过数据总线完成,为了避免三态总线,AHB将读写分开。每一笔传输包含一个地址和控制周期,一个或者多个数据周期。地址和控制周期不能被扩展,slave需要在一个周期内采样。数据周期可以通过HREADY扩展,HREADY为低时给传输加入一个等待状态以使得slave获得额外的时间来提供或采样数据,slave通过响应信号HRESP反应传输状态。
一般情况下master完成完整的burst传输,arbiter才会授权给其他master接入总线,然而为了避免过大的判决延迟,arbiter也可能打断burst传输。这种情况下master必须再次接入总线以进行中断的burst剩余部分传输。
递增burst传输
T1时刻给出地址以及控制信号,因为是新的burst开始,transfer的类型是NONSEQ
T2时刻由于master在第二个周期不能处理第二拍,所以产生BUSY信号来延长一个周期。虽然周期延长,但是master仍然需要给出地址和控制信号
T3时刻,slave接收到busy信号,slave会忽略这个BUSY transfer;同时在T3时刻master再次发起第二个transfer,由于是同一个burst的第二个transfer,所以transfer类型是SEQ
T5 slave将HREADY拉低,告诉master需要等待一个时钟周期;
T8 完成最后一个transfer
控制信号
HTRANS[1:0] | 传输类型 | 描述 |
00 | IDLE | 主设备占用总线但是没有进行传输;两次burst传输中间,主设备可以发IDLE,此时就算slave被使能,也不会从总线上获取任何数据信号。如果此时slave被选中,那么每一个IDLE周期slave都要通过HRESP[1:0]返回OKAY响应 |
01 | BUSY | 主设备占用总线,但是还没准备好下一次传输,一次burst传输中间,主设备可以发出BUSY,这时slave不会从总线接收数据,而是等待,并通过HRESP[1:0]返回一个OKAY响应。需要注意,这个transfer需要给出下一拍的地址和控制信号,虽然slave不回去采样 |
10 | NONSEQ | 表明一次单个数据的传输或者一次burst传输的第一个数据,地址个控制信号与前一次传输没有联系 |
11 | SEQ |
burst传输接下来的数据,都需设置为SEQ 地址和上一次传输是相关的,总线上的控制信号应该与之前的保持一致,地址信号根据INCR或WRAP进行变化 |
响应信号
master发起传输信号后,slave可以决定本次传输的进程,transfer不能取消本次传输。slave会通过HREADY信号反馈传输是否完成,通过HRESP反应传输状态
立即完成一笔传输
延迟一个或者几个周期完成传输
传输失败返回error
延迟传输,释放总线
HREADY为1代表传输完成,为0代表延迟传输
HRESP[1:0] 00:OKEY 01:ERROR 10:RETRY(传输未完成,请求主设备重新开始一个传输。arbiter会使用通常的优先级) 11:SPLIT(传输未完成,请求主设备分离一次传输,arbiter会调整优先级方案以便于其他请求总线的主设备可以访问总线)
地址译码
地址译码器用于为总线上每个slave提供选择信号HSELx,选择信号是通过组合逻辑对地址码译码产生的。只有当前的数据传输完成后(HREADY为高),slave才会采样地址和控制信号以及HSELx。在一定条件下可能会出现这样的情况:产生HSELx信号而HREADY为低,在当前传输后slave会改变。
每个slave最小的地址空间为1KB,所有的master的burst传输上限也是1KB,如此设计保证了不会出现地址越界问题。当一个设计不会用到所有的地址空间时,可能出现访问到一个不存在的地址的情况,这就需要增加一个附加的默认slave来为上面的情况提供一个响应。当SEQ或NONSEQ传输访问到一个不存在的地址,默认slave应该提供ERROR响应;当IDLE或BUSY传输访问到一个不存在的地址,默认slave会响应OKAY。地址译码器会带有实现默认slave的功能。
仲裁
仲裁机制保证了任意时刻只有一个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产生指示当前传输是否为锁定序列传输。
HSPLIT:供支持SPLIT传输使用。