大家看看code吧
module full_sync(
clk1,
resetn1,
clk2,
resetn2,
set, // set signal from clk1 domain
set2_reg2,
setout // set output to clk2 domain
);
input clk1;
input resetn1;
input clk2;
input resetn2;
input set;
output setout;
output set2_reg2;
wire setout;
reg set_reg;
reg set2_reg1;
reg set2_reg2;
reg set2_reg3;
reg set1_reg1;
reg set1_reg2;
wire zero;
assign zero = set | set_reg & ~set1_reg2;
assign setout = set2_reg2 & (~set2_reg3); // output a pulse
always @(posedge clk1 or negedge resetn1)
begin
if(~resetn1)
begin
set_reg <= 1'b0;
end
else
begin
set_reg <= zero;
end
end
// clk2 sync set_reg
always @(posedge clk2 or negedge resetn2)
begin
if(~resetn2)
begin
set2_reg1 <= 1'b0;
set2_reg2 <= 1'b0;
end
else
begin
set2_reg1 <= set_reg;
set2_reg2 <= set2_reg1;
end
end
// clk1 sync set2_reg1
always @(posedge clk1 or negedge resetn1)
begin
if(~resetn1)
begin
set1_reg1 <= 1'b0;
set1_reg2 <= 1'b0;
end
else
begin
set1_reg1 <= set2_reg2;
set1_reg2 <= set1_reg1;
end
end
// clk1 delay set2_reg2
always @(posedge clk2 or negedge resetn2)
begin
if(~resetn2)
begin
set2_reg3 <= 1'b0;
end
else
begin
set2_reg3 <= set2_reg2;
end
end
endmodule |