⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clk_odd_divdier.vhd

📁 常用1、3、5及任意奇数分频器的VHDL代码实现(原创)
💻 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 + -