按照信号用途将单bit跨时钟同步器分为:电平同步器,边沿检测器和脉冲同步器。
小结:
所谓电平同步器,顾名思义是将有用的电平信号同步至另一时钟域,电平信号需要在原时钟域保持至少两个时钟周期。其同步方法是将信号经过两个D触发器,即打两拍
边沿检测器的原理是在电平同步器的输出加一个触发器(第一级可能存在亚稳态,利用二三级触发器结果判断信号是上升沿还是下降沿)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HyxsBLF7-1618539128392)(https://upload-images.jianshu.io/upload_images/9246563-fb1305938ad82022.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
脉冲同步器的作用是检测原时钟域的脉冲并在新时钟域上产生一个新的脉冲
以上是较为简单的脉冲同步器,此脉冲同步器对于某些情况下是不可靠的,若要可靠的完成脉冲的同步,可以引入握手机制。具体的握手机制如下:
若源时钟域脉冲来临,且同步器处于空闲状态,则向同步器发出同步请求;
同步请求信号到达目的时钟域,目的时钟域产生应该信号表示同步完成;
源时钟域检测到应答信号后清楚请求信号;
目标时钟域检测到源时钟域请求信号清除后清除应答信号;
同步器回到空闲状态,进行下一个脉冲的同步;
CLR高电平有效
module Sync_Pulse( input clka, input clkb, input rst_n, input pulse_ina, output pulse_outb, output signal_outb ); //------------------------------------------------------- reg signal_a; reg signal_b; reg signal_b_r; reg signal_b_rr; reg signal_a_r; reg signal_a_rr; //------------------------------------------------------- //在clka下,生成展宽信号signal_a always @(posedge clka or negedge rst_n)begin if(rst_n == 1'b0)begin signal_a <= 1'b0; end else if(pulse_ina == 1'b1)begin signal_a <= 1'b1; end else if(signal_a_rr == 1'b1) signal_a <= 1'b0; else signal_a <= signal_a; end //------------------------------------------------------- //在clkb下同步signal_a always @(posedge clkb or negedge rst_n)begin if(rst_n == 1'b0)begin signal_b <= 1'b0; end else begin signal_b <= signal_a; end end //------------------------------------------------------- //在clkb下生成脉冲信号和输出信号 always @(posedge clkb or negedge rst_n)begin if(rst_n == 1'b0)begin signal_b_r <= 'b0; signal_b_rr <= 'b0; end else begin signal_b_rr <= signal_b_r; signal_b_r <= signal_b; end end assign pulse_outb = ~signal_b_rr & signal_b_r; assign signal_outb = signal_b_rr; //------------------------------------------------------- //在clka下采集signal_b_rr,生成signal_a_rr用于反馈拉低signal_a always @(posedge clka or negedge rst_n)begin if(rst_n == 1'b0)begin signal_a_r <= 'b0; signal_a_rr <= 'b0; end else begin signal_a_rr <= signal_a_r; signal_a_r <= signal_b_rr; end end endmodule
两种电路图的功能一致。在参考链接2中也有一个设计,但是设计复杂,优点是每个触发器采取的是时钟触发。
参考链接:
https://blog.csdn.net/qq_21842097/article/details/88657046
https://blog.csdn.net/Reborn_Lee/article/details/96714098
https://www.cnblogs.com/iclearner/p/6579754.html
由图可见,DMUX有一个MUX和一个触发器构成,在数据输入使能有效的时候采样端口信号,数据输入使能无效的时候数据保持。在VCS综合中会综合成为低功耗设计,增加一个门控电路。
小结:DMUX的原理类似于脉冲检测器
根据这个时序图,d_req是根据d_in产生的,根据d_ack截止的。d_req从s到d,再从d_到s变为ack。