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

📄 trafficlight.txt

📁 系统设置一个两位BCD码倒计时计数器(计数脉冲1HZ)
💻 TXT
字号:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY TrafficLight IS
  PORT (Clk               : IN STD_LOGIC;
        S,Reset           : IN STD_LOGIC;
        LED               : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
        Mg,My,Mr,Cg,Cy,Cr : OUT STD_LOGIC );
END TrafficLight ;

ARCHITECTURE rtl OF TrafficLight IS
  TYPE TrafficState IS (mgcr, mycr, mrcg, mrcy);
  SIGNAL State    : TrafficState ;
  SIGNAL DataOut  : STD_LOGIC_VECTOR(5 DOWNTO 0);
  SIGNAL Count    : STD_LOGIC_VECTOR(5 DOWNTO 0);
  SIGNAL SetCount : STD_LOGIC_VECTOR(5 DOWNTO 0);
  SIGNAL Clrn     : STD_LOGIC ;
  SIGNAL LEDB     : STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN

  Counter : PROCESS(clk)
  BEGIN
    IF Reset = '1' OR (Clrn = '1' AND NOT(Count = "000000")) THEN Count <= "000000";
    ELSIF clk'EVENT AND clk = '1' THEN 
      IF NOT(Count = "111011" AND State = mgcr) THEN Count <= Count + 1;END IF;
    END IF;
  END PROCESS Counter;

  StateTransition : PROCESS(clk)
  BEGIN
    IF Reset = '1' THEN State <= mgcr;Clrn <= '0';
      ELSIF clk'EVENT AND clk = '1' THEN
        CASE State IS
          WHEN mgcr => IF Count >= "111011" AND S = '1' THEN State <= mycr;Clrn <= '1';
                       ELSE Clrn <= '0';
                       END IF;
          WHEN mycr => IF Count >= "000011" THEN State <= mrcg;Clrn <= '1';
                       ELSE Clrn <= '0';
                       END IF;
          WHEN mrcg => IF Count >= "010011" OR S = '0' THEN State <= mrcy;Clrn <= '1';
                       ELSE Clrn <= '0';
                       END IF;
          WHEN mrcy => IF Count >= "000011" THEN State <= mgcr;Clrn <= '1';
                       ELSE Clrn <= '0';
                       END IF;
          WHEN OTHERS => NULL;
        END CASE;
    END IF;
  END PROCESS StateTransition;

  CountDown : PROCESS(CLK)
  BEGIN
    IF LEDB > 59 THEN LED <= LEDB + 36;
    ELSIF LEDB > 49 THEN LED <= LEDB + 30;
    ELSIF LEDB > 39 THEN LED <= LEDB + 24;
    ELSIF LEDB > 29 THEN LED <= LEDB + 18;
    ELSIF LEDB > 19 THEN LED <= LEDB + 12;
    ELSIF LEDB > 9 THEN LED <= LEDB + 6;
    ELSE LED <= LEDB;
    END IF;
  END PROCESS CountDown;

  Output : BLOCK
  BEGIN
    WITH State SELECT 
      DataOut  <= "100001" WHEN mgcr,
                  "010001" WHEN mycr,
                  "001100" WHEN mrcg,
                  "001010" WHEN mrcy;
    WITH State SELECT 
      SetCount <= "111100" WHEN mgcr,
                  "000100" WHEN mycr,
                  "010100" WHEN mrcg,
                  "000100" WHEN mrcy;
    Mg <= DataOut(5);My <= DataOut(4);Mr <= DataOut(3);
    Cg <= DataOut(2);Cy <= DataOut(1);Cr <= DataOut(0);
    LEDB <= SetCount - ("00" & Count);
  END BLOCK Output;

END ARCHITECTURE rtl;

⌨️ 快捷键说明

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