En esta lección y en la siguiente vamos a ver como podemos describir los circuitos secuenciales. Vimos que los circuitos combinacionales podemos describirlos explícitamente mediante la llamada tabla de verdad que especifica la relación entre las entradas y las salidas del circuito simplemente escribiendo todos los casos posibles. En los circuitos secuenciales, cuando se quiere utilizar una descripción funcional explícita se utiliza un grafo de comportamiento. Un grafo de comportamiento es un conjunto de nodos y de arcos, de manera que los nodos representan los estados del circuito y los arcos representan las transiciones entre estados. Por ejemplo, un grafo como este nos está describiendo un circuito que tiene tres estados, Q0, Q1 y Q2, esto ¿qué quiere decir? Quiere decir que en esta memoria, en distintos instantes de tiempo podremos tener almacenada la información Q0, Q1 o Q2. Por supuesto esta información acabará siendo combinaciones de 0s y 1s. Nos está diciendo que el circuito tiene una entrada X que puede tomar los valores 1, 2 y 3, y nos está diciendo que si, por ejemplo, el circuito está en el estado Q0, ¿qué quiere decir? Que en la memoria tengo guardado el código correspondiente a Q0 y por la entrada X me llega por ejemplo un 2, X=2, el circuito pasa al estado Q1, quiere decir, este circuito combinacional genera por las salidas q el código Q1 que en el siguiente ciclo de reloj, en el siguiente flanco de la señal de reloj, recordemos que siempre hay esta señal de sincronización definiendo en qué momento se entra esta información en la memoria, este circuito combinacional generará este código Q1, que en el siguiente flanco de reloj entrará en la memoria y sustituirá el estado que teníamos anteriormente. En este momento estamos en el estado Q1, si por ejemplo por la X nos llega un 3, lo que ocurrirá según el grafo es que el circuito volverá al estado Q0, quiere decir que el circuito combinacional por las salidas q generará el código correspondiente a Q0, que en el siguiente flanco de reloj entrará en la memoria, etc, etc, así sucesivamente. Hemos visto como el grafo de comportamiento nos permite describir la evolución de los estados del circuito; por qué estados pasa el circuito, Pero todavía en el grafo no hemos puesto ninguna información sobre las salidas del circuito. La información sobre las salidas podemos incluirlas de dos maneras, la primera consistiría en asociar las salidas a los estados, es decir, por ejemplo, cuando el circuito está en el estado Q0, la salida Y toma el valor uno. Cuando el circuito está en el estado Q2, la salida toma por ejemplo el valor 1 independientemente del valor de las entradas. Un circuito que se comporte de esta manera se dice que es una máquina de Moore. La segunda posibilidad será asociar las salidas a las combinaciones de estados más entradas, es decir, por ejemplo, cuando estamos en el estado Q0 y me llega un 1, me llega una X=1, en ese momento la salida toma el valor 1. O bien, cuando estoy en el estado Q1 y me llega una entrada 1, 2 o 3, la salida toma el valor 0. Como vemos las salidas están asociadas a un estado más un valor de las entradas. Un circuito que se comporte de esta manera se dice que es una máquina de Mealy. La verdad es que cualquier comportamiento, cualquier circuito puede representarse ya sea por una máquina de Moore o una máquina de Mealy, así que utilizaremos indistintamente una u otra según nos convenga. Vamos a ver ahora un ejemplo de descripción del comportamiento de un circuito utilizando estos grafos. Queremos describir el funcionamiento de un circuito secuencial capaz de controlar el movimiento de un robot-escoba, uno de esos pequeños artilugios que corren por algunas casas recogiendo polvo y desechos del suelo. Vamos a trabajar por supuesto con un robot-escoba muy simplificado, casi ideal. El robot-escoba tiene un único sensor que cuando detecta un obstáculo frente a él genera una senal OB igual a uno. El robot es capaz de avanzar recto, girar a la derecha 90 grados, o girar a la izquierda 90 grados. Y vamos a suponer que se para manualmente accionando un interruptor de manera que nuestro sistema de control no tiene que preocuparse por las señales de puesta en marcha o parada del robot. Simplemente esto es para conseguir un grafo lo más sencillo posible. El sistema que queremos describir debe decidir en función de la entrada OB si el robot debe avanzar, girar a la derecha o girar a la izquierda. Y lo debe decidir en función de esta regla: Cuando el robot detecta un obstáculo, es decir, cuando OB=1, va girando a la derecha hasta que deja de detectar el obstáculo, momento en el cual comienza a avanzar en línea recta. La siguiente vez que se detecta un obstáculo, el robot se pone a girar pero en sentido contrario de como lo hizo anteriormente, es decir, si primero giró a la derecha, ahora girará a la izquierda o viceversa. Queremos describir el funcionamiento de un circuito como este, un circuito que tiene una entrada OB que viene del sensor, que toma el valor 1 cada vez que se detecta un obstáculo delante del robot y dos señales RR y RL tal que si RR=1 el robot gira a la derecha, y si RL=1 el robot gira hacia la izquierda. Si estas dos señales son 0, el robot avanza recto. Lo que todavía no tenemos claro es cuales son estas señales, en el fondo ¿cuántos estados vamos a necesitar? ¿Y de qué nos informará cada uno de estos estados? Bien, razonemos un poco. Decíamos que el estado es lo que nos sirve para recordar la historia pasada del circuito, con lo cual deberíamos preguntarnos ¿de qué necesita acordarse el circuito para decidir como debe de moverse en cada momento? Y debe recordar dos cosas, una, ¿qué estaba haciendo hace un momento? ¿Estaba avanzando o estaba girando? Y si estaba avanzando, la última vez que giró ¿hacia qué lado giró? ¿hacia la derecha o hacia la izquierda? Porque la próxima vez tendrá que girar en sentido contrario. Es decir, podríamos jugar a definir 4 estados, vamos a llamarlos un estado, o dos estados SA que significará "estoy avanzando". El SAR le diréá "estoy avanzando y la última vez que giré, giré hacia la derecha". SAL lo interpretaremos como "estoy avanzando y la última vez que giré, giré hacia la izquierda". Y otros dos estados SRR y SRL que le dirán simplemente al circuito, "estoy girando hacia la derecha" o "estoy girando hacia la izquierda". Estos son los 4 estados que acabamos de describir y esto quiere decir que la memoria podrá guardar cuatro informaciones distintas, SAR, SAL, SRR y SRL. Estas informaciones, como ya hemos dicho más de una vez, al final sólo pueden ser combinaciones de 0s y 1s. Para distinguir entre 4 combinaciones distintas necesitamos 2 bits. Por lo tanto, vamos a necesitar 2 señales q para definir los 4 estados posibles del circuito. Vamos a construir el grafo. Hemos dicho que teníamos 4 estados, SAR, SAL, SSR y SRL. Y vamos a ver, estando en cada uno de los estados, cuando llega por la entrada OB un 0 o un 1, hacia qué estado debe moverse el circuito. Supongamos que estamos en el estado AR, quiere decir, el robot en estos momentos está avanzando y la última vez que giró, giró hacia la derecha. Si no detecta ningún obstáculo, es decir, si OB=0, ha de seguir avanzando y ha de seguir recordando que la última vez que se movió, se movió a la derecha, es decir, tendremos esta situación. En el momento que se detecte un obstáculo el robot ha de empezar a girar, ¿en qué sentido? Pues si la última vez giró a la derecha, ahora ha de girar a la izquierda, es decir, cuando OB=1 pasaremos al estado SRL y nos mantendremos girando hacia la izquierda hasta que desaparezca el obstáculo. Cuando desaparezca el obstáculo, ¿qué ha de hacer? Moverse recto, moverse recto, pero recordad que la última vez que giró, giró hacia la izquierda, es decir, tiene que venir al estado SAL. Mientras no se detecta obstáculo el circuito se queda en este estado, sigue avanzando el robot acordándose que la última vez que giró, giró hacia la izquierda y cuando detecta el obstáculo ha de girar, pero en este caso ha de girar hacia la derecha porque la última vez que giró, lo hizo hacia la izquierda, es decir, OB=1. Y ahora, aquí ya la cosa es muy fácil, se mantiene en este estado girando a la derecha hasta que deja de detectar el obstáculo, momento en el cual se pone a avanzar recto de nuevo, pero recordando que la última vez que giró, giró hacia la derecha. En esta descripción nos falta incluir las salidas, el valor de RR y de RL. Vamos a jugar con una máquina de Moore, por ejemplo. Quiere decir que vamos a asociar las salidas a los estados. Cuando estoy en el estado AR, el robot avanza recto. Avanza recto quiere decir que RR, RL toman el valor 0 cada una de ellas. Si estoy en el estado RL, el robot está girando a la izquierda, es decir, RR debe ser 0, y RL deber ser 1. Si el robot avanza recto aunque recuerde que la última vez que se movió, que giró, giró hacia la izquierda, pues, lo que necesitamos es que avance recto: RR y RL han de ser 0. Y finalmente, si gira a la derecha, RR debe ser 1, y RL debe ser 0. Y ahora ya tenemos completo el grafo de comportamiento de este circuito. Aquí tenéis el grafo que describe este circuito dibujado en limpio. Os dejo un pequeño ejercicio. Como siempre, intentad hacerlo y después comentamos la solución. Lo que queremos es construir un circuito secuencial, describir; construir ya lo veremos más adelante cómo lo haremos, con la parte de circuito combinacional, con las entradas, salidas, el estado actual y el estado siguiente, de forma que: tiene una única entrada, una única salida, y aquí en distintos instantes de tiempo t, t+1, t+2, t+3, van llegando, un conjunto de 1s y 0s, por ejemplo algo como esto. Y el circuito en el instante t lo que mira es cuántos 1s le han llegado, Si es un número impar debe generar un 1 por la salida, y si es un número par genera un 0. En el instante de tiempo t solo le ha llegado un 1. El número de 1s, por lo tanto, es impar, y generaría una salida 1. En t+1 le habría llegado un 0 y un 1, en total un número impar de 1s, por lo tanto generaría un 1. En t+2 le habría llegado un 1, 0, 1, es decir dos 1s, un número par, por lo tanto sacaría un 0. En t+3 le habría llegado un 1 0 1 1, tres 1s, el tres es un número impar, etc. Este es el comportamiento que queremos reflejar. Y la pregunta como siempre es, bueno, ¿cuántos estados necesitamos? Y la pregunta como siempre es, bueno, ¿cuántos estados necesitamos? Y la reflexión otra vez es, ¿de qué tiene que acordarse el circuito para que en función de la entrada que le llega, poder decidir si la salida ha de ser 0 y 1?. Y aquí la respuesta es sencilla. De lo único que debe acordarse es de si el número de 1s que le había llegado hasta ese momento es un número par o un número impar. Esto son 2 estados, vamos a llamarlos Spar y Simpar. Y para codificar dos estados, dos situaciones distintas, necesitamos un solo bit, es decir, que aquí tendremos un único bit. Y ahora ya podemos intentar construir el grafo. Tenemos el estado Spar, el estado Simpar. Vamos a trabajar con una máquina de Moore, de manera que siempre que estemos en el estado Spar la salida será 0, y siempre que estemos en el estado Simpar, la salida será 1. Si estamos en el estado Spar quiere decir que me ha llegado un número par de unos. Si me llega un 0, me mantengo en este estado. Si me llega un 1, puesto que me había llegado un número par y ahora me llega otro 1, tendré un número impar de unos y por lo tanto me iré al estado Simpar. Y aquí, pues exactamente lo mismo. Si me llega un 0, el número de 1s que me habrá llegado seguirá siendo un número impar, y si me llega un 1, puesto que ya me había llegado un número impar de 1s, si me llega otro más tendré un número par de 1s. Y eso es todo. Este es el grafo que representa el circuito, circuito que hemos representado como una máquina de Moore porque hemos asociado las salidas al estado. Para acabar con la lección vamos a hablar de las tablas de estado y las tablas de salida. Las tablas de estado, por cierto, en alguna bibliografía, en algún texto lo encontraréis también referenciado como tablas de transición; es lo mismo, ¿vale?: Bien, es lo mismo, ¿vale?: Bien, todo grafo de comportamiento puede representarse por dos tablas, la TABLA DE ESTADOS y la TABLA DE SALIDAS. La tabla de estados refleja cómo evolucionan los estados, es decir, nos da el estado siguiente en función del estado actual y de las entradas. Y la tabla de salida especifica el valor que toman las salidas. Si estamos en un modelo de Moore, las salidas dependen solo del estado actual, y si estamos en un modelo de Mealy, las salidas dependen del estado actual y de las entradas. Vamos a hacer un ejemplo, el grafo que ya vimos del robot-escoba. La tabla de estados, ¿en qué consistiría?. Pues consistiría en escribir el estado actual, las entradas, que en este caso solo hay una entrada que es OB, y, en función de ambas, decir cuál es el estado siguiente, es decir, empezaríamos a construir la tabla diciendo, si estoy en el estado AR y me llega un 0, me he de quedar en el mismo estado SAR. Si estoy en el estado SAR y me llega un 1, me voy al estado SRL. Si estoy en el estado SRL, por ejemplo, y me llega un 0, me voy al estado SAL. Si estoy en el estado SRL y me llega un 1 me voy a quedar en el mismo estado SRL, etc. Así iríamos rellenando la tabla. Y la tabla de salidas, puesto que esto se trata de un modelo de Moore, lo único que hemos de poner es para cada estado, cuáles son las salidas. Las salidas en este caso serán RR, vamos a ponerlas aquí abajo, RR y RL. este caso serán RR, vamos a ponerlas aquí abajo, RR y RL. Y simplemente la tabla dirá: en el estado SAR, las salidas son 00, en el estado SRL las salidas son 01, en el estado SRR, las salidas son 10 y en el estado SAR, las salidas son 00. Aquí tenéis las dos tablas completas, y os he explicado el concepto de tabla de estado y tablas de salida, porque más adelante veremos que las tablas de estado y las tablas de salida nos permitirán implementar el circuito secuencial con componentes del catálogo que todavía no hemos visto. Esto es prácticamente todo por lo que respecta a esta lección. Os dejo con un par de quizzes. Un comentario, porque el último quiz tenía un poco de truco porque os he puesto un grafo que es una máquina de Mealy, En este caso la tabla de salidas nos ha de dar la salida en función del estado actual y de las entradas. En este caso solo hay una entrada que es la X, nos ha de dar la salida Y. Esto tendríamos que ir diciendo, pues si estoy en el estado Q0, las entradas solo pueden tomar, fijaros, los valores 0 y 1. Si estoy en el estado Q0 y me llega un 0, me voy al estado Q2, esto ahora no me importa, pero la salida asociada es 0. Si estoy en el estado Q0 y me llega un 1, la salida asociada es un 1. Si estoy en el estado Q1, y me llega un 0, bueno, fijaros, si estoy en el estado Q1, tanto si me llega un 0 como si me llega un 1 la salida asociada es 0, etc. Así se iría rellenando esta tabla. Bien, ya como resumen, lo que hemos visto en esta lección es la representación funcional exhaustiva de máquinas secuenciales, hemos definido lo que es un grafo de comportamiento y hemos visto varios ejemplos de cómo construir los grafos de comportamiento, hemos definido los modelos de Moore y de Mealy, en función de las salidas, y hemos visto lo qué son las tablas de estado y las tablas de salida, que serán unas herramientas muy útiles a la hora de sintetizar los circuitos secuenciales con los componentes más básicos que veremos más adelante.