((hot)) — Verilog Frequency Divider

module div_by_3 ( input clk, rst_n, output reg clk_out ); reg [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 == 2) begin // 0,1,2 -> 3 cycles count <= 0; clk_out <= ~clk_out; end else begin count <= count + 1; end end end endmodule

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. verilog frequency divider

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 . module div_by_3 ( input clk, rst_n, output reg

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 This minimizes skew

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.