1. AHB5总线
1.1. AHB总线信号
名称 | 来源 | 描述 | ||||||||||||||||
HCLK | 时钟源 | 时钟为所有总线传输提供时基。所有信号时序都和HCLK的上升沿相关。 | ||||||||||||||||
HRESETn | 复位控制器 | 总线复位信号,低电平有效,用来复位系统和总线。 | ||||||||||||||||
HADDR[31:0] 地址总线 | 主机 | 32位地址总线 | ||||||||||||||||
HTRANS[1:0] 传输类型 | 主机 | IDLE:no transfer BUSY:master在burst transfer中暂停发送,如果是INCR transfer,最后一个数传完后可以插入BUSY状态,固定长度transfer和SINGLE transfer不允许最后一个数据传输完后插入BUSY状态;BUSY状态下,下一次传输的地址和控制信号必须准备好 NONSEQ:transfer开始时,master的第一个状态 SEQ:burst的中间状态 | ||||||||||||||||
HWRITE 传输方向 | 主机 | 1 = write, 0 = read | ||||||||||||||||
HSIZE[2:0] 传输大小 | 主机 |
大小不得大于data bus的位宽,同HADDR时序一致,BURSE transfer下一致保持 | ||||||||||||||||
HBURST[2:0] 突发类型 | 主机 |
| ||||||||||||||||
HPROT[3:0] 保护控制 | 主机 | 提供总线访问的附加信息,主要是给那些希望执行某种保护级别的模块使用的。 这个信号指示当前传输是否为预取指令或者数据传输,同时也表示传输是保护模式访问还是用户模式访问。 对带存储器管理单元的总线主机而言这些信号也用来指示当前传输是高速缓存的(cache)还是缓冲的(buffer)。 | ||||||||||||||||
HWDATA[31:0] 写总线数据 | 主机 | 写数据总线用来在写操作期间从主机到总线从机传输数据。建议最小的数据总线宽度为 32 位。 在要求高带宽运行时扩展(数据总线)还是很容易的。 | ||||||||||||||||
HSELx 从机选择 | 译码器 | 每个 AHB 从机都有自己独立的从机选择信号并且用该信号来表示当前传输是否是打算送给选中的从机。 该信号是地址总线的简单组合译码。 | ||||||||||||||||
HRDATA[31:0] 读数据总线 | 从机 | 读数据总线用来在读操作期间从总线从机向总线主机传输数据。建议最小的数据总线宽度为 32 位。 在要求高带宽运行时扩展(数据总线)还是很容易的。 | ||||||||||||||||
HREDAY 传输完成 | 从机 | 当 HREADY 为高时表示总线上的传输已经完成。在扩展传输时该信号可能会被拉低。 | ||||||||||||||||
HRESP[1:0] 传输响应 | 从机 | 传输响应给传输状态提供了附加信息。提供四种不同的响应: OKEY、 ERROR、 RETRY 和 SPLIT。 |
1.2 主从机接口
图1.1 主机接口
图1.2 从机接口
1.3 传输过程简介
1.3.1 传输开始
Master切换到NONSEQ状态,标志一次传输开始。
地址传输成功:HREADY=1且HRESP=OKEY且HTRANS=SEQ or NONSEQ
数据传输成功: HREADY=1且HRESP=OKEY且HTRANS_Delay=SEQ or NONSEQ
对于主机而言,地址传输成功后的下一个周期就一定可以对数据进行相应的处理,不管master之后的状态是否为SEQ or NONSEQ。
地址传输成功后,如果从机解析地址后发现不能对master即将传来的数据进行操作,那么就会把READY拉低,并作出相应的ERROR回应。
1.3.2 传输结束
Master结束一次BURST的情况:
- Slave发出error。此时Master可以选择继续传输,直到slave再次准备好。Master也可以选择停止传输,在这种情况下,master必须要在slave在ERROR状态(slave的ERROR状态会保持两个周期)下,切换成IDLE状态,以告知slave停止当前的传输。(一般发出ERROR都是因为master进行了错误的数据传输,所以master一般都会选择结束传输)
- Mult-master的情况下,当前master的transfer被其他master打断。
2. AMBA 2.0 AHB总线协议
2. 1 整体架构
图2.1. AMBA 2.0 AHB整体架构
- Masters
- Slaves
- Arbiter:决定那个Master可以获得总线的控制
- Decoder:将Slave的RDATA和RESP给到正确的Master
2.2 工作流程简述
- Master如果想要进行一次transfer,需要首先向Arbiter发起一次总线请求。
- 得到Grant之后,Master才能够获得总线控制权
- Transfer的类型和AHB-5一致,分为SINGLE,INCR和WRAP,同样也是地址和数据两级流水传输
- Slave的RESP相比AHB-5多增加了RETRY和SPLIT两种
2.3 Two-cycle response
相比AHB5总线协议,HRESP额外增加了RETRY和SPLIT两个状态,同时对于不时OKEY的状态,slave的相应进行了约束,即两周期响应(Two-cycle response)。
两周期响应指的是结束ERROR/RETRY/SPLT响应需要两个周期,第一个周期的目的是告诉master当前slave的RESP,第二个周期是slave的RESP结束的标志。
图2.2. 一次RETRY RESP
图2.2 给出的例子中,slave在接收到master传来的地址之后,会先对其进行解析。解析的结果使其做出RETRY的响应。在进入RETRY响应之后(T2-T3),HRESP的状态首先切换成RETRY,HRADY拉低。此后这个RESP信息会被master接收,master做出IDLE的反应,表示结束本次transfer,并且数据总线上的数据无效,master开始准备下一次需要传输的地址。同时slave会保持RETRY状态,并将HREADY拉高,表示本次响应结束。(slave的读写冲突可能会发生这种响应模式?)当然,slave也不是必须马上要做出RETRY的响应。如果不能立马给出RETRY响应,但是slave又不能处理数据总线上的数据,那么HREADY就必须拉低,且HRESP置为OKEY,如图4所示。
图2.3 一次ERROR RESP
2.4 SPLIT和RETRY的区别
SPLIT 传输
仲裁器还可以仲裁希望能完成SPLIT传输的总线slave。当仲裁器观察到master收到SPLIT响应,则会将master的优先权给屏蔽起来,当master的总线访问权被屏蔽后,该master将无法再获得总线访问的权利,即使是没有其它master访问总线时也一样。同时,slave需要记录master的信号,以便以后要通知仲裁器恢复那个master的优先级。这可以从仲裁器发出的HMASTER[3:0]信号查得。若所有的master都收到SPLIT的响应信号,则仲裁器会把总线访问移交给dummy master(一种只会发出IDLE传输的master)。
当回应SPLIT的slave处理完传输的要求后,会发出HSPLIT[15:0]的信号给master . 仲裁器会在时钟的每一个上升沿采样HSPLIT[15:0],当它收到HSPLIT[15:0]后,会将原来被屏蔽掉的master的总线优先权解封,这样master的优先权就会回复原来的状态而有机会去重新获得总线访问权。
以下来自手册原文:
if a master is only able to complete 3 transfers of an 8-beat burst, then when it regains the bus it must use a legal burst encoding to complete the remaining 5 transfers. Any legal combination can be used, so either a 5-beat undefined length burst or a 4-beat fixed length burst followed by a single-beat undefined length burst would be acceptable.
就是说,Master在被SPLIT之后,需要自己重新调整BURST的大小。一开始压迫传输8 beat,但是传了3 beat之后就被SPLIT了。当下一次该Master重新获得总线控制权的时候,就需要在进行一次4 beat传输再加一次Single传输。
RETRY 传输
当slave发出RETRY的响应信号时,仲裁器内master的优先权不会发生改变。但是当有更高优先级的master的发出总线请求信号时,总线的访问权会由高优先级的master取得,但是如果原来得到RETRY响应的master是当时总线请求的master中优先级别最高的,则总线还是继续会被占住,而无法释放给其它有需要的master
-
2.5 仲裁
- Arbiter工作时序
信号名称 | 来源 | 描述 |
HBUSREQx | Master | 由各个Master发出的总线请求信号,协议最大支持16个Master |
HLOCKx | Master | 由各个Master发出的总线锁定信号,表明Master希望传输不被打断。在该Master传输的期间,grant一直锁定在当前的Master。 跟随HBUSREQx同时给出。 |
HGRANTx | Arbiter | Master的输入信号,如果有效,则说明当前Master的优先级最高,当HREADY同时为高的时钟上升沿之后,Master才拥有地址总线的控制权,同时HMASTER变成拥有总线控制权的Master的ID。 |
HMASTER[3:0] | Arbiter | 表明当前拥有地址总线控制权的Master的ID,也就是当前地址总线和控制总线上的数据来自哪一个Master |
HMASTLOCK | Arbiter | |
HSPLIT[15:0] | Slave | 用于表明之前被SPLIT的Master可以重新完成SPLIT Transfer,Arbiter使用该信号来帮助调整各个Master之间的优先级 |
图2.3 Arbiter重要信号的更新时序
- Master发起请求
- 请求可能会在下一个周期被响应
- 此时即将拥有总线控制权的HGRANTx被拉高
- 如果HREADY有效,HMASTER切换成拥有总线控制权的Master的ID
从发起请求到真正用拥有控制权,中间至少需要两个周期
图2.4 Arbiter控制权交接时序
因为从发起请求到正式拥有控制权中间至少需要两个周期,所以在总线控制权交接的时候,在上一个Master传输倒数第二个地址/控制信号的时候,即将拥有下一次transfer的总线控制权的Master对应的HGRANTx就会被拉高。这样,就可以保证在上一个Master传输完之后的下一个周期,新的Master可以立刻拥有总线的控制权。
图2.4 发生SPLIT transfer的时候Arbiter控制权交接时序
本协议要求,Master在接收到SPLIT和RETRY RESP的时候需要给出一个IDLE状态,Arbiter在接收到该状态后进行总线控制权的交接。在第一个SPLIT状态,Arbiter将当前拥有优先级的Master的HGRANTx拉高。在第二个SPLIT状态,在接收到上一个Master的IDLE状态后,将HMASTER设置成新的获得总线控制权的Master的ID。开始新的数据传输。