Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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.
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.
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.
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.