Clock Divider Calculator

Find the best integer divide ratio from an input clock to a target frequency, see the error in ppm, and get a clean Verilog divider - plus the clock-enable pattern you should probably use instead.

Results

Exact ratio needed
100
Best integer divider
/100
Actual output
1 MHz
Error
+0.0 ppm

Nearby dividers

Divide byOutputErrorDuty cycle
991.0101 MHz+10,101.0 ppm~49.5%
1001 MHz+0.0 ppm50%
1010.990099 MHz-9,901.0 ppm~49.5%

Notes

Verilog divider
// Divide 100 MHz by 100 -> 1 MHz
// Generated by libfpga.com/tools/clock-divider
module clk_div #(
    parameter integer DIV = 100   // must be >= 2
) (
    input  wire clk_in,
    input  wire rst,
    output reg  clk_out
);
    localparam integer CW = $clog2(DIV);
    reg [CW-1:0] cnt;

    always @(posedge clk_in) begin
        if (rst) begin
            cnt     <= 0;
            clk_out <= 1'b0;
        end else if (cnt == DIV/2 - 1 + (clk_out ? DIV % 2 : 0)) begin
            cnt     <= 0;
            clk_out <= ~clk_out;
        end else begin
            cnt     <= cnt + 1'b1;
        end
    end
endmodule
Verilog clock-enable (preferred)
// Preferred: clock ENABLE at 1/100 rate - keeps everything in one
// clock domain, no CDC, and the tools can time it properly.
reg [$clog2(DIV)-1:0] div_cnt;
reg                   tick;   // 1-cycle pulse every DIV cycles

always @(posedge clk) begin
    if (rst) begin
        div_cnt <= 0;
        tick    <= 1'b0;
    end else if (div_cnt == DIV-1) begin
        div_cnt <= 0;
        tick    <= 1'b1;
    end else begin
        div_cnt <= div_cnt + 1'b1;
        tick    <= 1'b0;
    end
end
// then:  always @(posedge clk) if (tick) ... your slow logic ...

This exact result is bookmarkable — the URL contains all your inputs. Need it in a script? Append &format=json (API docs).

About this tool

A counter can only divide a clock by an integer, so the first question is which integer lands closest to your target and how many ppm off that is — this calculator answers both and shows the neighbors. The second question is whether you should divide the clock at all: a fabric-generated clock burns a global routing resource, complicates timing analysis, and creates a CDC at every boundary. If the slow logic can stay in the fast domain, use the clock-enable pattern in the second code block instead — one domain, no CDC, and the tools time it automatically. Save real derived clocks for when you truly need them, and prefer a PLL/MMCM for exact or fractional ratios.

Related tools