alt

由于同步脉冲最先是在快时钟域下的,因此先用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