Facebook
From Whipped Pudu, 1 Year ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 113
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.std_logic_unsigned.all;
  4. use ieee.std_logic_arith.all;
  5.  
  6. entity Semafor is
  7.     Port (
  8.                                 iCLK    : in  std_logic;
  9.                                 iRST    : in  std_logic;
  10.                                 iOK     : in  std_logic;
  11.                                 iHAZ    : in  std_logic;
  12.                                 oRED    : out std_logic;
  13.                                 oYELLOW : out std_logic;
  14.                                 oGREEN  : out std_logic
  15.                          );
  16. end entity;
  17.  
  18. architecture Behavioral of Semafor is
  19.  
  20. type tSTATE is (IDLE, RED, RED_YELLOW, GREEN, YELLOW, HAZARD);
  21.          signal sSTATE, sNEXT_STATE : tSTATE;
  22.     signal sLED                 : std_logic_vector(7 downto 0);
  23.         -- signal sNEXT_LED : std_logic_vector(7 downto 0);
  24.     signal sCNT                 : std_logic_vector(23 downto 0);
  25.          signal sEN                     : std_logic;
  26.  
  27.         -- konstanta za maksimalnu vrednost brojača jedne sekunde - za MAX 10
  28.         constant cMAX : std_logic_vector (23 downto 0) := conv_std_logic_vector(12000000, 24); -- 12Mhz
  29.          
  30.         -- konstanta za maksimalnu vrednost brojača jedne sekunde - za simulaciju
  31.         --constant cMAX : std_logic_vector (23 downto 0) := conv_std_logic_vector(10, 24);
  32.          
  33. begin
  34.        
  35. -- brojac jedne sekunde
  36.     process (iCLK, iRST) begin
  37.         if (iRST = '1') then
  38.             sCNT <= (others=>'0');
  39.         elsif (iCLK'event and iCLK = '1') then
  40.             if (sCNT = cMAX) then        
  41.                 sCNT <= (others=>'0');
  42.             else                        
  43.                 sCNT <= sCNT + 1;
  44.             end if;
  45.         end if;
  46.     end process;
  47.          sEN <= '1' when sCNT = cMAX else '0';
  48. -- registar za pamcenje stanja
  49.     process (iCLK, iRST) begin
  50.                 if (iRST = '1') then
  51.                         sSTATE <= IDLE;
  52.       elsif (iCLK'event and iCLK = '1') then
  53.                         if(sEN = '1') then
  54.                                 sSTATE <= sNEXT_STATE;
  55.                         end if;
  56.                 end if;
  57.         end process;
  58.        
  59. --funkcija prelaza stanja (kombinaciona mreza)
  60.         process (iOK, iHAZ, sSTATE) begin
  61.                 case sSTATE is
  62.                         when IDLE =>
  63.                                 if (iOK = '1') then
  64.                                         sNEXT_STATE <= RED;
  65.                                 else
  66.                                         sNEXT_STATE <= IDLE;
  67.                                 end if;
  68.                                
  69.                         when RED =>
  70.                                 if (iHAZ = '1') then
  71.                                         sNEXT_STATE <= HAZARD;
  72.                                 else
  73.                                         sNEXT_STATE <= RED_YELLOW;
  74.                                 end if;
  75.                        
  76.                         when RED_YELLOW =>
  77.                                 if (iOK = '1') then
  78.                                         sNEXT_STATE <= HAZARD;
  79.                                 else
  80.                                         sNEXT_STATE <= GREEN;
  81.                                 end if;
  82.        
  83.                         when GREEN =>
  84.                                 if (iOK = '1') then
  85.                                         sNEXT_STATE <= HAZARD;
  86.                                 else
  87.                                         sNEXT_STATE <= YELLOW;
  88.                                 end if;
  89.        
  90.                         when YELLOW =>
  91.                                 if (iOK = '1') then
  92.                                         sNEXT_STATE <= HAZARD;
  93.                                 else
  94.                                         sNEXT_STATE <= RED;
  95.                                 end if;
  96.        
  97.                         when HAZARD =>
  98.                                 if (iOK = '1') then
  99.                                         sNEXT_STATE <= RED;
  100.                                 else
  101.                                         sNEXT_STATE <= HAZARD;
  102.                                 end if;
  103.                         when others =>
  104.                                         sNEXT_STATE <= sSTATE;
  105.                         end case;
  106.                 end process;
  107.                
  108. --registar za izlazno stanje LED diode
  109.        
  110.                         oRED <= '1'when (sSTATE = RED or sSTATE = RED_YELLOW or sSTATE = HAZARD) else '0';
  111.                         oYELLOW <= '1'when (sSTATE = YELLOW or sSTATE = RED_YELLOW or sSTATE = HAZARD) else '0';
  112.                         oGREEN <= '1'when (sSTATE = GREEN or sSTATE = HAZARD) else '0';
  113.        
  114.        
  115. end Behavioral;