打印
[matlab]

n.5分频的VHDL实现

[复制链接]
1492|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yun888|  楼主 | 2010-8-20 10:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
n.5分频的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  :  IN  STD_LOGIC;
       PREL  :  IN  STD_LOGIC_VECTOR(2 DOWNTO 0):="111";
       NCLK  :  BUFFER  STD_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分频时的波形图



相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

78

帖子

1

粉丝