Bonjour je doit réaliser un feux de carrefour en vhdl.
les feux doivent avoir 14 coups en vert, 1 en rouge, 2 en orange.
2 passage piéton pris en compte qui passe le feu au rouge au bout de 3 coups
J'ai deux solutions mais cela ne marche pas si quelqu'un peut m'aider :
1er essaie:
Code:library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; -- Uncomment the following library declaration if using -- arithmetic functions with Signed or Unsigned values --use IEEE.NUMERIC_STD.ALL; -- Uncomment the following library declaration if instantiating -- any Xilinx leaf cells in this code. --library UNISIM; --use UNISIM.VComponents.all; entity feux is Port ( REQV : in STD_LOGIC; REQH : in STD_LOGIC; H : in STD_LOGIC; raz : in STD_LOGIC; VH : out STD_LOGIC; YH : out STD_LOGIC; RH : out STD_LOGIC; VV : out STD_LOGIC; YV : out STD_LOGIC; RV : out STD_LOGIC; cp : out STD_LOGIC_VECTOR (3 downto 0)); end feux; architecture Behavioral of feux is type state is (FVH,FYH,FRH,FVV,FYV,FRV); signal present_state, next_state : state; signal cpt : STD_LOGIC_VECTOR (3 downto 0);--compteur 4 bits begin process(cpt,present_state) begin case present_state is when FVH=> VH<='1'; YH<='0'; RH<='0'; VV<='0'; YV<='0'; RV<='1'; -- feu VERT voie HORIZONTALE-->feu ORANGE voie HORIZONTALE if cpt<="1110" then next_state<=FYH; end if; when FYH=> VH<='0'; YH<='1'; RH<='0'; VV<='0'; YV<='0'; RV<='1'; -- feu ORANGE voie HORIZONTALE-->feu ROUGE voie HORIZONTALE if cpt<="0010" then next_state<=FRH; end if; when FRH=> VH<='0'; YH<='0'; RH<='1'; VV<='0'; YV<='0'; RV<='1'; -- feu ROUGE voie HORIZONTALE-->feu VERT voie VERTICAL if cpt<="0001" then next_state<=FVV; end if; when FVV=> VH<='0'; YH<='0'; RH<='1'; VV<='1'; YV<='0'; RV<='0'; -- feu VERT voie VERTICAL-->feu ORANGE voie VERTICAL if cpt<="1110" then next_state<=FYV; end if; when FYV=> VH<='0'; YH<='0'; RH<='1'; VV<='0'; YV<='1'; RV<='0'; -- feu ORANGE voie VERTICALE-->feu ROUGE voie VERTICAL if cpt<="0010" then next_state<=FRV; end if; when FRV=> VH<='0'; YH<='0'; RH<='1'; VV<='0'; YV<='0'; RV<='1'; -- feu ROUGE voie VERTICAL-->feu VERT voie HORIZONTALE if cpt<="0001" then next_state<=FVH; end if; end case; end process; process(H,raz) begin if (H'event and H = '1') then if raz ='1' then present_state<=FVH; else present_state<=next_state; end if; if present_state /= next_state then cpt<="0000"; -- incrémentation du compteur end if; end if; end process; cp<=cpt; end Behavioral; 2eme essaie : library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; -- Uncomment the following library declaration if using -- arithmetic functions with Signed or Unsigned values --use IEEE.NUMERIC_STD.ALL; -- Uncomment the following library declaration if instantiating -- any Xilinx leaf cells in this code. --library UNISIM; --use UNISIM.VComponents.all; entity feu is Port ( ReqV : in STD_LOGIC; ReqH : in STD_LOGIC; h : in STD_LOGIC; raz : in STD_LOGIC; VH : out STD_LOGIC; YH : out STD_LOGIC; RH : out STD_LOGIC; VV : out STD_LOGIC; YV : out STD_LOGIC; RV : out STD_LOGIC; q : out STD_LOGIC_VECTOR (3 downto 0)); end feu; architecture Behavioral of feu is type StateType is (FVH,FYH,FRH,FVV,FYV,FRV); --on déclare les variable d'état signal couleur : StateType; signal qtemp : STD_LOGIC_VECTOR (3 downto 0);--compteur 4 bits begin state_comb : process(raz,ReqH,ReqV,couleur,h) begin --if h'event and h='1' then qtemp<=qtemp+1 ; --coup d'horloge if raz='1' then qtemp<="0000"; --lancement des feux tricolores couleur<=FRV; elsif (ReqH='1' and couleur=FVH) then qtemp<="1011"; --gère la commande piéton voie horizontale --on donne la valeur 11, encore 3 coup et etats suivants ok elsif (ReqV='1' and couleur=FVV) then qtemp<="1011"; --gère la commande pièton voie vertical --on donne la valeur 11, encore 3 coup et etats suivants ok elsif (h'event and h='1') then qtemp <= qtemp + 1; --14 coups pour passer le vert, 2 pour le orange et 1 pour le rouge case couleur is when FVH=> -- feu VERT voie HORIZONTALE-->feu ORANGE voie HORIZONTALE if qtemp<="1110" then couleur<=FYH; qtemp<="0000"; end if; when FYH=> -- feu ORANGE voie HORIZONTALE-->feu ROUGE voie HORIZONTALE if qtemp<="0010" then couleur<=FRH; qtemp<="0000"; end if; when FRH=> -- feu ROUGE voie HORIZONTALE-->feu VERT voie VERTICAL if qtemp<="0001" then couleur<=FVV; qtemp<="0000"; end if; when FVV=> -- feu VERT voie VERTICAL-->feu ORANGE voie VERTICAL if qtemp<="1110" then couleur<=FYV; qtemp<="0000"; end if; when FYV=> -- feu ORANGE voie VERTICALE-->feu ROUGE voie VERTICAL if qtemp<="0010" then couleur<=FRV; qtemp<="0000"; end if; when FRV=> -- feu ROUGE voie VERTICAL-->feu VERT voie HORIZONTALE if qtemp<="0001" then couleur<=FVH; qtemp<="0000"; end if; end case; end if; end process; Q <= qtemp; VH<='1' when (couleur=FVH) else '0'; --valeurs de sortie selon les différents états YH<='1' when (couleur=FYH) else '0'; RH<='1' when (couleur=FRH or couleur=FVV or couleur=FYV) else '0'; VV<='1' when (couleur=FVV) else '0'; YV<='1' when (couleur=FYV) else '0'; RV<='1' when (couleur=FRV or couleur=FVH or couleur=FYH) else '0'; end Behavioral;
-----