题解 | 脉冲同步电路
脉冲同步电路
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_signal; //打一拍
reg data_in_signal_r; //打一拍
reg data_in_signal_rr; //打两拍
reg data_in_signal_rrr; // 边沿检测信号
reg dataout_signal; // 输出信号反馈
reg dataout_signal_r; // 输出信号打一拍
//转电平信号
always @(posedge clk_fast or negedge rst_n) begin
if (!rst_n) begin
data_in_signal <= 1'b0;
end
else if(dataout_signal_r == 1'b1) begin
data_in_signal <= 1'b0; // 反馈信号拉低
end
else if(data_in == 1'b1)begin
data_in_signal <= 1'b1; // 采集快时钟域的输入信号
end
end
//慢时钟域采集电平方案
always @(posedge clk_slow or negedge rst_n) begin
if (!rst_n) begin
{data_in_signal_rrr, data_in_signal_rr, data_in_signal_r} <= {3{1'b0}};
end
else begin
{data_in_signal_rrr, data_in_signal_rr, data_in_signal_r} <= {data_in_signal_rr, data_in_signal_r, data_in_signal}; // 左边给左边,右边给右边
end
end
//慢时钟域边沿检测,得到脉冲信号
assign dataout = (data_in_signal_rr == 1'b1) && (data_in_signal_rrr == 1'b0); // 上升沿检测, 将data_in_signal_r打一拍
//快时钟域采集慢时钟域的返回信号
always @(posedge clk_fast or negedge rst_n) begin
if (!rst_n) begin
dataout_signal <= 1'b0;
dataout_signal_r <= 1'b0;
end
else begin
dataout_signal <= data_in_signal_rr; // 采集慢时钟域的输出信号
dataout_signal_r <= dataout_signal; // 打一拍
end
end
endmodule
