MENU |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.- Introducción a las herramientas de diseño de XILINX Foundation F2.1
El sistema CAE de Xilinx es una herramienta de desarrollo que consiste en un conjunto integrado de herramientas software y hardware para crear, simular e implementar diseños digitales en una FPGA o CPLD. Todas las herramientas usan una interfaz de usuario gráfica que permite usar todos los programas desde iconos, menús o barras de herramientas. También se dispone de ayuda en línea desde la mayoría de ventanas.
1.1.- Pasos para realizar el Diseño.
El flujo de diseño para CPLDs o FPGAs consiste en tres pasos principales, ilustrados en la figura 3.1.

Figura 3.1: Visión general del flujo de diseño.
El proceso de diseño consiste en (a) Entrada del Diseño, (b) Implementación del Diseño y (c) verificación del diseño. Los diseños se pueden realizar de varias formas: Usando un Editor de Esquemáticos para dibujar un diagrama lógico, usando una descripción textual orientada al comportamiento del circuito (ABEL o VHDL), o una combinación de ambos. Las herramientas también permiten la realización de diseños jerárquicos.
Las herramientas de implementación sintetizan el diseño realizado en la arquitectura del dispositivo seleccionado. Las herramientas están automatizadas y compilan el diseño en un fichero de configuración que es el que se usa para programar el dispositivo real, optimizado en términos de uso de puertas lógicas e interconexiones para el dispositivo dado.
La programación del dispositivo final se puede realizar fácilmente desde un PC en una FPGA (usando una placa de prueba o un programador) o en un CPLD. Ambos dispositivos también se pueden programar en el sistema (ISP) conectando un cable JTAG (MultiLINX) o Xchecker a las patillas de programación del dispositivo.
La verificación del diseño incluye la simulación funcional, que se realiza sobre el ordenador, el testeo del circuito, que se realiza tras su programación, y la simulación temporal (una vez rutado el dispositivo).
1.2.- Tipos de dispositivos: FPGA o CPLD.
Hay dos tipos de dispositivos lógicos programables con los que se puede trabajar. Unos se denominan Array de Puertas Programable (Field Programmable Gate Array o FPGA) y el otro se denomina Dispositivo Lógico Programable Complejo (CPLD). Emplearemos principalmente el XC4003EPC84-4 que funciona a 5V o el XC4005XLPC84-4 que funciona a 3.3V pero con patillas de E/S tolerantes a 5V.
Los dispositivos están disponibles con gran variedad de encapsulados. Los que vamos a usar están empaquetados en plástico con 84 patillas en formato PLCC y tienen los siguientes números de dispositivo: XC4010XLPC84, XC4005XLPC84 y XC4003EPC84. Tendremos que especificar estos nombres de dispositivo cuando comencemos un nuevo proyecto para que las herramientas puedan optimizar el diseño para el dispositivo especifico que usemos. Una vez tengamos el diseño, resulta muy fácil cambiar el componente destino de nuestro diseño como veremos en la sección de implementación del diseño.
Se puede encontrar información detallada de estos dispositivos en el Libro de Datos de lógica programable de Xilinx. La disposición de patillas del XC4000 la podemos encontrar al final de este anexo.
2.- Creación de un nuevo proyecto: Entrada de Esquemáticos.
Supongamos que queremos construir un sencillo circuito conbinacional, como muestra la figura 3.2. Este circuito se usará en un coche para generar una señal de aviso cuando "La llave de contacto (marcha) este puesta Y la puerta este abierta O no se usen los cinturones.

Figura 3.2: Diagrama del esquemático usado en el diseño.
La expresión boleana correspondiente es la siguiente:
ZUMBADOR = MARCHA & ( !PUERTA # !CINTURON )
, donde & denota la operación AND, # la operación OR y ! la operación NOT.
2.1.- Abrir un proyecto nuevo.
Para arrancar las herramientas de Xilinx Foundation (hacer click en el icono sobre el escritorio o bien ir al menu Inicio de Windows -> Programas -> Electrónica Digital -> Xilinx Foundation Series -> Xilinx Foundation Program Manager). Aparecerá primero una pequeña ventana preguntando si abrir un proyecto existente o crear uno nuevo. Seleccionar "New Project". Esto provoca que aparezca la ventana de proyecto nuevo:
La ventana del Project Manager se muestra en la figura 3.3. Esta ventana muestra el flujo de diseño junto con las herramientas asociadas.

Figura 3.3.- Ventana del gestor de proyectos de Xilinx Foundation.
El proyecto tendrá una extensión .PDF. Otros ficheros de proyecto como esquemáticos, listas de componentes, macros, etc., se almacenarán en un subdirectorio con el nombre de proyecto. Un proyecto puede tener tan solo un esquematico principal. Después se pueden añadir sub-esquemáticos al proyecto como macros.
Para conseguir más información sobre el gestor de proyecto, usar la función de ayuda en línea seleccionando HELP -> FOUNDATION HELP CONTENTS -> PROJECT MANAGER, en la ventana del gestor de proyectos.
2.2.- Entrada del esquemático.
Para crear el circuito de la figura anterior usando el editor de esquemáticos hay que hacer click sobre el icono del editor de esquematicos en la ventana del gestor de proyectos o seleccionar el menu TOOLS -> DESIGN ENTRY -> SCHEMATIC EDITOR. Una ventana de captura de esquematico aparece como la de la figura 3.4.

Figura 3.4.- Ventana del capturador de esquematicos con esquema en blanco de Xilinx Foundation.
Colocación de los símbolos
Podemos añadir los símbolos lógicos haciendo click en el icono de la puerta NAND (icono de Símbolo) en la barra de herramientas de la izquierda. Surge una ventana de símbolos. Se puede hacer un scroll sobre la lista y seleccionar AND2 o escribir el nombre del simbolo en la caja inferior de la lista. Una breve descripción del simbolo seleccionado aparece abajo. Ahora se puede colocar la puerta lógica con el cursor sobre el esquematico haciendo click con el ratón. Para colocar otra puerta AND solo hay que hacer click en la anterior y una segunda puerta lógica se engancha en el cursor. Cada vez que se hace click otra puerta del mismo tipo se coloca sobre el esquemático. Colocar las puertas AND de dos entradas. Luego seleccionar OR2 de la lista de simbolos y colocar una puerta OR.
Hay que tener cuidado de no colocar los simbolos demasiado cerca entre ellos de forma que parezca que están conectados. En realidad no están conectados electricamente. Los símbolos deben conectarse a través de hilos, asi que hay que asegurarse que se deja algo de espacio entre las puertas lógicas para que se puedan cablear. El test de integridad no avisa de este tipo de errores. Sin embargo, en la versión F2.1i, las puertas que estén colocadas juntas se conectarán automaticamente. También, el test de integridad de la versión F2.1i informará que las puertas no están conectadas. La figura 3.5 muestra el esquemático con los simbolos añadidos.

Figura 3.5.- Ventana del capturador de esquemáticos con los simbolos añadidos.
Se puede dar la vuelta a un simbolo pulsando Ctrl+M o rotandolo pulsando la tecla Ctrl+L. Para redibujar la pantalla pulsar la tecla de función F10. La FPGA contiene un oscilador de reloj en el chip de 8 MHz. Este se puede emplear colocando el símbolo OSC4 en el esquematico. Un divisor interno hace disponibles las siguientes señales: 8MHz, 500KHz, 16KHz, 490Hz y 15Hz. Las frecuencias no están muy bien definidas y pueden variar entre –50% y +25%.
Las FPGAs poseen bloques de entrada/salida que actuan como una interfaz entre la circuitería interna y las patillas que la conectan al mundo exterior. El bloque de E/S se puede configurar por el usuario. Consiste en buffers (amplificadores de corriente) de entrada y salida (designados por los símbolos de la librería como IBUF y OBUF), buffer de salida triestado (OBUFT) y flip-flops (flip-flop tipo D disparado por flanco (IFD) o como cerrojo (ILD)). Las patillas de salida están conectadas a la alimentación a través de una resistencia de pull-up de unos 10Kohm cuando no se encuentra en uso para prevenir salidas flotantes. Durante el funcionamiento normal, el pull-up está desactivado.
Buffers
Los buffers son necesarios para las señales de entrada y las de salida que se dirigen a una patilla del dispositivo. Los buffers se colocan en el esquematico de forma similar a como se hace para los demás símbolos. Para los buffers de entrada se selecciona el símbolo IBUF y para el buffer de salida seleccionar OBUF de la lista de símbolos. En el caso que se desee añadir un buffer triestado, se puede seleccionar OBUFT. No olvidar añadir buffers al esquemático porque sino este no se podrá compilar después.
Pads
También tendremos que añadir patillas (pads) de E/S a los buffers de entrada y salida. Estos pads representan a las patillas reales del dispostivo programable. Un pad es un componente físico en la Librería unificada de Xilinx y se coloca como cualquier otro componente. Los nombres de los pads son IPAD (entrada), OPAD (para salida), IOPAD (bidireccional), IPAD4 y OPAD4, etc. Todas las patillas del dispositivo DEBEN ser representadas con uno de estos pads de entrada/salida. Se le debe dar un nombre a los pads y posiblemente un número de patilla (localización de la patilla). Esto se puede realizar haciendo doble click sobre el pad, aparece la ventana de propiedades del símbolo.
Patillas
Un terminal de E/S (patilla), disponible haciendo click sobre el botón terminal de E/S a la izquierda de la barra de herramientas encima de la ventana de símbolos, no es un dispositivo físico y no se puede usar como una patilla de E/S. Los terminales de E/S solo deben usarse para proporcionar conexión entre niveles de jerarquia dentro del diseño. De esta forma se usan en macros para conectar señales a las patillas correspondientes sontre el símbolo de macro. Sin embargo, las señales que se distribuyen por múltiples páginas de un diseño plano no necesitan terminales ni conectores fuera de página. Para indicar patillas del dispositivo en el esquemático de mayor nivel de un diseño jerárquico, no se deben usar terminales de E/S sino pads para indicar las patillas del dispositivo.
Si el esquemático va a convertirse en una celda o macro (subdiseño) que será usada posteriormente en un esquemático más grande necesitamos usar terminales de E/S para indicar los terminales del dispositivo.
Dibujando líneas y nombrando conexiones
Para conectar una puerta con otra, se usa el botón de dibujar conexión. Esto se realiza haciendo click sobre el símbolo de conexión justo debajo del icono de la puerta NAND. Todos los símbolos deben conectarse con hilos. No se deben colocar los símbolos juntos para guardar espacio para colocar los hilos de conexión.
Los hilos de conexión (NETS) deben definirse por el usuario con el propósito de mejorar la documentación y la legibilidad del diseño. Se puede nombrar un hilo haciendo click en el icono de hilo con una A debajo del icono de bus en la barra vertical. Escribir un nombre en la ventana Net Name y colocar el cursor sobre la línea de conexión. Asegurarse que apuntamos a la conexión que queremos nombrar, en caso contrario el nombre no estará conectado a nada. Un atajo para nombrar conexiones es hacer doble clic sobre ellas. Ahora podremos rellenar el nombre de conexión (netname) entre las patillas y los buffers para las tres entradas (PUERTA, MARCHA y CINTURON) y la salida (ZUMBADOR). Los nombres de conexión deben aparecer en azul (nombres en verde indican que el nombre no está conectado a nada).
Añadir números de patilla
Podemos asignar números de patilla a cada pin de entrada y salida. Si no hacemos esto, el compilador asignará las patillas por nosotros. Hay dos formas de asignar números de patilla. Primero, podemos colocar las patillas en el esquematico usando la propiedad LOC. Esto se hace haciendo doble clic en el simbolo de PAD. En la ventana emergente de propiedades, vamos a la sección Parameters y entramos como Parameter Name: LOC, y para la Parameter Description: P#, en los que # representa el número de pin (la letra P es necesaria delante del número). Hacemos clic en el botón ADD. Para mostrar el número de patilla, hacer doble clic sobre LOC=P19 hasta que aparezcan dos diamantes al lado. Hacer clic en OK para terminar. El nombre se puede mover haciendo doble clic sobre el pad hasta que aparezca la ventana de propiedades del símbolo. Seleccionamos LOC=P# y seleccionamos mover. Ahora podemos mover la etiqueta de patilla.

Figura 3.6.- Ventana de propiedades de símbolo para asignar patillas.
Una forma alternativa es no asignar números de patilla en el esquemático, sino especificarlos después, antes de compilar el diseño. Esto se realiza creando un fichero de restricciones de usuario (UCF). La ventaja de este método es que el esquemático es más genérico y se pueden cambiar fácilmente las patillas sin tener que modificar el esquemático.

Figura 3.7.- Esquemático del circuito terminado incluyendo números de patilla.
Cuando usamos las placas de desarrollo de FPGA, ciertas patillas han sido preasignadas y algunas están conectadas a LEDs y conmutadores para facilitar el testeo (consultar la descripción de las placas de desarrollo). Asignar los números de patilla de forma que podamos hacer uso de estos dispositivos (leds y pulsadores).
Añadir nuestro nombre, titulo del proyecto y fecha.
Resulta buena práctica etiquetar los esquemas de forma clara. Existe una forma estándar de hacer esto. Ir a la parte inferior de la página y rellenar el pequeño rectángulo. Si la caja tiene un nombre predefinido, podemos cambiarlo yendo a File -> Table Setup. Podemos cambiar ahora la dirección, nombre, Descripción, Fecha, etc.
Creación del netlist y test de integridad.
Necesitaremos generar un netlist en un formato que sea legible por el compilador. Esto se realiza yendo al menú OPTIONS -> CREATE NETLIST. Cuando termine el proceso, siempre es buena idea comprobar que el esquemático no tiene errores de reglas eléctricas. Esto se realiza en el menú OPTIONS -> INTEGRITY TEST. También podemos generar ahora un netlist EDIF yendo al menú OPTIONS -> EXPORT NETLIST. Si no hacemos esto, no hay que preocuparse, el sistema nos preguntara después si debe hacer este paso.
Guardar nuestro esquemático.
Ir al menú FILE -> SAVE o hacer clic en el icono del disquete en la barra de herramientas superior. Poner un nombre al esquemático con la extensión .SCH (p. ejemplo prueba1.sch). Cuando terminemos con el esquemático, salir del programa de captura de esquemáticos que nos trasladará de vuelta a la ventana del gestor de programas de Foundation.
Añadir el esquemático al proyecto.
Si el documento creado no se encuentra listado en la ventana del gestor de proyectos dentro del proyecto que hemos creado (p. ejemplo prueba1.sch) tenemos que seleccionar el menú DOCUMENT -> ADD en la ventana del gestor de proyectos. Aparece una ventana con una lista de ficheros. Para mostrar solo el tipo "Esquemático" teclear *.SCH en la ventana del diálogo. Luego seleccionar el esquemático (prueba1.sch) que queremos añadir a nuestro proyecto (prueba1.sch).
Copiar el proyecto a otro disco.
Si queremos guardar el proyecto en otro disco (p. ejemplo en un disquete) podemos hacer esto desde el gestor de programas. Abrir el menú FILE -> COPY PROJECT. Dar el nombre de la unidad de disco y el directorio donde queramos copiar el proyecto.
Podemos archivar también el proyecto como un fichero ZIP. En el gestor de proyectos, vamos a FILE -> ARCHIVE PROJECT. Esto abrirá la ventana del asistente de archivo de proyectos. El fichero zip es interesante cuando necesitamos mandar el proyecto por e-mail o cuando el fichero es muy grande para almacenarlo en un disco.
El próximo paso es compilar el circuito o simularlo. Veremos primero la simulación.
3.- Simulación del diseño.
Abrir el simulador
En este momento podemos realizar una simulación funcional para verificar que el circuito funciona adecuadamente. Hacer clic en el icono "Simulation" en la ventana del gestor de proyectos o seleccionar TOOLS -> SIMULATION -> GATE SIMULATOR de la ventana del gestor de proyectos. La versión actual del diseño se carga a continuación. Si aparece una ventana con el mensaje "Schematic Netlist prueba1 is older than schematic. Update netlist from Schematic Editor?" (El netlist del esquemático prueba1 es más antiguo que el esquemático. ¿ Quiere actualizarlo ? ) hacer clic en YES. Surgirá la ventana del simulador lógico de Foundation con la ventana del visor de cronogramas, como se muestra en la figura 3.8.

Figura 3.8.- Ventana del simulador lógico con el visor de cronogramas y la ventana de selección de componentes.
Selección de las señales de entrada y salida.
Para simular el circuito hacemos los mismo que si estuviéramos en el laboratorio: añadimos señales de entrada a las patillas de entrada y vemos las señales de salida de entrada y salida en el cronograma. Así, el primer paso consiste en especificar las señales de entrada. Esto se realiza haciendo clic en el icono CHIP (seleccionar componente) que se encuentra sobre la ventana del visor de cronogramas o yendo al menú SIGNAL -> ADD SIGNAL. Ahora aparece otra ventana, denominada ventana de selección de componentes, como muestra la figura 3.9.

Figura 3.9.- Ventanas de selección de componentes.
En la ventana de selección de componente, seleccionar las entradas que queremos añadir al cronograma y hacer clic en el botón "Add" o doble clic en el nombre de señal. Hacer esto para todas las entradas y salidas. Cuando terminemos, hacer clic en el botón CLOSE. Las señales seleccionadas aparecerán en la ventana del visor de cronogramas.
Podemos seleccionar también patillas de test volviendo a los esquemáticos y añadiendo puntos de prueba a los hilos de conexión:
- Para cambiarse al editor de esquemáticos, hacer clic en el botón SC en la barra de herramientas horizontal o ir al menú TOOLS -> SCHEMATIC CAPTURE. El editor de esquemáticos pasará a ser la ventana activa.
- Seleccionar el menú MODE -> TESTPOINT que mostrará la caja de herramientas SC Probe. La herramienta de puntos de prueba es la que se encuentra arriba a la izquierda y es la seleccionada por defecto. Para añadir un punto de prueba a la línea, hacer clic en la etiqueta de la línea (la conexión debe tener una etiqueta). Una pequeña caja gris aparecerá sobre la conexión que cambiará de color a medida que la simulación se realice.
- También podemos añadir puntos de prueba a buses. El valor del bus se mostrará en formato hexadecimal.
- Para volver a la ventana del simulador, hacer clic en el icono SIM en la caja de herramientas SC Probes.
Añadiendo estímulos.
A continuación debemos añadir estímulos adecuados a las señales de entrada.
- Esto se realiza haciendo clic en el icono del generador de estímulos (sobre la barra de herramientas, el icono con las dos ondas cuadradas) o yendo al menú SIGNAL -> ADD STIMULATORS.
- Aparece una nueva ventana que parece muy complicada, como muestra la figura siguiente.
- La sección del teclado se usa para definir la simulación interactiva. Pulsando una tecla en particular, el generador de estímulos cambiará entre 0 y 1. Para asignar una tecla a una señal, primero seleccionar la señal y luego hacer clic en la tecla. Para poner la señal permanentemente a 0 o 1, usar la tecla 0 o 1, respectivamente en la sección de teclado.
- Debajo de la sección de teclado hay dos filas de LEDs redondos y una fila de LEDs cuadrados. Los redondos representan los bits de un contador binario de 16 bits. Este contador se puede usar para generar señales de reloj de varias frecuencias con un ciclo de trabajo del 50 %.
- La fila superior de LEDs, etiquetada Bc: ofrece la salida activa a nivel alto y la segunda fila, etiquetada NBc: da el formato activo a nivel bajo. Las primeras cuatro salidas empezando por la izquierda están etiquetadas como B0 a B3, las siguientes cuatro como B4 a B7, etc. Las salidas cambian siguiendo la secuenica: 0000 0000 0000 0000 -> 0000 0000 0000 0001 -> 0000 0000 0000 0010 ... -> 1111 1111 1111 1111 -> 0000 0000 0000 0000 ... Las salidas del contador NBc serán 1111 1111 1111 1111 -> 1111 1111 1111 1110 ....
- Los LEDs cuadrados, etiquetados como Form: permiten asignar funciones lógicas definidas por el usuario. Esto se explica un poco más abajo.

Figura 3.10.- Ventana del generador de estímulos y ventana de simulación.
En nuestro caso necesitamos usar tres salidas del contador. Usaremos los tres bits menos significativos del contador Bc. Hacer clic primero en el nombre de señal en el visor de cronogramas (ejemplo: PUERTA) de forma que quede resaltado, luego hacer clic en el lado más a la derecha de la salida del contador (etiquetado 0). Aparecerá el nombre B0 tras el nombre de señal en el visor de cronogramas. Hacer lo mismo para las otras tres señales de entrada (seleccionar las siguientes dos salidas del contador).
Podemos asignar también una tecla del teclado a la señal, para cambiar una señal manualmente. Esto se hace seleccionando una de las teclas sobre la sección de teclado en la ventana del generador de estímulos. Para más información, pulsar el botón HELP. Cuando hayamos terminado cerramos la ventana de selección del generador de estímulos.
Definición de la frecuencia del contador.
Podemos definir la frecuencia de reloj del contador binario. Ir al menú OPTIONS -> PREFERENCES. Bajo la sección Stimulation, hacer clic en la lista desplegable "B0 period" y seleccionar el periodo necesario. La frecuencia se ajustará de forma automática. La precisión depende del tipo de simulación. Una simulación funcional requiere menos precisión (por ejemplo 1ns) mientras que una simulación física (timing simulation) requiere una precisión más alta (p. ejemplo 100ps o menos).
Realización de la simulación y del cronograma.
En este momento podemos realizar una simulación funcional. Escogemos "Functional" del menú desplegable que se encuentra sobre la ventana del simulador. Luego, hacemos clic en el icono de periodo de simulación (paso corto) sobre la ventana para iniciar la simulación. Las entradas y los cronogramas correspondientes a las salidas aparecen, como muestra la siguiente figura. Para cambiar el tamaño de paso, usar el menú desplegable cera del icono de paso de simulación. Podemos cambiar también la escala del eje de tiempos haciendo clic en el icono de regla sobre la lista de señales. La escala de tiempos también se muestra.
Podemos volver a la ventana de esquemático haciendo clic en el icono SC de la ventana del simulador. La ventana de esquemático mostrará los niveles lógicos (0 o 1) de cada una de las señales añadidas a la ventana del visor de cronogramas. En la ventana de puntos de prueba SC podemos hacer clic en el icono STEP para avanzar a lo largo de la simulación. Los resultados aparecerán sobre el esquemático para las señales que hayamos añadido a la ventana del visor de cronogramas. Podemos añadir señales adicionales haciendo clic en el icono de punta de prueba en la ventana SC Probes. Hacer clic en las conexiones que queramos mostrar.
Ahora podemos verificar si el circuito funciona como se esperaba. Si tenemos problemas, comprobar la lógica del esquemático. Un problema común es que los símbolos no están conectados entre sí con hilos porque se han colocado uno al lado del otro. Una cosa que no se puede comprobar fácilmente viendo el esquemático.
Para limpiar el cronograma y comenzar la simulación de nuevo, ir a la opción del menú WAVEFORM -> DELETE -> ALL WAVEFORMS WITH POWER ON.
Tener en cuenta que la simulación funcional solo nos muestra como funciona la lógica, pero nada acerca de la temporización de las señales. Esto significa que no tenemos información de los retardos de las puertas (y por tanto frecuencia máxima de utilización), se pueden extraer riesgos o violaciones de tiempos de set-up y hold a partir de una simulación temporal. Una vez que hayamos compilado nuestro diseño para un dispositivo especifico, podremos realizar un análisis de tiempos.
Mostrando señales y buses.
Si tenemos varias señales que mostrar, puede resultar más conveniente agruparlas formado un "Bus". Esto se puede realizar seleccionando primero las señales que queremos agrupar y yendo al menú SIGNAL -> BUS -> COMBINE. El valor de las señales del bus se muestra en notación hexadecimal (a no ser que se especifique otra). Podemos también deshacer un bus yendo al menú SIGNAL -> BUS -> FLATTEN. Un ejemplo de simulación con buses se muestra en la figura 3.11.

Figura 3.11.- Ventana del visor de cronograma en el que las señales se han combinado en buses.
Para ver las señales en un bus sin expandirlas, hacer clic en el icono BUS on/off (expandir) sobre la barra de menú superior del visor de cronogramas. El LSB de un bus se marca por un "*" y el MSB mediante un "$". Todas las demás señales se denotan por un signo "+". Si al bus se le da la vuelta (esto es, el LSB pasa a ser el MSB), podemos cambiar la dirección seleccionando el bus, haciendo clic con el botón derecho y seleccionando BUS -> CHANGE DIRECTION.
Diseñando funciones de usuario.
Mencionamos antes que la tercera fila de los LEDs en la ventana de selección de estímulos se usa para asignar valores definidos por el usuario (o funciones lógicas) a una señal. Las funciones se pueden usar para asignar valores a una señal simple o a un bus. Esto se realiza haciendo clic en el botón Formula en la ventana de selección de estímulos. Esto hace aparecer la ventana "Set Formulas", como se observa en la figura 3.12.

Figura 3.12.- Ventana de configuración de funciones usada para definir funciones lógicas.
Asignaremos una función lógica al LED F0.
Vamos a definir F1 para simular un bus.
- Hacer doble clic en F1.
- En el campo Edit formulas escribir por ejemplo lo siguiente: [0]100 [52]200 [0B]300 [8C]500 [4D]400 [02]200. El valor entre corchetes da el valor de la señal del bus en formato hexadecimal, mientras que el número que sigue al corchete especifica la duración. En el ejemplo anterior, la señal F1 tendrá un valor de 0(es decir, 0000 0000) durante 100 ns, un valor de 52(16 (es decir, 0101 0010), etc.
- Nota: el simulador ignora los espacios en las funciones.
Podemos usar también el asistente de creación de funciones para facilitarnos la creación de una función lógica. Seleccionar formula y hacer clic en el botón Wizard. Se abrirá la ventana del asistente de creación de funciones lógicas. Para asignar una función a una señal en particular, seleccionar la señal en la ventana del visor de cronogramas y luego hacer clic en el LED de la fila Form correspondiente.
Como guardar los vectores de test y los resultados de la simulación.
Para guardar las selecciones de señal anteriores, ir al menú FILE -> SAVE WAVEFORM. Con esto se guardarán los vectores de test. También podemos guardar la simulación yendo a FILE -> SAVE SIMULATION STATE.
Cuando terminemos podemos guardar la simulación para usarla posteriormente o para imprimirla. Podemos especificar el tiempo de comienzo y de finalización del cronograma que queramos imprimir (esto nos ahorrará un montón de papel) yendo al menú FILE -> PRINT. En la ventana de impresión, rellenamos el Time Range (periodo de tiempo) del que queremos imprimir el cronograma (seleccionar el tiempo Start (comienzo) y End (Fin) del cronograma). No coger más de lo necesario. Rellenar también el periodo de tiempo por página. En general, el cronograma entra en una página.
3.2. Simulación Física.
La simulación física (timing simulation) nos ofrecerá información detallada sobre el tiempo que tarda una señal en pasar de una puerta a otra (retardo de puerta) y dará información de la respuesta del circuito en el peor caso. El retardo total de un circuito completo depende del número de puertas por las que circula la señal y de la forma que las puertas se han colocado en la FPGA o CPLD. De esta forma, la información de temporización solo se puede obtener tras la implementación del diseño (Place y Route) como se explica en la sección siguiente. Si no hemos hecho la implementación todavía, hacerla ahora. Cuando la implementación se termine, la información de tiempos se habrá generado y podrá ser usada por el simulador lógico.
La simulación de tiempos es muy similar a la simulación funcional descrita antes.
- En la ventana del gestor de proyectos, hacer clic en el botón VERIFICATION (primer icono en el botón). El simulador de tiempos se cargará y estará listo para usar.

- Seleccionar las señales en el visor de cronogramas y los estímulos, o cargar un cronograma creado anteriormente yendo al menú FILE -> LOAD WAVEFORM.
- Cuando todas las señales se hayan añadido y se hayan especificado los estímulos, seleccionar TIMING de la lista desplegable sobre la barra horizontal. Ahora podemos ejecutar la simulación haciendo clic en el icono de periodo de simulación corto o largo.
- En el caso en que hayamos usado Flip-Flops debemos activar el Global Reset. El reset global (GSR) se debe pulsar al comienzo de todas las simulaciones temporizadas. Esto pone a uno o a cero los flip-flops del esquemático. La señal de reset global no existe en el esquemático, pero existe en el dispositivo y en el netlist de la simulación temporizada. Para dispositivos XC4000, el nombre de conexión del reset global es GSR, y es activo a nivel alto. Para activar el reset global añadir la señal GSR al visor de cronogramas. En la ventana del generador de estímulos podemos asignar una función de usuario a uno de los LEDS Form, por ejemplo F2:H100L5000. Esto genera un pulso de reset a nivel alto durante 100ns y bajo durante 5000ns. Una forma alternativa es asignar uno de las teclas del teclado a la señal GSR y hacer el reset manualmente.
Podemos ahora ejecutar la simulación haciendo clic en el icono Step en la barra horizontal. Puede ser necesario ampliar el cronograma de forma que podamos ver los retardos de las puertas. Hacer clic en la escala de tiempos y arrastrar hacia una transición de reloj. Para medir el retardo, ir al menú WAVEFORM -> MEASUREMENTS -> MEASUREMENTS ON. Posicionar el cursor sobre el borde de la señal de interés para indicar el comienzo de la medida. Hacer clic en otra transición para completar la medida (ver figura adjunta). Tener cuidado que el periodo del estímulo que estemos aplicando al circuito no sea mayor que el retardo máximo de la señal de salida. Por ejemplo, en la figura más abajo, la señal PUERTA debe permanecer constante durante al menos 5.3 ns, en otro caso la señal de salida (ZUMBADOR) no tendrá tiempo de permanecer en el valor correcto. Podemos cambiar el periodo (o frecuencia) de la señal de reloj yendo a OPTION -> PREFERENCES -> SIMULATION: seleccionar el valor correcto de B0: periodo de reloj.

Figura 3.13.- Simulación temporizada, mostrando el retardo de la señal de salida (ZUMBADOR) en relación con la señal de entrada.
Ficheros Script.
Una forma alternativa de definir las formas de onda y ejecutar el simulador es uar un fichero script. Para abrir el editor de script, ir a TOOLS -> SCRIPT EDITOR. Se abrirá una caja de dialógo. Podemos usar el asistente del editor de script que nos guiará a través de la creación del fichero script. Para más información de cómo crear un fichero script, hacer clic en el botón HELP o ir a HELP -> HELP TOPICS en la ventana del editor de script.
Nota sobre señales indefinidas en una simulación.
Es posible que para un diseño complejo algunas de las señales se muestren como indefinidas (una caja gris en el visor de cronogramas o una X azul en el esquemático). Las señales que vienen de un circuito combinacional y se introducen en otro a menudo se colocan en el mismo CLB. Algunas de estas señales no son esenciales para el funcionamiento y el software de sintesis puede optimizarlas. Como resultado de este proceso, no se encuentran disponibles para la simulación temporizada. Podemos comprobar la lógica que ha sido eliminada yendo al informe de mapeo (ventana panel de la derecha – pestaña Report en la ventana del gestor de proyectos) tras realizar la implementación. Si queremos mantener la señal, podemos decirle al programa que lo haga. Hay dos posibilidades. Una el el fichero ucf, de la siguiente forma: net net_name keep; (en el que net_name es el nombre de la conexión que no queremos que se elimine). Otro método es colo el attributo "keep" en la conexión en el editor de esquemático.
- Hacer doble clic sobre la conexión.
- seleccionar "attributes"
- en "parameter name", introducir "keep"
- seleccionar "add" (si queremos podemos mostrar los atributos)
- luego "ok"
4.- Realizando un diseño con ABEL – HDL.
Una forma alternativa al uso del editor de esquemáticos para introducir un diseño es usar una descripción del comportamiento del circuito. Las herramientas del entorno Xilinx Foundation F2.1 nos permiten introducir un diseño usando ABEL, VHDL o Verilog. Usaremos el lenguaje de descripción hardware ABEL (HDL) en una primera introducción. Si no se es muy familiar con ABEL, sería conveniente leer el capitulo de introducción a ABEL-HDL para una introducción rápida al lenguaje.
Podemos usar cualquier editor de texto para crear un fichero fuente ABEL mientras sigamos las convenciones y sintaxis del lenguaje ABEL como se describe en la introducción al lenguaje. Sin embargo, Foundation series nos proporciona una forma fácil de crear un fichero fuente: el asistente de diseño HDL. Este será el que usemos a continuación.
Abrir un proyecto en el gestor de proyectos Foundation.
Si no estamos en el gestor de proyecto, abrirlo ahora. Vamos a crear un nuevo proyecto denominado AbelFac. Crearemos la misma función lógica que realizamos anteriormente en la sección de entrada de esquemáticos. Ir al menú FILE -> NEW PROJECT. En la ventana emergente, entrar el nombre, familia, tipo y velocidad del componente para el que se genera la lógica. En el caso que queramos añadir un fichero Abel al proyecto existente, podemos hacerlo creando una macro en Abel (ver la sección 3.8 sobre macros).
Crear un diseño HDL y usar el asistente HDL.
En el gestor de diseño, hacer clic en el icono de editor HDL o ir al menú APPLICATIONS -> HDL EDITOR. Seleccionar HDL Design Wizard (Asistente para diseño HDL). En la ventana del asistente de diseño hacer clic en NEXT e ir a la ventana del asistente de lenguaje de diseño. Estaremos usando el lenguaje ABEL, luego seleccionar ABEL. Hacer clic en el botón NEXT con lo que se abrirá la ventana de nombre. Entrar el nombre del diseño. Vamos a llamarlo AbelFac. Los nombres no deben ser más largos de 8 caracteres. Si usamos nombres con más de 8 caracteres la síntesis dará errores. Sin embargo, el informe de errores no dirá lo que estuvo mal.
Hacer clic en NEXT. La ventana de puertos del asistente de diseño mostrará un símbolo a la izquierda. Seguir las instrucciones en esta ventana. Podemos crear aquí las patillas de entrada y de salida (ports). Hacer clic en el botón NEW y entrar el nombre (Name), seleccionar como Dirección (Direction) entrada o salida, dependiendo del tipo de puerto (port). Para los pines de salida vamos al botón AVANCED que abrirá la ventana de configuración avanzada. Seleccionar Combinatorial o Register, para un puerto combinacional o registrado (con flip flops). Para nuestro sencillo circuito, escogeremos combinacional. Cuando lo hayamos hecho, hacer clic en el botón FINISH. La ventana del editor HDL se abrirá en este momento.
Crear el fichero fuente ABEL con el Editor HDL.
La ventana del editor HDL estará abierta con una plantilla que contiene el titulo, así como las declaraciones de patillas realizadas en el paso previo. Debemos verificar que están presentes todas las entradas y salidas. Luego tendremos que añadir la descripción lógica de nuestro circuito. Las descripciones lógicas pueden introducirse de varias maneras: Ecuaciones, Tablas de Verdad, y descripciones de Estados (para circuitos secuenciales). Usaremos una ecuación para definir la función lógica de nuestro circuito combinacional. Bajo la sección Equation (<>) escribir la siguiente ecuación:
ZUMBADOR = MARCHA & ( !PUERTA # !CINTURON);
Recordar que en los nombres importan las mayúsculas. La figura siguiente muestra el fichero completo en ABEL. Podemos localizar los números de patilla en el código ABEL o podemos especificarlos más tarde usando un "fichero de restricciones de usuario" cuando compilemos el diseño (ver Editor de Restricciones en el capitulo de Implementación).

Figura 3.14.- Ventana del editor ABEL descibiendo el circuito de la Figura 3.1.
Para conocer algo más sobre la sintaxis de ABEL hacer clic en el icono del asistente de Lenguaje sobre la parte superior derecha de la barra de herramientas, o seleccionar TOOLS -> LANGUAGE ASSISTANT.
Comprobar la sintaxis.
Vamos a asegurarnos que no hemos cometido errores de sintaxis. Ir al menú SYNTHESIS -> CHECK SYNTAX. Si hemos tenido éxito, surgirá una ventana que mostrará "Check Successful". También, el panel de la ventana inferior en el gestor de proyecto mostrará el estado del proceso o informará de cualquier error.
Guardar el fichero
Hacer clic en el icono del disquete o ir a FILE -> SAVE para guardar el fichero fuente HDL. Podemos ahora salir de la ventana del editor HDL que nos devolverá a la ventana del gestor de proyectos.
Añadir el diseño al proyecto.
Para hacer el fichero fuente HDL parte del proyecto prueba1, ir al menú DOCUMENT -> ADD en la ventana del gestor de proyecto. Mostrar ficheros de tipo: ABEL (*.ABL). Seleccionar el FacAbel.abl y hacer clic en OK. El fichero FacAbel.abl debe aparecer ahora en el directorio del proyecto sobre la ventana del gestor de proyectos (pestaña de ficheros).
En este momento podemos simular o compilar el circuito. Ver las secciones sobre simulación y compilación. Si vamos a simular el diseño, ir al menú SYNTHESIS -> SYNTHESIZE y luego hacer clic en el icono botón SIMULATION en la ventana del gestor de proyectos. Si sucede un error, comprobar que el nombre del fichero ABEL no tenga más de 8 caracteres.
5.- Editor de Diagramas de Estados.
Las maquinas de estados finitos se pueden especificar de varias formas. Una forma es usando HDL, como ABEL o VHDL. El tutorial de ABEL explica como usando las construcciones STATE_DIAGRAM, IF-THEN-ELSE o TRUTH_TABLE se pueden usar para especificar máquinas de estados finitas. Las herramientas Xilinx Foundation proporcionan un método alternativo para especificar una máquina de estado. Para usar el Editor de Estados, se debe haber instalado XABEL o X-VHDL (disponible en el PC del laboratorio; es también una parte de la Edición Estudiante de Xilinx). El Editor de Estados nos permite definir diagramas de estado usando una descripción gráfica y convertir la descripción gráfica en ABEL o VHDL.
Para mostrar el uso de un Editor de Estados, implementaremos un detector de secuencia. Implementaremos dos variaciones del mismo detector de secuencia, una implementada como máquina de Mealy y otra como máquina de Moore.
El detector de secuencia reconoce la secuencia siguiente "1011". La máquina se mantendrá comprobando si la secuencia de entrada es correcta y no pasará al estado inicial tras reconocer la cadena correcta. En el caso que lo implementemos como máquina de Mealy, la salida estará asociada con transiciones como indica el siguiente diagrama de estado.

Figura 3.15.- Una máquina de Mealy para un detector de secuencia que detecta la secuencia 1011.
En los apartados siguientes explicaremos como definir el diagrama de estado anterior usando el Editor de Diagramas de Estados. Primero tendremos que crear un nuevo proyecto (o usar un proyecto existente).
5.1.- Crear una macro de maquina de estado.
En el gestor de proyecto, hacer clic en el botón Editor de Estados. Esto abrirá la ventana del editor de estados. Si queremos crear una nueva maquina de estado, seleccionar "Use the HDL Design Wizard" y hacer clic en OK.
En la ventana del asistente de diseño, podemos seleccionar ABEL o VHDL. Usaremos el lenguaje ABEL. Esto implica que el Editor de Estados convertirá la descripción gráfica en código ABEL (o VHDL). Especificar el nombre de fichero. Es buena práctica no usar nunca nombres más largos de 8 caracteres. Hacer clic en NEXT.
En la ventana Ports, definir las entradas: X, RST(para reset) y CLK (reloj). Definir también el port de salida Z. Hacer clic en el botón ADVANCED y seleccionar "combinacional" para la dirección de salida. Asumiremos que la salida del detector de secuencia viene de un circuito combinacional. Podemos hacer la máquina de estado síncrona seleccionando para la salida Z "registrada". Solo necesitamos definir una señal de reloj como uno de los ports de entrada. Nombrando uno de los ports de entrada CLK, la maquina de estado determina que CLK es la entrada de reloj. También proporcionaremos una señal de reset, RST, que nos permitirá poner el detector de secuencia a un estado conocido. Cuando todos los ports de entrada y salida se han definido hacer clic en NEXT.
|
|
|
|
|
|
|
Hoy habia 11265 visitantes (21713 clics a subpáginas) ¡Aqui en esta página! |
|
|
|
|
|
|
|