Está en la página 1de 10

Anexo de problemas

Diseo Lgico Facultad de Informtica Diciembre 2003

Este documento contiene dos propuestas de problemas realizados por los alumnos del grupo de valenciano de DLO - Facultad de Informtica.

Thunderbird
Tenemos un Ford Thunderbird con 6 luces traseras que llamaremos L3, L2, L1, R1, R2 y R3. Estn dispuestas de la siguiente forma: L3 L2 L1 R1 R2 R3 (L viene de left y R de right)

Se pretende disear un SSS que encienda o apage cada luz siguiendo unos patrones especficos. Este Ford normalmente tiene las luces apagadas o en reposo. El coche activa una seal LEFT cada vez que detecta un giro del volante a la izquierda, y una seal RIGHT cuando detecta un giro a la derecha. Tanto LEFT y RIGHT son seales activas a nivel alto. Partiendo del estado de reposo, si se activa LEFT el coche ha de comenzar una secuencia de luces de esta forma: 1 2 3 4 L3 a '0' L2 a '0' L1 a '1' R1 a '0' R2 a '0' R3 a '0' L3 a '0' L2 a '1' L1 a '1' R1 a '0' R2 a '0' R3 a '0' L3 a '1' L2 a '1' L1 a '1' R1 a '0' R2 a '0' R3 a '0' L3 a '0' L2 a '0' L1 a '0' R1 a '0' R2 a '0' R3 a '0' (estado de reposo)

Esta secuencia no podr ser interrumpida por la activacin de la seal LEFT o RIGHT. Partiendo del estado de reposo, si se activa RIGHT el coche ha de comenzar otra secuencia de luces as: 1 2 3 4 L3 a '0' L2 a '0' L1 a '0' R1 a '1' R2 a '0' R3 a '0' L3 a '0' L2 a '0' L1 a '0' R1 a '1' R2 a '1' R3 a '0' L3 a '0' L2 a '0' L1 a '0' R1 a '1' R2 a '1' R3 a '1' L3 a '0' L2 a '0' L1 a '0' R1 a '0' R2 a '0' R3 a '0' (estado de reposo)

Esta secuencia tampoco podr ser interrumpida por la activacin de la seal LEFT o RIGHT. Por otra parte, si estando en el estado de reposo detectramos que LEFT y RIGHT se activan simultneamente (prueba de la existencia de algn error), se querra generar una secuencia de parpadeo, que sera as: 1 2 L3 a '1' L2 a '1' L1 a '1' R1 a '1' R2 a '1' R3 a '1' L3 a '0' L2 a '0' L1 a '0' R1 a '0' R2 a '0' R3 a '0' (estado de reposo)

Esta secuencia no podr ser interrumpida por NINGUNA seal del sistema. Finalmente, existe otra seal HAZ, activa a nivel alto, que seala la existencia de algn problema en el automvil. La activacin de HAZ debe generar el comienzo de una secuencia de parpadeo como la descrita anteriormente. Adems, HAZ tendr prioridad sobre las seales LEFT y RIGHT, as que podr interrumpir las secuencias que generan ests ltimas (secuencias de giro a izquierda o a derecha) en cualquier momento. En cambio, HAZ no podr interrumpir una secuencia de parpadeo (no sera de utilidad que pudiera). Se propone disear un autmata de Moore en VHDL que siga este comportamiento y que incluya una seal sncrona de RESET que lleve al estado de reposo (esta seal tendr mxima prioridad). Como consejo para simplificar la implementacin se sugiere codificar los diferentes estados mediante sus cdigos de luces de salida.

Cdigo en VHDL --- Autmata de MOORE que controla las luces traseras de un coche -- FORD Thunderbird. ---- Esta implementacin se sale de lo habitual. Estamos acostumbrados a crear -- dos procesos, uno que controle las transiciones y otro que cambie la salida -- al percibir una transicin. -- En este cdigo se juntan esas dos tareas en un proceso. Se codifica cada -- estado por su salida y se lee la salida a cada flanco de reloj para -- conocer el estado de partida en una transicin. Es una manera ms compacta -- de programar autmatas de Moore de forma comportamental. -library IEEE; use IEEE.std_logic_1164.all; entity Vtbird is --- Declaramos las entradas y salidas necesarias con una particularidad: -- la seal de salida LIGHTS tambin ser leda porque -- contendr en cada instante el estado actual del sistema y, por eso, -- es declarada como buffer. -port ( CLOCK, RESET, LEFT, RIGHT, HAZ: in STD_LOGIC; LIGHTS: buffer STD_LOGIC_VECTOR (1 to 6) ); end; architecture Vtbird_arch of Vtbird is --- Codificamos los estados como constantes que nos sirven, -- a su vez, para conocer la salida del estado. Dicho de otra -- forma igualamos el cdigo de cada estado a la salida del mismo. -- Las diferentes salidas son cadenas de 6 bits que representan el estado -- de las luces traseras. "110000" por ejemplo representa un estado en el -- que estn encendidas las luces izquierdas C y B (luces LC y LB). -constant IDLE: STD_LOGIC_VECTOR (1 to 6) := "000000"; -- Reposo constant L3 : STD_LOGIC_VECTOR (1 to 6) := "111000"; -- Giro a la izquierda 3 constant L2 : STD_LOGIC_VECTOR (1 to 6) := "110000"; -- Giro a la izquierda 2 constant L1 : STD_LOGIC_VECTOR (1 to 6) := "100000"; -- Giro a la izquierda 1 constant R1 : STD_LOGIC_VECTOR (1 to 6) := "000001"; -- Giro a la derecha 1 constant R2 : STD_LOGIC_VECTOR (1 to 6) := "000011"; -- Giro a la derecha 2 constant R3 : STD_LOGIC_VECTOR (1 to 6) := "000111"; -- Giro a la derecha 3

constant LR3 : STD_LOGIC_VECTOR (1 to 6) := "111111"; -- Luces intermitentes begin process (CLOCK) --- Nos fijamos en que el circuito es totalmente sncrono ya que, -- en la lista de activacin del proceso que lo modela, slo est -- la seal del reloj. De esta forma, la entrada de RESET es sncrona. -begin --- De esta lnea sacamos que el circuito trabajo sincronizado con el -- reloj por flanco de subida. -if CLOCK'event and CLOCK = '1' then --- Esta sentencia confirma, por estar anidada respecto a la anterior, -- que la entrada de RESET es sncrona. --- Si la seal de RESET est a '1' ponemos las luces del coche en -- estado IDLE (reposo). -if RESET = '1' then LIGHTS <= IDLE; --- Si la seal de RESET NO est a '1' seguiremos el diagrama de estados. -else --- Segn el estado en el que estemos y la entrada que tengamos, pasaremos -- a un estado o a otro. -case LIGHTS is --- Este es el caso en el que las luces estn en el estado de reposo IDLE. -when IDLE => --- Si HAZ es '1' o las seales LEFT y RIGHT son '1' a la vez, entonces hay algn -- problema en el coche y pasamos al estado LR3 (luces intermitentes). -if HAZ='1' or (LEFT='1' and RIGHT='1') then LIGHTS <= LR3; --- Si lo que pasa es que solamente LEFT est a '1', entonces comienza la -- secuencia de luces de giro a la izquierda con el estado L1 (giro a la -- izquierda 1). -elsif LEFT='1' then LIGHTS <= L1; --- Si lo que pasa es que solamente RIGHT est a '1', entonces comienza la -- secuencia de luces de giro a la derecha con el estado R1 (giro a la -- derecha 1). -elsif RIGHT='1' then LIGHTS <= R1; end if;

--- Este es el caso en el que las luces estn en el estado de giro a la -- izquierda 1, L1. -when L1 => --- Si HAZ es '1' entonces pasamos al estado de luces intermitentes, LR3. -- Ntese que el paso a LR3 tiene prioridad respecto al seguimiento de la -- secuencia de luces de giro. Esto se desea as porque, como ya hemos dicho, -- HAZ a '1' indica que el coche tiene algn problema. -if HAZ='1' then LIGHTS <= LR3; --- Si HAZ es '0' y, por lo tanto, el coche no tiene ningn problema, entonces -- contina la secuencia de luces de giro a la izquierda con el siguiente -- estado de la misma, L2. -else LIGHTS <= L2; end if; --- Este es el caso en el que las luces estn en el estado de giro a la -- izquierda 2, L2. -when L2 => --- Si HAZ es '1', esta transicin tiene prioridad y se ha de pasar al -- estado LR3. -if HAZ='1' then LIGHTS <= LR3; --- Si HAZ es '0', contina la secuencia de luces de giro a la izquierda -- con el siguiente estado de la misma, L3. -else LIGHTS <= L3; end if; --- Este es el caso en el que las luces estn en el estado de giro a la -- izquierda 3, L3. -when L3 => --- Si HAZ es '1', esta transicin tiene prioridad y se ha de pasar al -- estado LR3. -if HAZ='1' then LIGHTS <= LR3; --- Si HAZ es '0', la secuencia de luces de giro a la izquierda ha -- acabado y, por lo tanto, debemos regresar al estado de reposo, IDLE. -else LIGHTS <= IDLE; end if; --- El comportamiento para los estados de giro a la derecha es idntico -- a los de giro a la izquierda. --

when R1

=> if HAZ='1' then LIGHTS <= LR3; else LIGHTS <= R2; end if; when R2 => if HAZ='1' then LIGHTS <= LR3; else LIGHTS <= R3; end if; when R3 => if HAZ='1' then LIGHTS <= LR3; else LIGHTS <= IDLE; end if; --- Este es el caso en el que las luces estn todas encendidas y han -- de parpadear, LR3. Para lograr el parpadeo, hacemos una transicin -- fija hacia el estado de reposo. -when LR3 => LIGHTS <= IDLE; --- Si estamos en otro estado no contemplado como consecuencia de la -- falta de inicializacin del circuito, no realizaremos ninguna -- accin. -when others => null; end case; end if; end if; end process; end Vtbird_arch; --- Comentarios finales: -- * Remarcamos que una vez se inicia una secuencia de luces de giro, -- se ignoran las seales de giro hasta que la secuencia acaba. --

Juego de las adivinanzas


Se quiere construir una mquina que, cambiando contnuamente de estado (entre 4 estados), permita comprobar si su usuario ha adivinado el estado en el que estaba en un instante determinado. Disponemos de 5 LEDs y 5 botones. 4 de los botones los denominaremos G1, G2, G3 y G4 y cada uno de ellos se asociar a un estado de la mquina. 4 LEDs sern denominados L1, L2, L3 y L4 y cada uno de ellos corresponder al mismo estado al que se asocia G1, G2, G3 y G4 respectivamente. El ltimo LED ser ERR y su activacin nos dir que hemos fallado la adivinanza. El ltimo botn ser RESET y har que la mquina apage todas las luces. La mquina comenzar con todas las luces apagadas y, si no hay ningn botn pulsado, comenzar a cambiar de estado encendiendo su respectivo LED al mismo tiempo (cambiar entre 4 estados cclicamente): X - L1 - L2 - L3 - L4 - L1 - - - ( 'Li' representa al estado que enciende el LED 'Li' y X representa al estado de reposo con todas las luces apagadas). El usuario intentar adivinar el estado actual de la mquina pulsando sobre el botn correspondiente al mismo (la dificultad estribar en la velocidad de la mquina para cambiar de estado). Si acierta la adivinanza, todos los LEDs se apagarn y la mquina esperar hasta que ningn botn est pulsado para volver a cambiar de estado. Si falla la adivinanza, L1, L2, L3 y L4 se apagarn, pero ERR se encender y la mquina esperar hasta que ningn botn est pulsado para volver a cambiar de estado, esto es: ERR - ... - ERR - L1 - L2 - - - (ERR representa al estado que enciende el LED ERR). Se propone disear un autmata de Moore (las especificaciones se han hecho de forma acorde a este tipo de autmata) en VHDL que siga este comportamiento. Como consejo para simplificar la implementacin se sugiere el uso de asignaciones concurrentes condicionales para las seales de salida (os ahorraris un proceso).

Cdigo en VHDL --- Juego de las Adivinanzas - Sistema Secuencial Sncrono --- Describiremos el comportamiento del sistema secuencial sncrono -- a partir de su cdigo en vhdl. -library IEEE; use IEEE.std_logic_1164.all; entity Vggame is --- Se declaran una seal de reloj, otra de inicializacin y otras 4 -- seales ms de entrada numeradas. Tambin se declaran 4 seales -- de salida numeradas igualmente que las 4 seales de entrada -- anteriores. Finalmente, se define una seal de salida ERR que -- suponemos marcar algn tipo de "error". -port ( CLOCK, RESET, G1, G2, G3, G4: in STD_LOGIC; L1, L2, L3, L4, ERR: out STD_LOGIC ); end; architecture Vggame_arch of Vggame is --- Se define un tipo enumerado que contendr los distintos estados -- posibles del sistema. -type Sreg_type is (S1, S2, S3, S4, SOK, SERR); --- Se declara una seal auxiliar Sreg. -signal Sreg: Sreg_type; begin process (CLOCK) begin --- Esta lnea nos indica que el sistema funcionar sincronizado por -- flanco de subida del reloj. -if CLOCK'event and CLOCK = '1' then --- El hecho de que se compruebe la seal RESET despus del flanco de -- de subida nos indica que la inicializacin del sistema es sncrona. -- Por otra parte, la inicializacin supone la asignacin a la seal -- auxiliar Sreg del estado SOK. As, vemos que Sreg es la seal que -- guarda el estado actual en todo momento. -if RESET = '1' then Sreg <= SOK; --- Si no ha habido inicializacin tendremos que hacer que el sistema -- haga transiciones con normalidad segn su diagrama de estados, que -- no conocemos. -else

case Sreg is --- Si estamos en el estado S1... -when S1 => --- Si G2 o G3 o G4 se ponen a '1' pasamos al estado de error. -if G2='1' or G3='1' or G4='1' then Sreg <= SERR; --- Si G2, G3 y G4 estn a '0' y G1 est a '1' pasamos al estado -- SOK, que por eliminacin debe ser una estado de 'correcto' o -- 'no error'. -elsif G1='1' then Sreg <= SOK; --- Si G1, G2, G3, G4 estn a '0' entonces pasamos al estado S2. -else Sreg <= S2; end if; --- El comportamiento para los siguientes estados parece anlogo al -- anterior. Partiendo de un estado 'Si' si se activa alguna seal -- 'Gk' tal que k != i entonces debemos pasar al estado de error -- SERR. Si, por el contrario, solamente se activa la seal 'Gi' -- pasamos al estado de 'correcto', SOK. Y, finalmente, si no se -- activa ninguna seal 'Gk' tal que 0 < k < 5, debemos pasar al -- estado 'S((i+1) % 4)' (es una sucesin de estados cclica). -when S2 => if G1='1' or G3='1' or G4='1' then Sreg <= SERR; elsif G1='1' then Sreg <= SOK; else Sreg <= S3; end if; when S3 => if G1='1' or G2='1' or G4='1' then Sreg <= SERR; elsif G1='1' then Sreg <= SOK; else Sreg <= S4; end if; when S4 => if G1='1' or G2='1' or G3='1' then Sreg <= SERR; elsif G1='1' then Sreg <= SOK; else Sreg <= S1; end if; --- Estos dos estados son interesantes. Si nos encontramos en SOK o SERR -- no cambiaremos de estado a menos que todas las seales 'Gi' estn a -- '0'. Si se cumplen las condiciones se pasa al estado S1 y, si no, -- no hacemos nada, permaneciendo en el mismo estado SOK o SERR. -when SOK | SERR => if G1='0' and G2='0' and G3='0' and G4='0' then Sreg <= S1; end if; --- Finalmente, si el estado actual no est contemplado dentro de los que -- hemos definido, haremos una transicin al estado S1. -when others => Sreg <= S1; end case; end if; end if;

end process; -----------Esta parte resulta interesante. Son 5 asignaciones concurrentes y condicionales. La salida 'Li' estar a '1' solamente si la seal 'Sreg' contiene el estado 'Si', en caso contrario 'Li' estar a '0'. Por otra parte la salida 'ERR' estar a '1' slo cuando la seal 'Sreg' contenga el estado 'SERR'. De estas lneas podemos extraer que la salida slo depende del estado de 'Sreg' que contiene el estado actual del circuito en cada momento. Por ello, el sistema es un autmata de Moore. L1 L2 L3 L4 ERR <= <= <= <= <= '1' '1' '1' '1' '1' when when when when when Sreg Sreg Sreg Sreg Sreg = = = = = S1 S2 S3 S4 SERR else else else else else '0'; '0'; '0'; '0'; '0';

end Vggame_arch; Anlisis Supongamos que las seales de salida L1, L2, L3, L4 y ERR son unos leds que se encienden en estado '1' y se apagan en estado '0'. Supongamos tambin que las entradas RESET, G1, G2, G3 y G4 son unos botones que al ser pulsados se ponen a '1'. El comportamiento del autmata es el siguiente: - Partiendo de un estado indeterminado se pulsa el RESET quedndose el autmata en estado SOK hasta que no se suelta el botn. - Partiendo de SOK, si no pulsamos ningn botn, el autmata ir pasando a cada pulso de reloj de estado SOK-S1-S2-S3-S4-S1... haciendo que veamos la secuencia de luces(X representar a todas las luces apagadas y 'Li' representar a todas las luces apagadas menos la 'Li') X-L1-L2-L3L4-L1. - Si pulsamos el botn 'Gi' justo cuando el estado del sistema es 'Si' y por lo tanto justo cuando el led 'Li' est encendido, entonces pasaremos al estado SOK en el que las luces estn todas apagadas. En cambio, si pulsamos 'Gi' cuando el estado del sistema es 'Sk' con k != i, entonces pasamos al estado SERR, en el que se enciende nicamente la luz ERR. - En los estados SOK y SERR si mantenemos pulsado cualquier botn permaneceremos en el estado de partida. En conclusin, el sistema es una especie de juego de sincronizacin. Si viendo las salidas, eres capaz de excitar la entrada correspondiente al estado actual del sistema, entonces aciertas y todas las luces se apagan. Si no aciertas, la luz de error 'ERR' se enciende.

También podría gustarte