Verilog Frequency Divider !!hot!! Info
Caveat: The divisor value must be ≥ 2 and stable during operation. For very high input frequencies (e.g., 500 MHz in an ASIC), counter propagation delay may limit performance. Use synchronous prescalers with low-bit ripple counters or Johnson counters.
module prog_divider #(parameter WIDTH=16) ( input clk, rst_n, input [WIDTH-1:0] divisor, // N value output reg clk_out ); reg [WIDTH-1:0] count; always @(posedge clk or negedge rst_n) begin if (!rst_n) begin count <= 0; clk_out <= 0; end else begin if (count == divisor - 1) begin count <= 0; clk_out <= ~clk_out; end else begin count <= count + 1; end end end endmodule verilog frequency divider
module div_by_8_even ( input clk, input rst_n, output reg clk_out ); reg [1:0] count; // 2 bits for N/2 = 4 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin count <= 0; clk_out <= 0; end else begin if (count == 3) begin // N/2 - 1 count <= 0; clk_out <= ~clk_out; end else begin count <= count + 1; end end end endmodule Odd division (e.g., divide-by-3, 5, 7) is more complex because ( N/2 ) is fractional. A common method uses two counters : one triggered on the positive edge, the other on the negative edge, and the outputs are ORed or ANDed to reconstruct a near-50% duty cycle. Caveat: The divisor value must be ≥ 2
module clk_enable_div8 ( input clk, rst_n, output reg clk_en ); reg [2:0] count; always @(posedge clk or negedge rst_n) begin if (!rst_n) count <= 0; else count <= (count == 7) ? 0 : count + 1; end assign clk_en = (count == 7); // one cycle wide pulse endmodule Then downstream modules use: 0 : count + 1; end assign clk_en
1. Introduction In digital systems, different components often require different clock frequencies. A microcontroller might run at 100 MHz, while a UART needs 115.2 kHz, and an LED blinks at 1 Hz. Generating these diverse clocks from a single master clock is the task of the frequency divider . In Verilog, a frequency divider is not merely a counter; it is a careful exercise in timing, resource utilization, and clock domain management. This essay explores the architecture, coding techniques, and pitfalls of frequency dividers, ranging from simple integer dividers to fractional and programmable designs. 2. Core Principle: The Counter-Based Divider The most fundamental frequency divider is the counter-based integer divider . Given an input clock of frequency ( f_{in} ), a divide-by-( N ) circuit produces an output clock of frequency ( f_{out} = f_{in} / N ). This is achieved by counting ( N ) cycles of the input and toggling the output. 2.1 Even Divide-by-( N ) For even ( N ), a simple counter that rolls over after ( N/2 ) cycles generates a symmetric 50% duty cycle output.
Output: 2 cycles high, 1 cycle low → 33% duty, frequency = clk/3. Fractional division (e.g., divide by 2.5) is essential for generating arbitrary frequencies from a fixed crystal. It is achieved by periodically swallowing clock edges using a phase accumulator.
always @(posedge clk) begin if (clk_en) begin // do something every 8 clocks end end If you must produce a real clock (e.g., for an external chip), route the divider output to a global clock buffer (BUFG in Xilinx, GCLK in Intel). This minimizes skew. 4. Advanced Dividers: Programmable and Wide-Range 4.1 Programmable Divider A programmable divider allows software to select ( N ) at runtime. This is a counter with a loadable terminal count .
