Está en la página 1de 24

CAPITULO 8

Diseño de máquina de estado finito usando VHDL


Las máquinas de estados finitos (FSM) son abstracciones matemáticas que se utilizan
para resolver una gran variedad de problemas, entre los que se encuentran la
automatización del diseño electrónico, el diseño de protocolos de comunicación, el
análisis sintáctico y otras aplicaciones de ingeniería. En este punto de su carrera de diseño
digital, probablemente haya diseñado varias máquinas de estado en papel. Ahora se
encuentra en el punto donde puede implementarlos y probarlos usando hardware real. El
primer paso en este proceso es aprender cómo modelar los FSM usando VHDL.
Como verá en la siguiente sección, los diseños simples de FSM están apenas un paso más
allá del diseño de circuito secuencial descrito en la sección anterior. Las técnicas que
aprenda en esta sección le permitirán diseñar rápida y fácilmente FSM relativamente
complejas que pueden ser útiles de varias maneras. En la figura 8.1 se muestra un
diagrama de bloques para un FSM tipo Moore estándar. Este diagrama es bastante típico,
pero se usan diferentes nombres para algunos de los bloques en el diseño. El Next State
Decoder es un bloque de lógica combinatoria que usa las entradas externas actuales y el
estado actual para decidir sobre el siguiente estado del FSM. En otras palabras, las
entradas al bloque Next State Decoder se decodifican para producir una salida que
representa el siguiente estado del FSM. Los circuitos en el Next State Decoder son
generalmente las ecuaciones de excitación para los elementos de almacenamiento (flip-
flops) en el bloque State Register. El siguiente estado se convierte en el estado actual del
FSM cuando la entrada del reloj al bloque de registros de estado se activa. El bloque de
registros de estado es un elemento de almacenamiento que almacena el estado actual de
la máquina. Las entradas al decodificador de salida se usan para generar las salidas
externas deseadas. Las entradas se decodifican a través de lógica combinatoria para
producir las salidas externas. Debido a que las salidas externas solo dependen del estado
actual de la máquina, esta FSM se clasifica como FSM tipo Moore.

Figura 8.1: Diagrama de bloques para un FSM tipo Moore.


Figura 8.2: Modelo para implementaciones VHDL de FSM.

El modelo de FSM que se muestra en la figura 8.1 es el modelo más común para describir
un FSM tipo Moore. Esto es probablemente porque a los estudiantes a menudo se les pide
que generen la lógica combinatoria requerida para implementar el Decoder de Estado
Siguiente y el Decodificador de Salida; sin embargo, aquí queremos pensar en FSM en el
contexto de VHDL. El verdadero poder de VHDL comienza a surgir al tratar con los
FSM. Como verá, la versatilidad del modelado de comportamiento VHDL elimina la
necesidad de grandes diseños de papel de K-maps interminables y elementos de lógica
combinatoria sin fin.
Hay varios enfoques diferentes utilizados para modelar FSM en VHDL. Los diversos
enfoques son el resultado de la versatilidad general de VHDL como lenguaje. Lo que
describiremos en esta sección es probablemente el enfoque más claro para la
implementación de FSM. En la figura 8.2 se muestra un diagrama de bloques del enfoque
que utilizaremos en la implementación de las FSM.

Aunque no parece mucho más claro, pronto encontrará que el modelo FSM que se muestra
en la figura 8.2 es un método sencillo para implementar FSM. El enfoque que utilizaremos
divide el FSM en dos procesos de VHDL. Un proceso, conocido como el Proceso
sincrónico, maneja todos los asuntos relacionados con la sincronización y otros controles
asociados con el elemento de almacenamiento. El otro proceso, el proceso combinatorio,
maneja todos los asuntos asociados con el siguiente decodificador de estado y el
decodificador de salida de la figura 8.1. Tenga en cuenta que los dos bloques en la figura
8.1 están hechos únicamente de lógica combinatoria.

Se usa una nueva jerga para describir las señales en la figura 8.2, tal como se describe y
describe a continuación:
 Las entradas etiquetadas Entradas Paralelas se usan para indicar las entradas que
actúan en paralelo en cada uno de los elementos de almacenamiento. Estas
entradas incluyen habilitaciones, ajustes preestablecidos, borrados, etc.
 Las entradas etiquetadas entradas de transición de estado incluyen entradas
externas que controlan las transiciones de estado. Estas entradas también incluyen
entradas externas utilizadas para decodificar salidas externas de tipo Mealy.
 Las señales de estado actual son utilizadas por el cuadro de proceso combinatorio
para la siguiente descodificación de estado y de salida. El diagrama de la figura
8.2 también muestra que las variables de estado presente también se pueden
proporcionar como salidas al FSM, pero no son necesarias.
Un comentario final antes de comenzar. Hay muchos métodos diferentes que se pueden
usar para describir FSM usando VHDL. Una vez que comprenda el método presentado
aquí, aprender cualquier otro estilo de implementación de FSM es relativamente sencillo.
Se puede encontrar más información sobre los otros estilos de codificación FSM en varios
textos VHDL o en la web.

8.1 Representación conductual de VHDL de FSM

EJEMPLO 18.
Escribe el código VHDL que implementa el FSM que se muestra a la derecha.

SOLUCIÓN.
Este problema representa una implementación básica de FSM. Es instructivo mostrar el
diagrama del recuadro negro, que es una ayuda para escribir la descripción de la entidad.
Comenzar los problemas de FSM con el dibujo de un diagrama de caja negra es un
enfoque saludable, particularmente cuando se trata de FSM. A menudo, con los
problemas de FSM, resulta difícil discernir las entradas de FSM de las salidas. Dibujar
un diagrama alivia este problema. El diagrama de caja negra y el código para la solución
del Ejemplo 18 se muestran en el Listado 8.1.
Y, por supuesto, esta solución tiene muchas cosas que vale la pena mencionar. Las cosas
más interesantes se enumeran a continuación.
 Hemos declarado un tipo especial de VHDL llamado tipo de estado para
representar los estados en este FSM. Este es un ejemplo de cómo se usan los tipos
de enumeración en VHDL. Al igual que con los tipos enumerados en otros
lenguajes de programación de nivel superior, existen representaciones numéricas
internas para los listados
tipos de estado, pero solo tratamos con el equivalente simbólico más expresivo.
En este caso, el tipo que hemos creado se llama tipo de estado y hemos declarado
dos variables de este tipo: PS y NS. La cuestión clave a tener en cuenta aquí es
que un tipo de estado es algo que hemos creado y que no es un tipo de VHDL
nativo.
 El proceso sincrónico es igual en forma y función a los simples flip-flops D que
examinamos en la sección sobre circuitos secuenciales. La única diferencia es que
hemos sustituido PS y NS por D y Q, respectivamente. Algo a tener en cuenta
aquí es que el elemento de almacenamiento está asociado solo con la señal de PS.
Tenga en cuenta que PS no se especifica para todas las posibles combinaciones de
entradas.
 Aunque este ejemplo es del FSM más simple que podría esperar, el código parece
algo complicado. Pero si lo examina de cerca, puede ver que todo está bien
compartimentado en la solución. Hay dos procesos; el proceso sincrónico maneja
el restablecimiento asincrónico y la asignación de un nuevo estado a la llegada del
reloj del sistema. Además, el proceso combinacional maneja las salidas no
manejadas en el proceso síncrono.
 Debido a que los dos procesos operan al mismo tiempo, se puede considerar que
funcionan en un paso de bloqueo. Los cambios en la señal NS que se generan en
el proceso combinatorio obligan a una evaluación del proceso síncrono. Cuando
los cambios se instituyen realmente en el proceso síncrono en el siguiente borde
del reloj, los cambios en la señal PS hacen que se evalúe el proceso combinatorio.
Y así sucesivamente y así sucesivamente.
 La declaración de caso en el proceso combinatorio proporciona una cláusula when
para cada estado del FSM. Una cláusula cuando otros también se han utilizado.
Las asignaciones de señal que forman parte de esta cláusula catch-all son
arbitrarias ya que el código nunca debería llegar allí. Esta declaración se
proporciona para una sensación de integridad y representa una buena práctica de
codificación VHDL.
 La salida de Moore es una función del estado actual. Esto se expresa por el hecho
de que la asignación de la salida Z1 se evalúa incondicionalmente en cada cláusula
when del enunciado caso en el proceso combinatorio. En otras palabras, la
variable Z1 está dentro de la cláusula when pero fuera de la instrucción if en la
cláusula when. Esto es, por supuesto, porque los resultados de Moore son solo una
función de los estados y no de las entradas externas. Tenga en cuenta que es la
entrada externa la que controla a qué estado hace transición la FSM desde
cualquier estado dado. Verá más adelante que las salidas de Mealy, debido a su
naturaleza general, se asignan dentro de la declaración if
 La salida Z1 está preasignada como el primer paso en el proceso combinatorio.
La asignación previa de esta manera evita la generación de retención inesperada
para la señal Z1. Cuando se trata de FSM, el diseñador de FSM tiene una tendencia
natural a olvidarse de especificar un resultado para la variable Z1 en cada uno de
los estados. Al presionarlo, evita que se generen pestillos y, sin duda, puede
limpiar el código fuente. La preasignación no hace ninguna diferencia en el código
VHDL porque si se realizan varias asignaciones dentro del código, solo la
asignación nal tiene efecto. En otras palabras, solo se considera la asignación nal
una vez que finaliza el proceso.

Hay una cosa fundamental a tener en cuenta sobre el Ejemplo 18. En un esfuerzo por
mantener el ejemplo simple, descartamos los valores digitales de las variables de estado.
Esto se indica en el diagrama de caja negra del Listado 8.1 por el hecho de que la única
salida del FSM es la señal Z1. Esto es razonable si solo se requiere una señal para
controlar algún otro dispositivo o circuito. La variable de estado se representa
internamente y su representación precisa no es importante ya que la variable de estado no
se proporciona como salida.

En algunos diseños de FSM, las variables de estado se proporcionan como salidas. Para
mostrar esta situación, proporcionaremos una solución al Ejemplo 18 con las variables de
estado como salidas. El diagrama de caja negra y el código VHDL de esta solución se
muestran en el Listado 8.2.
Tenga en cuenta que el código VHDL que se muestra en el Listado 8.2 difiere en solo dos
áreas del código que se muestra en el Listado 8.1. El primer área es la modificación de la
declaración de entidad para explicar la salida de variable de estado Y. La segunda área es
la inclusión de la instrucción de asignación de señal selectiva que asigna un valor de salida
de variable de estado Y en función de la condición de la variable de estado. La declaración
de asignación de señal selectiva se evalúa cada vez que se detecta un cambio en la señal
PS. Una vez más, dado que hemos declarado un tipo de enumeración para las variables
de estado, no tenemos forma de saber exactamente cómo el sintetizador decidirá
representar la variable de estado. La declaración de asignación de señal selectiva en el
código del Listado 8.2 solo hace que parezca que hay una variable de estado y los estados
están representados con un '1' y un '0'. En realidad, hay métodos que podemos usar para
controlar cómo se representan las variables de estado y nos ocuparemos de ellas pronto.
Por último, hay tres declaraciones simultáneas en el código VHDL que se muestra en el
Listado 8.2: dos instrucciones de proceso y una declaración de asignación de señal
selectiva.

EJEMPLO 19.
Escriba el código VHDL que implementa el FSM que se muestra a la derecha. Considere
las variables de estado como salidas del FSM.

SOLUCIÓN.
El diagrama de estado que se muestra en este problema indica que se trata de un FSM de
tres estados con una salida externa tipo Mealy y una entrada externa. Como hay tres
estados, la solución requiere al menos dos variables de estado para manejar los tres
estados. El diagrama de la caja negra de la solución se muestra en el Listado 8.3. Tenga
en cuenta que las dos variables de estado se manejan como una señal agrupada.
Como de costumbre, hay un par de cosas divertidas que destacar sobre la solución para el
Ejemplo 19. Lo más importante es que debe tener en cuenta las similitudes entre esta
solución y la anterior.

 El FSM tiene una salida de tipo Mealy. La solución esencialmente trata este
resultado como un resultado de tipo Moore en las dos primeras cláusulas de la
declaración de caso. En la cláusula nal cuando, la salida Z2 aparece en ambas
secciones de la instrucción if. El hecho de que la salida Z2 sea diferente en el
contexto del estado ST2 lo convierte en una salida de tipo Mealy y, por lo tanto,
un FSM tipo Mealy.
 Al simular las salidas de variables de estado (teniendo en cuenta que las variables
de estado reales se representan con tipos de enumeración), se requieren dos
señales dado que el diagrama de estados contiene más de dos estados (y menos de
cinco estados). La solución elegida es representar estas salidas como un paquete
que tiene el efecto de cambiar ligeramente la forma de la instrucción de asignación
de señal seleccionada que aparece al final de la descripción de la arquitectura.

EJEMPLO 20.
Escriba el código VHDL que implementa el FSM que se muestra a la derecha. Considere
las variables de estado enumeradas como salida.

El diagrama de estado indica que su implementación contendrá cuatro estados, una


entrada externa y dos salidas externas. Este es un FSM híbrido en el que si contiene tanto
una salida de tipo Mealy como de Moore, pero en este caso, el FSM se consideraría un
FSM tipo Mealy. El diagrama de caja negra y la solución real para la solución se muestran
en el Listado 8.4.
Si no lo ha notado, implementar FSM usando el modelo de comportamiento VHDL es
notablemente sencillo. En realidad, rara vez codigo un FSM desde cero; Por lo general,
opto por tomar FSM anterior que he codificado y comenzar desde allí. Tenga en cuenta
que la ingeniería real rara vez se basa en un libro de cocina. Para problemas de FSM, la
ingeniería está en la prueba y creación del diagrama de estado. No se sienta demasiado
cómodo con el modelado de comportamiento de los FSM; la verdadera diversión es
generar un FSM que resuelva un problema determinado.

8.2 Codificación One-Hot para FSM


A decir verdad, hay muchos métodos diferentes que se pueden usar para codificar
variables de estado1. Si la forma exacta de la representación utilizada es importante para
usted, tendrá que seguir los pasos necesarios para controlar cómo el sintetizador
representa las variables de estado. Hay dos enfoques para controlar la representación de
variables de estado. El primer enfoque es permitir que la herramienta de sintetización
maneje los detalles. Dado que cada FSM que hemos visto hasta este momento ha utilizado
tipos de enumeración para representar las variables de estado, el sintetizador podría elegir
representarlas con un esquema de codificación de su elección. La realidad es que las
herramientas generalmente tienen una opción para seleccionar el esquema de codificación
deseado. La desventaja de este enfoque es que se le niega la experiencia de aprendizaje
asociada con la implementación del código VHDL que induce explícitamente su esquema
de codificación deseado. Después de todo, es posible que tenga algún esquema de
codificación especial que necesite usar pero que no sea compatible con las herramientas
de desarrollo. El segundo enfoque para codificar las variables de estado es especificarlas
directamente en VHDL. El enfoque de especificar las variables de estado en el código
VHDL se presenta en esta sección.

La codificación One-hot usa un bit en el registro de estado para cada estado del FSM.
Para un FSM con codificación única con 16 estados, se requieren 16 flip flops. Sin
embargo, solo se requieren cuatro flip flops si se implementa el mismo FSM utilizando
una codificación binaria. La codificación One-Hot simplifica la lógica y las
interconexiones entre la lógica general. A pesar de parecer bastante derrochador en
términos de la lógica empleada, la codificación única a menudo resulta en FSM más
pequeñas y más rápidas.

En este caso, la codificación se refiere al acto de asignar un patrón único de 1 y 0 a


cada uno de los estados para que no sean ambiguos de otros estados.

El enfoque adoptado en los ejemplos de FSM anteriores era fingir que estábamos
utilizando la codificación completa para las variables de estado del FSM. El enfoque de
codificación completa minimiza la cantidad de elementos de almacenamiento (flip-flops)
utilizados para almacenar las variables de estado. La ecuación de forma cerrada que
describe el número de flip-flops requeridos para un FSM dado como una función del
número de estados se muestra en la ecuación 8.1. Los símbolos tipo bracket utilizados en
la ecuación 8.1 indican una función de techo2. La naturaleza binaria expresada por esta
ecuación es tan evidente que esta codificación a menudo se denomina codificación
binaria.
Para los FSM codificados en caliente, solo se afirma un flip-flop en un momento dado.
Esto requiere que cada estado distinto esté representado por un solo flip-flop. En una
codificación en caliente, el número de flip-flops necesarios para implementar un FSM es,
por lo tanto, igual al número de estados en el FSM. La forma cerrada de esta relación se
muestra en la ecuación 8.2.

Naturalmente, surge la pregunta de cómo se puede usar VHDL para implementar FSM
codificadas en caliente. Si desea un control total del proceso, tendrá que tomar el control
del sintetizador. Y dado que estamos interesados en aprender VHDL, tenemos que mirar
el proceso de codificación explícita de FSM calientes.
El enfoque modular que utilizamos para implementar las FSM acelera el proceso de
conversión desde el uso de tipos de enumeración hasta la especificación de cómo se
representan las variables de estado. Los cambios de nuestro enfoque anterior se limitan a
cómo se asignan las salidas a las variables de estado y cómo las variables de estado se
ven forzadas a representarse mediante ciertos patrones de bits. Las modificaciones del
enfoque totalmente codificado están, por lo tanto, limitadas al control de la entidad del
proceso; será necesario tomar el control del sintetizador. Y dado que estamos interesados
en aprender VHDL, tenemos que mirar el proceso de codificación explícita de FSM
calientes. declaración (necesitará más variables para representar los estados), la
declaración de las variables de estado (tendrá que declarar explícitamente los patrones de
bits asociados con cada estado) y la asignación de las variables de estado a las salidas (en
este caso, en realidad no estamos fingiendo como en otros ejemplos).

La función de techo y = |X| asigna y al entero más pequeño que es mayor o igual a x.

EJEMPLO 21
Escriba el código VHDL que implementa el FSM que se muestra a la derecha. Considere
las variables de estado enumeradas como salida. Utilice una codificación en caliente para
las variables de estado. Este problema es el ejemplo 20 una vez más, pero utiliza una
codificación real única para las variables de estado.
SOLUCIÓN
El diagrama de estado muestra cuatro estados, una entrada externa X, dos salidas externas
Z1 y Z2 con la salida Z2 como salida de Mealy. Esta es una máquina Mealy que indica
que se debe usar una codificación en caliente para codificar las variables de estado. Nos
acercaremos a la implementación de esta FSM de una sola pieza en el momento.

El Listado 8.5 muestra las modificaciones a la declaración de entidad requerida para


convertir la codificación completa utilizada en el Ejemplo 20 en una pseudo-codificación
en caliente. El listado 8.6 muestra las modificaciones requeridas para la asignación de
salida de variable de estado para pasar de los tipos de enumeración a una forma especial
de tipos asignados. Forzar que las variables de estado estén verdaderamente codificadas
usando una codificación en caliente requiere estas dos líneas adicionales de código, como
se muestra en el Listado 8.6. Estas dos líneas de código obligan esencialmente al
sintetizador VHDL a representar cada estado del FSM con su propio elemento de
almacenamiento. En otras palabras, cada estado está representado por el modificador de
"cadena" como se indica. Esto fuerza a cuatro bits por estado a ser recordados por la
implementación de FSM que esencialmente requiere cuatro flip-flops. Tenga en cuenta
en el listado 8.7 que al caso predeterminado se le asigna un estado válido de "uno caliente"
en lugar del estado habitual de cero. Deberías considerar seriamente comparar estas tres
guras. La solución total se muestra en el Listado 8.8
8.3 Puntos importantes
 El modelado de FSM a partir de un diagrama de estado es un proceso sencillo que
utiliza el modelo de comportamiento VHDL. El proceso es tan sencillo que a
menudo se considera cortador de galletas. La verdadera ingeniería involucrada en
la implementación de FSM está en la generación del diagrama de estado que
resolvió el problema en cuestión.
 Debido a la versatilidad general de VHDL, hay muchos enfoques que se pueden
usar para modelar FSM usando VHDL. El enfoque utilizado aquí detalla solo uno
de esos estilos, pero generalmente se considera el más sencillo de todos los estilos.
 La codificación real de las variables de estado del FSM cuando se utilizan tipos
de enumeración se deja a la herramienta de síntesis. Si se desea un método
preferido de codificación variable, usar el enfoque de atributos detallado en esta
sección es una alternativa simple pero viable.

8.4 Ejercicios: Modelado de comportamiento de las FSM

EJERCICIO 1.
Dibuje el diagrama de estado asociado con el siguiente código VHDL. Asegúrese de
proporcionar una leyenda y etiquetar completamente todo.
EJERCICIO 2.
Escriba un modelo de comportamiento VHDL que podría usarse para implementar el
diagrama de estado como se muestra a la derecha. Las variables de estado deben
codificarse como se enumeran y también proporcionarse como salidas del FSM.

EJERCICIO 3.
Dibuje el diagrama de estado asociado con el siguiente código VHDL. Asegúrese de
proporcionar una leyenda y recuerde etiquetar todo.
EJERCICIO 4.
Escriba el código del modelo de comportamiento VHDL que podría usarse para
implementar el diagrama de estado que se muestra a la derecha.

EJERCICIO 5.
Dibuje el diagrama de estado asociado con el siguiente código VHDL. Considere que las
salidas Y son representativas de las variables de estado. Asegúrate de proporcionar una
leyenda. Indique los estados con ambas variables de estado y sus equivalentes simbólicos.
EJERCICIO 6.
Escriba un código de modelo de comportamiento VHDL que pueda usarse para
implementar el diagrama de estado que se muestra a la derecha. Todas las variables de
estado deben codificarse como se enumeran y también proporcionarse como salidas del
FSM.

EJERCICIO 7.
Dibuje el diagrama de estado que corresponde al siguiente VHDL modelar e indicar si
el FSM es una máquina Mealy o una máquina Moore. Asegúrate de etiquetar todo.

También podría gustarte