-- Practica 4. 10
-- Programe un sistema secuencial correspondiente a una maquina expendedora de
-- refescos, el valor del refresco es de 5, 10 y 20. cuando se introduce una moneda
-- de 5, 10 o 20 pesos se debe completar el cambio correspondiente.
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_arith.all;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.all;
entity Punto_10 is
Port ( X : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
clock, R, CLC_E, CLC_E2: in STD_LOGIC;
Z : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
SALIDA: out STD_LOGIC );
end Punto_10;
architecture MAQUINA_SODAS of Punto_10 is
type Estados is (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11, S12);
signal ED_ACTUAL, ED_SIGUIENTE :ESTADOS;
signal temporal : STD_LOGIC;
signal contador: integer range 0 to 100000000:=0;
BEGIN
--Estado de Registro.
divisor_frecuencia: process(R, clock)
begin
if(R='1') then
temporal<='0';
contador<=0;
elsif (rising_edge(clock) and CLC_E='0') then
if(contador=100000000) then
temporal<= not(temporal);
contador<=0;
else
contador<=contador+1;
end if;
end if;
end process;
Salida<=temporal;
RELOG_TEMPORAL: PROCESS (TEMPORAL)
BEGIN
IF (TEMPORAL' EVENT AND TEMPORAL='1' AND CLC_E2='0')THEN
ED_ACTUAL <= ED_SIGUIENTE;
END IF;
END PROCESS;
-- MAQUINA DE MOORE
--Estado Siguiente / salida logica..
PROCESS (X, ED_ACTUAL)
BEGIN
CASE (ED_ACTUAL) IS
WHEN S0 => Z <="000";
IF (X="000")THEN
ED_SIGUIENTE <=S0;
ELSIF (X="001") THEN
ED_SIGUIENTE <=S1;
ELSIF(X="010")THEN
ED_SIGUIENTE <=S2;
ELSIF(X="100") THEN
ED_SIGUIENTE <=S3;
ELSE
ED_SIGUIENTE <=S0;
END IF;
WHEN S1 => Z <= "001";
IF (X= "001")THEN
ED_SIGUIENTE <=S4;
ELSIF(X="010")THEN
ED_SIGUIENTE<= S5;
ELSIF(X="100")THEN
ED_SIGUIENTE<= S6;
ELSE
ED_SIGUIENTE <=S1;
END IF;
WHEN S2 => Z <= "010";
IF (X= "001")THEN
ED_SIGUIENTE <=S7;
ELSIF(X="010")THEN
ED_SIGUIENTE<= S4;
ELSIF(X="100")THEN
ED_SIGUIENTE<= S8;
ELSE
ED_SIGUIENTE <=S2;
END IF;
WHEN S3 => Z <= "100";
IF (X= "001")THEN
ED_SIGUIENTE <=S9;
ELSIF(X="010")THEN
ED_SIGUIENTE<= S10;
ELSIF(X="100")THEN
ED_SIGUIENTE<= S4;
ELSE
ED_SIGUIENTE <=S3;
END IF;
WHEN S4 => Z <= "000";
IF (X="000") THEN
ED_SIGUIENTE<=S12;
ELSE
ED_SIGUIENTE <=S4;
END IF;
WHEN S5 => Z <= "001";
IF (X="000") THEN
ED_SIGUIENTE<=S12;
ELSE
ED_SIGUIENTE <=S5;
END IF;
WHEN S6 => Z <= "011";
IF (X="000") THEN
ED_SIGUIENTE<=S12;
ELSE
ED_SIGUIENTE <=S6;
END IF;
WHEN S7 => Z <= "000";
IF (X= "001")THEN
ED_SIGUIENTE <=S4;
ELSIF(X="010")THEN
ED_SIGUIENTE<= S5;
ELSIF(X="100")THEN
ED_SIGUIENTE<= S6;
ELSE
ED_SIGUIENTE <=S7;
END IF;
WHEN S8 => Z <= "010";
IF (X= "000")THEN
ED_SIGUIENTE <=S12;
ELSE
ED_SIGUIENTE <=S8;
END IF;
WHEN S9 => Z <= "000";
IF (X= "001")THEN
ED_SIGUIENTE <=S11;
ELSIF(X="010")THEN
ED_SIGUIENTE<= S7;
ELSIF(X="100")THEN
ED_SIGUIENTE<= S5;
ELSE
ED_SIGUIENTE <=S9;
END IF;
WHEN S10 => Z <= "000";
IF (X= "001")THEN
ED_SIGUIENTE <=S7;
ELSIF(X="010")THEN
ED_SIGUIENTE<= S4;
ELSIF(X="100")THEN
ED_SIGUIENTE<= S8;
ELSE
ED_SIGUIENTE <=S10;
END IF;
WHEN S11 => Z <= "000";
IF (X= "001")THEN
ED_SIGUIENTE <=S7;
ELSIF(X="010")THEN
ED_SIGUIENTE<= S4;
ELSIF(X="100")THEN
ED_SIGUIENTE<= S8;
ELSE
ED_SIGUIENTE <=S11;
END IF;
WHEN S12 => Z <= "111";
ED_SIGUIENTE <=S0;
END CASE;
END PROCESS;
END MAQUINA_SODAS;
Este comentario ha sido eliminado por el autor.
ResponderEliminardisculpa, que son las entradas CLC_E2 y CLCE?
ResponderEliminar