`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