📄 trafficlight.vhd
字号:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
ENTITY TrafficLight IS
PORT ( Reset : IN STD_LOGIC;
Sensor : IN STD_LOGIC;
Clk : IN STD_LOGIC;
Numeral : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
Light : OUT STD_LOGIC_VECTOR(5 DOWNTO 0)
);
END TrafficLight ;
ARCHITECTURE Rtl OF TrafficLight IS
TYPE TrafficState IS (mgcr, mycr, mrcg, mrcy);
SIGNAL State : TrafficState ;
SIGNAL Count0 : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL Count1 : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL MaxCount0 : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL MaxCount1 : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL Load : STD_LOGIC ;
SIGNAL Borrow : STD_LOGIC ;
BEGIN
CounterL : PROCESS(Reset,Load,Clk,Count0,Count1,MaxCount0,MaxCount1)
BEGIN
IF Reset = '1' OR (Load = '1' AND NOT((Count0 = MaxCount0) AND (Count1 = MaxCount1))) THEN Count0 <= MaxCount0;
ELSIF Clk'EVENT AND Clk = '1' THEN
IF NOT(Count1 & Count0 = "0000001" AND State = mgcr) THEN
IF Count0 = "0000" THEN Count0 <= "1001";
ELSE Count0 <= Count0 - 1;
END IF;
END IF;
END IF;
END PROCESS CounterL;
Borrow <= '1' WHEN Count0 = "0000" ELSE '0';
CounterH : PROCESS(Reset,Load,Clk,Count0,Count1,MaxCount0,MaxCount1)
BEGIN
IF Reset = '1' OR (Load = '1' AND NOT((Count0 = MaxCount0) AND (Count1 = MaxCount1))) THEN Count1 <= MaxCount1;
ELSIF Clk'EVENT AND Clk = '1' THEN
IF NOT(Count1 & Count0 = "0000001" AND State = mgcr) THEN
IF Borrow = '1' THEN Count1 <= Count1 - 1; END IF;
END IF;
END IF;
END PROCESS CounterH;
StateTransition : PROCESS(Reset,Clk,Load,Count0,Count1)
BEGIN
IF Reset = '1' THEN State <= mgcr;Load <= '0';
ELSIF clk'EVENT AND clk = '1' THEN
CASE State IS
WHEN mgcr => IF Count1 & Count0 = "0000001" AND Sensor = '1' THEN State <= mycr;Load <= '1';
ELSE Load <= '0';
END IF;
WHEN mycr => IF Count1 & Count0 = "0000001" THEN State <= mrcg;Load <= '1';
ELSE Load <= '0';
END IF;
WHEN mrcg => IF Count1 & Count0 = "0000001" OR Sensor = '0' THEN State <= mrcy;Load <= '1';
ELSE Load <= '0';
END IF;
WHEN mrcy => IF Count1 & Count0 = "0000001" THEN State <= mgcr;Load <= '1';
ELSE Load <= '0';
END IF;
WHEN OTHERS => NULL;
END CASE;
END IF;
END PROCESS StateTransition;
Numeral <= Count1 & Count0;
WITH State SELECT Light <= "011110" WHEN mgcr,
"101110" WHEN mycr,
"110011" WHEN mrcg,
"110101" WHEN mrcy;
WITH State SELECT MaxCount0 <= "0000" WHEN mgcr,
"0100" WHEN mycr,
"0000" WHEN mrcg,
"0100" WHEN mrcy;
WITH State SELECT MaxCount1 <= "0110" WHEN mgcr,
"0000" WHEN mycr,
"0010" WHEN mrcg,
"0000" WHEN mrcy;
END ARCHITECTURE Rtl;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -