老怪甲 发表于 2010-5-18 12:54:22

交通灯源码

交通灯

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 = &#39;1&#39; OR (Clrn = &#39;1&#39; AND NOT(Count = "000000")) THEN Count <= "000000";
ELSIF clk&#39;EVENT AND clk = &#39;1&#39; 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 = &#39;1&#39; THEN State <= mgcr;Clrn <= &#39;0&#39;;
   ELSIF clk&#39;EVENT AND clk = &#39;1&#39; THEN
    CASE State IS
   WHEN mgcr => IF Count >= "111011" AND S = &#39;1&#39; THEN State <= mycr;Clrn <= &#39;1&#39;;
            ELSE Clrn <= &#39;0&#39;;
            END IF;
   WHEN mycr => IF Count >= "000011" THEN State <= mrcg;Clrn <= &#39;1&#39;;
            ELSE Clrn <= &#39;0&#39;;
            END IF;
   WHEN mrcg => IF Count >= "010011" OR S = &#39;0&#39; THEN State <= mrcy;Clrn <= &#39;1&#39;;
            ELSE Clrn <= &#39;0&#39;;
            END IF;
   WHEN mrcy => IF Count >= "000011" THEN State <= mgcr;Clrn <= &#39;1&#39;;
            ELSE Clrn <= &#39;0&#39;;
            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;

lisuai 发表于 2012-2-26 22:40:22

神马东西啊,注释都没有还叫程序吗

fpga_feixiang 发表于 2022-3-20 17:04:40

6666666666666666666
页: [1]
查看完整版本: 交通灯源码