奇偶分频器VHDL
偶数分频器
二分频
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY oushufenpin IS
PORT(clkin:IN STD_LOGIC; ----时钟输入信号
clkout:OUT STD_LOGIC); ----时钟输出信号
END oushufenpin;
ARCHITECTURE fen OF oushufenpin IS
SIGNAL data:INTEGER RANGE 0 TO 10;
SIGNAL q:STD_LOGIC;
BEGIN
PROCESS(clkin)
BEGIN
IF(clkin’EVENT AND clkin=‘1’)THEN ----上升沿触发
IF(data=0)THEN --data=0,1,2,3…
data<=0;
q<=NOT q;
ELSE
data<=data+1;
END IF;
END IF;
clkout<=q;
END PROCESS;
END fen;
计算公式:
data=F/(2f)-1
F 固定频率;f 分频后频率;n=F/f=2(data+1) 分频数
以二分频为例仿真
此时data=0
奇数分频器
七分频
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity fdiv3 is
port( clk,reset : in std_logic; ----reset复位键
clkout ,q1,q2 : out std_logic);
end fdiv3;
architecture behave of fdiv3 is
signal s1,s2 : std_logic;
signal cnt : integer range 0 to 6;----cnt计数器
begin
q1<=s1;
q2<=s2; ----q1,q2即s1,s2的波形显示
P1: process(clk,reset)
begin
if reset=‘1’ then
cnt<=0;
elsif clk’event and clk=‘1’ then
if cnt=6 then
cnt<=0;
else
cnt<=cnt+1;
end if;
end if;
end process;
P2: process(clk,reset)
begin
if reset=‘1’ then
s1<=‘1’;
elsif clk’event and clk=‘1’ then
if cnt=0 then
s1<=not s1;
else
s1<=s1;
end if;
end if;
end process;
P3: process(clk,reset)
begin
if reset=‘1’ then
s2<=‘1’;
elsif clk’event and clk=‘0’ then ----下降沿触发
if cnt=4 then
s2<=not s2;
else
s2<=s2;
end if;
end if;
end process;
clkout<= s1 xor s2; -----s1,s2异或
end behave;
对于任意奇数(2n-1)的50%的占空比分频,则计数器cnt的模值为(2n-1),假设信号1为上升沿触发,在cnt=0时跳变,则信号2为下降沿触发,在cnt=n时跳变。这样就保持信号1和信号2间间隔的周期,在2(2n-1)的周期内为两个后期,实现了(2n-1)的50%的占空比分频。
若以7分频为例:
计数器的模值为7(0,1,2,3,4,5,6)
信号2在cnt=4时跳变