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

📄 trafic.vhd

📁 使用vhdl语言编写的交通灯控制程序
💻 VHD
字号:
LIBRARY IEEE;                      --  使用模式5
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY TRAFIC IS
	PORT(CLK,SIGNAL_M,SIGNAL_F : IN STD_LOGIC;
	       RM,YM,GM,RF,YF,GF : OUT STD_LOGIC;
		   OUT_H : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
		   OUT_L : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));					
END ;
ARCHITECTURE ONE OF TRAFIC IS
 	TYPE STATES IS(A,B,C,D);
	SIGNAL CUR_STATE : STATES;
	SIGNAL DIV_CLK : STD_LOGIC; --分频后的秒脉冲
	SIGNAL NUM_COUNT : STD_LOGIC_VECTOR(27 DOWNTO 0);--用来分频
BEGIN
DIV : PROCESS(CLK) --分频模块
BEGIN
   IF CLK'EVENT AND CLK='1' THEN
		IF(NUM_COUNT >=64) THEN  --根据晶振频率修改
			NUM_COUNT <=(OTHERS=>'0');
			DIV_CLK <= NOT DIV_CLK;
		ELSE
		NUM_COUNT <= NUM_COUNT + 1;
		END IF;
	END IF;
END PROCESS;

COUNT : PROCESS(DIV_CLK) --计数模块
		  VARIABLE S : INTEGER RANGE 0 TO 19; --秒计数器
		  VARIABLE CLR ,EN : STD_LOGIC;
		  VARIABLE TEMP : INTEGER RANGE 0 TO 20;
		  VARIABLE TEMP1 : STD_LOGIC_VECTOR(7 DOWNTO 0);
		BEGIN
		IF DIV_CLK'EVENT AND DIV_CLK='1' THEN 
			IF CLR = '1' THEN S := 0;
			   ELSIF EN = '0' THEN S := S;  --禁止计数
			ELSE
			 S := S + 1;
			END IF;
	CASE CUR_STATE IS
		WHEN A|C=> 
		IF(((SIGNAL_M AND SIGNAL_F)='1') OR (((NOT SIGNAL_F) AND (NOT SIGNAL_M))='1')) THEN
		    TEMP := 20 - S;
			TEMP1 := CONV_STD_LOGIC_VECTOR(TEMP,8);
			IF TEMP = 20 THEN
				OUT_H<="0010";
				OUT_L<="0000";
			ELSIF TEMP>=10 THEN TEMP :=TEMP + 6;
					TEMP1 := CONV_STD_LOGIC_VECTOR(TEMP,8);	
					OUT_H <="0001";
					OUT_L <=TEMP1(3 DOWNTO 0);
			ELSE 
			OUT_H <="0000";
			OUT_L <=TEMP1(3 DOWNTO 0);
			END IF;
			ELSE
			S:=0;
			TEMP :=0;
			OUT_H<="0000";
			OUT_L<="0000";
			END IF;
		WHEN B|D=> 
				TEMP :=5-S;
				TEMP1 := CONV_STD_LOGIC_VECTOR(TEMP,8);	
				OUT_H <="0000";
				OUT_L <=TEMP1(3 DOWNTO 0);
	END CASE;
     	CASE CUR_STATE IS    --M 方向绿灯亮F方向红灯亮
		 WHEN A => RM <='0';YM <='0'; GM <='1'; RF <= '1';YF <= '0'; GF <= '0';	
			IF (SIGNAL_M AND SIGNAL_F)='1' THEN 
				IF S=19 THEN   --在两个方向都有车的情况下计时到19秒时...
					CUR_STATE <=B; CLR :='1';EN :='0'; --清零停止计数
				ELSE
					CUR_STATE <=A; CLR :='0';EN :='1'; 
			    END IF;
			ELSIF (SIGNAL_F AND (NOT SIGNAL_M))='1' THEN --只有F方向有车
				CUR_STATE <=B; CLR :='1';EN :='0';
			ELSIF ((NOT SIGNAL_F) AND (NOT SIGNAL_M))='1' THEN --两个方向都没有车
				IF S=19 THEN  
					CUR_STATE <=B; CLR :='1';EN :='0'; 
				ELSE
					CUR_STATE <=A; CLR :='0';EN :='1'; 
			    END IF;	
			ELSE
			CUR_STATE <=A;CLR :='0';EN :='1';
			END IF;
		WHEN B => RM <='0';YM <='1'; GM <='0'; RF <= '1';YF <= '0'; GF <= '0';	
			  IF S = 5 THEN     --M 方向黄灯亮F方向红灯亮
					CUR_STATE <=C; CLR :='1';EN :='0';
			  ELSE 
			    CUR_STATE <=B; CLR :='0';EN :='1';
			   END IF;
		WHEN C => RM <='1';YM <='0'; GM <='0'; RF <= '0';YF <= '0'; GF <= '1';
				IF(SIGNAL_M AND  SIGNAL_F)='1' THEN 
					IF S=19 THEN    --M 方向红灯亮F方向绿灯亮
					CUR_STATE <=D; CLR :='1';EN :='0';
					ELSE
					CUR_STATE <=C; CLR :='0';EN :='1';
					END IF;
				ELSIF (SIGNAL_M AND (NOT SIGNAL_F))='1'  THEN
					CUR_STATE <=D; CLR :='1';EN :='0';
				ELSIF ((NOT SIGNAL_F) AND (NOT SIGNAL_M))='1' THEN 
				  IF S=19 THEN  
					CUR_STATE <=D; CLR :='1';EN :='0'; 
				 ELSE
					CUR_STATE <=C; CLR :='0';EN :='1'; 
			    END IF;	
				ELSE
				CUR_STATE <=C; CLR :='0';EN :='1';
				END IF;
		WHEN D => RM <='1';YM <='0'; GM <='0'; RF <= '0';YF <= '1'; GF <= '0';
				IF S = 5 THEN       --M 方向红灯亮F方向黄灯亮
					CUR_STATE <=A; CLR :='1';EN :='0';
			  ELSE 
			    CUR_STATE <=D; CLR :='0';EN :='1';
			   END IF;
		END CASE;
		END IF;
		END PROCESS;
		END ONE;
				
		
		
		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -