Buscar este blog

sábado, 6 de junio de 2015

Estacionamiento con LCD

----------------------------------------------------------------------------------
-- Practica 6.
-- Diseñar e impelemntar en VHDL un contador de autos de un estacionamiento usando
-- maquinas de estado Mealy o Moore.
----------------------------------------------------------------------------------
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 ESTACIONAMIENTO is
    Port ( X: in STD_LOGIC_VECTOR(1 DOWNTO 0);
       CLOCK, CLC_E, CLC_E2, R: in  STD_LOGIC;
 LCD_E  : OUT STD_LOGIC;
 LCD_RS : OUT STD_LOGIC;
 LCD_RW : OUT STD_LOGIC;
 LCD_DB : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
 RELOG : OUT STD_LOGIC);
end ESTACIONAMIENTO;

architecture  CONTADOR of  ESTACIONAMIENTO is
type Estados is (S0, S1, S2, S3, S4, S5, S6);
signal ED_ACTUAL, ED_SIGUIENTE :ESTADOS;
signal temporal : STD_LOGIC;
signal contador: integer range 0 to 10:=0;
signal CARROS : STD_LOGIC_VECTOR(3 DOWNTO 0);
signal Z : STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL E  : STD_LOGIC:= '0';
SIGNAL RS : STD_LOGIC:= '0';
SIGNAL RW : STD_LOGIC:= '0';
SIGNAL DB : STD_LOGIC_VECTOR(7 DOWNTO 0):= "00000000";
BEGIN
LCD_E  <= E;
LCD_RS <= RS;
LCD_RW <= RW;
LCD_DB <= DB;

--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 = 10) then
temporal<= not(temporal);
contador<=0;
else
contador<=contador+1;
end if;
end if;
end process;
RELOG<=TEMPORAL;
--Estado de Registro.
PROCESS (CLOCK)
BEGIN
IF (CLOCK' EVENT AND CLOCK='1' AND CLC_E2='0')THEN
ED_ACTUAL <= ED_SIGUIENTE;
END IF;
END PROCESS;

-- CONTADOR
--Estado Siguiente / salida logica..

PROCESS (X, ED_ACTUAL)
BEGIN
CASE (ED_ACTUAL) IS
WHEN S0 => Z <="00";
IF (X="10")THEN
ED_SIGUIENTE <=S2;
ELSIF(X="01") THEN
ED_SIGUIENTE <=S1;
ELSE
ED_SIGUIENTE <=S0;
END IF;

WHEN S1 => Z <="00";
IF (X= "10")THEN
ED_SIGUIENTE <=S3;
ELSIF(X="11") THEN
ED_SIGUIENTE<= S0;
ELSE
ED_SIGUIENTE<=S1;
END IF;

WHEN S2 => Z <="00";
IF (X="01")THEN
ED_SIGUIENTE<=S4;
ELSIF(X="11") THEN
ED_SIGUIENTE <=S0;
ELSE
ED_SIGUIENTE<=S2;
END IF;

WHEN S3 => Z <="00";
IF (X="11")THEN
ED_SIGUIENTE<=S5;
ELSIF(X="01")THEN
ED_SIGUIENTE <=S1;
ELSE
ED_SIGUIENTE<=S3;
END IF;

WHEN S4 => Z <="00";
IF (X="11")THEN
ED_SIGUIENTE<=S6;
ELSIF(X="10") THEN
ED_SIGUIENTE <=S2;
ELSE
ED_SIGUIENTE<=S4;
END IF;

WHEN S5 => Z <="01";
ED_SIGUIENTE<=S0;

WHEN S6 => Z <="10";
ED_SIGUIENTE<=S0;

END CASE;
END PROCESS;

-- NUMERO DE CARROS
PROCESS(R, Z, CARROS, CLOCK)
BEGIN
IF(R='1') THEN
CARROS<="0000";
ELSIF (CLOCK' EVENT AND CLOCK='1' AND CLC_E2='0')THEN
 IF(Z="01") THEN
   IF(CARROS="1001") THEN
  CARROS<="1001";
ELSE
CARROS<=CARROS+1;
END IF;
 ELSIF(Z="10") THEN
   IF(CARROS="0000") THEN
  CARROS<="0000";
ELSE
CARROS<=CARROS-1;
END IF;
 ELSE
   CARROS<=CARROS;
 END IF;
END IF;
END PROCESS;

-- PROCESO DE LA LCD
PROCESS (R, CLOCK, CARROS)
VARIABLE COUNTER  : INTEGER := 0;
VARIABLE AUX       : INTEGER := 0;
VARIABLE ACT_STEP    : INTEGER := 0;
VARIABLE NEXT_STEP : INTEGER := 0;
BEGIN
IF (R='1') THEN
COUNTER:=0;
ELSE
IF (RISING_EDGE(CLOCK) AND CLC_E='0') THEN
COUNTER := COUNTER + 1;
IF (COUNTER >= AUX) THEN
ACT_STEP := NEXT_STEP;
  NEXT_STEP := ACT_STEP + 1;
CASE ACT_STEP IS
-- Inicializacion 1
WHEN  0 => E <= '0';
AUX := 750000;
WHEN  1 => DB <= "00111111";
E <= '1'; AUX := 12;
WHEN  2 => E <= '0';
AUX := 205000;
WHEN  3 => DB <= "00111111";
E <= '1'; AUX := 12;
WHEN  4 => E <= '0';
AUX := 5000;
WHEN  5 => DB <= "00111111";
E <= '1'; AUX := 12;
WHEN  6 => E <= '0';
AUX := 2000;
WHEN  7 => DB <= "00101111";
E <= '1';
AUX := 12;
WHEN  8 =>
E <= '0';
AUX := 2000;
-- Inicializacion 2
-- Function Set con DL 8 bits
WHEN  9 => E <= '1';
RS <= '0';
RW <= '0';
DB <= "00111111";
AUX := 12;
WHEN 10 => E <= '0';
AUX := 50;
WHEN 11 => E <= '1';
RS <= '0';
RW <= '0';
DB <= "10001111";
AUX := 12;
WHEN 12 => E <= '0';
AUX := 2000;
-- ENTRY MODE
WHEN 13 => E <= '1';
RS <= '0';
RW <= '0';
DB <= "00000110";
AUX := 12;
WHEN 14 => E <= '0';
AUX := 2000;
-- Display On/Off
WHEN 15 => E <= '1';
RS <= '0';
RW <= '0';
DB <= "00001100";
AUX := 12;
WHEN 16 => E <= '0';
AUX := 2000;
-- Clear Display
WHEN 17 => E <= '1';
RS <= '0';
RW <= '0';
DB <= "00000001";
AUX := 12;
WHEN 18 => E <= '0';
AUX := 82000;
-- Escribir texto
-- Set DD RAM address (0x03)
WHEN 19 => E <= '1';
RS <= '0';
RW <= '0';
DB <= "10000111";
AUX := 12;
WHEN 20 => E <= '0';
AUX := 2000;
-- Escribir
WHEN 21 => E <= '1';
RS <= '1';
RW <= '0';
IF(CARROS="0000") THEN
DB <= "00110000";
ELSIF(CARROS="0001") THEN
DB <="00110001";
ELSIF(CARROS="0010") THEN
DB <="00110010";
ELSIF(CARROS="0011") THEN
DB <="00110011";
ELSIF(CARROS="0100") THEN
DB <="00110100";
ELSIF(CARROS="0101") THEN
DB <="00110101";
ELSIF(CARROS="0110") THEN
DB <="00110110";
ELSIF(CARROS="0111") THEN
DB <="00110111";
ELSIF(CARROS="1000") THEN
DB <="00111000";
ELSIF(CARROS="1001") THEN
DB <="00111001";
ELSE
DB <="00111001";
END IF;
AUX := 12;
WHEN 22 => E <= '0';
AUX := 2000;
WHEN OTHERS => NEXT_STEP := 19; AUX := 0;
 END CASE;
      COUNTER := 0;
END IF;
END IF;
END IF;
END PROCESS;

END CONTADOR;



20 comentarios:

  1. Que significan las entradas CLC_E y CLC_E2?

    ResponderEliminar
    Respuestas
    1. son para habilitar o des-habilitar el reloj, si se desactivan el programa se queda en pausa,
      clock enable.

      Eliminar
  2. Hola, de casualidad no tienes tu diagrama de estado o algo?

    ResponderEliminar
    Respuestas
    1. Este comentario ha sido eliminado por el autor.

      Eliminar
    2. Al poner el codigo en el programa me marca esto
      Warning (10492): VHDL Process Statement warning at estacionamiento.vhd(40): signal "CLC_E" is read inside the Process Statement but isn't in the Process Statement's sensitivity list

      Eliminar
    3. Hace mucho no programo en VHDL, pero me parece que es por que falta declararlo en la lista de variables sensibles al proceso, creo que es en PROCESS(variable1, variable2,...)

      Eliminar
    4. Muchas gracias! me sirvió bastante

      Eliminar
  3. otra cosa, lo hiciste en físico?
    Si lo hiciste en físico que otros materiales usaste?

    ResponderEliminar
    Respuestas
    1. Era una simulación, use sensores infrarrojos y solo pasaba algo entre ellos para marcar una entrada o una salida, en una dirección marcaba una entrada depues de pasar entre los dos sensores y en la dirección contraria marcaba una salida

      Eliminar
    2. No entiendo como conectar el lcd

      Eliminar
    3. Para conectar la LCD tienes que enviarle una serie se pulsos de cierto tiempo para inicializarla, son las secciones de inicialización 1 y 2, esos pulsos del vector DB los envías a las terminales de la LCD que corresponden a LCD_DB0,...LCD_DB7 según tu hoja de datos de la tarjeta que estés utilizando, de igual forma las señales de LCD_RS, LCD_RW y LCD_E se envían a la terminal con el mismo nombre.

      Eliminar
    4. ya los conecte, pero no me marca nada en la pantalla, solo se queda encendida

      Eliminar
    5. Tal vez los pulsos de configuración no están bien para tu modelo de LCD

      Eliminar
    6. que tipo de lcd es el que necesito para el codigo entonces?

      Eliminar
    7. No es que necesites un tipo en especifico, tienes que adaptarlo al hardware que estés usando

      Eliminar
  4. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  5. y como quedaria el codigo y utulizara dos display

    ResponderEliminar
  6. CLC_E2 Input PIN_112 2 B2_N0 PIN_112 3.3-V LVTTL (default) 24mA (default)
    CLOCK Input PIN_17 1 B1_N0 PIN_17 3.3-V LVTTL (default) 24mA (default)
    LCD_DB[7] Output PIN_119 2 B2_N0 PIN_119 3.3-V LVTTL (default) 24mA (default)
    LCD_DB[6] Output PIN_92 3 B3_N0 PIN_92 3.3-V LVTTL (default) 24mA (default)
    LCD_DB[5] Output PIN_122 2 B2_N0 PIN_122 3.3-V LVTTL (default) 24mA (default)
    LCD_DB[4] Output PIN_103 3 B3_N0 PIN_103 3.3-V LVTTL (default) 24mA (default)
    LCD_DB[3] Output PIN_120 2 B2_N0 PIN_120 3.3-V LVTTL (default) 24mA (default)
    LCD_DB[2] Output PIN_121 2 B2_N0 PIN_121 3.3-V LVTTL (default) 24mA (default)
    LCD_DB[1] Output PIN_118 2 B2_N0 PIN_118 3.3-V LVTTL (default) 24mA (default)
    LCD_DB[0] Output PIN_125 2 B2_N0 PIN_125 3.3-V LVTTL (default) 24mA (default)
    LCD_E Output PIN_115 2 B2_N0 PIN_115 3.3-V LVTTL (default) 24mA (default)
    LCD_RS Output PIN_104 3 B3_N0 PIN_104 3.3-V LVTTL (default) 24mA (default)
    LCD_RW Output PIN_31 1 B1_N1 PIN_31 3.3-V LVTTL (default) 24mA (default)
    R Input PIN_144 2 B2_N1 PIN_144 3.3-V LVTTL (default) 24mA (default)
    RELOG Output PIN_129 2 B2_N1 PIN_129 3.3-V LVTTL (default) 24mA (default)
    X[1] Input PIN_114 2 B2_N0 PIN_114 3.3-V LVTTL (default) 24mA (default)
    X[0] Input PIN_113 2 B2_N0 PIN_113 3.3-V LVTTL (default) 24mA (default)
    ~ASDO~ Input PIN_1 1 B1_N0 PIN_1 3.3-V LVTTL (default) 24mA (default)
    ~nCSO~ Input PIN_2 1 B1_N0 PIN_2 3.3-V LVTTL (default) 24mA (default)
    <>


    Asi me quedaron asignados los pines

    ResponderEliminar