📄 int_div.vhd
字号:
--// 任意整数分频模块 //
--//*******************************************************//
--//功能:对输入时钟clock进行F_DIV倍分频后输出clk_out。
--//其中F_DIV为分频系数,分频系数范围为1~2^n (n=F_DIV_WIDTH)
--//若要改变分频系数,改变参数F_DIV或F_DIV_WIDTH到相应范围即可。
--//若分频系数为偶数,则输出时钟占空比为50%;
--//若分频系数为奇数,则输出时钟占空比取决于输入时钟占空比和分
--//频系数(当输入为50%时,输出也是50%)。
--//--------------------------------------------------------
--//奇数倍分频:三倍分频的时序图如下所示。
--// 1 2 3 4 5 6
--//clock |--|__|--|__|--|__|--|__|--|__|--|__|
--//clk_p_r |_____|-----------|_____|-----------|
--//clk_n_r ---|_____|-----------|_____|---------
--//clk_out |________|--------|________|--------|
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.NUMERIC_BIT.ALL; --包含移位函数等.
ENTITY int_div IS
GENERIC
(
F_DIV:Integer:=48000000; --分频系数
F_DIV_WIDTH:Integer:=32 --分频计数器宽度
);
PORT(
clock : IN STD_LOGIC;
clock_out: OUT STD_LOGIC
);
END;
ARCHITECTURE one OF int_div IS
SIGNAL clk_p_r: STD_LOGIC; --上升沿输出时钟
SIGNAL clk_n_r: STD_LOGIC; --下降沿输出时钟
SIGNAL count_p: STD_LOGIC_VECTOR(f_div_width-1 DOWNTO 0);--上升沿脉冲计数器
SIGNAL count_n: STD_LOGIC_VECTOR(f_div_width-1 DOWNTO 0);--下降沿脉冲计数器
--SIGNAL f_div_width_r:STD_LOGIC_VECTOR(f_div_width-1 DOWNTO 0);
SIGNAL clock_out_r:STD_LOGIC;
SIGNAL full_div_p: STD_LOGIC; --上升沿计数满标志
SIGNAL half_div_p: STD_LOGIC; --上升沿计数半满标志
SIGNAL full_div_n: STD_LOGIC; --下降沿计数满标志
SIGNAL half_div_n: STD_LOGIC; --下降沿计数半满标志
BEGIN
clock_out<=clock_out_r;
--clock_out<=clock WHEN (F_DIV=1) ELSE ((clk_p_r='1' AND clk_n_r='1') WHEN (F_DIV(0)='1') clk_p_r);
-------------------------<<判断计数标志位置位与否.
full_div_p<='1' WHEN (count_p<F_DIV-1) ELSE '0';
half_div_p<='1' WHEN (count_p<(F_DIV/2 )-1) ELSE '0';
full_div_n<='1' WHEN (count_n<F_DIV -1) ELSE '0';
half_div_n<='1' WHEN (count_n<(F_DIV/2)-1) ELSE '0';
PROCESS(clock)--上升沿脉冲计数
--VARIABLE i:Integer RANGE 0 TO 31;
BEGIN
IF RISING_EDGE(clock)THEN
IF full_div_p='1' THEN count_p<=count_p+1;
IF (half_div_p='1') THEN clk_p_r<='0';
ELSE clk_p_r<='1';
END IF;
ELSE count_p<= (OTHERS =>'0');clk_p_r<= '0';
END IF;
END IF;
END PROCESS;
PROCESS(clock)--下降沿脉冲计数
BEGIN
IF FALLING_EDGE(clock)THEN
IF full_div_n='1' THEN count_n<=count_n+1;
IF half_div_n='1' THEN clk_n_r<='0';
ELSE clk_n_r<='1';
END IF;
ELSE count_n<=(OTHERS =>'0');
clk_n_r <= '0';
END IF;
END IF;
END PROCESS;
PROCESS(clock)
BEGIN
IF RISING_EDGE(clock)THEN
IF F_DIV= 1 THEN clock_out_r<=clock;
ELSE IF (F_DIV REM 2) =1 THEN clock_out_r<= clk_p_r AND clk_n_r;
ELSE clock_out_r<=clk_p_r;
END IF;
END IF;
END IF;
END PROCESS;
END;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -