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

📄 trafficlight.vhd

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