LABORATORIO DE DISEÑO DE CIRCUITOS Y SISTEMAS ELECTRÓNICOS 4º Ingeniería Electrónica Universidad de Valencia. Dpto. Ingeniería Electrónica. Manuel Bataller. Alfredo Rosado. Lab. de Diseño de Circuitos y Sistemas Electrónicos. Ing. Electrónica PRÁCTICA 1. Diseño de FPGA’s. Programación de dispositivos de XILINX. 1. Introducción. Debido a los requerimientos de funcionamiento, la complejidad que están alcanzando los diseños digitales aumenta día a día. Estos diseños implementan multitud de funciones, las cuales deben realizarse de forma rápida y precisa, por lo que resulta necesario el empleo de circuitos integrados digitales programables con mayor complejidad que los ampliamente difundidos PLD (Programmable Logic Device). Los dispositivos PLD ofrecen una respuesta muy rápida, pero están fuertemente restringidos por su capacidad, y principalmente por su estructura, ya que está completamente fijada y ha de ser nuestro diseño el que se adapte al PLD. Otra posibilidad de implementación la podemos encontrar en los circuitos semi-custom. Estos circuitos permiten la implementación de cualquier sistema digital por complejo que sea, pero tienen algunas desventajas: En primer lugar nos encontramos con un coste elevado, únicamente rentabilizado si el volumen de producción es alto, en segundo lugar, el tiempo de desarrollo es largo (un diseño puede tardar varios meses en comercializarse), esto hace que no resulte interesante debido a la pérdida de competitividad en un mercado que innova constantemente. Con los dispositivos FPGA (Field Programmable Gate Array) se ha alcanzado un punto intermedio entre los dispositivos PLD y los circuitos semi-custom. Un FPGA puede alcanzar una alta densidad de integración en un solo circuito integrado (hasta 1.000.000 de puertas lógicas equivalentes aproximadamente, y cada año aumenta su complejidad), y con velocidades de tratamiento de la información de entrada muy altas; cada día se continua mejorando la eficiencia de estos dispositivos tanto en velocidad como en complejidad. Aunque su estructura está completamente fijada a nivel de silicio , la flexibilidad en su programación es grande ya que un FPGA está formado por células independientes que se pueden programar para realizar funciones sencillas, pero debido a los amplios recursos de interconexión de que disponen, estas células se pueden conectar entre ellas para generar unas funciones lógicas de salida complejas. La programación de este tipo de dispositivos se realiza en cuestión de minutos, con lo que se hacen altamente recomendables para prototipos o bajas producciones. Los proble mas de un FPGA frente a la tecnología semicustom son principalmente la menor velocidad y optimización del chip, pues a menudo, en un FPGA quedan recursos sin utilizar debido a la falta de canales de conexión; además, los canales introducen retardos en la señal, y a veces es necesario un canal de gran longitud (mayor retardo) para interconectar las células requeridas. Todo esto hace que el dispositivo pierda eficiencia, pero estos factores se ven subsanados por la rapidez con la que pueden ser reprogramados, adaptándose rápidamente a las necesidades del mercado. Actualmente, los dispositivos FPGA son empleados en todo tipo de aplicaciones tanto científicas como de consumo; por ejemplo, actualmente se emplean en reproductores de CD, tarjetas de expansión para PC’s, dispositivos para telecomunicaciones, tareas de control de dispositivos, etc. Si el número de unidades a fabricar está por debajo de 10.000, la fabricación con tecnología semicustom no resulta rentable, y la mejor opción es un FPGA. Se puede pensar que si el número de unidades es bajo, podría emplearse lógica estándar, pero el tamaño total del circuito y el encarecimiento de la corrección de errores en una placa de circuito impreso vuelven a hacer aconsejable el empleo de FPGA. Si nuestro diseño se desea implementar con los métodos tradicionales, después de las especificaciones se han de separar diferentes bloques funcionales, diseñando cada uno de ellos por separado para posteriormente integrarlos todos en una placa prototipo, esto provoca que a menudo se produzcan “cuellos de botella” que habrá que corregir. Mientras se fabrican las placas definitivas, pueden sugerirse nuevos cambios que repercutirán en alteraciones de la placa, lo que provocará un retraso en el lanzamiento del producto y un mayor gasto económico, por desgracia, estas alteraciones en el diseño son usuales. El diseño completo puede llevar de 6 a 12 meses para diseños que necesiten de 500 a 1500 circuitos integrados de lógica estándar, y si se incluyen las alteraciones de la placa puede llegarse a un tiempo total de 2 años. Una vez implementado el diseño correctamente, para reducir costes se puede pasar a implementarlo en tecnología semicustom, lo que requeriría otro año más. Actualmente, un nuevo sistema de diseño tiende a implantarse. Una vez hechas las especificaciones, el sistema es dividido en grandes bloques como pueden ser memorias, microprocesador, PLD y FPGA, se realiza una descripción de alto nivel a través de un esquema o lenguaje de descripción lógica para posteriormente simular el diseño, cuando la simulación es correcta se realiza el diseño de la placa que contendrá los diferentes elementos, mientras la placa está siendo fabricada, se depura el diseño, pero en la mayoría de los casos esto no afecta a la placa sino a los circuitos programables incluidos en ella. Para incrementar beneficios, si la producción va a ser alta se puede pasar a emplear tecnología semicustom, pero 2 Lab. de Diseño de Circuitos y Sistemas Electrónicos. Ing. Electrónica con la ventaja que muchos de los pasos realizados para simular y comprobar el diseño son los mismos para un FPGA y un circuito semicustom, pero para que esta migración del diseño sea rentable, la complejidad ha de ser alta (pues el FPGA se encarece bastante) y el nivel de producción elevado. Un FPGA consiste básicamente en un conjunto de células lógicas (CLB) interconectables entre sí a través de unos canales de conexionado donde tanto las células como los canales son programables para permitir la personalización del diseño, esta estructura se aprecia en las figuras siguientes donde se pueden ver los canale s de interconexión y el interior de una célula lógica CLB. También se incluyen las células de entrada-salida que comunican la lógica interna con el exterior, y aunque su estructura es variable, siempre contienen puertas triestado que permiten hacer funcionar el terminal como entrada, salida o como entradasalida, además, pueden controlar la transferencia de señales a los buses de conexión, contienen diodos de protección electrostática y a menudo incluyen resistencias de “pull-up” para definir compatibilidad TTL o CMOS. Diagrama de conexiones en una FPGA Ejemplo de estructura configurable CLB. interna de un bloque lógico PSM: Programmable switch matrix CLB: Configurable logic block 2. Objetivo de la práctica. Simular e implementar un mini-procesador de 4 bits con una pila de datos en una placa de evaluación de FPGA’s. El procesador ejecuta operaciones entre un registro interno y la parte superior de la pila o entre los datos de entrada provenientes de unos interruptores externos que sitúan el valor de cada entrada al nivel lógico 1 ó 0 (alto o bajo) deseado. Los resultados de las operaciones son almacenados en el registro interno y visualizados en formato hexadecimal en un display de 7 segmentos. La parte alta de la pila se muestra en binario en una fila de LED’s, y la cantidad de elementos que hay en la pila se muestra en un tramo de 4 LED’s de una segunda fila. El diseño se probará en una placa de evaluación con posibilidad de descarga del programa desde el ordenador y que dispone de 8 entradas en forma de interruptores, 2 filas de 8 LED’s, 3 displays de 7 segmentos y 3 botones (de los cuales solo emplearemos uno de ellos para el reset del sistema). Prácticamente todos los elementos del sistema han sido ya diseñados y su esquema se ha realizado a través del entorno de diseño esquemático que Xilinx Foundation incorpora en su programa de diseño de FPGA y CPLD. Todos los bloques presentes en cada uno de los esquemas tales como CONTROL o ALU, están enlazados con un esquema de un nivel inferior que describe su funcionamiento interno, y que a su vez puede contener otros bloques que hacen referencia a nuevos esquemas, es decir, forman parte de un diseño jerárquico. La figura siguiente muestra el esquema de más alto nivel del diseño con todos los bloques principale s que componen el sistema. 3 Lab. de Diseño de Circuitos y Sistemas Electrónicos. Ing. Electrónica El diseño consiste en los siguientes bloques: ·ALU Donde se realizan las operaciones aritméticas ·CONTROL Aquí, los códigos de operación se decodifican en líneas de control que regulan el funcionamiento de la pila (STACK) y la unidad aritmético lógica (ALU). ·STACK La pila es un dispositivo de almacenamiento de 4 palabras de 4 bits y que se implementa a través de módulos RAM en caso de la familia XC4000 como es nuestro caso ·DEBOUNCE Este bloque es el encargado de manejar la orden de ejecución de instrucción y hacerla llegar en el momento correspondiente. ·SEG7DEC Permite la decodificación de la salida de la ALU para que se visualice apropiadamente en los visualizadores de 7 segmentos. ·CLOCKGEN CLOCKGEN utiliza un oscilador interno presente en la FPGA para generar la señal de reloj que permite que el sistema este sincronizado. ·BARDEC BARDEC muestra la cantidad de elementos que hay en la pila a través de 4 LED’s de la placa. ·SWITCH7 Este módulo simplemente sincroniza la entrada de datos procedente de los interruptores al sistema. Las operaciones que realiza el procesador en función del valor de los interruptores (asociados, por orden de descripción a SWITCH6, SWITCH5, SWITCH4, SWITCH3, SWITCH2, SWITCH1, SWITCH0) de entrada se indican en la siguiente tabla, donde: X: No importa el estado en que se encuentre. Data: Dato de entrada para el cálculo de la operación indicada. NOTA: el interruptor número 1 (asociado a SWITCH7) es el encargado de ordenar la ejecución de las instrucciones. Las operaciones con la pila siempre se realizan con el valor que se ha introducido más recientemente, pues la pila (STACK) es de tipo LIFO (Last Input First Output): 4 Lab. de Diseño de Circuitos y Sistemas Electrónicos. Ing. Electrónica Nº interruptor 2 3 4 5 6 7 8 Vector SWITCH(6:0) 6 5 4 3 2 1 0 0 0 0 0 1 0 0 1 1 0 0 1 0 1 0 1 1 0 1 1 0 X X X Data X 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 0 0 1 1 0 0 0 1 0 1 0 1 X X X X X X 1 1 1 1 1 0 X 1 1 1 1 1 1 X Data Data Data Data Data Operación SUMA entre Data y registro AND entre Data y registro OR entre Data y registro XOR entre Data y registro RESTA el valor de Data del valor del registro PUESTA A CERO del registro CARGA del registro con el valor de Data SUMA entre la pila y el registro AND entre la pila y el registro OR entre la pila y el registro XOR entre la pila y el registro RESTA el valor de la pila del registro APILAR (PUSH) el valor del registro en la pila DESAPILAR (POP) el valor de la pila en el registro NOP no realiza ninguna operación 3. Etapas a seguir. Una de las tareas a realizar en esta práctica es la de completar el esquemático correspondiente al bloque ALU, para ello crearemos un nuevo símbolo y su diagrama esquemático asociado, el cual insertaremos posteriormente en el esquema de la ALU. Además, insertaremos y conectaremos algunos elementos de librería estándar. Posteriormente simularemos el sistema y si todo es correcto, se procederá a la implementación definitiva. Las etapas de que consta un diseño para implementación en FPGA son: 1. Diseño del sistema. 2. Creación del esquema lógico que realiza las operaciones especificadas. 3. Simulación. 4. Implementación en el dispositivo FPGA. 5. Prueba del sistema mediante la placa de evaluación. Para el desarrollo de todos estos pasos, el entorno de desarrollo nos proporciona el acceso a cada una de las herramientas, para acceder a él, ejecutaremos el programa “Xilinx Foundation Project Manager” tal y como se muestra en la siguiente figura: 5 Lab. de Diseño de Circuitos y Sistemas Electrónicos. Ing. Electrónica Seguidamente debemos abrir el proyecto donde se encuentra nuestra práctica, para ello realizaremos la operación File → Open Project, y seleccionamos el proyecto calc dentro del directorio c:\dcse_xil: Una vez abierto el proyecto, en la parte izquierda de la pantalla nos aparecen los componentes principales del proyecto, es decir, los esquemas que lo componen, la librería de la familia en la que va a ser implementado, y todo lo relacionado con elementos indispensables de dicho proyecto. En la parte derecha aparecen diversas solapas donde podemos conocer el estado de nuestro proyecto, y a través de los botones de la solapa ‘Flow’, tenemos acceso al resto de herramientas que permitan completar el diseño, con entrada ya sea a través de captura esquemática, mediante lenguajes HDL o editor de estados, para posteriormente simular el diseño y una vez sea el correcto, realizar su implementación. 3.1. Creación y modificación del diagrama esquemático. Haciendo doble -click sobre el nombre del fichero esquemático de más alto nivel (CALC.SCH), o bien pulsando sobre el botón “Schematic Editor” accederemos al editor de esquemáticos. En este esquema, correspondiente a la figura que se muestra en la página 4 se pueden apreciar los bloques básicos en los que se descompone el sistema, con las entradas correspondientes a switch[7:0] y Reset (el elemento IPAD se emplea para designar las entradas exteriores) y salidas hacia los LED’s y los display de 7 segmentos (representadas por el elemento OPAD). También se puede apreciar un bloque de control que decodifica la entrada (CONTROL), una unidad aritmético-lógica que efectúa las operaciones aritméticas que 6 Lab. de Diseño de Circuitos y Sistemas Electrónicos. Ing. Electrónica se le indican (ALU), la pila de almacenamiento de datos (STACK), un oscilador interno que proporciona una frecuencia de reloj de 15Hz (CLOCKGEN), los decodificadores que envían la información a los visualizadores (LED’s y display’s), y SWITCH7 y DEBOUNCE que se encargan de que las entradas envíen la información a los módulos de forma síncrona con los ciclos de reloj que se generan. Dado que los elementos IPAD y OPAD representan las patillas externas del dispositivo, desde el esquema se les puede asignar el número de patilla que debe tener cada salida y entrada para que se corresponda con las patillas de la placa de evaluación, así, podemos asignar a la salida STACKLED0 la patilla número 60, para ello, seleccionando su OPAD correspondiente, se hace doble -click sobre el elemento aparece la ventana “Symbol Properties”, donde además de los atributos que ya haya definidos, se crea uno nuevo en la zona reservada para nuevos parámetros de caracterización del símbolo (Parameters ) con las siguientes características: Name: LOC Description: P60 después se pulsa el botón Add para validar el atributo y OK para cerrar la ventana; por lo que respecta al resto de patillas, veremos posteriormente otro método de asignación mediante fic hero de restricciones. Además, para las cuatro salidas STACKLED se incluye el atributo FAST que se especifica dentro del campo Name de la zona Parameters; este atributo se emplea para especificar que estas señales dispongan de un alto Slew Rate de salida, permitiendo incluso proporcionar mayor corriente de salida. Otro requisito indispensable que debe cumplir cualquier diseño esquemático para FPGA’s es que cualquier entrada o salida externa debe ir acompañada de un buffer de entrada (IBUF) o salida (OBUF) respectivamente. En cuanto a las tareas a realizar, el diseño se encuentra prácticamente finalizado a falta de algunos componentes. Dado que está esquematizado de forma jerárquica, podremos acceder al esquema que representa cada bloque a través del botón “Hierarchy Push/Pop” , pues haciendo doble -click sobre el símbolo nos introducimos un nivel más abajo, y si estamos en un nivel inferior y queremos ascender, haremos doble -click sobre cualquier zona en blanco del esquemático, pero siempre con el botón activado ya que en caso contrario se realizará diferente función de la descrita; si queremos movernos de un esquema a otro sin cerrarlos, podremos acceder a las solapas inferiores que nos muestran los esquemas que tenemos actualmente abiertos. Con él nos introduciremos dentro del elemento ALU. Una vez situados en su esquema, veremos que hay un hueco donde llegan las líneas de bus, pero falta un elemento, pues bien, este elemento deberemos crearlo. En primer lugar es necesario crear un nuevo esquema con File → New Sheet composición: con la siguiente Para ello, con el botón “Symbols Toolbox” abrimos una ventana donde aparecen todos los elementos disponibles en la librería de componentes, y de entre todos ellos seleccionamos AND2, y al pasar el puntero del ratón de esa ventana al esquema, ya tendremos la puerta implantada en el circuito. Repitiendo el proceso conseguiremos poner los cuatro símbolos necesarios. Para la creación de líneas de conexión, dado 7 Lab. de Diseño de Circuitos y Sistemas Electrónicos. Ing. Electrónica que vamos a utilizar un bus, en primer lugar, con el botón “Draw Buses” dibujamos las líneas de bus, y con el botón “Draw Bus Taps” conseguiremos realizar por completo el esquema, al que llamaremos ANDBLK2.SCH en el momento de guardar el esquema. Es importante nombrar cada uno de los buses y asignar a cada linea que sale de él un nombre correspondiente a una de las señales contenidas en el bus. Para conseguir esto, podemos hacer que las líneas salientes se nombren automáticamente, por defecto el nombre será el de la línea de bus más baja, y con las teclas de los cursores arriba y abajo el indice cambia. Asímismo, en la ventana “Add Bus Terminal/Label” , además de definir el nombre, podremos definir si el bus es de entrada o salida, cosa importante ya que al formar parte de un símbolo debe conocerse el sentido de las señales y de esta forma ser coincidentes con las posibles conexiones que se realicen. Una vez finalizado, elegiremos Hierarchy → Create Macro Symbol From Current Sheet, y aparecerá la siguiente ventana de especificación del símbolo, que una vez rellenada con lo que el programa pone por defecto más nuestras especificaciones añadidas debe tener el aspecto siguiente: Una vez generado el símbolo, nos preguntará si queremos editarlo, de momento le decimos que no. Ahora ya tenemos una nueva macro que podremos insertar en cualquiera de nuestros esquemas; en este caso lo haremos en el esquema ALU.SCH que es donde falta por incluir. Para añadirlo, bastará con realizar la misma operación que cuando se insertó la puerta AND2, pues el nombre ANDBLK2 aparecerá en la ventana “SC symbols” que aparece al pulsar el botón . Si lo queréis conectar a las líneas destinadas al símbolo, el tamaño del símbolo generado no coindice con la separación entre las líneas de bus que ya existen, para hacerlo coincidir hay dos posibilidades, la primera es borrar las líneas de bus y dibujarlas donde corresponden, y la segunda opción, que es la que se debe utilizar, consiste en cambiar el tamaño y la posición de los buses del símbolo generado, esto se consigue emplazando el símbolo en un lugar cualquiera del esquema y ejecutando Tools → Symbol Editor con el símbolo a editar previamente seleccionado, así nos aparece una ventana como la que sigue donde arrastrando con el ratón se puede cambiar el aspecto del símbolo. 8 Lab. de Diseño de Circuitos y Sistemas Electrónicos. Ing. Electrónica Ahora que ya hemos conseguido colocar correctamente el nuevo símbolo generado, para que el diseño ALU esté completo es necesario añadir un elemento más, este elemento llamado en la librería AND5B2, se debe colocar tal y como muestra la figura siguiente. De nuevo se hará aparecer la ventana de selección de componentes y con el botón “Draw Wires” , se dibujan las conexiones simples necesarias, no olvidando nombrarlas, sobre todo si éstas se dejan al aire haciendo referencia a una señal ya existente en el circuito, pues dado que resulta demasiado engorroso trazar la línea, se le asigna el mismo nombre, con lo que el software se dará por enterado de que todas las líneas con el mismo nombre están conectadas entre sí. Para generar el símbolo ANDBLK, existe una forma alternativa y que puede resultar más sencilla en algunos casos, que es la de utilizar la opción Tools → Symbol Wizard, con la que nos aparecen una serie de pasos guiados para generar el nuevo símbolo, especificando entradas y salidas, tipo de descripción (esquema, HDL, etc.) y algunas opciones adicionales, tendremos primero el símbolo al que posteriormente le crearemos el esquema interno. Si se desea, por este método podéis probar a realizar un nuevo símbolo análogo al ANDBLK2 pero llamado ANDBLK pa ra así comparar resultados. Finalmente, el esquema ALU.SCH finalizado debe quedar de la siguiente forma: 9 Lab. de Diseño de Circuitos y Sistemas Electrónicos. Ing. Electrónica 3.2. Simulación. Para comprobar que el diseño ejecuta todas las operaciones correctamente, es necesario realizar una simulación funcional, paso previo a la implementación ya que no tiene sentido ponerse a implementar un diseño que no funciona correctamente. Por tanto, emplearemos la herramienta de simulación, que lanzaremos con Tools → Simulator o bien, dentro de la solapa Flow de la ventana del Project Manager, el botón: Entonces, si se nos preguntará si deseamos actualizar el Netlist, diremos que Sí, con lo que se generará el listado de componentes que servirán para que el simulador conozca el comportamiento de cada uno de los elementos del sistema y las interconexiones entre ellas. Una vez que se ha cargado la Netlist, nos aparece la ventana del simulador desde la que podemos controlar el proceso de creación de estímulos aplicables a las entradas, visualizar las señales deseadas, ya sean internas o de salida, y podremos comprobar cómo evolucionan las señales sobre el esquemático creado, es decir, que además de visualizar los estados en forma de onda temporal, en el esuqema también aparecen los valores que toman las señales en cada estado de simulación, pudiendo tener la oportunidad de realizar dicha simulación paso a paso o de una sola vez. Dado que la ventana del simulador aparece sin señales algunas que visualizar, para añadirlas elegiremos la opción Signal → Add Signals o el botón: , con lo que nos aparece una ventana dividida en tres partes. La parte izquierda muestra los buses y líneas contenidas en el nivel de jerarquía seleccionado en la parte derecha de la ventana, y en la parte central aparecen los componentes del diseño en el nivel de jerarquía seleccionado. Como queremos visualizar señales del nivel superior (Root), lo dejaremos seleccionado, y haremos doble click en las señales que vamos a visualizar: SWITCH7,SWITCH0 ALUVAL3,ALUVAL0 STACKOUT3,STACKOUT0 CLK PUSH STACKEN y a continuación cerramos la ventana. Para añadir señales adicionales, también se puede hacer desde el editor de esquemas; vamos a añadir la señal EXEC, lo que se consigue trasladándonos al esquema (lo abrimos si es que lo habíamos cerrado previamente), y con la opció n Mode → Testpoints se abre una pequeña ventana en la que se pueden poner puntas de prueba, que en este caso nos servirá para ponerla en la línea EXEC haciendo click en dicha línea, apareciendo una señal gris sobre dicha línea para indicar que ésta va a ser monitorizada. También se puede comprobar que esta misma señal gris aparece en el resto de líneas que habíamos seleccionado previamente mediante las herramientas del simulador. En esta zona gris será donde, durante el proceso de simulación, se sitúen los valores lógicos que las señales toman. Para volver al simulador, seleccionamos Tools → Simulator. La visualización de los buses puede cambiar, ya que éstos pueden aparecer expandidos o no. Por motivos de visualización, vamos a expandir [switch7,switch0] para separar la señal switch7 del resto del bus ya que ésta indica la ejecución de operación mientras el resto son las que contienen la instrucción y datos a ejecutar por el mini-procesador. Para realizar esta operación seleccionamos dicho bus, y haciendo click en el botón derecho seleccionamos Bus → Flatten, luego, seleccionamos la señal switch6, y con la tecla mayúsculas pulsada (Shift) seleccionamos switch0, con lo que quedarán seleccionadas todas las señales entre ellas, y pulsando Bus → Combine desde el menú contextual que aparece al pulsar el botón derecho, crearemos un nuevo bus que en este caso ya no contiene la señal switch7, teniendo la lista de señales como sigue: 10 Lab. de Diseño de Circuitos y Sistemas Electrónicos. Ing. Electrónica Como final para tener las señales preparadas para la simulación, debemos comprobar el orden del nuevo bus, es decir, hacer que switch6 sea el más significativo MSB y switch0 el menos significativo LSB, si es necesario cambiarlo, con el botón derecho se elige Bus → Change Direction. Es importante verificar que esto es así, pues en caso contrario la simulación podría producir resultados indeseados, esto se consigue con el botón: . Este proceso también hay que hacerlo para ALUVAL y STACKOUT. El siguiente paso consiste en asignar los estímulos a las entradas, esto se realiza mediante el editor de estímulos que aparece pulsando Signal → Add Stimulator o el botón . Las filas de LED’s Bc y NBc son contadores que se pueden utilizar como señales repetitivas cada cierto tiempo, por ello utilizaremos B0 (la opción cero de la fila de Bc) para definir la señal de reloj CLK, para ello, se selecciona la señal CLK en la ventana principal y se pulsa sobre B0, con lo que veremos que aparece B0 en la parte derecha del nombre de la señal indicando que esa señal ha sido asociada con B0 del generador de estímulos. A continuación, elegimos Options → Preferences para seleccionar la precisión de simulación en 100ps y el periodo de B0 en 100ns. Seguidamente vamos a definir varias fórmulas de aplicación de valores a las entradas. En primer lugar pulsamos el botón Formula... de la ventana, y haciendo doble -click en la línea F0 definiremos la primera fórmula, donde escribiremos: [0]200[61]500[0d]500[7b]600[3f]500[7b]500[50]500 con lo que los valores entre corchetes se aplicarán al bus especificado, que en este caso será [switch6..switch0]. sin salirse de esta ventana, definimos la segunda formula F1 como: H200 (L200H300)2 L200H400 (L200H300)3 11 Lab. de Diseño de Circuitos y Sistemas Electrónicos. Ing. Electrónica lo que indica que la señal asociada a este estímulos estará en valor lógico ‘1’ durante 200ns, posteriormente se repetirá dos veces un ciclo de 200ns bajo 300ns alto, luego uno de 200ns bajo y 400ns alto y finalmente 3 ciclos de 200ns bajo y 300ns alto. Para asociar estas fórmulas con determinadas señales de entrada haremos el proceso similar a CLK, es decir, se selecciona el bus [switch6..switch0] y se pulsa F0 (opción 0 de la fila Form. debajo de Bc y NBc), y luego se selecciona switch7, donde se pulsa F1 para que esta fórmula quede asociada. Cuestión: Comprobar el resultado de aplicar la fórmula F0 al bus [switch6..switch0]. Una vez que ya se tiene la definición de los estímulos de entrada, simularemos el circuito con el botón Step: . Cuyos valores temporales de lo que significa un salto de este tipo se seleccionan mediante Options → Simulation Step, que fijaremos en 200ns. Finalmente, se ejecuta la simulación pulsando el botón Step varias veces; con lo que se podrán visualizar los resultados generados. Cuestión: Añadir tres comandos adicionales para comprobar algunas instrucciones no simuladas en F0, entre ellas la instrucción que hace la función AND de la entrada con el contenido de la ALU. Para ello, ampliar la fórmula F0 para que incorpore estas funciones. Como se ve en la figura, es necesario inicializar la señal NOTGBLRESET. Crear la fórmula. Los resultados iniciales deben ser: Una vez realizada la simulación, ejecutamos File → Save Waveform, ya que posteriormente necesitaremos acceder a estos datos y no habrá necesidad de crear los estímulos de nuevo. 3.3. Implementación del diseño. Una vez nos hemos asegurado que nuestro diseño funciona correctamente, ya estamos dispuestos a afrontar la última etapa del diseño que consiste en la implementación definitiva sobre un dispositivo FPGA o CPLD específico, es decir, las especificaciones que hemos realizado a través del esquema se convierten en descripciones basadas en conexiones y estructuras lógicas existentes dentro del dispositivo Seguidamente comienza el proceso de traducción de los esquemas lógicos al formato genérico EDIF que posteriormente pasará a formato Xilinx, es decir, los elementos de los esquemas son traducidos a nivel de CLBs e interconexiones entre CLBs (además de conexiones internas dentro de cada CLB para configurar cada célula). El proceso a seguir se puede apreciar en la siguiente figura: 12 Lab. de Diseño de Circuitos y Sistemas Electrónicos. Ing. Electrónica Para comenzar este proceso, pulsaremos en el botón Implement en el Project Manager: con lo que accederemos al entorno del Design Manager, basado en un sistema de versiones y revisiones para no perder información sobre modificaciones que se van haciendo sobre la marcha. Diferentes versiones implican cambios del esquema lógico, y diferentes revisiones implican modificaciones en las opciones de implementación del diseño sobre el dispositivo. El aspecto inicial del entorno es: aquí podemos elegir otro dispositivo del inicialmente previsto (se elige: XC4010EPC84 -3). Mediante el botón Options... , seleccionamos las opciones de implementación para la revisión actual; el aspecto es: 13 Lab. de Diseño de Circuitos y Sistemas Electrónicos. Ing. Electrónica A su vez, se puede particularizar el tipo de implementación modificando las opciones de implementación con Edit Options..., donde dependiendo del tipo de dispositivo aparecerán un tipo u otro de opciones. Para el caso de la familia XC4000, una de las solapas de opciones es la que se muestra a continuación. Por defecto, dejaremos todas las opciones tal y como están y cerramos todas las ventanas hasta volver a la ventana Implement Design donde para comenzar el proceso, elegimos Run. Aparece la ventana siguiente y esperamos a que terminen todas las etapas: 14 Lab. de Diseño de Circuitos y Sistemas Electrónicos. Ing. Electrónica Tras una pequeña espera hasta que el proceso finalice, si todo el proceso se ha llevado a cabo con éxito (aunque existan varios mensajes de aviso-warning, no son preocupantes), podremos acceder al visor de informes desde Project Manager con el menú Implementation → View Report Files...: donde tenemos toda la información que se ha producido en cada una de las etapas del proceso de implementación. Cuestión: Responder a las siguientes preguntas: 1. Buscar el origen del aviso que muestra en informe Translation Report, ¿a qué se debe?, ¿afecta al comportamiento del sistema diseñado?. 2. ¿Qué velocidad máxima de reloj se puede alcanzar?, o lo que es lo mismo, ¿cuál es el máximo retardo que existe en el diseño?. Comprobar el valor proporcionado por el análisis post-layout. ¿Por qué la frecuencia máxima no es la dada por la inversa del maximum net delay? 3. ¿Se han realizado simplificaciones en el diseño durante la optimización?, describe las simplificaciones que indican los informes. 4. ¿Cuántas células lógicas son necesarias para el diseño?. ¿Cuántas patillas de entrada/salida se emplean?. Comprobar que cada patilla se corresponde a la asignación realizada en el fichero .ucf (ver anexo) 3.4. Simulación Post-layout. Para comprobar los retardos reales que se producen en el funcionamiento del dispositivo, ejecutamos: y accedemos a File → Load Waveform (recordad que para ello debíamos haber guardado previamente la simulación funcional ). Si hacemos un acercamiento a la zona que aparece en la figura, se puede ver cómo existe un retardo desde que la señal de reloj cambia hasta que el valor ALUVAL reacciona. Cosa que no ocurría en la simulación funcional, ya que ahora se está teniendo en cuenta los retardos que se producen dentro del dispositivo, con lo que este resultado se aproxima más fielmente al comportamiento real que va a tener el sistema. 15 Lab. de Diseño de Circuitos y Sistemas Electrónicos. Ing. Electrónica 3.4. FPGA Editor. Para poder echar un vistazo al resultado de la implementación sobre el dispositivo FPGA, desde la ventana de Project Manager ejecutaremos Tools → Implementation → FPGA Editor Esta aplicación permite visualizar el diseño calc resultante en el interior de la FPGA y analizar el emplazamiento de los recursos lógicos empleados, así como el trazado de las conexiones entre ellos. 16 Lab. de Diseño de Circuitos y Sistemas Electrónicos. Ing. Electrónica Mediante la barra de botones que ofrece el programa es posible modificar las conexiones entre CLB de modo que podemos alterar el layout generado. También es posible comprobar el contenido interno de cada CLB e IOB, se hace doble clic sobre ellas y aparece la segunda figura de las anteriores. También se puede ver la función lógica que incorpora cada LUT. 3.5. Comprobación del diseño en la placa de evaluación. Dado que la placa ya se encontrará conectada al PC mediante el cable Xchecker de programación, simplemente deberemos ejecutar el programa Hardware Debugger (se accede a él con Tools → Device Programming → Hardware Debugger o el botón del Project Manager: Desde Hardware Debugger realizaremos realmente la programación del dispositivo situado en la placa de evaluación. Por tanto, nos aparecerá el programa de grabación con el siguie nte aspecto: Si la conexión con la placa no se ha podido realizar, se visualiza un mensaje para poder elegir el tipo de conexión, que normalmente se hará desde el puerto serie COM2 y con cable XChecker. Además se visualizará otro mensaje en el que nos dice que el modo de verificación y depuración se han deshabilitado, pero que no tiene mayor importancia. Así, ya estamos dispuestos a programar el dispositivo; con Download → Download Design, se procede a la programación, y si todo va bien, ya podremos comenzar a probar el funcionamiento desde la placa de pruebas. Se dispone de una placa con dispositivos FPGA, de la que sólo emplearemos uno de ellos., el aspecto de la placa es el siguiente 17 Lab. de Diseño de Circuitos y Sistemas Electrónicos. Ing. Electrónica El display de 7 segmentos en el que aparece el dato existente en la ALU es el display U8, en los LED’s D9-D12 se muestra la cantidad de datos que hay en la pila, conforme ésta se va llenando, se van iluminando los LED’s comenzando por D9. En los LED’s D13-D16 (parte inferior derecha de la imagen anterior), se visualiza (en binario) el dato contenido en la parte superior de la pila (un LED apagado es nivel alto y LED encendido es nivel bajo). El interruptor SW4 realiza un reset del sistema (sería la señal NOTGBLRESET), y SW6 borra la programación de la FPGA, debiendo programarla de nuevo para hacer funcionarla otra vez. Los interruptores del zócalo SW3 (parte central) : se corresponden con la señales SWITCH7 para el número 1, SWITCH6 el 2,...., y SWITCH0 el 8. Es decir, para introducir las instrucciones y datos al miniprocesador, se realizará mediante los interruptores 2 al 8, y una vez seleccionado el valor, para validar la acción, se debe activar y desactivar de forma consecutiva el interruptor 1. Para atestiguar que el diseño funciona tal y como se había predicho en la simulación, deberemos introducir las mismas instrucciones que en el simulador funcional (incluyendo las instrucciones adicionales que se añadieron individualmente). 18 Lab. de Diseño de Circuitos y Sistemas Electrónicos. Ing. Electrónica APÉNDICE # CALC.UCF # Fichero de restricciones para CALC, XC4010E-PC84 # Se ha comentado el pin de STACKLED0 ya que se ha asignado # en el esquemático, si no ha sido así, eliminar el #NETSTACKLED0 LOC=P60 ; NET NET NET NET NET NET NET NET SWITCH<7> SWITCH<6> SWITCH<5> SWITCH<4> SWITCH<3> SWITCH<2> SWITCH<1> SWITCH<0> LOC=P19 LOC=P20 LOC=P23 LOC=P24 LOC=P25 LOC=P26 LOC=P27 LOC=P28 ; ; ; ; ; ; ; ; NET NET NET NET NET NET NET NET A B C D E F G OFL LOC=P49 LOC=P48 LOC=P47 LOC=P46 LOC=P45 LOC=P50 LOC=P51 LOC=P41 ; ; ; ; ; ; ; ; NET NET NET NET GAUGE3 GAUGE2 GAUGE1 GAUGE0 LOC=P61 LOC=P62 LOC=P65 LOC=P66 ; ; ; ; NET STACKLED3 NET STACKLED2 NET STACKLED1 # NETSTACKLED0 NET NOTGBLRESET comentario (#) de LOC=P57 ; LOC=P58 ; LOC=P59 ; LOC=P60 ; LOC=P56 ; 19