-
Notifications
You must be signed in to change notification settings - Fork 14
Autómatas
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
- Introducción
- Unidades de control
- Diagramas de estado
-
Reglas de implementación de autómatas
- Regla 1: Estado ➡️ Biestable D
- Regla 2: Inicialización de Biestables (one hot!!)
- Regla 3: Next ➡️ Load
- Regla 4: Etiquetar los estados
- Regla 5: Transiciones de salida
- Regla 6: Transiciones de entrada
- Regla 7: Condiciones de transición
- Regla 8: Generación de la señal Next
- Regla 9: Señales de salida
- Regla 10: ¡Comprobación!
- Autómatas de dos estados
- Autómatas de 3 estados
- Esquema general de implementación de los estados
- Ejemplo 10: Autómata del controlador de Símplez
- Tablero de juego
- Autómatas del sistema
- Conclusiones
- Autor
- Licencia
- Referencias
- Enlaces
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
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)
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
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
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
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 elE1
. Se produce cuando el autómata está en el estadoE0
y se activa la entradaSW1
-
T10: Transición entre el estado
E1
y elE0
. Se produce cuando el autómata está en el estadoE1
y se activa la entradaSW1
-
T02: Transición entre el estado
E0
y elE2
. Se produce cuando el autómata está en el estadoE0
y se activa la entradaSW2
-
T21: Transición entre el estado
E2
y elE1
. Se produce cuando el autómata está en el estadoE2
y transcurre un ciclo de reloj del sistema
Al hablar de una transición hay en realidad dos aspectos a tener en cuenta:
-
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
, dondex
es el número de estado origenl ey
el número de estado destino. Así por ejemplo, en camino de la transición lo denotamos comoE01
. Este será el identificador que usaremos para las conexiones en caso de usar etiquetas en nuestro circuito -
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 estadoE0
y se activa la entrada correspondiente, entonces la transición se produce, siguiendo el caminoE01
"
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
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
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
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
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
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
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
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 a0
- Si al estado
Ex
sólo le llega una única transición, procedente del estadoEy
, conectamos la etiquetaEy
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
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 entradaa
, generamos la etiquetaTxy
mediante la operación AND entreEx
y la señal de entradaa
. 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 etiquetaTxy
asignándole directamente la etiquetaEx
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
Las señales de salida se pueden obtener bien del estado (Autómatas de Moore) o bien de las transiciones (Autómatas de Mealy)
¡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
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...
Comenzamos por los autómatas de 2 estados con una única transición.
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
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:
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
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
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 1
en el resto de ciclos. Por eso vemos el LED0 apagado y el resto de LEDs, 1-7 encendidos
¡¡El autómata funciona!! (Regla 10)
Seguimos con ejemplos sencillos de 2 estados. Añadimos una transición más. Ahora tenemos autómatas con 2 estados y 2 transiciones
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
En este vídeo de Youtube vemos el funcionamiento:
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
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
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:
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! 😃
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:
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:
¡¡El LED sigue perfectamente la secuencia!!
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
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
En este vídeo de Youtube vemos el funcionamiento:
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
En este vídeo de Youtube vemos el funcionamiento:
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
En este vídeo de Youtube vemos el funcionamiento:
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
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
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!
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
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:
En este vídeo de Youtube vemos el funcionamiento:
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
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
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:
El circuito funciona. Vemos cómo el LED de desplaza hacia la derecha, periódicamente
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:
En este vídeo de Youtube vemos el funcionamiento:
Con el pulsador SW1
determinamos qué recorrido debe seguir el LED. ¡Funciona!
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:
En este vídeo de Youtube vemos el funcionamiento:
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
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
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
En este vídeo de Youtube vemos el funcionamiento:
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:
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
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
Este es el resultado. En los LEDs vemos la señal de 6Mhz (un ciclo a off y otro a on)
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
Medimos con el LEDOscopio y comprobamos que se obtiene la señal correcta: Dos ciclos a 0
y uno a 1
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
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:
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
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
La señal generada se muestra en el LEDOSCOPIO
En este vídeo de Youtube vemos el funcionamiento:
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
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
- Juan González-Gómez (Obijuan)
- [1] Libro: "Curso de ordenadores : conceptos básicos de arquitectura y sistemas operativos". Ed. ETS Ingenieros Telecomunicaciones, UPM. 2005. Madrid. ISBN: 9788474023121
- Imagen del Semáforo, By Tomas 21:45, 19 January 2007 (UTC) - Own work, Public Domain, https://commons.wikimedia.org/w/index.php?curid=1763139
- Tarjeta Alhambra-II
- Tarjeta AP-LED8-THT
- FPGAwars
- Autómatas Finitos (Wikipedia)
- Unidad de PWM de frecuencia aproximada
- VGA Retro: Puesta en marcha. MonsterLED
- Pines de Entrada/Salida
- Control de LEDs
- SPI esclavo
- SPI Maestro
- Display SPI de 4 dígitos de 7 segmentos
- Entrada y Salida de Bits con Componentes Virtuales
- Memorias
- Entradas y pulsadores
- Señales del sistema. Medición con el LEDOscopio
- Controlador LCD 16x2
- Señales periódicas y temporización
- Buses: Medio compartido
- Memoria Flash SPI
- Conexión de LEDs en la Alhambra II. Placa AP‐LED8‐THT
- Periféricos PMOD
- Fundamentos. Sistema Unario
- Autómatas
- Pantallas de vídeo. Fundamentos. Display de 1x4 LEDs
- Pantallas de vídeo. Fundamentos. Matriz de 4x4 LEDs