实现从快时钟域到慢时钟域的脉冲信号的同步
主模块代码:
module pulse_sync
(
input wire data,
input wire rst_n,
input wire clk1,
input wire clk2,
output wire out
);
reg Toggle;
reg Toggle_reg1, Toggle_reg2, Toggle_reg3;
//Toggle电路实现输入信号为高电平时输出信号的翻转
always@(posedge clk1 or negedge rst_n)
if(!rst_n)
Toggle <= 0;
else if(data)
Toggle <= ~Toggle;
else
Toggle <= Toggle;
//对输出的Toggle信号进行电平同步,防止出现亚稳态
always@(posedge clk2 or negedge rst_n)
if(!rst_n) begin
Toggle_reg1 <= 0;
Toggle_reg2 <= 0;
Toggle_reg3 <= 0;
end
else begin
Toggle_reg1 <= Toggle;
Toggle_reg2 <= Toggle_reg1;
Toggle_reg3 <= Toggle_reg2;
end
assign out = Toggle_reg2 ^ Toggle_reg3;
endmodule
testbench:
modul