我的第一个问题是,看上图的协议,在发cmdA(包括地址,trans,burst等相关的cmd)时,HREADY此时是不是1,或者问题提炼为,在master发送第一个cmd的时候需要slave的Hready为1才能发送吗,或者换种说法,slave需要在默认的情况下将Hready拉高吗。
解答:不需要slave的Hready为1就可以发送cmdA,但是cmdA要想变成其他指令时必须要保证当前周期的Hready为1,否则的待发送信息就必须保持(读的话是slave提供数据),另外slave只有检测的hready为1的情况下才会采样控制信号和地址信号。因而对于slave而言其默认的Hready是高或者低对master是没有影响的。
我的第二个问题是,上图的nonseq和seq意义何在,如果master将nonseq发成了seq会不会错,因为每次发送cmd的时候也伴有地址,所以个人觉得nonseq发成了seq不会造成slave的接收错误,那么nonseq意义是不是仅仅表示一个新的cmd开始了?
解答:nonseq可以用来表示一个新的cmd的发起,如果slave只采样地址(此时trans不能为0,为0表示空闲),那么slave收发数据不会错,但是有的slave可能会nonseq下对应的地址作为首地址,然后其他seq下的地址就用首地址递增的方法,而不是直接采样地址,用这种方式设计的话,nonseq和seq就不能随便发送。
总结:AMBA总线并没有强制性的规定协议某些地方必须是什么,留有了很多的不确定性,这样的好处是给设计带来了灵活性,你可以按照你的理解进行设计,只要是对应起来即可;缺点是灵活性带来大家理解的不一致,这样A做的master和B做的Slave可能就不能正确的搭配工作,所以关键是一起讨论,尽可能的理解协议,按照协议来做,至于有些corner的地方一定要讨论确定,否则后面会带来很大的麻烦。为什么我做的不能工作啊,因为corner case理解的差异。
最后再说一句,讨论很重要!
网友1评论:第一个问题的解答,写的有点矛盾,slave采样cmd信号为何需要hready拉高?hready是slave给出的,slave采样cmd信号又要hready拉高,岂不是死锁(假如hready初始为0,协议上只是建议初始值为1)?