偶分频:对于分频系数为10的分频器,本例的输入时钟系统50M时钟,输出为十分频时钟。设置一个3位的计数器,当计时寄存器到4(10/2-1)时,将输出分频信号取反即可得到10分频的输出。
module(clk,clk_out);
input clk;//输入时钟频率
output clk_out;//输出输出时钟频率
reg clk_out;
reg [2:0] cnt;//计数器,假设分频系数为10
always @(clk);
if(cnt = 3'b1000)begin
clk_out <= ~clk_out;
cnt <= 'b0;
end
else begin
cnt <= cnt + 'b1;
end
奇分频:实现奇数分频原理是分别用上升沿计数到N/2+1,时钟进行翻转,再计数到N/2输出out_clk1,再用下降沿计数到N/2+1,时钟进行翻转,再计数到N/2输出out_clk2,将out_clk1和out_clk2相或即可。可以通过修改N的值和计数器的位宽来实现其他奇数分频。
always @(posedge clk or negedge rst_n)
//上升沿输出out_clk1
begin
if(!rst_n)
begin
out_clk1<=0;
cnt_1<=0;
end
else
begin
if(out_clk1 == 0)
begin
if(cnt_1 == N/2+1)
begin
out_clk1<=~out_clk1;
cnt_1 <= 0;
end
else
cnt_1 <= cnt_1+1;
end
else
if(cnt_1 == N/2)
begin
out_clk1<=~out_clk1;
cnt_1 <= 0;
end
else
cnt_1 <= cnt_1+1;
end
end
always @(negedge clk or negedge rst_n)
//下降沿输出out_clk2
begin
if(!rst_n)
begin
out_clk2 <= 0;
cnt_2 <= 0;
end
else
begin
if(out_clk2 == 0)
begin
if(cnt_2 == N/2+1)
begin
out_clk2 <= ~out_clk2;
cnt_2 <= 0;
end
else
cnt_2 <= cnt_2+1;
end
else
if(cnt_2 == N/2)
begin
out_clk2 <= ~out_clk2;
cnt_2 <= 0;
end
else
cnt_2 <= cnt_2+1;
end
end
assign out_clk = out_clk1 | out_clk2;