跨时钟域的方法--MCP方式个人理解
多周期路径法
在上篇文章跨时钟域的方法--多周期路径中,图中标红和的方框部分会将脉冲信号转换为电平信号。
在不出现下一次高脉冲信号之前,电平信号会保持不变,当然可能是保持在高电平,也可能是保持在低电平,电平不变的情况下,使用三级触发器同步就可以使得数据最大可能避免亚稳态并得到一个脉冲信号,然后将这个电平信号通过b_ack传递回原时钟域,作为握手确认信号,只有当原时钟域接收到该电平信号并产生脉冲信号以后,才允许进入下一次的信号传输,因此在源时钟域需要有一个状态机控制这两种状态之间的切换,这个状态机的状态很简单,只有两种状态。代码如下。
上述电路因为在传递过程中的多个时钟周期内,信号都被保持不变,因此理论上是不存在亚稳态现象的,是可以保持正常传输的。
但是上述电路只需数据及信号已经发送到目标域,就可以开始下一次的数据传输,但是在实际过程中,目标域可能还需要更多的时钟周期对数据进行传递与接收,因此上述电路可能就不会很适应,因此需要在目标域增加一个状态机,确认当目标域已经完成接收后再响应下次的数据传输,在理解了上图的前提下,下图就比较好理解了。
对于图22中的示例,接收时钟域有一个小的WAIT-READY、1状态的FSM,当输入到数据寄存器的数据是有效的时,它向接收逻辑发送一个有效的信号(bvalid)。在接收逻辑通过bload信号确认应该加载数据之前,数据实际上不会加载。没有反馈到发送时钟域,直到数据已加载,然后b_ack信号被发送回源时钟域。状态机的代码如下:
至此,MCP的方法就差不多讲完了。
至于使用异步FIFO,格雷码等,在以前的文章中讲述过,链接如下: