题解 | 脉冲同步电路

脉冲同步电路

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

全部评论

相关推荐

09-02 11:14
已编辑
四川大学 Java
吴offer选手:这种面试是最烦的,学不到东西,然后还被挂的莫名其妙。之前看到一种说法是面试官如果不想要你了,就会问一些很简单的问题,防止你举报他
点赞 评论 收藏
分享
牛客40297450...:不是研究生强,是你强
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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