原创 分频器的硬件描述语言设计vhdl转

2007-3-27 08:30 2112 5 5 分类: MCU/ 嵌入式
       在数字电路中,常需要对较高频率的时钟进行分频操作,得到较低频率的时钟信号。我们知道,在硬件
电路设计中时钟信号是最重要的信号之一。 下面我们介绍分频器的 VHDL 描述,在源代码中完成对时钟
信号 CLK 的 2 分频, 4 分频, 8 分频, 16 分频。 这也是最简单的分频电路,只需要一个计数器即
可。




LIBRARY IEEE;


USE IEEE.STD_LOGIC_1164.ALL;


USE IEEE.STD_LOGIC_ARITH.ALL;


USE IEEE.STD_LOGIC_UNSIGNED.ALL;




ENTITY clkdiv IS


PORT(clk : IN STD_LOGIC;


clk_div2 : OUT STD_LOGIC;


clk_div4 : OUT STD_LOGIC;


clk_div8 : OUT STD_LOGIC;


clk_div16 : OUT STD_LOGIC);


END clk_div;




ARCHITECTURE rtl OF clk_div IS


SIGNAL count : STD_LOGIC_VECTOR(3 DOWNTO 0);


BEGIN


PROCESS(clk)


BEGIN


IF (clk'event AND clk=' 1' ) THEN


IF(count=” 1111” ) THEN


Count <= (OTHERS =>' 0' );


ELSE


Count <= count +1;


END IF ;


END IF ;


END PROCESS;


clk_div2 <= count(0);


clk_div4 <= count(1);


clk_div8 <= count(2);


clk_div16 <= count(3);


END rtl;




对于分频倍数不是 2 的整数次幂的情况,我们只需要对源代码中的计数器进行一下计数控制就可以了,
如下面源代码描述一个对时钟信号进行 6 分频的分频器。




ENTITY clkdiv IS


PORT(clk : IN STD_LOGIC;


clk_div6 : OUT STD_LOGIC);


END clk_div;




ARCHITECTURE rtl OF clk_div IS


SIGNAL count : STD_LOGIC_VECTOR(1 DOWNTO 0);


SIGNAL clk_temp : STD_LOGIC;


BEGIN


PROCESS(clk)


BEGIN


IF (clk'event AND clk=' 1' ) THEN


IF(count=” 10” ) THEN


count <= (OTHERS =>' 0' );


clk_temp <=NOT clk_temp;


ELSE


count <= count +1;


END IF ;


END IF ;


END PROCESS;


clk_div6 <= clk_temp;


END rtl;




前面两个分频器的例子描述的将时钟信号进行分频,分频后得到的时钟信号的占空比为 1 : 1 。在进
行硬件设计的时候,往往要求得到一个占空比不是 1 : 1 的分频信号,这时仍采用计数器的方法来产
生占空比不是 1 : 1 的分频信号。下面源代码描述的是这样一个分频器:将输入的时钟信号进行 16
分频,分频信号的占空比为 1 : 15 ,也就是说,其中高电位的脉冲宽度为输入时钟信号的一个周期。


LIBRARY IEEE;


USE IEEE.STD_LOGIC_1164.ALL;


USE IEEE.STD_LOGIC_ARITH.ALL;


USE IEEE.STD_LOGIC_UNSIGNED.ALL;




ENTITY clkdiv IS


PORT(clk : IN STD_LOGIC;


clk_div16 : OUT STD_LOGIC);


END clk_div;




ARCHITECTURE rtl OF clk_div IS


SIGNAL count : STD_LOGIC_VECTOR(3 DOWNTO 0);


BEGIN


PROCESS(clk)


BEGIN


IF (clk'event AND clk=' 1' ) THEN


IF(count=” 1111” ) THEN


Count <= (OTHERS =>' 0' );


ELSE


Count <= count +1;


END IF ;


END IF ;


END PROCESS;




PROCESS(clk)


BEGIN


IF (clk'event AND clk=' 1' ) THEN


IF(count=” 1111” ) THEN


Clk_div16 <= ‘ 1' ;


ELSE


Clk_div <= ‘ 0' ;


END IF ;


END IF ;


END PROCESS;


END rtl;

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /2 下一条