“打拍”:在数字系统和时序设计中,打拍(Double Flopping / Two-Stage Registering)是指通过两个级联的寄存器(flip-flops)将输入信号同步到系统时钟域内的过程,常用于解决跨时钟域信号的亚稳态问题。
为什么要打拍?
① 防止亚稳态:当信号从一个时钟域传输到另一个时钟域时,信号的变化可能与接收时钟的边沿非常接近,导致接收寄存器进入亚稳态(亚稳态可能导致不可预测的行为和系统错误);
② 同步异步信号:在一些情况下,外部信号(如按钮输入或外部设备信号)是异步的,需要将其同步到系统时钟域内才能安全地使用;
③ 提高稳定性:通过增加寄存器级数,信号在跨越时钟域时有更多的时间稳定下来,降低亚稳态发生的概率。
“打一拍”和“打两拍”:
“打一拍”适用于:
① 低速信号:输入信号变化速率较低,不易引起亚稳态;
② 已知稳定的异步信号:信号已在其他电路中经过处理,稳定性较高;
③ 无亚稳态风险:系统设计能够容忍一定的亚稳态风险。
//打一拍:单个D触发器(FF)实现
module single_flop_sync (input wire clk,input wire rst_n,input wire async_in, //异步输入信号output reg sync_out //同步输出信号
);always @(posedge clk or negedge rst)
beginif(!rst_n)beginsync_out <= 0;endelsebeginsync_out <= async_in;end
endendmodule
“打两拍”适用于:
① 高速信号:输入信号变化速率较高,容易引起亚稳态;
② 跨时钟域信号:信号从一个时钟域传输到另一个时钟域,存在较大的亚稳态风险;
③ 关键控制信号:系统中非常重要的信号,需要确保绝对稳定性。
//打两拍:两个级联的D触发器实现
module double_flop_sync (input wire clk,input wire rst_n,input wire async_in,output reg sync_out
);reg sync_stage1;always @(posedge clk or negedge rst_n)
beginif(!rst_n)beginsync_stage1 <= 0;sync_out <= 0;endelsebeginsync_stage1 <= async_in;sync_out <= sync_stage1;end
endendmodule