目录
AHB协议中slave的HREADYOUT和HREADYIN的区别
AHB协议中slave的HREADYOUT和HREADYIN的区别
- HREADYOUT:用于指示slave准备好接收master发过来的一笔传输
- HREADYIN:用于指示slave的上一笔传输是否结束
1. 没有hready_in会发生什么
由于AHB是支持pipeline传输的,所以当前的cycle会是上一个slave的data phase,也是下一个slave的addr phase。上面这张时序图表明master有两笔写传输,第一笔传输为slave1(s1),传输类型为SEQ,在第一笔传输的第二个周期,也就是第一笔传输的data phase,此时slave1没有准备好被写数据,因此把s1_hreadyout拉低,但此时slave2已经看到自己的NONSEQ传输了,而且slave2已经是准备好了的。如上图所示:
那这时master那边只能看到一个hready,那到底是看s1的还是s2的呢?
- 如果看s1的话,那么master会在下一个周期维持NONSEQ,那么s2会认为,我已经在上一个周期接收了一个NONSEQ,现在又来了一个NONSEQ并且addr还没有递增。在s2会发生protocol fail。如下图1所示:
- 如果看s2的话,那么s1的写数据就会失败,因为当前s1还没有准备好。如下图2所示:
2.有hready_in会发生什么
那么这个时候就要引入我们的hready_in了。这个hready_in有两种写法:
- 通过一个mux,把在data phase的slave的hreadyout作为输入连接到所有的slave
- 把所有的slave的hreadyout相与,然后再连接到所有的slave
slave必须看到自己的hreadyin&hreadyout,才认为一次addr phase/data phase的成功。
而且slave必须等到hreadyin为高电平时才进行addr以及控制信号的采样:
if(hreadyin)
begin
addr_reg <= haddr;
htrans_reg <= htrans;
hwrite_reg <= hwrite;
end
重新拿上面的仿真图看一下,由于前一个周期的s1_hreadyout为低电平,所以s2的hready_in也为低电平,那么该周期s2不会对addr以及控制信号进行采样。在下一个周期s1以及准备好了,s1_hreadyout拉为高电平,s2的hready_in也为高电平,表示上一笔传输以及结束了,可以开始下一笔传输,也就是s2的传输,此时s2就可以对addr以及控制信号进行采样了。就不会出现上面的问题。
原文链接:https://blog.csdn.net/weixin_42208307/article/details/112913587