题解 | #脉冲同步电路#

脉冲同步电路

https://www.nowcoder.com/practice/b7f37e6c55e24478aef4ec2d738bbf07

`timescale 1ns/1ns
module pulse_detect
(
    clk_fast  ,
    clk_slow  ,
    rst_n     ,
    data_in   ,

    dataout
);

    input     clk_fast    ;
    input     clk_slow    ;
    input     rst_n       ;
    input     data_in     ;
    output    dataout     ;

    // 快时钟域下信号扩展周期数,并进行再次打拍
    reg       buf1_data_in;
    reg       buf2_data_in;
    always @ (posedge clk_fast, negedge rst_n)
    begin
        if (rst_n==1'b0)
        begin
            buf1_data_in <= 1'b0;
            buf2_data_in <= 1'b0;
        end
        else 
        begin
            buf1_data_in <= data_in;
            buf2_data_in <= buf1_data_in;
        end
    end
    wire      ex_data_in  ;
    reg       buf_ex_din  ;
    assign ex_data_in = buf1_data_in|buf2_data_in;
    always @ (posedge clk_fast, negedge rst_n)
    begin
        if (rst_n==1'b0)
        begin
            buf_ex_din <= 1'b0;
        end
        else
        begin
            buf_ex_din <= ex_data_in;
        end
    end

    // 将扩展后的信号同步到慢时钟域;多打一拍做边沿检测
    reg       syn_ex_din;
    reg       dly1_syn_ex_din;
    reg       dly2_syn_ex_din;
    always @ (posedge clk_slow, negedge rst_n)
    begin
        if (rst_n==1'b0)
        begin
            syn_ex_din      <= 1'b0;
            dly1_syn_ex_din <= 1'b0;
            dly2_syn_ex_din <= 1'b0;

        end
        else
        begin
            syn_ex_din      <= buf_ex_din      ;
            dly1_syn_ex_din <= syn_ex_din      ;
            dly2_syn_ex_din <= dly1_syn_ex_din ;
        end
    end

    // 边沿检测,确保得到的输出脉冲只有一个周期
    assign dataout = dly1_syn_ex_din&(~dly2_syn_ex_din);
    
endmodule //pulse_detect

全部评论

相关推荐

但听说转正率很低,我现在有在实习了,好纠结要不要去
熬夜脱发码农:转正率低归低,但是实习的经历你可以拿着,又不是说秋招不准备了
点赞 评论 收藏
分享
不要停下啊:大二打开牛客,你有机会开卷了,卷起来,去找课程学习,在牛客上看看大家面试笔试都需要会什么,岗位有什么需求就去学什么,努力的人就一定会有收获,这句话从来都经得起考验,像我现在大三了啥也不会,被迫强行考研,炼狱难度开局,啥也不会,找工作没希望了,考研有丝丝机会
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-02 17:58
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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