是的,您可以,但解决方案需要基于输入脉冲相对于输出时钟的宽度。
当输出时钟非常慢并且您有脉冲时,您需要添加一个在输入时钟域中运行的内联脉冲展宽器。拉伸由下面的stretch_out的位宽定义,并且“MUST”大于输出clk域上的一个时钟。
reg [3:0] stretch_out; always @ (posedge inclk) begin stretch_out <= in_signal ? 4'b1111 : {stretch_out[2:0],1'b0}; end
现在您可以使用双翻转同步器。
reg [1:0] out_sync; always @ (posedge outclk) begin out_sync <= {out_sync[0],stretch_out[3]}; end
这应该将来自快域的电平和脉冲同步到慢域。
唯一的问题是,你将增加的不只是通常的两个翻牌延迟。
您可以使用目标域中的信号进行异步设置,使用双触发器进行同步,然后检测上升沿。应该适用于短脉冲和长脉冲。
// 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;