----------------------------------------------------------------------------------
-- 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;
Que significan las entradas CLC_E y CLC_E2?
ResponderEliminarson para habilitar o des-habilitar el reloj, si se desactivan el programa se queda en pausa,
Eliminarclock enable.
Hola, de casualidad no tienes tu diagrama de estado o algo?
ResponderEliminarNo lo tengo en limpio
EliminarEste comentario ha sido eliminado por el autor.
EliminarAl poner el codigo en el programa me marca esto
EliminarWarning (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
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,...)
EliminarMuchas gracias! me sirvió bastante
Eliminarotra cosa, lo hiciste en físico?
ResponderEliminarSi lo hiciste en físico que otros materiales usaste?
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
EliminarNo entiendo como conectar el lcd
EliminarPara 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.
Eliminarya los conecte, pero no me marca nada en la pantalla, solo se queda encendida
EliminarTal vez los pulsos de configuración no están bien para tu modelo de LCD
Eliminarque tipo de lcd es el que necesito para el codigo entonces?
EliminarNo es que necesites un tipo en especifico, tienes que adaptarlo al hardware que estés usando
EliminarEste comentario ha sido eliminado por el autor.
ResponderEliminary como quedaria el codigo y utulizara dos display
ResponderEliminarCLC_E2 Input PIN_112 2 B2_N0 PIN_112 3.3-V LVTTL (default) 24mA (default)
ResponderEliminarCLOCK 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
Disculpa pero no conozco esa sintaxis
Eliminar