一般的介绍VHDL语言的书在对分频器进行举例描述的时候,都是举得偶数倍分频的例子,因为那相对来说比较简单(只需要设置一个中间信号变量,然后在分频系数到达的时候对中间信号进行取反即可所需的偶数倍分频器),但是很少有介绍奇数倍分频器的,因为这需要对分频系数进行一定的处理,相信大家看过之后,会有耳目一新的感觉。
这里运用的方法是“错位异或法”。由于要进行奇分频而且占空比为50%,那么在一个周期内就必须有一个是时钟上升沿或下降沿是在系统时钟的下降沿处,即必须得有一个进程对下降沿敏感,否则就不可能使占空比为50%。这里我们设置两个中间信号(temp1,temp2)进行异或,当然得使每个中间信号的频率为所需要得到的分频频率,这样对两个信号进行异或的时候才不会使频率变化。具体实现如下:这里计数器的值从0到n-1(n为所需要的分频系数,为奇数保证是奇分频器),而要使得到50%的占空比,必须得使两个中间信号重叠的部分为整个周期的50%,由于是奇分频,这样就必须得其中一个对原始时钟上升沿敏感,而另一个对下降沿敏感。这样便使两个中间信号在上升沿到来的时刻相差1.5个系统时钟,
故只需再对其中一个中间信号上升沿提前(n-1)/2个时钟周期即可,这样重叠部分即可达到50%占空比。具体实现如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity odd_pide is
generic(n:integer:=7);
port(
clkin: in std_logic;
clkout: out std_logic;
temp1,temp2 : inout std_logic --此处设置为inout端口是为了--仿真方便
);
end entity;
architecture odd of odd_pide is
signal c: integer range 0 to n-1;
begin
process(clkin)
begin
if falling_edge(clkin) then
if c=(n-1)/2 then
temp1<=not temp1;
end if;
end if;
if rising_edge(clkin) then
if c=n-1 then
temp2<=not temp2;
c<=0;
else
c<=c+1;
end if;
end if;
end process;
clkout<=temp1 xor temp2;
end architecture;
仿真结果:
图1、3分频器
图2、5分频
图3、7分频
有以上结果可知得到了所需的分频器。