目录
在数字电路系统的设计中,分频器是一种应用十分广泛的电路,其功能就是对高频率的信号进行分频。本质上,分额电路是加法计数器的变种,其计数值由分频系数N= fin/fo定,其输出不是一般计数器的计数结果,而是根据分频常数对输出信号的高、低电平进行控制。通常来说,分额器常用于对数字电路中的时钟信号进行分频,从而得到较低频率的时钟信号、选通信号、中断信号等。
1 偶数分频
所谓偶数分频器,就是指分频系数为偶数的分频器,即分频系数N=2n (n=1,2,.)。如果输入信号的频率为f,则分频器的输出信号频率为f/2n,其中n=1,2,.。
1.1 分配系数是2的整数次幂的分频器
对于分频系数是2的整数次幂的分频器来说,可以直接将计数器的相应位赋给分频器的输出信号。想要实现分频系数为2^N的分频器,则只需要实现一- 个模为N的计数器,然后把模N计数器的最高位直接赋给分频器的输出信号,即可得到所需要的分频信号。
以输入信号的2分频信号,4分频信号,8分频信号为例。
modulediv248( div2 ,div4 ,div8 ,clk);
output div2 ,div4 ,div8;
input clk;
reg div2 ,div4 ,div8;
reg[2:0] cent =2'b00;always@ (poedge elk)
begin
cnt<=cnt +1 ;
div2 <=cnt[0];
div4 <=cnt[1];
div8 <=cnt[2];
end
endmodule
1.2 分频系数不是2的整数次幂
对于分频系数不是2的整数次幂的分频器来说,仍然可以用计数器来实现,不过需要对计数器进行控制,下面以一个分频系数为12的分频器为例。
module div12(div12 ,clk)
output div12;
input clk;
reg div12;
reg[2:0] cnt;
always@ ( posedge clk)
begin
if(cnt==3'b101)
begin div12 <= ~ div12;cnt <=0;end
else
begin cnt <= cnt + 1;end
end
endmodule
2 奇数分频
所谓奇数分频器,就是指分频系数为奇数的分频器,即分频系数N=2n+1(n=1,2,3...)。如果输入信号的频率为f,则分频器的输出信号频率为f/(2n+1)。
2.1 占空比不是1:1的奇数分频器
占空比不是1:1的奇数分频器于占空比不是1:1的偶数分频器设计方法相同,均是通过对计数器的控制来实现。以下以一个分频系数为7,占空比为1:6的奇数分频器为例。
module div7(div7,clk);
ouput div7;
input clk;
reg div7;
reg[2:0] cnt = 0;
always(posedge clk)
begin
if(cnt==6)
begin
div7<=1;
cnt<=0;
end
else
begin
cnt<=cnt+1;
div7<=0;
end
end
endmodule
2.2 占空比为1:1的奇数分频器
占空比为1:1的奇数分频器需要在输人时钟信号的下降沿进行翻转。通常这种分额器的实现方法是:设计两个计数器,一个计数器采用时钟信号的上升沿触发,另一个计数器采用时钟信号的下降沿触发,两个计数器的模与分频器系数相同;然后根据这两个计数器的并行信号输出来决定两个相应的电平控制信号;最后对两个电平控制信号进行相应的逻辑运算即可完成分频信号的输出。以占空比为1:1的通用奇数分频器为例,分频系数为n=7。
module anyodd_ _div( clkdiv,clk ,cntl ,cn2 )
output clkdiv;
output[2:0] cntl ,cnt2;
input clk;
reg[2:0] cnt1=0,cnt2 =0;
reg clk_temp1, clk_temp2 ;
parameter n= 7;
always@ ( posedge clk)
begin
if(cnt1 == n-1)
begin cntl <=3'b000;end
else
begin cnt1 <=cntl +1;end
if(cntl == 3'b000)
begin clk_templ = 1 ;end
if(cntl ==(n-1)/2)
begin clk_templ =0;end
end
always@ ( negedge clk)
begin
if(cnt2==n-1)
begin cn12 <=3'b000 ;end
else
begin cnt2 <=cnt2 + 1 ;end
if( cnt2 ==3'b000)
begin clk_ temp2 = 1 ;end
if(cnt2 ==(n-1)/2)
begin clk_ temp2 =0;end
end
assign clkdiv = clk_templ|clk_temp2;
endmodule