Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ejemplo. Autómata de Moore: semáforo para cruce de una vía de tren bidireccional con vía
vehicular
Se trata de un semáforo de aviso de paso de tren en un cruce de vía bidireccional con una
carretera; la vía posee, a una distancia adecuadamente grande, detectores de paso de tren a y b;
los trenes circulan por ella en ambas direcciones y se desea que el semáforo señale presencia de
tren desde que alcanza el primer sensor en su dirección de marcha hasta que pasa por el
segundo sensor tras abandonar el cruce.
entity SEMAFORO is
port ( CK, RS, A, B : in std_logic;
SEMF : out std_logic );
end SEMAFORO;
En el ejemplo anterior se ha dado nombre y número binario a los estados mediante la definición
de un tipo mis_estados y la enumeración de los estados y asignación de valores a ellos, a través
de su declaración como constantes.
Otra forma, más breve, que conduce exactamente a la misma declaración de estados y asignación
de valores, es la siguiente:
type mis_estados is (reposo, entra_por_a, entra_por_b, saliendo);
attribute enum_encoding: string;
attribute enum_encoding of mis_estados: type is “00 01 10 11”;
signal estado: mis_estados;
2
También puede hacerse una declaración de estados sin asignar valores, permitiendo que el
compilador efectúe esta asignación (generalmente, si no elegimos otra opción del compilador, los
numera en binario directamente):
Ejemplo. Automáta de Mealy: dos carros con movimiento de ida y vuelta sincronizados
Sean dos carros motorizados que se mueven linealmente, entre dos detectores a y b el primero y
entre c y d el segundo, de forma que, al activar un pulsador P, ambos carritos inician el
movimiento desde a y c y el primero en alcanzar el otro extremo b o d, espera a que el otro
alcance el suyo, para iniciar juntos el movimiento de vuelta.
Un diagrama detallado de este sistema de dos carros puede incluir siete estados (como autómata
de Moore) pero puede ser simplificado dando como resultado el diagrama siguiente (autómata de
Mealy: la necesidad de memoria se limita a distinguir entre dos situaciones, el movimiento de ida
hacia b y d y el de vuelta hacia a y c):
entity CARRITOS is
port ( CK, RS, A, B, C, D, P : in std_logic;
der_1, izq_1, der_2, izq_2 : out std_logic );
end CARRITOS;
case estado is
when vuelta_y_reposo => if (A) = '0' then izq_1 <= '1'; end if;
if (C) = '0' then izq_2 <= '1'; end if;
when ida => if (B) = '0' then der_1 <= '1'; end if;
if (D) = '0' then der_2 <= '1'; end if;
end case;
end process;
end DIAGRAMA;