2、快时钟域到慢时钟域
因为最大的问题可能是在慢时钟到来之前,控制信号已经无效,这样就丢失了控制信号。
(1)通过展宽+打拍同步
READ_DLY1 信号是 READ 信号相对于 CLK1 时钟打一拍产生的,READ_DLY2 信号是 READ 信号相对于 CLK1 时钟打两拍产生的,由于单纯的 READ 信号宽度根本不够 CLK2 采样,所以需要展宽 READ 的信号宽度, READ_OR 信号是由 READ 和 READ_DLY1 以及READ_DLY2 相或产生的。READ_OR 信号宽度以及够 CLK2 采样。同步原理如下,直接使用 CLK2 采样 READ_OR 信号得到 READ_ SYNC,然后再对READ_SYNC 打 2 拍,第一拍得到 READ_ SYNC_DLY1,第二拍得到 READ SYNC_DLY2,然后READ_SYNC_DLY1 和 READ_OR_SYNC_DLY2 的取反信号相与得到 READ SYNC_PULSE,即已经同步到 CLK2 时钟域的 READ 信号上升沿指示信号。
展宽方式也可以变为toggle。脉冲同步器,输入脉冲间隔>=2*clk_slow。输入脉冲相隔过近,则慢时钟域的新脉冲也紧密相邻,结果是输出脉冲比一个时钟周期宽;如果太近,则无法检测到每一个脉冲。
在展宽时,如果有效电平很宽,即使使得慢时钟能够采样到多次也没关系,因为后续在慢时钟域中进行的边沿检测就是为了最终使得该信号的有效电平只有一个慢时钟周期。具体代码如下:
然而,该方法仍然存在一些问题:相邻两个输入脉冲的间隔至少是两个同步器时钟(clkb)周期才行,有一定的局限性。
(2)握手
针对此脉冲同步器出现的问题:源时钟域中的第一个脉冲和第二个脉冲间隔过短,第一个脉冲未完成同步,第二脉冲又将状态清空,导致最终脉冲同步丢失。我们引入握手机制进行解决,思路如下:
(1) 同步请求产生;当同步器处于空闲(即上一次已同步完成)时,源同步脉冲到达时产生同步请求信号sync_req;
(2) 同步请求信号sync_req同步到目的时钟域,目的时钟域产生脉冲信号并将产生应答信号sync_ack;
(3) 同步应答信号sync_ack同步到源时钟域,源时钟域检测到同步应答信号sync_ack后,清除同步请求信号;
(4) 目的时钟域检测到sync_req撤销后,清除sync_ack应答;源时钟域将到sync_ack清除后,认为一次同步完成,可以同步下一个脉冲。
————————————————
版权声明:本文为CSDN博主「FPGA硅农」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40268672/article/details/123347337
————————————————
版权声明:本文为CSDN博主「FPGA硅农」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40268672/article/details/123347337