Buscar este blog

sábado, 6 de junio de 2015

Maquina de sodas con VDHL

----------------------------------------------------------------------------------
-- 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;

2 comentarios: