2016-06-28 4 views

답변

0

예, 해결책은 출력 클럭을 기준으로 입력 펄스의 너비를 기반으로해야합니다.

출력 클럭이 매우 느리고 펄스가있는 경우 입력 클럭 도메인에서 작동하는 인라인 펄스 스트레서를 추가해야합니다. 스트레치는 아래의 stretch_out의 비트 폭으로 정의되며 "반드시"는 출력 clk 도메인에서 1 클럭보다 커야합니다.

reg [3:0] stretch_out; 
always @ (posedge inclk) 
begin 
    stretch_out <= in_signal ? 4'b1111 : {stretch_out[2:0],1'b0}; 
end 

이제는 double flop synchronizer를 사용할 수 있습니다.

reg [1:0] out_sync; 
always @ (posedge outclk) 
begin 
    out_sync <= {out_sync[0],stretch_out[3]}; 
end 

이렇게하면 빠른 도메인의 속도와 펄스를 느린 도메인으로 동기화해야합니다.

유일한 문제는 일반적인 두 개의 플롭 대기 시간 이상을 추가하는 것입니다.

0

대상 도메인의 신호를 사용하여 비동기 적으로 설정하고, 이중 플립을 사용하여 동기화 한 다음 상승 에지를 감지 할 수 있습니다. 짧은 펄스와 긴 레벨 모두에서 작동해야합니다.

// Prevent DRC violations if using scan 
wire in_signal_n = scan_mode ? 1'b1 : !signal_in; 

// Following code creates a flop with both async setb and resetb 
reg sig_n_async; 
always @ (posedge outclk or negedge reset_n or negedge in_signal_n) 
    if (!reset_n) 
    sig_n_async <= 0; 
    else if (!in_signal_n) 
    sig_n_async <= 1; 
    else 
    sig_n_async <= 0; 


// Synchronizer 
reg [1:0] out_sync; 
always @ (posedge outclk or negedge reset_n) 
    if (!reset_n) 
    out_sync <= 0; 
    else 
    out_sync <= {out_sync[0],sig_n_async}; 


// Rising edge 
reg out_sync_del; 
always @ (posedge outclk or negedge reset_n) 
    if (!reset_n) 
    out_sync_del <= 0; 
    else 
    out_sync_del <= out_sync[1]; 

wire signal_out = out_sync[1] & !out_sync_del;