AHB中的hready深刻分析
AHB总线有两个阶段:地址阶段和数据阶段。
HREADY是来自每个Slave的输出信号,它被路由到每个Master和每个Slave。这意味着每个Slave将具有2个HREADY信号:HREADY_in和HREADY_out。即HREADY信号既是Slave的输入和同时又是Slave的输出。
AHB Slave的HREADY_out信号是Slave“延长/扩展”AHB传输的数据阶段的指示。如果Slave不能立即响应,通常会发生这种情况,因此该Slave将HREADY_out设为数值“0”,以通知Master延长数据阶段,以便Slave有足够的时间响应。
地址阶段不能扩展,因此在此期间,所有Slave必须对地址进行采样。然而,如果Slave正在”扩展”的数据阶段与地址阶段重合,那么这将导致错误。
问题1:为什么HREADY会是Slave的输入?
这是为了让总线上的所有Slave知道系统上是否有任何Slave请求“扩展”数据阶段,如果有,则任何其他Slave就不会开始响应可能与数据阶段重合的任何”地址”阶段。当Slave1(比如S1)决定延长突发传输的最后一个数据阶段时,通常会发生这种Corner Case的情况。突发传输的最后一个数据阶段可能发生在地址总线指示向新的Slave(比如S2)进行新的传输时,如果S1决定在最后一个”数据阶段”将HREADY拉低,则S2必须知道S1已将HREADY拉低,并且S2绝对不能对该地址阶段做出响应。该地址阶段与S1的最后一个数据阶段在同一周期内发生,因为S1的先前传输尚未结束,S2知道S1是否已将HREADY拉低的唯一方法是将S1的HREADY输出路由到S2的HREADY输入。实际上,每个Slave的HREADY输出都要”与”在一起,以给出系统范围的HREADY信号,该信号作为HREADY输入反馈给每个Slave。因此,如果任何Slave将其HREADY输出拉低,则系统范围内的HREADY信号(即所有Slave的HREADY输出的“与”)将变为低电平。由于该“与”操作后的HREADY信号作为输入发送到每个Slave,因此每个Slave都必须等该“与”操作后的HREADY信号变为“1”,然后才能做出响应。因此,每个AHB Slave必须有一个HREADY_out,以便能够扩展数据阶段,同时每个AHB Slave必须有HREADY_in,以便知道系统上是否有任何其他Slave正在请求数据阶段的扩展,如果任何Slave的HREADY_in为“0”,则该Slave必须等待其HREADY_in变为“1”,然后才能响应任何AHB请求。

如上图所示,因为仲裁器(Arbiter)跟踪传输的数量,并知道突发大小和所有特性,所以仲裁器(Arbiter)会在上一个Master的数据阶段的最后一个时钟周期(DA3/DB3)授予下一个Master总线控制权。假设Master1当前正在向Slave1发送INCR4的Burst传输。如果Slave1的HREADY始终为高,则数据相位将为4个时钟周期。然而,如果Slave1将DB3扩展为两个时钟周期,即DB3_0和DB3_1,HREADY在DB3_0中为“0”,则Data Phase将为5个时钟周期。如果HREADY没有作为从机(Slave)的输入,系统中的另一个从机Slave2将看到其HSEL在DB3_0中变为“1”,并且它将在DB3_1中开始响应,这将导致数据损坏。但是,由于HREADY也适用于此Slave2,因此即使它的HSEL为“1”,它也会意识到这一点。
建议将HREADY的默认值设为“1”。
问题2:主机何时采样“hready”?
由于“hready”仅与数据阶段相关,因此主机将在第N+1个边沿采样“hready”,其中N是时钟边沿,在该边沿发出数据。
当Master被授予总线并执行固定长度的突发时,不需要继续请求总线以完成突发。仲裁器(Arbiter)会监视突发的进展,并使用HBURST[2:0]信号来确定Master需要多少次传输。
对于未定义长度的突发,主机(Master)应继续发出请求,直到它开始最后一次传输。仲裁器(Arbiter)无法预测何时在未定义长度突发结束时更改仲裁。
浙公网安备 33010602011771号