整数(1~255)模值占空比50%分频VHDL
代码内有详细注释 学习中!support ! 终于有人回帖了,O(∩_∩)O哈哈~ 代码有点小问题,更改版为:library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
--整数分频器
entity DIVN is
port(
Clk,Rst :instd_logic;--输入时钟和复位信号
Data :instd_logic_vector(7 downto 0);--分频倍数输入
ClkOut :out 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; 整数(1~255)模值占空比50%分频VHDL ~~~~~~~~~~~~~~~~~~~~~~~~~~ 整数(1~255)模值占空比50%分频VHDL 整数(1~255)模值占空比50%分频VHDL
http://www.fpgaw.com/forum.php?mod=viewthread&tid=2279&fromuid=59831
(出处: fpga论坛|fpga设计论坛)
整数(1~255)模值占空比50%分频VHDL
页:
[1]