📄 trafic.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 + -