📄 clk_odd_divdier.vhd
字号:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
entity clk_odd_divdier is
generic(N:integer:=7);--定义任意奇数N分频
port
(
clk_in: in std_logic;
clk_div_3: out std_logic; --3分频输出
clk_div_5: out std_logic; --5分频输出
clk_div_7: out std_logic; --7分频输出
clk_div_N: out std_logic --任意奇数N分频输出
);
end clk_odd_divdier;
architecture clk_odd_divdier_body of clk_odd_divdier is
signal temp3_up,temp3_down:integer;
signal temp5_up,temp5_down:integer;
signal temp7_up,temp7_down:integer;
signal tempN_up,tempN_down:integer;
signal clk_div_3_up,clk_div_3_down:std_logic;
signal clk_div_5_up,clk_div_5_down:std_logic;
signal clk_div_7_up,clk_div_7_down:std_logic;
signal clk_div_N_up,clk_div_N_down:std_logic;
begin
--*******************************************
--实现占空比为50%奇数N分频的一般通用方法(!!!):
--对待分频时钟的上升沿和下降沿分别进行如下面进程中的N分频
--然后将两个分频所得的时钟信号相加(or),这2个信号虽然已经是N分频,但是占空比不是50%
--就可以得到占空比为50%的奇数N分频时钟信号
--最终信号用数据流描述得到:
clk_div_3<=clk_div_3_up or clk_div_3_down;
clk_div_5<=clk_div_5_up or clk_div_5_down;
clk_div_7<=clk_div_7_up or clk_div_7_down;
clk_div_N<=clk_div_N_up or clk_div_N_down;
--********************************************
-------------占空比50%的三分频-----------------
div_3_up:process(clk_in)--上升沿
begin
if clk_in='1' and clk_in'event then
if temp3_up<2 then --实现奇数N分频时,此处取N-1
temp3_up<=temp3_up+1;
else
temp3_up<=0;
end if;
if temp3_up<1 then --实现奇数N分频时,此处取(N-1)/2
clk_div_3_up<='1';
else
clk_div_3_up<='0';
end if;
end if;
end process div_3_up;
div_3_down:process(clk_in)--下降沿
begin
if clk_in='0' and clk_in'event then
if temp3_down<2 then --实现奇数N分频时,此处取N-1
temp3_down<=temp3_down+1;
else
temp3_down<=0;
end if;
if temp3_down<1 then --实现奇数N分频时,此处取(N-1)/2
clk_div_3_down<='1';
else
clk_div_3_down<='0';
end if;
end if;
end process div_3_down;
------------------------------------------------
-------------占空比50%的五分频------------------
div_5_up:process(clk_in)--上升沿
begin
if clk_in='1' and clk_in'event then
if temp5_up<4 then --实现奇数N分频时,此处取N-1
temp5_up<=temp5_up+1;
else
temp5_up<=0;
end if;
if temp5_up<2 then --实现奇数N分频时,此处取(N-1)/2
clk_div_5_up<='1';
else
clk_div_5_up<='0';
end if;
end if;
end process div_5_up;
div_5_down:process(clk_in)--下降沿
begin
if clk_in='0' and clk_in'event then
if temp5_down<4 then --实现奇数N分频时,此处取N-1
temp5_down<=temp5_down+1;
else
temp5_down<=0;
end if;
if temp5_down<2 then --实现奇数N分频时,此处取(N-1)/2
clk_div_5_down<='1';
else
clk_div_5_down<='0';
end if;
end if;
end process div_5_down;
------------------------------------------------
-------------占空比50%的七分频------------------
div_7_up:process(clk_in)--上升沿
begin
if clk_in='1' and clk_in'event then
if temp7_up<6 then --实现奇数N分频时,此处取N-1
temp7_up<=temp7_up+1;
else
temp7_up<=0;
end if;
if temp7_up<3 then --实现奇数N分频时,此处取(N-1)/2
clk_div_7_up<='1';
else
clk_div_7_up<='0';
end if;
end if;
end process div_7_up;
div_7_down:process(clk_in)--下降沿
begin
if clk_in='0' and clk_in'event then
if temp7_down<6 then --实现奇数N分频时,此处取N-1
temp7_down<=temp7_down+1;
else
temp7_down<=0;
end if;
if temp7_down<3 then --实现奇数N分频时,此处取(N-1)/2
clk_div_7_down<='1';
else
clk_div_7_down<='0';
end if;
end if;
end process div_7_down;
------------------------------------------------
-------------占空比50%的任意奇数N分频------------------
div_N_up:process(clk_in)--上升沿
begin
if clk_in='1' and clk_in'event then
if tempN_up<N-1 then --实现奇数N分频时,此处取N-1
tempN_up<=tempN_up+1;
else
tempN_up<=0;
end if;
if tempN_up<(N-1)/2 then --实现奇数N分频时,此处取(N-1)/2
clk_div_N_up<='1';
else
clk_div_N_up<='0';
end if;
end if;
end process div_N_up;
div_N_down:process(clk_in)--下降沿
begin
if clk_in='0' and clk_in'event then
if tempN_down<N-1 then --实现奇数N分频时,此处取N-1
tempN_down<=tempN_down+1;
else
tempN_down<=0;
end if;
if tempN_down<(N-1)/2 then --实现奇数N分频时,此处取(N-1)/2
clk_div_N_down<='1';
else
clk_div_N_down<='0';
end if;
end if;
end process div_N_down;
------------------------------------------------
end clk_odd_divdier_body;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -