基于FPGA的时钟信号分频方法

       

目录

1 偶数分频

1.1 分配系数是2的整数次幂的分频器

1.2 分频系数不是2的整数次幂

2 奇数分频

2.1 占空比不是1:1的奇数分频器

2.2 占空比为1:1的奇数分频器


在数字电路系统的设计中,分频器是一种应用十分广泛的电路,其功能就是对高频率的信号进行分频。本质上,分额电路是加法计数器的变种,其计数值由分频系数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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值