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

任意奇数倍时钟分频

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):0] cnt1;
    reg clk1, clk2;
    
    //计数模块,计数到dividor-1归0,因为整个电路并行执行,复位后cnt为0,
    //第一个时钟上升沿到来时,cnt为0,整个电路同时工作;所以cnt为0时整个电路已经一起工作过一次。
    always @ (posedge clk_in, negedge rst_n) begin
        if(!rst_n) begin
            cnt1 <= 0;
        end
        else
            cnt1 <= (cnt1 == dividor-1 ) ? 0 : cnt1 + 1;
    end
    
    //上升沿有效,在(dividor - 1)>>1和(dividor-1)时翻转
    always @ (posedge clk_in, negedge rst_n)begin
        if(!rst_n) begin
            clk1 <= 1'b0;
        end
        else if(cnt1 == (dividor - 1)>>1) begin
            clk1 <= ~clk1;
        end
        else if (cnt1 == (dividor-1)) begin
            clk1 <= ~clk1;
        end
        else begin
            clk1 <= clk1;
        end        
                     
    end
    //下升沿有效,在(dividor - 1)>>1和(dividor-1)时翻转
    always @ (negedge clk_in, negedge rst_n)begin
        if(!rst_n) begin
            clk2 <= 1'b0;
        end
        else if(cnt1 == (dividor - 1)>>1) begin
            clk2 <= ~clk2;
        end
        else if (cnt1 == (dividor-1)) begin
            clk2 <= ~clk2;
        end
        else begin
            clk2 <= clk2;
        end
              
    end
    assign clk_out = clk1 || clk2;
    
endmodule

全部评论

相关推荐

求offer的大角牛:不吃香菜
点赞 评论 收藏
分享
缒梦&独舞:这家公司是这样的,去年给我实习offer了,不过也是面着玩儿的,他周六还要去做公益志愿活动
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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