`timescale 1ns/1ns

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