Buscar este blog

sábado, 6 de junio de 2015

Semaforo con VHDL

------------------------------------------------------------------------------------------------------------
-- Practica 5
-- Diseñe el codigo VHDL del programa que resuelva el problema del punto 1.
--
------------------------------------------------------------------------------------------------------------
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 SEMAFORO is
    Port ( X, clock, R, CLC_E, CLC_E2: in  STD_LOGIC;
           Z : OUT STD_LOGIC_VECTOR(5 DOWNTO 0);
 SALIDA: out  STD_LOGIC );
end SEMAFORO;

architecture  FUNCION of  SEMAFORO is
type Estados is (S0, S1, S2, S3);
signal ED_ACTUAL, ED_SIGUIENTE :ESTADOS;
signal temporal : STD_LOGIC;
signal contador: integer range 0 to 100000000:=0;
signal contador2: integer range 0 to 300000000:=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 <="100001";
IF (X='0')THEN
ED_SIGUIENTE <=S0;
ELSE
ED_SIGUIENTE <=S1;
END IF;

WHEN S1 => Z <="001100";

process(clock)
begin
if (rising_edge(clock) and CLC_E='0') then
if(contador2 = 300000000) then
contador2 <= 0;
ED_SIGUIENTE <=S0;
else
contador2<=contador2+1;
if(contador2 = 100000000) then
Z <="001010";
end if;
end if;
end if;
end process;

END CASE;
END PROCESS;
END FUNCION;

1 comentario:

  1. sabes cuando lo pruebo me sale error con los if y que no fue declarado la ultima linea Funcion

    ResponderEliminar