由于同步脉冲最先是在快时钟域下的,因此先用T触发器检测脉冲的上升沿。题目说了快时钟域下的脉冲不会相邻很近,则保证快时钟域下的每一个脉冲都可以被T触发器采到。
采到之后,单比特信号的跨时钟域进行打两拍(r1, r2)同步到慢时钟域,在慢时钟域下再打一拍(r3),再将r2和r3对应的信号进行异或处理^,就可以在慢时钟域产生对应的脉冲。
`timescale 1ns/1ns
module pulse_detect(
input clk_fast ,
input clk_slow ,
input rst_n ,
input data_in ,
output dataout
);
reg data_in_t;
always@(posedge clk_fast or negedge rst_n) begin: toggle
if(~rst_n)
data_in_t <= 0;
else if(data_in)
data_in_t <= ~data_in_t;
end
reg data_in_r1, data_in_r2, data_in_r3;
always@(posedge clk_slow or negedge rst_n) begin: reg_data_in_t
if(~rst_n) begin
data_in_r1 <= 0;
data_in_r2 <= 0;
data_in_r3 <= 0;
end
else begin
data_in_r1 <= data_in_t;
data_in_r2 <= data_in_r1;
data_in_r3 <= data_in_r2;
end
end
assign dataout = data_in_r2 ^ data_in_r3;
endmodule