Vous êtes sur la page 1sur 12

Máquina expendedora de 2 gaseosas en VHDL

Autor: Chris Jimmy Martinez Cárdenas

Código: 20142517H

Especialidad: Ingeniería Mecatrónica

Curso: Análisis y Diseño de Circuitos Digitales

Problema: Diseñar una máquina expendedora de 2 gaseosas en lenguaje VHDL e implementarlo


en la placa FPGA.

Solución:

Se considerará para la solución del problema:

1.- Se puede erogar dos gaseosas: “Coca” o “Inca”. Que se deben seleccionar por medio de dos
botones.

2.- Se tiene la posibilidad de devolver el dinero al presionar un botón siempre y cuando no se esté
erogando ya una gaseosa y ya se haya introducido cierta cantidad de dinero.

3.- Se da vuelto si es que la cantidad de dinero es mayor a la necesaria.

4.- Si pasa un tiempo sin hacer alguna interacción regresará al inicio o devolverá el dinero si ya se
introdujo cierta cantidad y luego regresará al inicio.

Nota: Al terminar el proceso se deben poner todas las entradas en 0 (abajo) para empezar de
nuevo.

Las 4 entradas (switch) y 8 salidas (LED) disponibles físicamente son las siguientes:

Figura 1 – Entradas y salidas de la placa FPGA


Entradas:

Por la limitación de la tarjeta de solo tener 4 bits de entrada se usarán dos entradas de dos bits
cada una.

Entradas Tag de las entradas En el código Cantidad de bits


Selección S selec 2
Cantidad Q qant 2

Se considera “0” abajo y “1” arriba.

N17 H18 L14 L13


Selección Selección Cantidad Cantidad
No hay selección 0 0 0 0 No hay dinero
Coca 0 1 0 1 Dinero insuficiente
Inca 1 0 1 0 Dinero mayor
Devolución 1 1 1 1 Dinero igual
Salidas:

Se tendrán dos salidas y una extra que indique el estado en el que se encuentra la máquina. De las
8 disponibles solo se usarán 6.

Salidas Tag de las salidas En el código Cantidad de bits


Vuelto V vuelto 1
Despacho D desp 1
Estado actual 𝜙 est 3

Se considera “0” apagado y “1” encendido.

Para los 5 primeros LED de izquierda a derecha:

F9 E9 D11 C11 F11


Vuelto Vuelto - Despacho - Despacho
No hay vuelto 0 - 0 0 - No hay erogación
Hay vuelto 1 - 0 1 - Eroga coca
- 1 0 - Eroga inca
- 1 1 - -

Para los 3 últimos LED de izquierda a derecha:

E11 E12 F12


Estado actual Estado actual En el código
0 0 0 Inicio inicio
0 1 0 Selección sel
0 0 1 Coca seleccionada coca
1 0 0 Inca seleccionada inca
0 1 1 Erogación de Coca ecoca
1 1 0 Erogación de Inca einca
1 0 1 Vuelto vuelt
1 1 1 - -

Se usó esta distribución para los LED con el motivo de que sea fácilmente identificable el estado
actual de la máquina.
Diagrama de estados para la máquina Moore:

Se usó el siguiente diagrama de estados para la máquina Moore del problema.

Figura 2 – Diagrama de estados para la máquina Moore del problema

Nota: Los T2 y T4 fueron cambiados por T3 y T6 respectivamente.


Código: .ucf

# PlanAhead Generated physical constraints

NET "clk" LOC = C9;

NET "desp[1]" LOC = D11;

NET "desp[0]" LOC = C11;

NET "est[2]" LOC = E11;

NET "est[1]" LOC = E12;

NET "est[0]" LOC = F12;

NET "qant[1]" LOC = L14;

NET "qant[0]" LOC = L13;

NET "selec[1]" LOC = N17;

NET "selec[0]" LOC = H18;

NET "vuelto" LOC = F9;


Código: .hvd

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

entity Gas_mod is

Port ( clk : in STD_LOGIC;

selec : in STD_LOGIC_VECTOR (1 downto 0);

qant : in STD_LOGIC_VECTOR (1 downto 0);

vuelto : out STD_LOGIC;

desp : out STD_LOGIC_VECTOR (1 downto 0);

est : out STD_LOGIC_VECTOR (2 downto 0));

end Gas_mod;

architecture Behavioral of Gas_mod is

type estados is (inicio,sel,coca,inca,ecoca,einca,vuelt);

signal ep:estados;

signal clk_1Hz_S:std_logic;

signal ti:integer range 0 to 5;

begin

process(clk)

variable t:integer range 0 to 50000000;

begin

if (rising_edge(clk)) then

t:=t+1;

if (t<=1) then

clk_1Hz_s<='1';
elsif (t<50000000) then

clk_1Hz_s<='0';

else

t:=0;

end if;

end if;

end process;

process(clk_1Hz_s,selec,qant)

begin

if (rising_edge(clk_1Hz_s)) then

case ep is

when inicio=>

if (qant/="00") then

ep<=sel;

ti<=0;

elsif (selec="01") then

ep<=coca;

ti<=0;

elsif (selec="10") then

ep<=inca;

ti<=0;

end if;

when sel=>

ti<=ti+1;

if (selec="01") then

ep<=coca;

ti<=0;

elsif (selec="10") then


ep<=inca;

ti<=0;

elsif (ti=5) then

ep<=vuelt;

ti<=0;

end if;

when coca=>

ti<=ti+1;

if (selec="10") then

ep<=inca;

ti<=0;

elsif ((ti=5 or selec="11") and qant="00") then

ep<=inicio;

ti<=0;

elsif (qant="10" or qant="11") then

ep<=ecoca;

ti<=0;

elsif ((ti=5 or selec="11") and qant="01") then

ep<=vuelt;

ti<=0;

end if;

when inca=>

ti<=ti+1;

if (selec="01") then

ep<=coca;

ti<=0;

elsif ((ti=5 or selec="11") and qant="00") then

ep<=inicio;

ti<=0;
elsif (qant="10" or qant="11") then

ep<=einca;

ti<=0;

elsif ((ti=5 or selec="11") and qant="01") then

ep<=vuelt;

ti<=0;

end if;

when ecoca=>

ti<=ti+1;

if (ti=2 and qant="10") then

ep<=vuelt;

ti<=0;

elsif (ti=2 and qant="11") then

ep<=inicio;

ti<=0;

end if;

when einca=>

ti<=ti+1;

if (ti=2 and qant="10") then

ep<=vuelt;

ti<=0;

elsif (ti=2 and qant="11") then

ep<=inicio;

ti<=0;

end if;

when vuelt=>

ti<=ti+1;

if (ti=2) then

ep<=inicio;
ti<=0;

end if;

end case;

end if;

end process;

process(ep)

begin

case ep is

when inicio=>

est<="000";

vuelto<='0';

desp<="00";

when sel=>

est<="010";

vuelto<='0';

desp<="00";

when coca=>

est<="001";

vuelto<='0';

desp<="00";

when inca=>

est<="100";

vuelto<='0';

desp<="00";

when ecoca=>

est<="011";

vuelto<='0';

desp<="01";
when einca=>

est<="110";

vuelto<='0';

desp<="10";

when vuelt=>

est<="101";

vuelto<='1';

desp<="00";

end case;

end process;

end Behavioral;
Resultados:

Se cargó el código a la tarjeta y se comprobó el funcionamiento de máquina de estado. El tiempo


de espera que tiene realmente es un segundo mayor al del código, se usaron tiempos pequeños
para no prolongar el periodo de las pruebas.

Figura 3 – Máquina en el estado “Erogación de Inca”

Figura 4 – Máquina en el estado “Vuelto”

Vous aimerez peut-être aussi