异步时钟下跨时钟域信号处理
IC设计中经常会遇到多时钟域的情况,最常见就是总线接口一个时钟,模块工作一个时钟(两个异步时钟),这时候数据通过总线到达模块内部在被模块工作时钟采样前需要做下同步处理,这样可以保证信号正确的被采样,不至于在时序仿真时寄存器出现亚稳态状况,给出一个信号在不用时钟域下同步处理时序如下图,实际上这种处理只需要在异步时钟的情况下才需要,如果是同源时钟则不需要,用综合工具做好约束,DC会在综合时做好处理,优化好时序。
设计目的是将来自源时钟域sclk的start信号和数据data同步到目的时钟域dclk,注意到sclk和dclk是异步时钟,为了保证start信号能够被dclk正确采样,首先需要将start信号延长(data_avail_nxt),在源时钟域sclk下同步一级(data_avail),然后两级同步到目的时钟域dclk(sync_data_avail),这时候start信号已经可以被目的时钟域dclk正确采到,再将sync_data_avail在dclk下同步一级,输出其上升沿信号(sync_data_ed)给dclk使用。sync_data_avail可以作为dclk的ack告诉源时钟域sclk同步已完成,可以进行下一个数据的同步了,ack来自dclk,要过渡到sclk需要在sclk下同步两级,然后再采其边沿,作为同步完成握手信号给sclk使用,busy信号作为同步正在进行的标志,在sclk检测到start后开始,检测到finish后结束。
功能框图如下: