解题思路:
①先将高频脉冲展宽,从sig_a脉冲来就开始展,展宽结束是低频时钟域收到信号再打两拍反馈回来,表示已经收到了无需再拉长;
②低频时钟域对拉长的信号打两拍,防止亚稳态;
③低频再打一拍,相当于有一个延迟,根据这个延迟一拍用组合逻辑生成了sig_b;
④用高频把sig_b打两拍反馈给高频,示意展宽结束。
参考代码如下:
`timescale 100ps/100ps
module pulse_detect(
input clka ,
input clkb ,
input rst_n ,
input sig_a ,
output sig_b
);
reg sig_a_300;
reg sig_a_300_r1, sig_a_300_r2;
reg sig_b_r1;
reg sig_b_300_r1, sig_b_300;
always@(posedge clka or negedge rst_n)
if(!rst_n)
sig_a_300 <= 1'b0;
else if(sig_a)
sig_a_300 <= 1'b1;
else if(sig_b_300)
sig_a_300 <= 1'b0;
else
sig_a_300 <= sig_a_300;
always@(posedge clkb or negedge rst_n)
if(!rst_n) begin
sig_a_300_r1 <= 1'b0;
sig_a_300_r2 <= 1'b0;
end
else begin
sig_a_300_r1 <= sig_a_300;
sig_a_300_r2 <= sig_a_300_r1;
end
always@(posedge clkb or negedge rst_n)
if(!rst_n)
sig_b_r1 <= 1'b0;
else
sig_b_r1 <= sig_a_300_r2;
assign sig_b = sig_a_300_r2 && ~sig_b_r1;
always@(posedge clka or negedge rst_n)
if(!rst_n) begin
sig_b_300_r1 <= 1'b0;
sig_b_300 <= 1'b0;
end
else begin
sig_b_300_r1 <= sig_b;
sig_b_300 <= sig_b_300_r1;
end
endmodule