N.5分频的VHDL实现
2012-07-22
标签: 分频 VHDL

这种分频需要对输入时钟进行操作。基本的设计思想:对于进行n+0.5分频,首先进行模n的计数,在计数到n-1时,输出时钟赋为‘1’,回到计数0时,又赋为0,因此,可以知道,当计数值为n-1时,输出时钟才为1,因此,只要保持计数值n-1 为半个输入时钟周期,即实现了n+0.5分频时钟,因此保持n-1为半个时钟周期即是一个难点。从中可以发现,因为计数器是通过时钟上升沿计数,因此可以在计数为n-1时对计数触发时钟进行翻转,那么时钟的下降沿变成了上升沿。即在计数值为n-1期间的时钟下降沿变成了上升沿,则计数值n-1只保持了半个时钟周期,由于时钟翻转下降沿变成上升沿,因此计数值变为0。因此,每产生一个n+0.5分频时钟的周期,触发时钟都是要翻转一次。

以下是代码:

library IEEE;

use IEEE.STD_LOGIC_1164.ALL

use IEEE.STD_LOGIC_ARITH.ALL

use IEEE.STD_LOGIC_UNSIGNED.ALL

--Uncomment the following lines to use the declarations that are

--provided for instantiating Xilinx primitive components

--library UNISIM

--use UNISIM.VComponents.all;

entity nhalffenpin is

PORT (

CLK:INSTD_LOGIC;

PREL:INSTD_LOGIC_VECTOR(2 DOWNTO 0):="111";

NCLK:BUFFERSTD_LOGIC

) ;

end nhalffenpin;v;p

architecture Behavioral of nhalffenpin is

SIGNAL COUNTER : STD_LOGIC_VECTOR(2 DOWNTO 0):="000"

SIGNAL SIG_CLK : STD_LOGIC ;

SIGNAL LCLK: STD_LOGIC;

SIGNAL PCLK: STD_LOGIC:='1';

begin

LCLK <= CLK XOR PCLK;

PROCESS(LCLK,PREL)

BEGIN

IF RISING_EDGE(LCLK) THEN

IF COUNTER = "000" THEN

COUNTER <= PREL;

ELSE5

COUNTER <= COUNTER - 1;

END IF;

END IF;

END PROCESS;

PROCESS(COUNTER,LCLK)

BEGIN

IF RISING_EDGE(LCLK) THEN

IF COUNTER = "001" THEN

SIG_CLK <= '1';

ELSEX|

SIG_CLK <= '0';

END IF;

END IF;

END PROCESS;

PROCESS(SIG_CLK)

BEGIN

IF RISING_EDGE(SIG_CLK)THEN

PCLK <= NOT PCLK;

END IF;

END PROCESS;

NCLK <= SIG_CLK;

end Behavioral;

这是3.5分频时的波形图

可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号