题解 | #脉冲同步器(快到慢)#
脉冲同步器(快到慢)
http://www.nowcoder.com/practice/9f7c92635b5f49579e8e38fd8c8450d7
`timescale 100ps/100ps
module pulse_detect(input clka ,
input clkb ,
input rst_n ,
input sig_a ,
output sig_b);
reg [3:0] ff;
//pulse to level transition,use 1 ff;
always@(posedge clka or negedge rst_n) begin
if (!rst_n)
ff[0] <= 0;
else
ff[0] <= sig_a?~ff[0]:ff[0];
end
//2-level synchronizer
always@(posedge clkb or negedge rst_n) begin
if (!rst_n)
ff[2:1] <= 0;
else
ff[2:1] <= {ff[1],ff[0]};
end
//level transition to pulse
always@(posedge clkb or negedge rst_n) begin
if (!rst_n)
ff[3] <= 0;
else
ff[3] <= ff[2];
end
//whatever 1-0 or 0-1
assign sig_b = ff[3]^ff[2];
endmodule
module pulse_detect(input clka ,
input clkb ,
input rst_n ,
input sig_a ,
output sig_b);
reg [3:0] ff;
//pulse to level transition,use 1 ff;
always@(posedge clka or negedge rst_n) begin
if (!rst_n)
ff[0] <= 0;
else
ff[0] <= sig_a?~ff[0]:ff[0];
end
//2-level synchronizer
always@(posedge clkb or negedge rst_n) begin
if (!rst_n)
ff[2:1] <= 0;
else
ff[2:1] <= {ff[1],ff[0]};
end
//level transition to pulse
always@(posedge clkb or negedge rst_n) begin
if (!rst_n)
ff[3] <= 0;
else
ff[3] <= ff[2];
end
//whatever 1-0 or 0-1
assign sig_b = ff[3]^ff[2];
endmodule