题解 | 脉冲同步电路

脉冲同步电路

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

全部评论

相关推荐

10-09 17:17
已编辑
门头沟学院 Java
活泼的代码渣渣在泡池...:同学你好,我也是学院本,后天要面这个亚信科技,是实习,请问问题都啥样呀,我项目就做了网上的,这是第一次面试
投递多益网络等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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