题解 | #任意小数分频#

任意小数分频

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***********//

    reg [7:0] cyc_cnt;
    reg div_flag;
    reg [4:0] clk_cnt;
    reg clk_out_r;
    
    always @ (posedge clk_in,  negedge rst) begin
        if(!rst) begin
            clk_cnt <= 5'b0;
        end
        else if (!div_flag) begin
            clk_cnt <= (clk_cnt == div_e - 1) ? 5'b0 : clk_cnt + 5'b1;
        end
        else begin
            clk_cnt <= (clk_cnt == div_o - 1) ? 5'b0 : clk_cnt + 5'b1;
        end
    end
    
    always @ (posedge clk_in,  negedge rst) begin
        if(!rst) begin
            cyc_cnt <= 8'b0;
        end
        else  begin
            cyc_cnt <= (cyc_cnt == M_N - 1) ? 8'b0 : cyc_cnt + 8'b1;
        end
    end
    
    always @ (posedge clk_in,  negedge rst) begin
        if(!rst) begin
            div_flag <= 1'b0;
        end
        else  begin
            div_flag <= ((cyc_cnt == c89 - 1) || (cyc_cnt == M_N - 1))? (~div_flag) : div_flag;
        end
    end
    
    always @ (posedge clk_in,  negedge rst) begin
        if(!rst) begin
            clk_out_r <= 1'b0;
        end
        else if (!div_flag) begin
            clk_out_r <= clk_cnt <= ((div_e >> 2) + 1) ;
        end
        else begin
            clk_out_r <= clk_cnt <= ((div_o >> 2) + 1);
        end
    end
    
    assign clk_out = clk_out_r;
//*************code***********//
endmodule

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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