Skip to content

Autómatas

Juan Gonzalez-Gomez edited this page Sep 5, 2024 · 540 revisions

Descripción

Implementación de autómatas a partir de su diagrama de estado, siguiendo unas sencillas reglas. Estudiamos su funcionamiento, sus fundamentos y su implementación

  • Icestudio: Todos los ejemplos se han probado con Icestudio-0.12. Usa esta versión o superior
  • Ejemplos: Todos los ejemplos de este cuaderno técnico están accesibles en su repositorio en github

Contenido

Introducción

El comportamiento de los circuitos lo podemos expresar verbalmente. Por ejemplo, el funcionamiento de la unidad de control del procesador Símplez [1], diseñado por el profesor Gregorio Férnández, se puede describir así:

"Inicialmente se accede a memoria para leer la instrucción. En el siguiente ciclo se decodifica. Si se trata de las instrucciones CLR, DEC, BR o BZ, se ejecutan y se vuelve al estado inicial, para leer la siguiente instrucción. Si es la instrucción HALT, se queda en este estado, para que todo se pare. Si es alguna de las instrucciones LD, ST, o ADD entonces hay que acceder de nuevo a memoria para completar su ejecución. En el siguiente ciclo se prepara este acceso a memoria y en el siguiente se completa la operación. Por último se vuelve al estado inicial"

Sin embargo, este comportamiento se describe de manera muy compacta usando un diagrama de estados (también llamado diagrama de transiciones). En el caso del procesador simplez lo encontramos en el apartado 10.4 Modelo procesal de Simplez (página 285) del libro Conceptos básicos de arquitectura y sistemas operativos [1]:

Además de describir el coportamiento de circuitos complejos, los diagramas de estado se pueden convertir directamente en circuitos, aplicando unas reglas sencillas que aprenderemos en el apartado Reglas de implementación de Autómatas

¡¡Esto nos da un enorme poder!! Los circuitos que diseñemos a partir de estos diagramas son más complejos, y nos permiten hacer más cosas. Pero lo más importante es que quedarán perfectamente documentados para que otros los puedan entender y modificar

Unidades de control

Cuando hacemos un diseño complejo de un circuito, como por ejemplo un procesador, hay una parte conocida como unidad de control. Se trata de un sub-circuito encargado de generar todas las señales de gobierno (microórdenes) de nuestro procesador a partir de unas señales de entrada. En el caso de los procesadores, la unidad de control recibe como entrada el código de operación de la instrucción (qué instrucción hay que ejecutar) y alguna otra señal de estado, y produce como salidas las microórdenes que gobiernan la ruta de datos

Pero estas unidades de control no son sólo para lo procesadores. Pueden ser para cualquier otro circuito. Los denominamos controladores

Ciertas señales del circuito a controlador las lee el controlador por sus entradas. Esto hace que el autómata evolucione entre los estados y genere unas señales de salida que actúan sobre el circuito a controlar (típicamente llamado la ruta de datos)

Diagramas de estado

Crear los diagramas de estados que describen el comportamiento de un controlador requiere de un poco de práctica, y es algo que se aprender viendo cómo otros diseñadores los han creado. Y sobre todo, practicando mucho. En este cuaderno técnico nos centramos en cómo se implementan los controladores, suponiendo que alguién ya ha diseño los diagramas de estado

En este apartado nos vamos a centrar en la descripción de estos diagramas, mostrando los diferentes elementos que lo componen y la nomenclatura que usaremos

Hay 4 elementos: Estados, transiciones, entradas y salidas

Para describirlos vamos a utilizar este diagrama de ejemplo:

Este diagrama de estados describe el comportamiento de este controlador de ejemplo, que tiene 2 entradas (además del reloj) y 2 salidas

Estados

Los estados representan una situación concreta del controlador. Por ejemplo: estar en reposo, esperando a que se active una señal, transmitiendo datos, recibiendo datos, accediendo a memoria... En un estado habrá ciertas señales activadas y otras no

Es importante resaltar la idea de que el circuito SOLO PUEDE ESTAR en un estado cada vez. Diremos que es el estado activo. Cuando el circuito está en un cierto estado (por ejemplo en reposo), NO estará en el resto de estados. Es decir, que el resto de estados están desactivados. Esta idea es muy obvia, pero muy importante. Si pensamos en un circuito que haga parpadear un LED, lo podemos descomponer en 2 estados: led encendido y led apagado. El circuito bien está en el estado encendido, o bien en el apagado, ¡¡PERO NO EN AMBOS!! (Salvo que se trate de un LED de Schrödinger, que puede estar encendido y apagado a la vez! 🤣️🤣️🤣️)

(Nota: Imagen generada con IA)

Los estados de un circuito los define el diseñador. La capacidad para descomponer el comportamiento de un circuito en estos estados discretos se adquiere con la práctica. Inicialmente uno está muy perdido. Pero a base de ver otros diseños, y cómo otros diseñadores lo han descompuesto en determinados estados, se aprende y se aquiere intuición sobre cómo obtener estos estados.

La descomposición del comportamiento de un circuito en estados NO ES UNICA. Unos diseñadores lo harán de una forma, otros de otra. De todas las descomposiciones unas serán más óptimas, otras más sencillas...

Los estados se representan mediante círculos. El diagrama de estados de ejemplo de esta sección tiene 3 estados: por tanto hay 3 círculos

Cada estado tiene un identificador, que en este cuaderno técnico será de la forma Ex donde x es un número. En nuestro ejemplo tenemos 3 estados, cuyos identificadores son E0, E1 y E2. El estado E0 será siempre EL ESTADO INICIAL: Al arrancar el circuito, el estado inicial es en el que se encuentre nuestro circuito

Además del identificador de Estado, a cada estado le ponemos un nombre descriptivo, para saber más fácilmente qué significa el que el circuito esté en ese estado. Por ejemplo, en muchos diagramas el estado inicial se denomina Reposo, ya que en ese estado el circuito está sin hacer nada, a la espera de recibir la señal de arranque

Es el diseñador que ha creado el diagrama el que define los nombres, ya que es él el que sabe cómo funciona. En el ejemplo anterior tenemos el estado inicial de Reposo, y dos estados llamados LED1 y LED2, que se corresponden con la activación de los respectivos LEDs. En el estado LED1 será el LED1 el que esté encendido, mientras que en el estado LED2 será el LED2

Entradas

Las entradas del autómata son las señales a las que el circuito es sensible. Cuando se activan sus entradas, el autómata puede evolucionar (cambiar de estado). Estas entradas NO tienen por qué ser sólo entradas externas, sino cualquier señal otra señal internal proveniente de otra parte del circuito

En el diagrama de ejemplo hay en total 2 entradas: SW1 y SW2, que son externas (los pulsadores). Una de ellas, SW1, se utiliza dos veces

Transiciones

Las transiciones son las evoluciones del autómata de un estado al siguiente. Están causadas bien por la activación de alguna de sus entradas, o bien por que ha transcurrido un ciclo del reloj del sistema en otros casos

En el diagrama de estados las transiciones se dibujan como flechas que parten de un estado origen hacia un estado destino. Esta transición se produce cuando se activa la entrada indicada en la flecha. Si NO hay entrada asociada, significa que la transición se realiza en el siguiente ciclo de reloj tras alcanzar el estado origen

En el diagrama de ejemplo hay 4 transiciones. Dos de ellas provocadas por la entrada SW1, una por la SW2 y otra en el siguiente ciclo de reloj

Las transiciones las identificamos usando la letra T seguida del número del estado original y del número del estado destigno. En el ejemplo anterior, los 4 identificadores de transiciones son:

  • T01: Transición entre el estado E0 y el E1. Se produce cuando el autómata está en el estado E0 y se activa la entrada SW1
  • T10: Transición entre el estado E1 y el E0. Se produce cuando el autómata está en el estado E1 y se activa la entrada SW1
  • T02: Transición entre el estado E0 y el E2. Se produce cuando el autómata está en el estado E0 y se activa la entrada SW2
  • T21: Transición entre el estado E2 y el E1. Se produce cuando el autómata está en el estado E2 y transcurre un ciclo de reloj del sistema

Al hablar de una transición hay en realidad dos aspectos a tener en cuenta:

  1. El camino de la transición: Desde qué estado se parte, y cuál es el estado destino. Cuando nos referimos sólo al camino usamos la notación Exy, donde x es el número de estado origenl e y el número de estado destino. Así por ejemplo, en camino de la transición lo denotamos como E01. Este será el identificador que usaremos para las conexiones en caso de usar etiquetas en nuestro circuito

  2. La condición que provoca la transición. Por ejemplo, cuando escribimos T01 nos referimos a la condición de transición que nos dice que "Si estamos en el estado E0 y se activa la entrada correspondiente, entonces la transición se produce, siguiendo el camino E01"

Salidas

Las salidas del autómata son las que se usan para actuar sobre el resto de circuitos (ruta de datos). Se obtienen a partir de los estados, o de los estados y las entradas. En algunos diagramas, en los que la salida sólo depende del estado, su valor se escribe dentro del propio círculo de estado. En otros autómatas se escriben en la transición si depedenden del estado y de la entrada

Los autómatas que tienen salidas que sólo depeden del estado se denominan autómatas de Moore, mientras que los que generan las salidas a partir del estado y la entrada se llaman autómatas de Mealy. En este cuaderno técnico no entraremos en esos detalles. Nos centraremos en aplicar la intución

El diagrama de estado del ejemplo representa un autómata de Moore. Las salidas NO se indican explícitamente, pero por el contexto sabemos que hay 2: una para cada LED. En el restado de reposo ambos LEDs están apagados. En el estado E1 se activa la salida del LED1 y el LED2 apagado. En el estado E2 se enciende el LED2 y se apaga el LED1

Reglas de implementación de autómatas

A partir de un diagrama de estados aprenderemos a construir el controlador siguiendo unas reglas sencillas. Estos controladores NO ESTÁN OPTIMIZADOS. Esto significa que la implementación NO es la que utiliza menos recursos (biestables). PERO por contra su implementación es MUY SENCILLA

Crear controladores de manera sencilla a partir de su diagrama de estado nos permite desarrollar la intución y aprender más rápido. Una vez que se tiene un controlador diseñado y funcionando, la siguiente fase será optimizarlo para que haga lo mismo consumiendo menos recursos. Pero eso NO lo veremos en este cuaderno técnico. Vamos a centrarnos en aprender, practicar y desarrollar la intuición

El proceso de implementación del diagrama de estados se ha dividido en 15 reglas. PERO ¡no hay que asustarse!. Puede que parezcan muchas, pero con la práctica y los ejemplos veremos que son muy intutitivas y que no hace falta memorizarlas. Al final se pueden resumir en muy pocos casos

Las reglas de diseño son las siguientes. Para aprenderlas puedes pasar directamente a los apartados Autómatas de 2 estados y Autómatas de 3 estado, si quieres, donde se aplican a ejemplos sencillos

Regla 1: Estado ➡️ Biestable D

Cada uno de los estados se implementa con un Biestable D con entrada de LOAD. Si tenemos N estados, usaremos en total N Biestables

Aquí es donde vemos que el autómata generado NO está optimizado. Si por ejemplo tuviésemos un autómata con 32 estados, necesitaríamos 32 biestables, uno por cada estado. En una implementación optimizada ¡¡sólo necesitaríamos 5 Biestables!!

Pero para autómatas con pocos estados, hay poco ahorro y se gana mucho en simplicidad

Regla 2: Inicialización de Biestables (one-hot!)

El biestable del estado inicial (E0) se inicializa a 1. El resto de biestables se inicializan a 0. Es muy importante que se cumpla que sólo haya un biestable a 1 y el resto a 0. Esto es por la propia definición de autómata: Sólo pueden estar en un único estado en cada instante de tiempo (Y NO en dos o más, porque no son autómatas de SChrödinger)

Como sólo hay un biestable a 1 y el resto a 0, en realidad lo que estamos haciendo es ¡¡Utilizar codificación one-hot!! para implementar los autómatas

Regla 3: Next ➡️ Load

TODOS los biestables D tiene LA MISMA señal por su entrada LOAD. Típicamente usaremos la etiqueta Next como señal conectada a la entrada LOAD de los biestables. Tener la misma señal garantiza que TODOS los biestables se actualizan a la vez

Regla 4: Etiquetar los estados

Colocar la etiqueta Ex a la salida del biestable del estado x. Tendremos una etiqueta para cada estado (biestable): E0, E1, E2... Esto nos permitirá referenciar los estados en otras partes del circuito. Recuerda que las etiquetas son en realidad cables

En nuestro circuito puede ocurrir que no se utilicen todas las etiquetas. Sin embargo es una buena práctica colocarlas, para que sirva de documentación

Regla 5: Transiciones de salida

Esta regla se usa para conectar las salidas de los Biestables D

Si del estado Ex salen más de una transición, entonces hay que añadir a la salida demultiplexores 1-2 en cascada. En la figura se muestra el esquema general, en la que hay N transiciones. Por lo que se necesitarán N-1 demultiplexores 1-2 conectados en cascada

En esta figura se muestra un caso particular de 3 transiciones, por lo que se necesitan 2 demultiplexores. Sólo se usan 2 entradas, a y b que van a la selección de los multiplexores. La entrada c NO hay que añadirla porque es la que se produce si no se han activado ni a ni b (las transiciones son mutuamente excluyentes)

Por las salidas de los demultiplexores ponemos las etiquetas que definen el camino al siguiente estado: Exa, Exb y Exc

En esta figura se muestra otro caso particula de 2 transiciones, por lo que se necesita sólo 1 demultiplexor. Ahora sólo se conecta a a la entrada de selección del demultiplexor, y las etiquetas de los caminos a los siguientes estados Exa y Exb

Por último el caso más sencillo: una única transición. Si del estado Ex sale una única transición al estado Ey, NO HAY QUE HACER NADA, ya que ya tenemos la salida del biestable D conectada a la etiqueta Ex

Regla 6: Transiciones de entrada

Esta regla se usa para conectar la entrada de datos de los Biestables D

  • Si al estado Ex NO le llega ningúna transición, conectamos su entrada a 0

  • Si al estado Ex sólo le llega una única transición, procedente del estado Ey, conectamos la etiqueta Ey a su entrada de datos

  • Si al estado Ex le llegan dos o más transiciones (N), procedentes de los estados E1, E2...EN, utilizamos una puerta OR de N entradas para combinar todas las entradas en una, que es la que se conecta a su entrada de datos. Usamos las etiquetas de camino como entrada de esta or (E1x, E2x...ENx)

Alternativamente se podrían conectar N-1 puertas OR de 2 entradas. Sería totalmente equivalente

Regla 7: Condiciones de transición

Esta regla se usa para generar las condiciones de transición entre los estados, que usaremos en la siguiente regla para generar la señal Next que hacer que los Biestables cambien de estado

  • Si existe la transición Txy al activarse la entrada a, generamos la etiqueta Txy mediante la operación AND entre Ex y la señal de entrada a. Esto lo hacemos para TODAS las transiciones asociadas a una entrada:

  • Si existe la transición Txy sin entrada asociada (funciona por ciclo), generamos la etiqueta Txy asignándole directamente la etiqueta Ex

Regla 8: Generación de la señal Next

La señal Next que llega a la entrada load de todos los biestables se genera aplicando la operación OR a TODAS las condiciones de transicion (Txy, Tzw...). Habrá una entrada en la OR por cada transición (o se colocan N-1 puertas OR en cascada si hay N transiciones)

Si sólo hay 1 transición, se conecta directamente a la señal Next

Regla 9: Señales de salida

Las señales de salida se pueden obtener bien del estado (Autómatas de Moore) o bien de las transiciones (Autómatas de Mealy)

Regla 10: ¡Comprobación!

¡Ya tenemos el circuito Listo! Ahora toca probarlo para comprobar que funciona, y depurarlo en caso de no funcionar. ¡Cuidado con los nombres de las etiquetas! Si cambiamos el nombre por error, no funcionará correctamente

El circuito está formado por dos partes:

  • Circuito de estado: Es el que tiene los Biestables D interconectados
  • Circuito de transiciones: Es el que calcula las condiciones de las transiciones y genera la señal Next

En los siguiente apartados veremos ejemplos de aplicación de estas reglas, partiendo de ejemplos muy sencillos

Autómatas de 2 estados

El autómata más sencillo posible es el que tiene al menos 2 estados. Nos sirve para describir circuitos que puedan estar en dos estados diferentes: Encendido/Apagado, Derecha/Izquierda, En espera/funcionando...

Una transición

Comenzamos por los autómatas de 2 estados con una única transición.

Ejemplo 1: LED off / on

Este es el diagrama de estados que representa el encendido de un LED. Inicialmente el LED está apagado (Estado E0: OFF). Al apretar el pulsador sw1 se pasa al estado de encendido (E1), y se permanece ahí indefinidamente (Da igual que se apriete el pulsador de nuevo, no tiene efecto). La única manera para inicializar el circuito es apretar el pulsador de reset

Aplicando las reglas, obtenemos el circuito. Como es el primer ejemplo, vamos a ir construyéndolo paso a paso. Eso nos permitirá asimilar más fácilmente las reglas

Empezamos por la regla 1. Como este autómata tiene 2 estados, utilizamos 2 Biestables D con entrada de load, uno para cada estado

Inicializamos los biestables según la regla 2. El correspondiente al estado E0 debe estar activo (1) mientras que el resto a 0. Escribimos el nombre del estado encima del Biestable para identificarlo

Con la regla 3 añadimos la etiqueta Next a la entrada load de TODOS los Biestables D, para garantizar que todos cambian a la vez. Aprovechamos para añadir la conexión del reloj del sistema (que en Icestudio se hace automáticamente). Este reloj SIEMPRE llega a todos los elementos secuenciales de nuestros diseños

Aplicamos la regla 4. Colocamos las etiquetas a las salidas de los biestables, para conectarlos más adelante con el resto del circuito

Ahora nos fijamos en las salidas de los estados, en el diagrama. Del estado E0 sale una transición. Del estado E1 No sale ninguna transición. Según la regla 5 No hay nada que conectar (Con 1 transición la regla 5 NO aplica)

Vamos a por la regla 6. Nos fijamos en las transiciones que llegan a cada estado. Al estado E0 NO LE LLEGA ninguna transición, por lo que su entrada la ponemos a 0. Al estado E1 le llega una transición proveniente del E0, por lo que su entrada la conectamos a E0. Esta conexión se puede hacer mediante etiquetas, o directamente tirando un cable. Uso esa segunda opción

Ya tenemos el circuito de estado terminado. Llega el turno de las transiciones. Aplicamos la regla 7. Sólo hay una única transición, que va del estado E0 hacia el E1. Esta transición la denotamos como T01. Se realiza la operación AND entre el estado de origen E0 y la entrada que genera esa transición SW1

La lectura de este circuito es: "Si el autómata está en el estado E0 y se activa la entrada SW1, se activa la transición T01"

Ahora aplicamos la regla 8. Nos dice que la generación de la señal Next se debe hacer mediante una operación OR de todas las transiciones que haya. Como en este caso sólo hay 1 transición, no hace falta poner la OR. Se conecta la señal Next directamente a la señal T01

Aplicamos la regla 9: obtener las salidas. Este circuito tiene una única salida, conectada al LED D0. El estado del LED lo determina el estado E1. En cuanto se activa E1 hay que encender el LED. Por ello conectamos la etiqueta E1 al LED (Es un autómata de Moore)

¡Ya tenemos el circuito terminado! Ahora lo pasamos a Icestudio. Como la etiqueta T01 no la estamos utilizando en otras partes del circuito, la eliminamos. Y conectamos la salida de la transición directamente a Next

(Ej1-LED-off-on.ice)

Nos falta lo más importante: la regla 10. ¡Es necesario probarlo y comprobar que funciona!. En caso de no funcionar, hay que repasar los nombres de las etiquetas, por si hay alguna errata. En este vídeo de Youtube vemos el funcionamiento:

Click to see the youtube video

Efectivamente, al apretar SW1 se enciende el LED, y ya no hace nada más. El circuito se queda en ese estado indefinidamente, hasta que se reinicie la placa

Ejemplo 2: Escalón

En este ejemplo se genera la función escalón, que está a 0 en el ciclo 0 y luego se pone a 1 indefinidamente. En esta figura se muestra la señal escalón a generar:

El diagrama de estados es similar al del ejemplo 1, pero la única transición que hay ahora NO está asociada a una entrada, sino que se produce en el siguiente ciclo desde que E0 está activo. Es una transición automática

Al arrancar, el autómata se encuentra en el estado inicial de reposo (ciclo 0). En el siguiente ciclo se realiza una transición al estado E1, lo que hace que se active la señal de salida (que en el estado anterior estaba a 0)

Implementamos el circuito aplicando las reglas. Las reglas 1-4 hacen referencia al estado, y las podemos aplicar todas de golpe fácilmente. Además, al ser un diagrama de 2 estados, su aplicación es exactamente igual que en el ejemplo 1

La regla 5 ya se cumple. La reglas 6 se aplica exactamente igual que en el ejemplo 1. Al estado E0 no le llega ninguna transición, por lo que lo conectamos a 0 por su entrada. Al estado E1 sólo le llega una transición proveniente del estado E0

Aplicamos la regla 7 para la condición de transición

La etiqueta T01 se genera directametne conectándola a la E0

Aplicamos la regla 8 para generar la señal Next. La conectamos también directamente a la E0

La señal de salida se obtiene de E1 (Regla 9), pero ahora no se lleva a un LED (aunque se podría, por supuesto). Es mejor llevarla al LEDOSCOPIO para medirla y comprobar que es efectivamente una función escalón

Este es el circuito final. La etiqueta T01 se ha eliminado, porque no se usa. La etiqueta E0 se conecta a Next. En Icestudio 0.12 no está permitido conectar directamente etiquetas entre sí. Por eso se utiliza el bloque wire (de la colección icewires), que representa un cable

(Ej2-escalon.ice)

Este es el resultado. Observamos en el LEDOSCOPIO que efectivamente la señal generada es el escalón: está a 0 en el ciclo 0 y se pone a 1en el resto de ciclos. Por eso vemos el LED0 apagado y el resto de LEDs, 1-7 encendidos

¡¡El autómata funciona!! (Regla 10)

Dos transiciones

Seguimos con ejemplos sencillos de 2 estados. Añadimos una transición más. Ahora tenemos autómatas con 2 estados y 2 transiciones

Ejemplo 3: LED on / off

En este ejemplo se controla un LED con los pulsadores SW1 y SW2. Con el pulsador SW1 se enciende el LED. Con el pulsador SW2 se apaga. El LED sólo se enciende si antes estaba apagado. Es decir, que si ya está encendido y se aprieta el pulsador SW1 el autómata permanece en el mismo estado. Lo mismo al apagarlo. Si el LED ya está apagado, y se pulsa SW2, se queda en el mismo estado

Este es el diagrama de estados:

Aplicamos directamente las reglas 1-4. El resultado es el mismo que en los ejemplos anteriores, ya que es un autómata de 2 estados

A cada estado sólo le llega una única transición. Por tanto, al aplicar la regla 6 tenemos que E1 entra en el primer biestable y E0 en el segundo. Podemos usar cables o etiquetas. En este ejemplo uso un cable para conectar del biestable primero al segundo, y una etiqueta para conectar el segundo con el primer

Con la regla 7 generamos las condiciones de las transiciones: etiquetas T01 y T10. Como hay 2 transiciones, necesitamos 2 puertas AND

Aplicamos la regla 8 para generar la señal Next. Como hay 2 transiciones, se necesita una puerta OR

Por último añadimos las salidas (Regla 9):

Este es el circuito final en Icestudio. Las etiquetas T01 y T10 no se usan para generar las salidas, por lo que se podrían sustituir por cables. Sin embargo he preferido en este ejemplo dejarlas

(Ej3-LED-on-off.ice)

En este vídeo de Youtube vemos el funcionamiento:

Click to see the youtube video

Ejemplo 4: Pulso de 1 ciclo (tic)

En este ejemplo se genera un pulso de 1 ciclo de anchura (lo llamamos tic) cuándo se aprieta el pulsador SW1. Este es el diagrama de estados:

Inicialmente el autómata está en el estado de reposo (IDLE). Al activar la entrada SW1 el autómata transita al estado PULSO donde pone a 1 la señal de salida. En el siguiente ciclo de reloj vuelve al estado inicial de reposo

Este es el circuito de las transiciones y de la generación de la señal Next (Reglas 7 y 8)

Este es el circuito final. La etiqueta T10 se ha sustituido por un cable. La señal de salida es la del estado PULSO (E1). Para resaltar que es una salida se saca por la etiqueta Pulso. La medición se realiza con el Analizador lógico iceRok

(Ej4-Pulso-tic.ice)

Esta es la salida que obtenemos. Se visualiza con el PulseView:

Comprobamos que efectivamente se ha generado la señal Pulso, que tiene 1 ciclo de anchura

Ejemplo 5: Divisor entre 2: señal de 6Mhz

Ya hemos visto en otros cuadernos técnicos cómo hacer un divisor entre 2, para obtener una señal de 6Mhz (ya que la señal del sistema de la Alhambra-II es de 12Mhz). En este ejemplo veremos cómo crear uno basado en un autómata, para aprender a convertirlo a un circuito

El autómata tiene 2 estados alternantes: ciclo 0 y ciclo 1. En el primero la señal se pone a 0 y en el segundo a 1. La señal generada tiene 2 ciclos de periodo, el doble de la señal del sistema. O lo que es lo mismo, la mitad de la frecuencia

Las dos transiciones son automáticas: ambas se realizan en el ciclo siguiente al llegar a cada estado. Por ello, aplicando la regla 7 las transiciones se obtienen directamente a partir de las etiquetas E0 y E1. La señal Next se obtiene mediante la OR de ambas (Regla 8)

Este es el circuito en Icestudio:

(Ej5-Divisor-2-6Mhz.ice)

Para comprobar el funcionamiento medimos la señal con el analizador lógico icerok. Este es el resultado

Efectivamente, ¡Tenemos una señal de 6Mhz! 😃

Ejemplo 6: Coche fantástico (Knight Rider)

Vamos a generar la secuencia del coche fantástico (Knight Rider) en los LEDs, utilizando un autómata. Este es el diagrama de estados del autómata

Los estados se denominan Derecha e izquierda. Cuando el autómata está en el estado Derecha (E0), significa que el LED se está desplazando hacia la derecha. Cuando se encuentra en el estado Izquierda (E1) el LED se mueve hacia la izquierda

Lo que hace cambiar de un estado a otro son las señales EndR y EndL. La señal EndR se activa cuando el LED ha alcanzado el extremo derecho. La señal EndL se activa cuando el LED ha alcanzado el extremo izquierdo. En ambos casos hay que transitar al otro estado

Observamos que este autómata es exactamente igual que el del ejemplo 3, para encender/apagar el LED con los pulsadores SW1 y SW2. Lo que cambia es la semántica

Este es el circuito en Icestudio:

(Ej6-coche-fantastico.ice)

El circuito está compuesto de las dos partes típicas: La ruta de datos y el controlador. La ruta de datos es el registro de desplazamiento a izquierda y derecha, por donde se desplaza el LED. El controlador es el que decide cuándo desplazar hacia un lado o hacia el otro, en función de la situación actual del LED

En este vídeo de Youtube vemos el funcionamiento:

Click to see the youtube video

¡¡El LED sigue perfectamente la secuencia!!

Autómatas de 3 estados

El siguiente nivel en complejidad es tener autómatas con 3 estados. Ahora ya es posible que desde un mismo estado origen salgan 2 transiciones, hacia estados diferentes. Y también desde estados diferentes se puede llegar a un mismo estado. Veremos ejemplos muy sencillos para entender cómo se gestionan estos casos, aplicando las reglas correspondientes

Ejemplo 7: LED0 ó Led1

Empezamos con un ejemplo de un circuito de 3 estados muy sencillos: Encender dos LEDs, de manera excluyente. O se enciende uno o el otro. Este ejemplo nos permitirá comprober el concepto de bifurcación, y cómo implementarlo en los circuitos

Este es el diagrama de estados

Inicialmente los dos LEDs están apagados. Si se aprieta SW1 se enciende el LED0, y permanecerá así todo el rato. No se puede volver al estado inicial, salvo pulsando el botón de reset. Si desde el estado inicial se aprieta SW2 se encenderá el LED2. Y se permanece ahí todo el rato

Vamos a implementarlo siguiendo las reglas. Primero aplicamos las reglas 1-4. Ponemos 3 Biestables D. Uno de ellos, el del estado E0 inicializado a 1 y el resto a 0. La señal Next llega a la entrada de load de los tres

Del estado E0 salen 2 transiciones, por ello hay que aplicar la regla 5. Añadimos un demultiplexor de 1 a 2 a la salida del estado E0. Por su entrada de selección ponemos la entrada SW1, que es la que activa la transición T01. Este elemento es el que hace que haya una bifurcación. Desde el estado E0 bien al E1 o bien al E2

Como no hay 2 transiciones que lleguen al mismo estado, NO hay que poner puerta OR al aplicar la regla 6

Aplicamos el resto de reglas como ya conocemos. Este es el circuito en Icestudio. Las etiquetas E01 y E02 se han sustituido por su cables correspondientes

(Ej7-LED0-o-LED1.ice)

En este vídeo de Youtube vemos el funcionamiento:

Click to see the youtube video

Ejemplo 8: LED0 ó LED1 (II)

Modificamos el ejemplo 7 para añadir una nueva transición, desde el estado E1 al E2. Ahora el LED1 se puede encender mediante dos acciones. Bien pulsador SW2 o bien pulsando SW1 dos veces. Ahora al estado E2 se puede llegar por dos sitios diferentes: tiene 2 transiciones de entrada

Al estado E2 le llegan dos transiciones por lo que hay que añadir una puerta OR a la entrada del biestable del estado E2 al aplicar la regla 6. El resto de los biestables se quedan iguales

Además, al haber una transición más, del estado E1 al estado E2 hay que añadir una condición nueva (etiqueta T12). Este es el circuito en Icestudio

(Ej8-LED0-o-LED1.ice)

En este vídeo de Youtube vemos el funcionamiento:

Click to see the youtube video

Ejemplo 9: LED0 y LED1

Este es un ejemplo de un autómata de 3 estados y 6 transiciones. Desde cada estado parten 2 transiciones, y llegan otras dos transiciones

Hay dos pulsadores, SW1 y SW2 que controlan los LEDs 0 y 1 respectivamente. Cada pulsador cambia el estado de su led correspondiente, pero garantizando que nunca estén los dos LEDs encendidos a la vez

Vamos a fijarnos en un único estado: el E0. Salen dos transiciones: T01 (hacia el estado E1) y T02 (hacia el estado E2). Si se pulsa el botón SW1 se activa la transición T01. Situamos un demultiplexor 2 a 1 a su salida (Regla 5) con la señal SW1 por su entrada de selección. Usamos las etiquetas E01 y E02

Al estado E0 llegan 2 transiciones, por lo que por la regla 6 hay que añadir una puerta OR. Las transiciones llegan de los estados E1 y E2, por lo que usamos las etiquetas E10 y E20

Hacemos lo mismo con el resto de estados, ya que se comportan igual: de todos ellos salen 2 transiciones y llegan 2 transiciones: su estructura es la misma

Como hay 6 transiciones, en total hay que colocar 6 Puertas AND, que luego se combinan mediante puertas OR para obtener la senal Next (Reglas 7 y 8)

Este es el circuito completo en Icestudio

(Ej9-LED0-y-LED1.ice)

En este vídeo de Youtube vemos el funcionamiento:

Click to see the youtube video

Esquema general de implementación de los estados

En la siguiente figura se muestra un fragmento de un diagrama de estado genérico en el que se ve el estado Ex, del que salen 3 transiciones hacia los estados Ea, Eb y Ec, y al que entran 3 transiciones procedentes de los estados E1, E2 y E3

Las transiciones de entrada se agrupan mediante puertas OR (Regla 6). Para las de salida hay que colocar demultiplexores 1-2 en cascada (Regla 5). El estado Ex se implementa, de forma genérica como se muestra en esta figura:

Las etiquetas Exy representan los cables que conectan el biestable que dalen del estado Ex y llegan al estado Ey

Ejemplo 10: Autómata del controlador de Simplez

Ahora que ya sabemos cómo implementar los autómatas a partir de su diagrama de estados, vamos a practicarlo con el controlador del procesador Símplez presentado al comienzo del cuaderno técnico:

Es un autómata de 4 estados y 5 transiciones. De estas transiciones, 3 son incodicionales: llevan al autómata al siguiente estado, y las 2 restantes dependen de la instrucción decodificada.

Por tanto, este autómata tiene 2 entradas: Una correspondiente a las instrucciones CLR, DEC, BR y BZ, y otra a las instrucciones de acceso a memoria: LD, ST y ADD

La salidas del autómata están asociadas a sus estados (es un autómata de Moore), y su detalle no nos interesa. Habrá una salida correspondiente al estado E0, otra para el E1, etc...

Vamos a reescribir el diagrama de estados utilizando la nomenclatura que hemos usado en este cuaderno técnico y sustituyendo las instrucciones por las nuevas entradas a y b

Aplicando las reglas que ya conocemos, implementamos este autómata. Vamos a ver primero la pinta que tiene el circuito del estado:

He dejado cables para todas las transiciones, para enfatizar su parecido con el diagrama de estados original. Pero se podrían usar etiquetas, sobre todo para los cables que van de derecha a izquierda

Con los cables se ve claramente que en este circuito hay 2 bucles. Uno que va del estado E0 al E1 y de nuevo al E0. Y otro que recorre todos los estados hasta llegar al inicial de nuevo: E0➡️E1➡️E2➡️E3➡️E0

En total hay 5 transiciones, que se generan con este circuito:

Antes de implementar el autómata, hay que pensar cómo probarlo!. ¿Cómo sabemos si este controlador funciona? Una forma sería construir un Simplez completo, y probarlo con diferentes programas. Pero esto es bastante arduo y fuera del contexto de este cuaderno técnico

Otro enfoque es el de generar directamente valores para las entradas a y b, y utilizar el analizador lógico para ver la evolución de los estados

Vamos a generar 3 valores para a y 3 para b, para simular como si hubiese 3 instrucciones en total: 2 de tipo a (cortas) y una de tipo b (larga)

Esta generación la hacemos encadenando biestables, y conectándolos en bucle, para que se repita el patrón. Cada vez que el autómata entra en el estado E1 se aprovecha para desplazar los biestables, generando el siguiente valor para a y b

(Ej10-simplez.ice)

Vemos el resultado en el analizador lógico. La captura se realiza al apretar el pulsador SW1. Cuando el autómata alcanza el estado E0 y si el pulsador SW1 se había apretado, se hace la captura:

El estado E0 es temporal. Siempre que se alcanza se pasa directamente al E1 en el ciclo siguiente. Esto lo observamos en el cronograma. El estado E1 es donde se comprueba la entrada recibida a o b, y en función de esa entrada transita a E0 ó a E1. Las lineas verticales amarillas marcan el ciclo donde se lee la entrada. Vemos que cuando es a, el siguiente estado siempre es E0. Pero cuando es b el siguiente es E2. El estado E2 también es transitorio y pasa directamente a E3. Y desde este último lo mismo: se pasa directamente al inicial E0.

Vemos el patrón perfectamente en el cronograma. Siempre se hacen dos transiciones de tipo a y a la tercera se hace de tipo b

¡Nuestro controlador funciona!

Tablero de juego

Los autómatas son pequeños "cerebros" que gobiernas otros circuitos. Los describimos mediante un diagrama de estado. Y como hemos visto, a partir de esta descripción gráfica implementamos el circuito, siguiendo las reglas dadas

Estos diagramas son Nuestros tableros de juego, por donde se mueve una ficha de casilla en casilla, siguiendo las instrucciones de las transiciones y las entradas, que determina la casilla destino

Estos tableros también los podemos ver como escenarios por donde se mueve una partícula

Sabemos que cada tablero de juego es en realidad un controlador, que hará una tarea específica. PERO en esta sección vamos a ver ejemplos centrándonos en el movimiento de la ficha, con independencia de su utilidad. Los circuitos de ejemplo lo que harán será mover LEDS por diferentes casillas. La ventaja de esto es que es muy visual, y fácil de comprobar su funcionamiento

También veremos cómo combinar varios autómatas independientes para crear circuitos más complejos

Ejemplo 11: Contador de 2 eventos con reset

En el Cuaderno técnico 18: Fundamentos. Sistema Unario vimos cómo construir contadores de eventos, utilizando codificación one-hot. PERO estos contadores, en realidad, son un caso particular de un autómata. Así que lo diseñaremos como un autómata, a partir de su diagrama de estado, y luego aplicaremos simplificaciones

En este ejemplo diseñaremos un contador de eventos, que cuenta hasta 2 eventos, provenientes por la señal inc. Cuando llega a su valor máximo (2) ya no cuenta más. Para ponerlo a 0 hay que activar la señal rst

La entrada de rst sólo es sensible cuando el contador ha alcanzado su valor máximo. Si se activa cuando está en el estado E1 no hace nada. El comportamiento típico de reset es poner a cero cuando se activa, con independencia del valor del propio contador. Pero eso es lo bueno de definir el contador con nuestro propio autómata: podemos definir el comportamiento que queramos

Este es el circuito de estado con los biestables D. Es la típica conexión en cadena

Para las transiciones aplicamos las reglas que ya conocemos, y obtenemos este circuito. En total hay 3 transiciones por lo que usamos 3 puertas AND, que luego las combinamos con puertas OR para obtener la señal Next

PERO este circuito se puede simplicar dado que las transiciones del estado E0 y E1 se activan con la misma señal inc. Por ello se puede sacar "factor común" la señal inc. De forma algebraica, el circuito actual de transición que tenemos está definido por esta ecuación:

Next = E0 * inc + E1 * inc + E2 * rst

Sacando factor cómun la señal inc nos queda esta ecuación:

Next = (E0 + E1) * inc + E2 * rst

Y este es el nuevo circuito, un poquito más simplificado:

Note

Usar el circuito simplificado nos permite verlo mejor en Icestudio, ya que ocupa menos espacio en pantalla. SIN EMBARGO, ambos cirucitos ocupan los MISMOS recursos en la FPGA, ya que al realizar la síntesis todos los circuitos SE SIMPLIFICAN INTERNAMENTE

Así queda el circuito en Icestudio:

(Ej11-contador-2.ice)

En este vídeo de Youtube vemos el funcionamiento:

Click to see the youtube video

El estado del autómata se muestra en los LEDs D7-D5 (alineación izquierda), en codificación one-hot. Inicialmente está encendido el LED D7, indicando que el contador está a 0 (en reposo). Al apretar SW1 se desplaza una posición a la derecha. Y al volver a apretarlo otra más. Sucesivas pulsaciones no provocan más incrementos. Para volver al estado inicial hay que pulsar SW2

Cuando el autómata está en el estado E1 (Led D6 encendido), la tecla SW2 NO está activa: no se hace reset

Nuestro contador especial funciona tal como lo habíamos diseñado

Ejemplo 12: Movimiento de un LED en 3 posiciones

En este ejemplo se desplaza un LED hacia la derecha 3 posiciones, y vuelve al comienzo. Este desplazamiento se hace automáticamente, estando 500ms en cada estado. Este es su diagrama de estado:

Hay 3 estados, cado uno correspondiente al encendido del LED en cada posición. Hay 3 transiciones, todas generadas con la misma entrada: la señal time. Es la que indica que ha transcurrido el tiempo establecido (500ms) para permanecer en cada estado

La estructura es la que ya conocemos de un contador módulo 3, en codificación one-hot, pero ahora lo vemos como un autómata

La ficha (estado activo) representa el LED encendido. Como la señal time se produce periódicamente lo que tenemos es que nuestro tablero de juego evoluciona como se muestra en esta animación

Ahora pasamos a su implementación. El circuito de estado es el mismo que el del Ejemplo 11: tres biestables encadenados. Siguiendo las reglas, creamos el circuito de las transiciones

Debido a que la señal time se usa en TODAS las transiciones, se puede sacar "factor común". Verbalmente se diría así: Si estamos en el estado E0 O en el E1 O en el E2 Y se activa time, entonces hay que activar la señal next para capturar el nuevo estado. De forma algebraica, lo expresamos así:

Next = E0 * time + E1 * time + E2 * time = (E0 + E1 + E2) * time

El circuito queda así:

PERO hay que recordar una propiedad de los autómatas: siempre hay un estado activo. Esto siginifica que o bien E0 está activa, o bien E1 o bien E2. Es decir, que es una condición que SIEMPRE SE CUMPLE, y por tanto su valor es 1 SIEMPRE!

Esto algebraicamente lo expresamos así: E0 + E1 + E2 = 1. Esta es también una propiedad de los números codificados en one-hot: sólo puede estar a 1 uno de los dígitos. El número con todos sus dígitos a 0 NO EXISTE en one-hot

Por tanto, la señal Next la podemos simplificar muchísimo!

Next = (E0 + E1 + E2) * time = time

El circuito de las transiciones queda ahora así de simple:

¡Un único cable que conecta time con Next!

Este es el circuito en Icestudio

(Ej12-desplazamiento3.ice)

En realidad es un registro de desplazamiento a la derecha, inicializado con el valor 100 binario. Es el mismo circuito que ya conocíamos del cuaderno técnico anterior. Pero ahora lo hemos enlazado todo. ¡Los contadores son autómatas simplificados!. Sabiendo diseñar bien los autómatas, ¡Podemos hacer muchísimas cosas!

En este vídeo de Youtube vemos el funcionamiento:

Click to see the youtube video

El circuito funciona. Vemos cómo el LED de desplaza hacia la derecha, periódicamente

Ejemplo 13: Bifurcación manual

Supongamos ahora que tenemos un tablero que representa un escenario por el que se mueve nuestra partícula. Este tablero está dividido en 2 tramos: que llamamos tramo 1 y tramo 2. Cada tramo es de 3 casillas (3 LEDs). Entre ambos tramos hay una bifurcación, que permite que la partícula avance hacia el tramo 2 ó bien repita el tramo 1.

Esta bifurcación es una especie de cambio de agujas, que podemos configurar como queramos con la entrada cambio. Si cambio está activado (vale 1) entonces se avanza hacia el tramo 2, pero si vale 0 entonces se repite el tramo 1. En esta animación vemos cómo se mueve, por diferentes recorridos según el valor de cambio

La ficha recorre 2 veces el tramo 1, y luego pasa al tramo 2, para volver a comenzar la secuencia de movimiento desde el inicio. Modificando la variable cambio se consiguen otras secuencias

El diagrama de estado asociado a este tablero es el siguiente:

La bifurcación se produce en el estado E2. La transición al tramo 2 (Estado E3) se produce si está activada la variable cambio y llega el tic de tiempo. Si no se activa cambio, al llegar time se vuelve al estado E0, para repetir el tramo 1

Implementamos el circuito. Empezamos por el circuito de estado, que en este caso está compuesto por 6 Biestables D, conectados en cascada, pero con una bifurcación en el biestable del estado E2. La salida de E2 se lleva bien a E3 o bien a E0 según el valor de cambio. Usamos un demultiplexor para implementar esta bifurcación

Lo siguiente es el circuito de transición. Lo podemos implementar como ya sabemos... PERO, igual que vimos en el ejemplo anterior, TODAS las transiciones se producen al activar time. Por ello lo podemos simplificar y conectar directamente Next con time

Este es el circuito en Icestudio:

(Ej13-bifurcacion-manual.ice)

En este vídeo de Youtube vemos el funcionamiento:

Click to see the youtube video

Con el pulsador SW1 determinamos qué recorrido debe seguir el LED. ¡Funciona!

Ejemplo 14: Semáforo

En este ejemplo nuestra partícula se mueve hacia la derecha por un tablero de 6 casillas. En la tercera casilla hay un semáforo que podemos controlar con el pulsador SW1. Si el semáforo está verde (1) la partícula sigue avanzando, pero si está en rojo ('0') se parará en esta tercera casilla

Este es nuestro tablero de juego:

En esta animación vemos el funcionamiento

El tablero lo convertimos al diagrama de estado. Vemos que es muy parecido al del ejemplo 13, pero ahora la bifurcación en vez de volver al estado E0 se lleva al propio estado E2, haciendo que la ficha permanezca en el mismo estado, hasta que se ponga el semáforo en verde (y que haya transcurrido el tiempo indicado por time)

Implementamos el circuito. El circuito de estado es muy parecido al del ejemplo 13. Está formado por 6 Biestables D conectados en cascada, con una bifurcación en el biestable del estado E2. PERO esta bifurcación es hacia el propio estado E2. Al estado E0 ahora sólo se llega desde el E5, por lo que la puerta OR se desplaza a la entrada del estado E2

Lo siguiente es el circuito de transición. Lo podemos implementar como ya sabemos... PERO, igual que vimos en el ejemplo anterior, TODAS las transiciones se producen al activar time. Por ello lo podemos simplificar y conectar directamente Next con time

Este es el circuito completo en Icestudio:

(Ej14-semaforo-manual.ice)

En este vídeo de Youtube vemos el funcionamiento:

Click to see the youtube video

El LED rojo D0 se usa para indicar que el semáforo está en rojo. Al apretar SW1 el semáforo se pone verde, por lo que se enciede el LED0 verde y se apaga D0. Vemos cómo efectivamente el LED en movimiento se para en la tercera posición (Led D5) cuando el semáforo está rojo, y vuelve a desplazarse cuando se pone verde

Combinación de autómatas

Los autómatas los podemos combinar entre ellos para crear circuitos más complejos. Esto lo podemos hacer gracias a que en hardware podemos poner circuitos en paralelo. Así tendremos funcionando varios autómatas en paralelo, y utilizar las salidas de uno para controlar al otro

Veremos algunos ejemplos sencillos de estas combinaciones

Ejemplo 15: contador de vueltas

Tenemos un escenario (Tablero 1) en el que se mueve una fichera hacia la derecha, y cuando llega al extremo vuelve a empezar por la izquierda. En total tenemos 4 casillas. Esta ficha se mueve en un bucle espacial infinito: Nunca para

PERO queremos llevar la cuenta de la cantidad de vueltas que da. Utilizamos un segundo tablero para llevar la cuenta. Como es un ejemplo sencillo, sólo vamos a poner 3 casillas en este segundo tablero. Cuando este tablero contador llega a su valor máximo (han transcurrido dos vueltas), se queda en ese estado

En esta animación lo vemos en funcionamiento. Cuando la ficha verde llega a la tercera casilla, ya no se pueden contar más vueltas. La ficha roja sigue desplazándose de manera infinita. En la animación hemos parado cuando las dos fichas están en sus extremos derechos (Y luego la animación comienza de nuevo desde el principio). Pero en realidad la ficha roja seguirá su movimiento

Estos dos tableros nos suenen, ¿no?. En realidad es un ábaco one-hot, que ya conocemos del Cuaderno técnico 18: Fundamentos. Sistema Unario. PERO ahora los vemos desde la perspectiva de los autómatas. Este ábaco en realidad es una composición de dos autómatas

Estos son los diagramas de estado:

La señal vuelta es una salida del autómata 1, asociada a la transición T30, que va desde el estado E3 al E0. Esta señal se usa como entrada del autómata 2, y provoca que el autómata transite a los estados S1 y S2

Este es el circuito en Icestudio

(Ej15-contador-vueltas.ice)

En este vídeo de Youtube vemos el funcionamiento:

Click to see the youtube video

Ejemplo 16: Recorrido automatizado

En este ejemplo se combina el autómata del ejemplo 13 (Bifurcación manual) con el del ejemplo 11 (Contador de 2 eventos con reset) para generar un recorrido automatizado para el LED: Da dos vueltas por el tramo 1 y se cambia automáticamente la bifurcación para saltar al tramo 2, se reinicia el contador y se repite la secuencia. La diferencia con el ejemplo 13 es que la bifurcación cambia automáticamente, frente al cambio manual

En esta animación vemos el tablero y la ficha moviéndose por el recorrido. Por cada vuelta completada se incrementa el contador, que al llegar a su extremo derecho cambia la bifurcación

Estos son los diagramas de estado:

Este es el circuito en Icestudio:

(Ej16-recorrido-automatizado.ice)

En este vídeo de Youtube vemos el funcionamiento:

Click to see the youtube video

Automatas del sistema

Los autómatas del sistema son un caso partícular de los autómatas en el que TODAS las transiciones se realizan en cada ciclo, a la velocidad del reloj del sistema. Se implementan con Biestables D del sistema y por tanto NO hay que generar la señal de transición Next (Ya que los biestables NO tienen entrada de load)

Cualquier autómata del sistema lo podemos implementar como un autómata normal, con las reglas que ya conocemos. Sin embargo, si los implementamos directamente como autómatas del sistema la implementación se simplifica, y se requiere menos lógica

Ejemplo 17: Divisor entre 2. Señal de 6 Mhz

Comenzamos con un ejemplo que ya hemos resuelto utilizando un autómata (Ejemplo 5). Se trata de un divisor de frecuencia entre 2, que genera una señal de 6Mhz a partir de la señal de reloj del sistema que es de 12Mhz

El diagrama de estados ya lo conocemos:

Este autómata cambia de estado en cada ciclo de reloj. Lo podemos implementar directamente con Biestables D del sistema, sin necesidad de entrada load ni de la generación de la señal Next. Usamos las mismas reglas que conocemos

El circuito de estado es el siguiente:

Nos hemos ahorrado la lógica de generación de las transiciones

En el circuito en Icestudio la señal de salida la medimos esta vez con el LEDOscopio

(Ej17-divisor2-6Mhz.ice)

Este es el resultado. En los LEDs vemos la señal de 6Mhz (un ciclo a off y otro a on)

Ejemplo 18: Divisor entre 3. Señal de 4Mhz

Si ahora queremos hacer un divisor entre 3, tenemos que añadir un estado adicional, pero la estructura es la misma: 3 estados encadenados, pasando de uno a otro en cada ciclo. Este es el diagrama de estado

Este es el circuito en Icestudio

(Ej18-divisor3-4Mhz.ice)

Medimos con el LEDOscopio y comprobamos que se obtiene la señal correcta: Dos ciclos a 0 y uno a 1

Ejemplo 19: Divisor configurable: 6Mhz/4Mhz

Sabemos hacer un circuito que divide entre 2, para generar una señal de 6Mhz, y también sabemos hacer otro para dividir entre 3, generando una señal de 4Mhz... PERO... ¿Cómo hacemos un circuito que pueda dividir entre 2 ó 3 según el estado de un pulsador? Es decir, ¿Cómo podemos hacer un generador de señal configurable que saque una señal bien 6Mhz o bien de 4Mhz?

La clave está en combinar ambos diagramas de estado usando bifurcaciones. Según el estado de la entrada div3 saltamos a un estado u a otro en el siguiente ciclo. Si div3 está a 1 significa que queremos dividir entre 3. Es decir, que hay que añadir un estado adicional. Por ello transitamos a E2. Pero si div3 está a 0, saltamos a E0 para continuar dividiendo entre 2

De esta forma tenemos 2 recorridos en bucle: Uno que consta de 3 estados (divisor entre 3) y otro que tiene sólo 2 (divisor entre 2). La clave está en cambiar de uno a otro según el estado del pulsador

Este es el circuito de estado:

Y como es un autómata del sistema no hay que implementar el circuito de transiciones

Este es el circuito en Icestudio. Inicialmente la señal div3 está a 0 (viene del pulsador) por lo que se divide entre 2 para generar la señal de 6 Mhz. Al apretar el pulsador se activa la bifurcación y se divide entre 3, para generar la señal de 4 Mhz

(Ej19-divisor2-3.ice)

Para comprobar el funcionamiento, cada vez que se aprieta el pulsador se hace una captura con el LEDOSCOPIO. La captura no se hace de manera asíncrona, sino que se espera a que el autómata llegue al estado E0 y ahí es cuando se captura. Esto garantiza que la señal siempre comienza en el mismo luegar, y aparece en los LEDs siempre igual (si no unas veces se captura antes y otras despues, aparenciendo con diferentes fases)

En este vídeo de Youtube vemos el funcionamiento:

Click to see the youtube video

Inicialmente se ve la señal de 6 Mhz (división entre 2). Al apretar el pulsador sw1 se genera la de 4 Mhz (división entre 3) y se muestra en los LEDs. Si se aprieta otra vez el pulsador, se cambia de nuevo a la división entre 2

Ejemplo 20: Generador de 6Mhz con encendido/apagado

En este ejemplo se implementa un generador de una señal de 6 Mhz (división entre 2) con control de ON/OFF. Inicialmente la señal está apagada (0). Al apretar el pulsador SW1 se genera la señal. Al apretar de nuevo SW1 se deja de emitirla

¿Cómo se puede hacer esto?. Utilizando también bifurcaciones, pero esta vez al propio estado. Esto hace que haya un camino que te lleva al propio estado, por lo que no hay evolución (y siempre permanece en ese estado), a pesar de que son biestables del Sistema y capturan datos en cada ciclo

Este es el diagrama de estado

Cuando la señal on está a 0, se realiza una transición al propio estado E0, por lo que permanece ahí hasta que on se pone a 1. En ese momento se transita a E1 y a partir de ahí se genera la señal de 6 Mhz

Esta es la pinta del circuito de estado:

Este es el circuito en icestudio

(Ej20-generador-on-off.ice)

La señal generada se muestra en el LEDOSCOPIO

En este vídeo de Youtube vemos el funcionamiento:

Click to see the youtube video

Inicialmente los LEDs están apagados, ya que la señal está a 0(no hay señal). Cuando se aprieta el pulsador sw1 se genera la señal y se captura con el LEDOSCOPIO, mostrándose en los LEDs

Conclusiones

Ahora que ya sabemos implementar autómatas, podemos crear circuitos más complejos, y más fácilmente. Aunque esta implementación NO es la más óptima, sí que es la más intuitiva. Se basa en el pensamiento espacial, donde hay un tablero de juego y unas fichas que se mueven por las casillas, siguiendo las transiciones. Por eso son tan intuitivos y fáciles de entender

Ya tenemos una pieza más en nuestro camino hacia la construcción de nuestros propios microprocesadores

Autor

Licencia

Referencias

  • [1] Libro: "Curso de ordenadores : conceptos básicos de arquitectura y sistemas operativos". Ed. ETS Ingenieros Telecomunicaciones, UPM. 2005. Madrid. ISBN: 9788474023121

Enlaces

Clone this wiki locally