|
代码有点小问题,更改版为:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
--整数分频器
entity DIVN is
port(
Clk,Rst :in std_logic;--输入时钟和复位信号
Data :in std_logic_vector(7 downto 0);--分频倍数输入
ClkOut ut std_logic--分频时钟输出
);
end DIVN;
architecture Behavior of DIVN is
signal Mid : std_logic_vector(7 downto 0);--分频倍数的一半,即偶数为N/2,奇数为(N-1)/2
signal ClkUp,ClkDown : std_logic;--上升沿和下降沿分频信号
begin
Mid<= '0'&Data(7 downto 1);--分频倍数的一半,相当于除2
process(Clk,Rst)--上升沿分频进程
variable Cnt1 : std_logic_vector(7 downto 0);--内部计数变量
begin
if(Rst='1')then--复位
Cnt1:=(others=>'0');
ClkUp<='0';
elsif(Clk'event and Clk='1')then--上升沿
if(Cnt1<Mid)then--前半个分频周期
ClkUp<='1';
else
ClkUp<='0';--后半个
end if;
if(Cnt1=conv_integer(Data)-1)then
Cnt1:=(others=>'0');--计满清0
else
Cnt1:=Cnt1+1;--未计满加1
end if;
end if;
end process;
process(Clk,Rst)--下降沿分频进程
variable Cnt2 : std_logic_vector(7 downto 0);--内部计数变量
begin
if(Rst='1')then--复位
Cnt2:=(others=>'0');
ClkDown<='0';
elsif(Clk'event and Clk='0')then--下降沿
if(Cnt2<Mid)then--前半个分频周期
ClkDown<='1';
else
ClkDown<='0';--后半个
end if;
if(Cnt2=conv_integer(Data)-1)then
Cnt2:=(others=>'0');--计满清0
else
Cnt2:=Cnt2+1;--未计满加1
end if;
end if;
end process;
ClkOut <= ClkUp when Data(0)='0' else--偶数时直接输出上升沿分频信号
clk when Data=1 else--分频系数为1时直接输出时钟信号
ClkUp or ClkDown;--计数分频时为保证50%占空比需上升下降沿分频信号进行或运算
end Behavior; |
|