| |
在数字电路中,分频器是一种基本电路。分频器通常用来对某个给定频率进行分频,得到所需的频率。整数分频器的实现非常简单,可采用标准的计数器,也可采用可编程逻辑器件设计实现。在某些场合下,时钟源与所需的频率不成整数倍关系,此时可采用小数分频器进行分频。
例如:要实现分频系数为2.5的分频器,可采用以下方法:设计一个模为3的计数器,再设计一个脉冲扣除电路,加在模3计数器输出之后,每来两个脉冲就扣除一个脉冲,就可以得到分频系数为2.5的小数分频器。采用类似方法,可以设计分频系数为任意半整数的分频器。
小数分频的基本原理是:采用脉冲吞吐计数,设计两个不同分频比的整数分频器,通过控制单位时间内两种分频比出现的次数,从而获得所需的小数分频值。例如,设计一个分频系数为10.1的分频器,可以将分频器设计成9次10分频,1次11分频,这样总的分频值为:
(9×10+1×11)/(9+1)=10.1
从这种实现方法的特点可以看出,由于分频器的分频值在不断改变,因此分频后得到的信号抖动大。
当分频系数为N-0.5(N为整数)时,可控制扣除脉冲的时间,使输出为一个稳定的脉冲频率,而不是一次N分频,一次N-1分频。
设需要设计一个分频系数为N-0.5的分频器,其电路可由一个模N计数器、二分频器和一个异或门组成,如图1所示:
图1:小数分频原理图
在实现时,模N计数器可设计成带预置的计数器,这样就可以实现任意分频系数为N-0.5的分频器。
VHDL程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity fen25 is
port
(clk:in std_logic;
qout1:buffer std_logic;
qout2:buffer std_logic;
clkout:out std_logic
);
end fen25;
architecture behave of fen25 is
constant counter_len:integer:=3; --模参数设置
signal clk_tem:std_logic;
begin
qout1<=clk xor qout2; --异或
process(qout1) --模为3的计数器
variable cnt:integer range 0 to counter_len-1;
begin
if qout1'event and qout1='1' then
if cnt=counter_len-1 then
cnt:=0;
clk_tem<='1';
clkout<='1';
else
cnt:=cnt+1;
clk_tem<='0';
clkout<='0';
end if;
end if;
end process;
process(clk_tem) --二分频器
variable tem:std_logic;
begin
if clk_tem'event and clk_tem='1' then
tem:=not tem;
end if;
qout2<=tem;
end process;
end behave;
图2:生成的图形文件
图3:仿真波形