任意数分频(包括奇偶数和小数)的设计方法(含例子)
众所周知,分频器是 FPGA 设计中使用频率非常高的基本设计之一,尽管在目前大部分
设计中,广泛使用芯片厂家集成的锁相环资源,如 altera 的 PLL,Xilinx 的 DLL.来进行时
钟的分频,倍频以及相移。但是对于时钟要求不高的基本设计,通过语言进行时钟的分频相
移仍然非常流行,首先这种方法可以节省芯片内部的锁相环资源,再者,消耗不多的逻辑单
元就可以达到对时钟操作的目的。另一方面,通过语言设计进行时钟分频,可以看出设计者
对设计语言的理解程度。因此很多招聘单位在招聘时往往要求应聘者写一个分频器(比如奇
数分频)以考核应聘人员的设计水平和理解程度。下面讲讲对各种分频系数进行分频的方法:
第一 偶数倍分频
偶数倍分频应该是大家都比较熟悉的分频,通过计数器计数是完全可以实现的。
(1)如进行 N 倍偶数、占空比为 50%的分频,那么可以通过由待分频的时钟触发计数器
计数,当计数器从 0 计数到 N/2-1 时,输出时钟进行翻转,以此循环下去。
(2) 如进行 N 倍偶数、占空比为 1/N 的分频,那么可以通过由待分频的时钟触发计数器
计数,当计数器从 0 计数到 N-1 时,输出时钟进行翻转,并给计数器一个复位信号,使得下
一个时钟从零开始计数,以此循环下去。
下面是一个 2 分频的例子:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity division2 is
port (clk : in std_logic;
out1: out std_logic);
end division2;
architecture Behavioral of division2 is
signal outclk : std_logic := '0';
begin
out1 <= outclk;
process(clk)
begin
if clk'event and clk = '1' then
outclk <= not outclk;--每到时钟上升沿就反转一次
end if;
end process;
end Behavioral;
下图为仿真波形: