Advertisement
Mihailo21

Signal svetlo

Feb 11th, 2024
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 3.65 KB | None | 0 0
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.std_logic_unsigned.ALL;
  4.  
  5. entity Signal_light is port (
  6.     iCLK    : in  std_logic;
  7.     iRST    : in  std_logic;
  8.     iLEFT   : in  std_logic;
  9.     iRIGHT      : in  std_logic;
  10.     oLEFT       : out std_logic_vector(2 downto 0);
  11.     oRIGHT  : out std_logic_vector(2 downto 0)
  12.     );
  13. end entity;
  14.  
  15. architecture Behavioral of Signal_light is
  16. type tSTATE is (IDLE,R1,R2,R3,L1,L2,L3);
  17. signal sSTATE,sNEXT_STATE: tSTATE;
  18. signal sR_TC : std_logic;
  19. signal sL_TC : std_logic;
  20. signal sRST_L : std_logic;
  21. signal sRST_R : std_logic;
  22. signal sL_EN : std_logic;
  23. signal sR_EN : std_logic;
  24. signal sR_CNT: std_logic_vector(3 downto 0);
  25. signal sL_CNT: std_logic_vector (3 downto 0);
  26.  
  27. begin
  28.  
  29. --registar stanja
  30. process(iRST,iCLK) begin
  31. if(iRST='1') then
  32. sSTATE<=IDLE;
  33. elsif(rising_edge(iCLK)) then
  34.   sSTATE<=sNEXT_STATE;
  35. end if;
  36. end process;
  37.  
  38. --funkcija prelaza
  39.  
  40. process(sSTATE,iLEFT,iRIGHT,sL_TC,sR_TC) begin
  41.  
  42. case(sSTATE) is
  43.       when IDLE=>
  44.                         if(iLEFT='1') then
  45.                          sNEXT_STATE<=L1;
  46.                          elsif(iRIGHT='1') then
  47.                          sNEXT_STATE<=R1;
  48.                          else
  49.                            sNEXT_STATE<=sSTATE;
  50.                             end if;
  51.                            
  52.         when L1=>  
  53.                     if(iLEFT='1' and sL_TC='1') then
  54.                            sNEXT_STATE<=L2;
  55.                         elsif(iLEFT='0') then
  56.                            sNEXT_STATE<=IDLE;
  57.                         else
  58.                              sNEXT_STATE<=sSTATE;
  59.                         end if;
  60.         when L2=>
  61.                      if(iLEFT='1' and sL_TC='1') then
  62.                            sNEXT_STATE<=L3;
  63.                         elsif(iLEFT='0') then
  64.                            sNEXT_STATE<=IDLE;
  65.                         else
  66.                              sNEXT_STATE<=sSTATE;
  67.                         end if;
  68.        when L3=>
  69.                     if(sL_TC='1' or iLEFT='0')then
  70.                          sNEXT_STATE<=IDLE;
  71.                          else
  72.                            sNEXT_STATE<=sSTATE;
  73.                             end if;
  74.           when R1=>  
  75.                     if(iRIGHT='1' and sR_TC='1') then
  76.                           sNEXT_STATE<=R2;
  77.                           elsif(iRIGHT='0') then
  78.                            sNEXT_STATE<=IDLE;
  79.                           else
  80.                                sNEXT_STATE<=sSTATE;
  81.                             end if;
  82.         when R2=>
  83.                    if(iRIGHT='1' and sR_TC='1') then
  84.                           sNEXT_STATE<=R3;
  85.                           elsif(iRIGHT='0') then
  86.                            sNEXT_STATE<=IDLE;
  87.                           else
  88.                                sNEXT_STATE<=sSTATE;
  89.                             end if;
  90.         when R3=>
  91.                    if(sR_TC='1' or iRIGHT='0') then
  92.                           sNEXT_STATE<=IDLE;
  93.                         else
  94.                              sNEXT_STATE<=sSTATE;
  95.                             end if;
  96.         when others=>
  97.                     sNEXT_STATE<=sSTATE;
  98.         end case;
  99. end process;
  100.  
  101. --funkcija izlaza
  102.  
  103. oLEFT<="001" when sSTATE=L1 else
  104.        "011" when sSTATE=L2 else
  105.          "111" when sSTATE=L3 else
  106.          "000";
  107. oRIGHT<="100" when sSTATE=R1 else
  108.        "110" when sSTATE=R2 else
  109.          "111" when sSTATE=R3 else
  110.          "000";
  111. sL_EN<='1' when sSTATE=L1 or sSTATE=L2 or sSTATE=L3 else '0';
  112. sR_EN<='1' when sSTATE=R1 or sSTATE=R2 or sSTATE=R3 else '0';
  113. sRST_L<='1' when sSTATE=IDLE or sSTATE=R1 or sSTATE=R2 or sSTATE=R3 else '0';
  114. sRST_R<='1' when sSTATE=IDLE or sSTATE=L1 or sSTATE=L2 or sSTATE=L3 else '0';
  115.                        
  116. --LEVI brojac po modulu 10
  117. process(iCLK,iRST) begin
  118.  
  119. if(iRST='1') then
  120. sL_CNT<="0000";
  121. elsif(rising_edge(iCLK)) then
  122.     if(sRST_L='1') then
  123.          sL_CNT<="1001";
  124.          elsif(sL_EN='1') then
  125.         if(sL_CNT="00000") then
  126.            sL_CNT<="1001";
  127.         else
  128.           sL_CNT<= sL_CNT-1;
  129.             end if;
  130.  end if;
  131. end if;
  132.  
  133. end process;
  134. sL_TC<='1' when sL_CNT="0000" else '0';
  135.  
  136. --DESNI brojac po modulu 10
  137.  
  138. process( iCLK,iRST) begin
  139.  
  140. if(iRST='1') then
  141. sR_CNT<="0000";
  142. elsif(rising_edge(iCLK)) then
  143.    if(sRST_R='1') then
  144.       sR_CNT<="1001";
  145.     elsif(sR_EN='1') then
  146.          if(sR_CNT=0) then
  147.               sR_CNT<="1001";
  148.             else
  149.                sR_CNT<=sR_CNT-1;
  150.             end if;
  151. end if;
  152. end if;
  153.  
  154. end process;
  155. sR_TC<='1' when sR_CNT="0000" else '0';
  156.  
  157.  
  158. end Behavioral;
  159.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement