题解 | #脉冲同步电路#
脉冲同步电路
https://www.nowcoder.com/practice/b7f37e6c55e24478aef4ec2d738bbf07
`timescale 1ns/1ns
module pulse_detect(
input clk_fast ,
input clk_slow ,
input rst_n ,
input data_in ,
output dataout
);
reg data_in_reg;
reg [2:0] data_slow_reg;
always@(posedge clk_fast or negedge rst_n)
begin
if(!rst_n)
data_in_reg <= 1'b0;
else if(data_in)
data_in_reg <= ~data_in_reg; //只要信号来就跳转一次,即把其转换为电平信号,然后让slow时钟进行抓取
end
always@(posedge clk_slow or negedge rst_n)
begin
if(!rst_n)
data_slow_reg <= 3'b0;
else
data_slow_reg <= {data_slow_reg[1:0] , data_in_reg}; //这也是打两拍的方式,主要就是把打拍数据放一起,
end
//打三拍主要是怕第一个数据刚同步过来不稳定,所以选择三拍,特别是我们的输出是组合逻辑,所以必须三拍,两拍同步,一拍取稳定
assign dataout = data_slow_reg[2] ^ data_slow_reg[1]; //把第三拍数据和第二拍数据进行求异或就能得到信号的边沿,从而实现输出信号是一个脉冲
endmodule

