慢到快:打两拍
快到慢:
module pulse_sys(
input clk1, ////////////快时钟域
input clk2, ////////////慢时钟域
input ret_n,
input data_in,
output data_out
);
reg fast_clk_data;
reg slow_clk_data0;
reg slow_clk_data1;
reg slow_clk_data2;
//脉冲展宽模块:由一个寄存器和一个二选一多路选择器构成,将脉冲信号转换成电平信号
always@(posedge clk1 or negedge rst_n)begin
if(!rst_n)
fast_clk_data<=0;
else begin
case(data_in)
1'b0:fast_clk_data<=fast_clk_data;
1'b1:fast_clk_data<=~fast_clk_data;
endcase
end
end
//同步器模块
always@(posedge clk2 or negedge rst_n)begin
if(!rst_n)begin
slow_clk_data0<=0;
slow_clk_data1<=0;
slow_clk_data2<=0;
end
else begin
slow_clk_data0<=fast_clk_data;
slow_clk_data1<=slow_clk_data0;
slow_clk_data2<=slow_clk_data1;
end
end
//输出模块
assign data_out=slow_clk_data1^slow_clk_data2;
endmodule