各种分频电路
偶数分频:
偶数分频电路比较简单,需要使用计数器即可实现50%占空比的分频电路。
下面是一个N分频的偶数分频电路Verilog代码:
module N_bit_even_divider (
input i_clk,
input rst_n,
output reg o_clk
);
parameter N =
N_bit_even; // bit_of_N: N_bit_even的二进制位宽
reg [(bit_of_N - 1):0] cnt;
// 计数器单元
// 上升沿计数: 0~(N-1)
always @ (posedge i_clk, negedge rst_n)
begin
if (!rst_n)
cnt <= 0;
else
begin
if (cnt == N-1)
cnt <= 0;
else
cnt <= cnt + 1;
end
end
// 生成上升沿时钟
// 0~(N/2-1) -> 1; (N/2)~(N-1) -> 0
always @ (posedge i_clk, negedge rst_n)
begin
if (!rst_n)
o_clk <= 0;
else
begin
if (cnt <= (N/2-1))
o_clk <= 1;
else
o_clk <= 0;
end
end
endmodule
奇数分频:
非50%占空比的N倍奇数分频也可以简单的通过一个模N计数器来实现,如3分频电路,通过模三计数,在1和2时刻输出时钟进行翻转就可以实现占空比为1/3,2/3的分频电路。它的verilog代码实现与上面基本相同,就不在多说了。
50%占空比的N倍奇数分频。先进行上升沿触发进行模N计数,计数到(N-1)/2时进行输出时钟翻转,然后计数到N-1再次进行翻转得到一个占空比非50%的奇数n分频时钟;同时进行下降沿触发的模N计数,同样到(N-1)/2时进行输出时钟翻转,计数到N-1再次进行翻转,生成占空比非50%的奇数n分频时钟。两个占空比非50%的n分频时钟相或运算,即得到占空比为50%的奇数n分频时钟。
下面是一个N分频的奇数分频电路Verilog代码:
module div(clr,clk,clkout);
input clr,clk;
output clkout;
reg clkreg1,clkreg2;
parameter n=5;
reg[n:0] counter1,counter2;
assign clkout=clkreg1||clkreg2;
always @(posedge clk)
if(clr==1)
begin
clkreg1=0;
counter1=0;
end
else
begin
if(counter1==n-1)
begin
counter1=0;
clkreg1=~clkreg1;
end
else if(counter1==(n-1)/2)
begin
counter1=counter1+1;
clkreg1=~clkreg1;
end
else
begin
counter1=counter1+1;
end
end
always @(negedge clk)
if(clr==1)
begin
clkreg2=0;
counter2=0;
end
else
begin
if(counter2==n-1)
begin
counter2=0;
clkreg2=~clkreg2;
end
else if(counter2==(n-1)/2)
begin
counter2=counter2+1;
clkreg2=~clkreg2;
end
else
begin
counter2=counter2+1;
end
end
endmodule
半整数分频:
分频系数为N-0.5的分频器电路可由一个异或门、一个模N计数器和一个二分频器组成。在实现时,模N计数器可设计成带预置的计数器,这样可以实现任意分频系数为N-0.5的分频器。下图给出了通用半整数分频器的电路组成。
下面是一个4.5分频电路的Verilog代码:
module div45(clk, rstn, clkout);
input clk;
input rstn;
output clkout;
reg clkout;
reg clkout1;
wire clk2;
integer cnt;
xor xor1(clk2,clk,clkout1);
always@(posedge clkout or negedge rstn)
if(~rstn)
begin
clkout1<=1'b0;
end
else
clkout1<= ~clkout1;
always@(posedge clk2 or negedge rstn)
if(~rstn)
begin
cnt<=0;
clkout<=1'b0;
end
else if(cnt==4)
begin
cnt<=0;
clkout<=1'b1;
end
else
begin
cnt<=cnt+1;
clkout<=1'b0;
end
endmodule
小数分频:
小数分频的基本原理是采用脉冲吞吐计数器和锁相环技术先设计两个不同分频比的整数分频器,然后通过控制单位时间内两种分频比出现的不同次数来获得所需要的小数分频值。如设计一个分频系数为10.1的分频器时,可以将分频器设计成9次10分频,1次11分频,这样总的分频值为:
F=(9×10+1×11)/(9+1)=10.1
从这种实现方法的特点可以看出,由于分频器的分频值不断改变,因此分频后得到的信号抖动较大