题解 | 脉冲同步电路

脉冲同步电路

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

全部评论

相关推荐

11-10 16:01
点赞 评论 收藏
分享
notbeentak...:就抓,嗯抓,开不开匿名都要抓,一点坏事不让说,就对公司顶礼膜拜佩服的五体投地就对了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务