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

📄 int_div.vhd

📁 用VHDL实现交通灯的功能 很实用的 我认为比其他的的交通灯程序更好
💻 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 + -