jueves, 24 de noviembre de 2011

Máquina Rotativa Meally en Xilinx


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”.







Una vez le demos a variables, nos saldrá una lista, en la que tendremos que ir introduciendo las variables de nuestra máquina de estados. En nuestro caso tenemos que meter 2 entradas (A, B), una salida (M) y por último 6 estados, empezando desde el 0 y acabando en el 5. Por ello, nuestra tabla nos debe de quedar algo parecido a esto.








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