Muy buenas a tod@s, en esta entrada voy a explicaros el
proceso de elaboración de una máquina de estados. Quizá no sea la definición
más correcta, sin embargo, creo que para empezar está bastante bien.
La definición de una máquina de estados del tipo Mealy es la
siguiente : En la teoría de la computación, una Máquina
de Mealy es un tipo de máquina
de estados finitos que genera una salida basándose en su estado actual y
una entrada.
Es decir, sus estados no son infinitos y, las salidas,
dependen del estado actual y de sus entradas. Quizá esto en un principio no os suene
de nada, de todas formas, a medida que vayamos creando el proyecto iréis
entendiendo algo más. En un principio os diré cómo es el enunciado del
ejercicio que voy a hacer:
Se desea proyectar el gobierno de un
conmutador rotativo, que permite realizar un ciclo completo cuando el tambor
haya efectuado una vuelta completa.
El disco solidario del tambor lleva un
saliente para actuar sobre el contacto (a).
El pulsador (b) (botón de
impulsos) da comienzo al ciclo.
1) Estado inicial (reposo) a=1,
b=0, M=0.
2) (b) es accionado y después
desaccionado rápidamente (impulso) -> M=1.
3) Cuando el disco ha dado una vuelta, (a) es
accionado por el saliente y el disco se para.
Éste sería un poco el esquema que nos hemos encontrado:
El proceso de la máquina se desarrolla mediante un diagrama
de flujo de máquina Mealy síncrona.
Para la elaboración del diagrama de flujo, es muy importante
tener la famosa “tabla de estados” ,presente en cualquier tipo de máquina de
estados. En nuestro ejemplo es la siguiente.
Éste es el funcionamiento de nuestra máquina, está
constituido por dos entradas (a,b) y una salida M.
Para la elaboración de un proyecto de máquina de estados, el
principio es exactamente igual al de cualquier otro proyecto en xilinx, es
decir, “file/new Project…, seleccionamos un nombre y luego elegimos
esquemático.
Después cuando nos salgan los parámetros, copiaremos los que
aquí os dejo.
Una vez le demos a OK, nos saldrá una ventana donde podremos
elegir si deseamos meter una nueva fuente, en este caso, le daremos a “new
source”, y ahí, pondremos un nombre a la fuente y la crearemos del tipo “state
diagram”, en lo que traducido al español significa, “state diagram”.
Una vez establecido todo esto, daremos a ok, y nos abrirá un
entorno nuevo denominado “stateCAD”, en él se desarrollan las máquinas de
estado. Es posible que os aparezcan una serie de globos a modo de ejemplo,
ignorarlos, nuestro proyecto se va a crear desde el principio.
En primer lugar comenzaremos declarando nuestras variables,
para eso nos vamos a “options” y seguido le daremos a “variables”.
Si os fijáis, os marco con un recuadro en negro 3 opciones,
bien, esto sirve para configurar cada variable, con tan solo un click podemos
modificar si queremos que se entrada o salida, o bien sea un nodo o un pin,
etc.
Una vez le demos a OK, deberemos ir metiendo los “globos”
pertinentes, que representan a los distintos estados que va a tener nuestra
máquina.
Para hacerlo hacemos uso de la opción “add state” que hay en
la parte izquierda de nuestro entorno.
A medida que vamos haciendo click se nos irá creando un
estado nuevo posterior al anterior. En nuestro caso necesitamos del estado 0 al
estado 5. Nos deberá quedar una cosa así.
Ahora es momento de ir agregando las transiciones de cada
estado. Para eso ahcemos uso de la herramienta inmediatamente inferior a la de
“add state” que os decía antes. La marcaremos e iremos dando click, primero en
el estado, y luego volviendo a darle otra vez a otro punto de ese mismo estado
para determinar que la transición, por decirlo de alguna manera que se entienda,
“viene y va”. De todas maneras una manera más sencilla es darle doble click,
automáticamente se nos creará una transmisión. Como os enseño en la foto.
Una vez esté colocada, daremos click sobre la propia
transición del estado. Al hacerlo nos saldrá una ventana en la que nosotros
mismos, podremos modificar el estado de las entradas y las salidas justo en esa
transición.
Algo así como esto.
Bien, no me preguntéis
el motivo por el que ocurre pero, bajo ningún concepto toquéis el
“output wizard”, este elemento es un soporte que nos ayuda a configurar nuestra
máquina de estados mediante una especie de parámetros predefinidos. Por qué os
digo que no lo toquéis?, pues porque no sé porqué, cuando yo elijo unos parámetros, directamente al salir del
soporte, me borra todo lo que tenga puesto en la plantilla, no sé porque
ocurre, pero me ha costado varios disgustos, no lo aconsejo tocar, que se puede
hacer perfectamente desde los cuadros.
Bien, en primer lugar nos iremos a “conditions”, en él,
establecemos cómo tienen que estar las entradas para que, por tanto, se active
la salida que queramos. Os enseño la imagen y os lo explico.
En este caso en la condición del estado digo, “Cuando A sea
1 Y B sea distinto de uno, es decir, 0 la salida M será 0”. Entonces cuando ya
tengamos esto, tendremos nuestro primer estado, es momento de seguir avanzando
mediante transiciones e ir colocando sus respectivas condiciones. Como dato
importante, yo os diría que pusierais el “;” al final de cada “output”. Puede
evitarnos varios problemas.
El siguiente paso será colocar un reset en el estado 0. Para
eso nos vamos a la opción siguiente.
Cuando le demos, tendremos que primer dar click, cerca del
globo y después, poner el segundo punto en el globo. Nos preguntará si el reset
quieres que sea asíncrono o síncrono. En nuestro caso lo queremos de tipo
asíncrono, por lo que le daremos a “Yes”. Una vez le demos a OK, nos saldrá una
flecha de nombre “RESET”. Como os enseño en la imagen.
En este caso no es necesario meternos dentro del reset para
modificar parámetros, ya que al preguntarnos si queríamos síncrono o asíncrono
el propio xilinxs lo estableció así.
Ahora lo que hay que hacer es establecer las demás
condiciones de cada estado, una vez hecho eso, nos quedará más o menos una cosa
así.
Ahora vamos a realizar un “seguimiento” o simulación
principal de lo que ha sido nuestro proyecto. Para eso tenemos que ir a la
barra de herramientas de la parte superior
y seleccionar la siguiente herramienta
Una vez le demos nos saldrá una ventana como esta. En ella
es donde vamos a verificar que nuestra máquina de estados funciona
correctamente.
Ahora lo que tenemos que ir haciendo es ir seleccionado las
transiciones, es decir las flechas entre estados, y darle al apartado “cycle”,
que está debajo, esto simulará que el reloj da un pulso, por tanto si todo está
bien, se pasará de un estado a otro. Haremos esto con todos los estados, para
ver si realmente funciona bien.
Cuando veamos que el proyecto nos pasa de estados
adecuadamente será el momento de generar nuestro “VHDL” para eso le daremos a
la ventana que pone “Generate HDL” en la parte superior de la barra de
herramientas. Entonces se nos creará en formato “vhdl”, una vez lo tengamos
tendremos que incorporarlo a la máquina rotativa.
Para eso tenemos que ir a la máquina “rota”, botón derecho y
“add source”. Como os muestro en la imagen.
Y cuando lo añadamos, nos tendrá que salir verificado, como
os muestro.
Se nos habrá creado un nuevo proyecto, es en este donde
vamos a crear un nuevo componente. Primero crearemos un nuevo esquemático, para
eso le damos a “new source” y seleccionamos esquemático. Una vez tengamos el
nombre, seleccionamos el archivo “rota”.vhd, y seleccionamos “create a schematic symbol”, para diseñar un
símbolo.
Una vez lo tengamos creado, solo nos quedará implementarlo
en el esquemático y ya habremos acabado. Para eso vamos al esquemático de
nuestra máquina rotativa, e introduciremos el símbolo anteriormente creado.
Como os enseño en esta imagen. Teniendo en cuenta los Bufg y salídas, entradas… etc.
Después de tener todo esto, tendremos que crear el .ucf,
para eso crearemos una nueva fuente, le daremos
botón derecho, “new source” seleccionaremos un nombre y, después
seleccionaremos “implementation Contraints file”.
Se nos habrá creado el archivo con extensión ucf. Después de
esto, como en anteriores proyectos lo que tendremos que hacer es abrir el ucf,
e ir colocando todos los pines.
Una vez estén colocados, será el momento de hacer la
simulación
Para eso, crearemos el “test bench” y daremos a “post fit simulation”,
nos deberá salir algo así.
Y una vez que tengamos la simulación, iremos marcando todas
las partes del “implement design” , hasta generar el .JED. Con esto habremos
acabado.
Espero haberos sido de ayuda.
DESCARGAR PROYECTO AQUÍ
No hay comentarios:
Publicar un comentario