题解 | #任意小数分频#

任意小数分频

https://www.nowcoder.com/practice/24c56c17ebb0472caf2693d5d965eabb

`timescale 1ns/1ns

module div_M_N(
 input  wire clk_in,
 input  wire rst,
 output wire clk_out
);
parameter M_N = 8'd87; 
parameter c89 = 8'd24; // 8/9时钟切换点
parameter div_e = 5'd8; //偶数周期
parameter div_o = 5'd9; //奇数周期
//*************code***********//

// 8.7分频,10个输出时钟周期等于87个输入时钟周期,需要3个8分频时钟周期和7个9分频时钟周期
// cnt_87 计数周期为0-86,cnt_div为产生8分频时钟(1/2占空比)和9分频时钟(4/9占空比)的计数器,cnt_div在cnt_87为23之前计数周期为0-7,在23之后计数周期为0-8,且分频时钟在cnt_div计数为0和3时翻转

    // cnt
    reg [7:0] cnt_87;
    reg [3:0] cnt_div;
    always @(posedge clk_in, negedge rst) begin
        if(!rst) begin
            cnt_87 <= 0;
            cnt_div <= 0;
        end
        else begin
            cnt_87 <= (cnt_87 == M_N-1)? 0 : cnt_87 + 1;
            if(cnt_87 <= c89-1) begin
                cnt_div <= (cnt_div == div_e-1)? 0 : cnt_div + 1; // 8分频计数
            end
            else begin
                cnt_div <= (cnt_div == div_o-1)? 0 : cnt_div + 1; // 9分频计数
            end
        end
    end

    // clk_out
    reg clk_div;
    always @(posedge clk_in, negedge rst) begin
        if(!rst) begin
            clk_div <= 0;
        end
        else begin
            clk_div <= (cnt_div == 0 || cnt_div == div_e >> 1)? ~clk_div : clk_div;
        end
    end
    assign clk_out = clk_div;

//*************code***********//
endmodule

全部评论

相关推荐

11-05 07:29
贵州大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务