偶数分频器的Verilog实现
核心思想
对于占空比为50%、分频系数为N的偶数分频,其核心思想是使用计数范围为[0, (N/2)-1]的计数器,每当计数器计到最大值时输出时钟翻转一次,其余时间保持不变。
Verilog实现
module clk_div_even #
( parameter DIV_NUM = 8 ) // 这里设置了可调整的分频系数
( input clk_in ,
input rst_n ,
output reg clk_out
);
parameter CNT_BITS = $clog2(DIV_NUM) - 1 ; // 求分频系数相应计数器的位数,$clog2(N)是系统函数,表示对N求2的对数
parameter CNT_MAX = (DIV_NUM >> 1) - 1 ; // 设置计数器的最大值,即 N/2-1
reg [CNT_BITS: 0] cnt ;
always @ (posedge clk_in or negedge rst_n) begin
if (~rst_n)
cnt <= 0;
else
cnt <= (cnt == CNT_MAX)? 0: (cnt + 1'b1) ;
end
always @ (posedge clk_in or negedge rst_n) begin
if (~rst_n)
clk_out <= 0 ;
else
clk_out <= (cnt == CNT_MAX)? ~clk_out: clk_out ; // 每当计数器计到最大值时输出时钟翻转一次
end
endmodule
仿真结果
仿真在HDLBits的在线调试平台Iverilog上进行,注意要添加 `probe(rst_n); 语句才能观察到信号。
testbench
module top_module ();
reg clk_in;
reg rst_n;
wire clk_out;
always #5 clk_in = ~clk_in; // Create clock with