题解 | 任意奇数倍时钟分频

任意奇数倍时钟分频

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

`timescale 1ns / 1ns

module clk_divider #(
    parameter dividor = 5
) (
    input  clk_in,
    input  rst_n,
    output clk_out
);
    reg [$clog2(dividor)-1:0] cnt;
    reg clk_p, clk_n;
    assign clk_out = clk_p || clk_n;
    always @(posedge clk_in or negedge rst_n) begin
        if (!rst_n) begin
            cnt <= 0;
        end else begin
            cnt <= (cnt == dividor - 1) ? 0 : cnt + 1;
        end
    end
    always @(posedge clk_in or negedge rst_n) begin
        if (!rst_n) begin
            clk_p <= 0;
        end else if (cnt == (dividor - 1) >> 1) begin
            clk_p <= ~clk_p;
        end else if (cnt == dividor - 1) begin
            clk_p <= ~clk_p;
        end
    end
    always @(negedge clk_in or negedge rst_n) begin
        if (!rst_n) begin
            clk_n <= 0;
        end else if (cnt == (dividor - 1) >> 1) begin
            clk_n <= ~clk_n;
        end else if (cnt == dividor - 1) begin
            clk_n <= ~clk_n;
        end
    end
endmodule

观察时钟翻转处波形,相位提高了半个周期,考虑到cnt_n比cnt_p晚半个周期,可以推知cnt_n和cnt_p共用一个有posedge clk产生的cnt_p

全部评论

相关推荐

迷茫的大四🐶:哇靠,哥们,啥认证啊,副总裁实习,这么有实力嘛
一起聊美团
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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