EUITI - MADRID DEPARTAMENTO ELAI Prácticas de Microelectrónica Luis Castedo EUITI - MADRID DEPARTAMENTO ELAI Índice PRÁCTICA Nº 1: .................................................................................................................................................. 1 INTRODUCCIÓN AL ENTORNO ISE DE XILINX........................................................................................ 1 INTRODUCCIÓN ................................................................................................................................................... 1 EL ENTORNO DE DESARROLLO ............................................................................................................................. 2 Project navigator........................................................................................................................................... 3 Creación de un nuevo proyecto ..................................................................................................................... 5 Uso el editor de esquemáticos ....................................................................................................................... 8 Verificación de la sintaxis y simulación ...................................................................................................... 10 PRÁCTICA Nº 2: ................................................................................................................................................ 13 DECODIFICADOR BCD A 7 SEGMENTOS.................................................................................................. 13 OBJETIVOS DE LA PRÁCTICA .............................................................................................................................. 13 INTRODUCCIÓN ................................................................................................................................................. 13 La tarjeta Spartan-3 Starter kit ................................................................................................................... 13 El bus JTAG................................................................................................................................................. 15 Control del proceso de síntesis.................................................................................................................... 16 Programas de prueba .................................................................................................................................. 17 La entidad de nivel superior ........................................................................................................................ 17 REALIZACIÓN DE LA PRÁCTICA ......................................................................................................................... 18 El decodificador .......................................................................................................................................... 18 Tarea 1......................................................................................................................................................... 21 Tarea 2......................................................................................................................................................... 22 PRÁCTICA Nº 3: ................................................................................................................................................ 25 DISEÑO DE UNA UNIDAD LÓGICO ARITMÉTICA.................................................................................. 25 OBJETIVOS DE LA PRÁCTICA .................................................................................................................... 25 INTRODUCCIÓN ................................................................................................................................................. 25 REALIZACIÓN DE LA PRÁCTICA ......................................................................................................................... 27 EJERCICIOS ........................................................................................................................................................ 29 Tarea 1......................................................................................................................................................... 29 Tarea 2......................................................................................................................................................... 29 PRÁCTICA Nº 4: ................................................................................................................................................ 31 DISEÑO DE UNA UNIDAD LÓGICO ARITMÉTICA (Y II) ....................................................................... 31 OBJETIVOS DE LA PRÁCTICA .................................................................................................................... 31 INTRODUCCIÓN ................................................................................................................................................. 31 Diseño de la máquina de estados finitos...................................................................................................... 34 REALIZACIÓN DE LA PRÁCTICA ......................................................................................................................... 36 Tarea 1......................................................................................................................................................... 36 Tarea 2......................................................................................................................................................... 36 Tarea 3......................................................................................................................................................... 36 1 EUITI - MADRID DEPARTAMENTO ELAI Práctica nº 1: INTRODUCCIÓN AL ENTORNO ISE DE XILINX INTRODUCCIÓN La evolución de los sistemas digitales ha hecho necesario el empleo de lenguajes de descripción de circuitos. En efecto, cuando se pretende diseñar un sistema complejo con miles de elementos, tratar de describirlo a través de esquemas resulta inviable. En la actualidad existen muchos lenguajes de descripción hardware, pero uno de los más extendido es el VHDL (Very high speed Hardware Description Language). Se desarrolló con la idea de que sirviera como un lenguaje estándar de descripción de circuitos. Esto significa que el código creado en VHDL puede ser utilizado con independencia del fabricante o la tecnología que elijamos. Fue en 1984 cuando el IEEE propuso su estándar. Se diseñaron varias versiones con la colaboración de la industria y las universidades, pero fue finalmente en Diciembre de 1987 cuando el IEEE publicó el estándar IEEE Std 1076-1987 que más adelante sería conocido como VHDL`87. Prácticas de Electrónica de Microelectrónica 2 DEPARTAMENTO ELAI EUITI - MADRID Esta primera versión pronto mostró algunas carencias, debido fundamentalmente a la rápida evolución de las herramientas que utilizaban VHDL. Por eso, en 1993 el IEEE, en base a las experiencias recogidas del uso del VHDL´87 planteó un segundo estándar, el IEEE Std 10761993, más comúnmente conocido como VHDL´93. Conviene resaltar que VHDL y otros lenguajes HDL tienen capacidad de expresar más cosas de las que las herramientas actuales son capaces de sintetizar. Incluso existen construcciones que tienen sentido para la verificación de un diseño o su descripción a muy alto nivel, pero que no tienen sentido en un chip, como el acceso a ficheros en disco o los bucles for. Por tanto, el hecho de que un diseño pueda simularse no significa que pueda sintetizarse. De hecho, según se avanza en el diseño y éste se va refinando, hay que restringirse a un subconjunto del lenguaje y a unas ciertas reglas de codificación que la herramienta de síntesis pueda comprender. Es lo que se denomina código sintetizable. En este laboratorio se trabajará fundamentalmente en VHDL, si bien en algunas ocasiones emplearemos otras herramientas de captura como las de captura de esquemáticos, formas de onda o diagramas de estado. Como herramientas de trabajo emplearemos en el entorno de desarrollo de Xilinx ISE WebPack, ya que emplearemos dispositivos programables de este fabricante, y el simulador ModelSim XE II de Model Technology. Ambas herramientas (al menos en sus versiones más básicas) pueden descargarse de la página web de Xilinx. Hacer notar aquí que, aunque casi todos los fabricantes ofrecen su propio paquete de herramientas, que suelen subvencionar de algún modo, y que, como era de esperar, sólo es válido para sus productos, también existen paquetes independientes del fabricante, desarrollados por empresas de software de CAD/CAE como Mentor, Cadence o Synopsys. EL ENTORNO DE DESARROLLO El entorno de desarrollo está compuesto por un conjunto de herramientas que nos van a permitir: • Capturar diseños a través de esquemáticos, diagramas de estados, en VHDL y en Verilog. • Capturar testbenches (código de verificación) en forma de diagramas de formas de onda, VHDL o Verilog e incluso generarlos de forma semiautomática. • Simular nuestro diseño a través de los testbenches generados. • Sintetizar (generar la netlist) a partir del diseño capturado. • Optimizar el diseño. • Implementar el diseño en un dispositivo programable concreto (asignando bloques del dispositivo a los elementos de la netlist e interconectándolos entre sí) atendiendo a las restricciones de tiempo y espacio que podamos imponer. • Programar el dispositivo programable elegido a través de un bus JTAG o generar el fichero de programación necesario. La mayor parte de las herramientas son de Xilinx y se hallan integradas en el paquete Xilinx ISE WebPack. Sin embargo, este paquete no incluye el simulador, que debe obtenerse como una herramienta independiente. Prácticas de Electrónica de Microelectrónica 3 EUITI - MADRID DEPARTAMENTO ELAI Las dos herramientas más visibles del entorno son: • Project Navigator: se trata de un entorno integrado de desarrollo (IDE) desde el que es posible acceder a todas las operaciones y herramientas necesarias para realizar nuestro diseño. • ModelSim: nos permite simular el circuito realizado en el Project Navigator y verificar si se cumplen o no las especificaciones de diseño. PROJECT NAVIGATOR La ventana principal por defecto del Project Navigator consta de tres ventanas “atracables”, dos a la izquierda y una abajo, que rodean el área de trabajo. Es en el área de trabajo donde se editan los ficheros de VHDL y aparece la interfaz de varias de las herramientas. Por defecto, en el área de trabajo las ventanas se apilan en forma de cuaderno con separadores, de forma que en cada momento sólo se ve una ventana. Pinchando el separador de la ventana de nuestro interés, ésta pasa a primer plano. Otras herramientas, notablemente el simulador, abren sus propias ventanas independientes. Figura 1: Vista general del entorno del Project Navigator. En la parte superior izquierda está la ventana de Fuentes del Proyecto (Sources in Proyect), que muestra los elementos incluidos en el proyecto. Justo debajo de la ventana de Fuentes se encuentra la ventana de Procesos (Processes for Current Source) para la fuente actual, que muestra los procesos permitidos. La tercera ventana es la consola y ocupa la parte inferior de Prácticas de Electrónica de Microelectrónica 4 DEPARTAMENTO ELAI EUITI - MADRID la pantalla, visualiza los resultados de las operaciones que vamos realizando como los errores de compilación o los resultados del proceso de síntesis. Sources in Proyect Se compone a su vez de tres pestañas que ofrecen diversa información al usuario: • Module View: Muestra el nombre del proyecto, el tipo de dispositivo sobre el que vamos a trabajar así como todos los elementos del proyecto (archivos VHDL, esquemáticos, diagramas de estados, bancos de pruebas…). Si un elemento en cuestión posee niveles inferiores de jerarquía veremos que a la izquierda del nombre aparece un +, si hacemos clic sobre él podremos visualizar los niveles de jerarquía. Para editar un archivo simplemente hay que hacer doble clic sobre el nombre del mismo. • Snapshot view: Muestra todos los snapshots. Un snapshot es una copia de solo lectura del proyecto actual. Se usan para guardar el proyecto antes de emprender nuevas modificaciones con el fin de recuperarlo si los cambios no dan el resultado adecuado, o bien, para tener diferentes versiones del proyecto. • Library view: Muestra todas las librerías asociadas al proyecto. Processes for Current Source Contiene la pestaña de la vista de procesos. Desde aquí se pueden lanzar las acciones posibles para cada tipo de fuente del proyecto y también comprobar el estado de las ya realizadas. En general cada acción de la lista requiere la ejecución de las que la preceden, no obstante, si fuese necesario, el programa lanzaría de forma automática las acciones previas pertinentes. Para los ficheros que forman parte de la jerarquía del diseño las acciones posibles son: • Desing Entry Utilities: nos sirve de comienzo para verificar y simular nuestro diseño. • User Constraints: nos permite editar las restricciones temporales y de área. • Synthesis: una vez que los archivos del diseño han sido creados podemos sintetizar el diseño. Al hacerlo se revisará la sintaxis y la jerarquía del diseño con el fin de optimizarlo para la arquitectura de diseño que hemos escogido. • Implement Design: nos permite convertir nuestro diseño lógico a un formato físico que puede ser implementado en el dispositivo sobre el que vamos a trabajar ya sea una CPLD o una FPGA. • Generate Programming File: permite generar el código binario que se cargará en el dispositivo. Para los ficheros de test (testbenches) aparecen las opciones de simulación: • Simulate Behavioral Model: Permite simular el código sin tener que sintetizarlo antes. Por tanto, no incluye retardos. Útil para verificar el comportamiento lógico (funcional) del diseño. Prácticas de Electrónica de Microelectrónica 5 EUITI - MADRID • DEPARTAMENTO ELAI Simulate Post…: Simula el diseño después de completar una determinada fase de síntesis. Al conocer los bloques implicados y su interconexión ya es posible hacer una estimación precisa de los retardos. Consola La consola nos muestra mensajes de información, avisos y errores. Los avisos se resaltan con una caja amarilla junto al mensaje, mientras que los errores se indican con una caja roja. En cualquiera de los dos casos si queremos ir a la parte del código en la que se ha producido el aviso o el error bastará con seleccionar el mensaje y hacer doble clic sobre él. CREACIÓN DE UN NUEVO PROYECTO A la hora de crear un nuevo proyecto se debe elegir el modo de representación para el nivel más alto de la jerarquía del diseño: esquemático o HDL. A continuación se detallan los pasos a seguir en cada caso: Utilizando esquemáticos 1. Seleccionar New Proyect en el menú File. 2. Aparecerá la ventana New Proyect, en Proyect Location indicamos la ubicación del directorio en el que se guardarán los archivos del proyecto, en Proyect Name escribimos el nombre del proyecto y en Top Level Module-Type debemos seleccionar Schematic. Finalmente pulsamos Siguiente. 3. En la siguiente ventana podemos definir el dispositivo sobre el que vamos a implementar el diseño. 4. Al pulsar siguiente nos aparece un diálogo que nos pregunta si queremos añadir una fuente nueva al proyecto o bien una ya existente. Seleccionamos Add New Source. 5. Nos aparecerá un diálogo que nos muestra una lista de los diversos tipos de fuente con los que se puede trabajar. Seleccionamos Schematic. Escribimos el nombre del diseño en File Name y hacemos click en Siguiente. 6. Para concluir presionamos Finalizar. Automáticamente se abrirá el editor de esquemáticos, Xilinx ECS (Engineering Schematic Capture). Prácticas de Electrónica de Microelectrónica 6 DEPARTAMENTO ELAI EUITI - MADRID Figura 2: Ventana de creación de un nuevo proyecto. Utilizando código VHDL 1. Seleccionar New Proyect en el menú File. 2. Aparecerá la ventana New Proyect, en Proyect Location indicamos la ubicación del directorio en el que se guardarán los archivos del proyecto, en Proyect Name escribimos el nombre del proyecto y en Top Level Module-Type debemos seleccionar HDL. Finalmente pulsamos Siguiente. 3. En la siguiente ventana podemos definir el dispositivo sobre el que vamos a implementar el diseño. 4. Al pulsar siguiente nos aparece un diálogo que nos pregunta si queremos añadir una fuente nueva al proyecto o bien una ya existente. Seleccionamos Add New Source. 5. Nos aparecerá un diálogo que nos muestra una lista de los diversos tipos de fuente con los que se puede trabajar. Seleccionamos VHDL Module. Escribimos el nombre del diseño en File Name y hacemos click en Siguiente. Prácticas de Electrónica de Microelectrónica 7 EUITI - MADRID DEPARTAMENTO ELAI Figura 3: Definimos las entradas y salidas que tendrá el módulo. 6. La siguiente ventana nos permite definir las entradas y salidas que tendrá nuestro módulo así como el número de bits de que constarán. En Port Name se escribe el nombre de la entrada ó salida, en Direction indicamos si va a ser una entrada, una salida o una entradasalida, y finalmente en MSB y LSB indicamos el número de bits. Una vez definidas todas las entradas/salidas pulsamos Siguiente. 7. Para terminar pulsamos Finalizar. Al hacerlo se generará automáticamente el código básico en VHDL para definir las entradas y salidas que tendrá nuestro diseño y que hemos indicado en el paso 6. En este caso vamos a crear una sencilla puerta and. Debido a su sencillez la única línea que es necesario añadir al código VHDL pregenerado es S<=A and B; como se puede apreciar en la siguiente figura. Prácticas de Electrónica de Microelectrónica 8 DEPARTAMENTO ELAI EUITI - MADRID Figura 4: Definición de una puerta and en VHDL. USO EL EDITOR DE ESQUEMÁTICOS Cuando se abre el editor de esquemáticos veremos una ventana principal en blanco que es donde podremos dibujar el esquemático. A su izquierda hay dos pestañas llamadas Options y Symbols. En Options aparecen varias opciones que nos ofrecen la posibilidad de indicar como queremos que se comporte la interfaz del programa al usar una herramienta en concreto que hayamos seleccionado, es decir la pestaña Options cambia dependiendo de la herramienta seleccionada. En Symbols hay varios campos: • Categories: nos permite elegir el tipo de componentes que queremos que aparezcan en el siguiente campo (symbols) si seleccionamos all symbols en symbols aparecerán todos los componentes. • Symbols: aquí elegimos los componentes que deseamos introducir en nuestro esquemático. • Symbol Name Filter: en symbols sólo aparecerán los componentes que empiecen por las letras que aquí escribamos, así por ejemplo, si tenemos seleccionado all symbols en Prácticas de Electrónica de Microelectrónica 9 EUITI - MADRID DEPARTAMENTO ELAI Categories y en Symbol Name Filter escribimos en Symbols sólo aparecerán las puertas and. • Orientation: se usa para rotar el componente que vamos a colocar en la ventana principal. Una vez seleccionado el componente solo resta llevar el cursor al lugar de la ventana principal donde queremos colocarlo y hacer click. Figura 5: Ventana principal del editor de esquemáticos. Para unir los componentes entre sí deberemos usar la herramienta wire, esto se puede seleccionando Add->Wire en el menú principal. Una vez colocados los componentes y conectados correctamente entre sí, es imprescindible definir bien las entradas y salidas del esquema, esto se hace mediante la herramienta marcador de entrada/salida (I/O Marker) que se encuentra en el menú Add. Para definir el marcador debemos unirlo mediante una línea (Wire) al componente en cuestión y hacer doble click sobre el marcador; nos aparecerá una ventana en la que podremos definir la entrada-salida escribiendo el nombre en la celda Name-Value y el tipo de puerto (entrada, salida o bidireccional) en PortPolarity-Value. Si queremos dar nombres a los cables, para facilitar su identificación, hay que seleccionar Add->Net_Name en el menú principal. Para dar nombre al cable debemos escribirlo en la edit box que aparece en la pestaña Options y seguidamente hacer click sube el cable en cuestión. Prácticas de Electrónica de Microelectrónica 10 DEPARTAMENTO ELAI EUITI - MADRID Terminado el diseño, el siguiente paso es revisarlo para asegurarse de que todas las conexiones esta bien hechas. Esto se puede hacer fácilmente seleccionando en el menú principal Tools->Check_Schematic. Aparecerá una ventana que nos indicará si hay algún error en el circuito. Si todo está correctamente, el último paso es guardar el diseño y volver al Project Navigator. VERIFICACIÓN DE LA SINTAXIS Y SIMULACIÓN Para verificar la sintaxis debemos ir a la ventana Processes for Source y hacer doble click en el icono Synthetisize-XTS, automáticamente se revisará la sintaxis y aparecerá una marca verde junto al icono si no han aparecido errores o warnings; si hay algún warning aparecerá una exclamación amarilla y si por contra hay errores veremos una "x" roja. De todos modos una forma más rápida y sencilla de ver si hemos cometido algún error en la sintaxis es hacer doble click en Create Schematic Symbol el cual se encuentra en Design Entry Utilities. Una vez que la sintaxis es correcta podemos pasar a la simulación. Tanto si hemos diseñado un circuito programando directamente en VHDL o utilizando esquemáticos, la simulación resulta un paso imprescindible para saber si los resultados son los esperados o por el contrario debemos revisar el diseño. Para simular lo más cómodo es comenzar creando un banco de pruebas donde introduciremos los valores que se les aplicarán a las entradas y en función de los cuales se obtendrá la salida. Figura 6: Verificar la sintaxis. Prácticas de Electrónica de Microelectrónica 11 EUITI - MADRID DEPARTAMENTO ELAI Los pasos a seguir son: 1. Hacer click con el botón derecho en la pestaña Module View en Sources in Proyect y seleccinar New Source. 2. En la ventana New Source escogemos Test Bench Waveform, damos nombre al archivo y pulsamos Siguiente. 3. Seleccionamos el archivo sobre el que queremos realizar la simulación. Para terminar hacemos click en Siguiente y Finalizar. En la ventana Initialize Timing hay que especificar los parámetros de tiempos que se usarán en la simulación. Si el diseño que vamos a simular es secuencial, y en consecuencia usa una señal de reloj, deberemos seleccionar Single Clock y fijar sus condiciones de funcionamiento. Figura 7: Generación del testbench Al hacer click en Ok nos aparecerá el banco de pruebas donde podremos ver que la entradas tienen marcas azules y las salidas marcas amarillas y todas están inicializadas a 0. Ahora debemos definir los valores de las entradas y salidas para poder probar el diseño, para ello si hacemos click en la zona coloreada de cada celda (azul para las entradas, amarillo para las salidas) podremos cambiar el valor. En el caso de que la entrada o salida sea un vector veremos que al hacer click nos aparece un botón en el que pone pattern (en el caso de que la entrada o salida sea de un bit deberemos hacer doble clic para que salga el botón pattern) y una caja donde escribir un valor; el botón pattern sirve para definir un patrón en esa entrada, de forma que, por ejemplo, podríamos hacer que se asignaran valores a partir de uno dado y se Prácticas de Electrónica de Microelectrónica 12 DEPARTAMENTO ELAI EUITI - MADRID fueran incrementando en uno en cada ciclo de tiempo; por contra si sólo queremos dar un valor a esa celda escribiremos el número y presionaremos enter. Cuando hayamos terminado de definir los valores de las entradas y salidas deberemos guardar el diseño haciendo click en el icono del diskete en la ventana del banco de pruebas. Al hacer esto veremos que en la ventana Sources in Project se nos añade un nuevo archivo, si lo seleccionamos aparecerán en Processes for Source los procesos o funciones para ese archivo que como veremos están todos relacionados con la simulación. Si hacemos doble click sobre Simulate Behavioral Model se abrirá el Model Sim y se procederá a la simulación. Figura 8: Simulación con ModelSim XE de una puerta and. La ventana principal nos da información de los eventos que ocurren en la simulación y nos informará al final si la simulación ha sido correcta siempre y cuando así lo definamos en el código VHDL para la simulación. En la ventana wave podremos ver como varían las entradas y salidas del sistema en el tiempo. En el caso de que simulemos un diseño sin utilizar ningún banco de pruebas la ventana signals nos será útil para dar valores a las señales. Prácticas de Electrónica de Microelectrónica 13 EUITI - MADRID DEPARTAMENTO ELAI Práctica nº 2: Decodificador BCD a 7 segmentos OBJETIVOS DE LA PRÁCTICA Con la realización de esta práctica se persiguen los siguientes objetivos: • Familiarizarse a través de ejemplos sencillos con los tres tipos de descripción en VHDL: flujo de datos, comportamental y estructural. • Ejercitarse en la creación de programas de pruebas o testbenches. • Familiarizase con el uso de restricciones, en particular con las de asignación de patillas. • Familiarizarse con el uso de los recursos de la placa de prácticas. INTRODUCCIÓN LA TARJETA SPARTAN-3 STARTER KIT La tarjeta que se va a usar en las prácticas está fabricada por Digilent bajo el patrocinio de Xilinx y se ha diseñado para facilitar la iniciación en el uso de las FPGA Spartan-3 de Xilinx y como un entorno de bajo coste para la evaluación de diseños realizados con estos dispositivos. Prácticas de Electrónica de Microelectrónica 14 DEPARTAMENTO ELAI EUITI - MADRID Las características más importantes de esta tarjeta son: • • • Una FPGA XC3S200FT256 de 200.000 puertas con encapsulado BGA de 256 patillas: • Equivalente a 4.230 celdas lógicas. • Doce bloques de RAM de 18 kbit (216 kbit en total). • Doce multiplicadores hardware de 18 × 18 bits. • Cuatro gestores de reloj digitales (DCM). • Hasta 173 patillas de entrada salida definidas por el usario. 2 Mbit de memoria flash XCF02S para configuración. Programable en el propio circuito a través del bus JTAG: • 1 Mbit está reservado para la configuración de la FPGA. • El resto está disponible para almacenar variables no volátiles del usuario. 1 Mbyte de memoria RAM estática asíncrona rápida: • Dos memorias ISSI IS61LV25616AL-10T seleccionables de forma individual con posibilidad de acceso a bytes individuales. • Posibilidad de organizarla en un bloque de 256 kword de 32 bits o dos bloques de 256 kword de 16 bits. • Tiempo de acceso de 10 ns. • Puerto VGA de 8 colores (3 bits). • Puerto serie RS-232 de nueve patillas (existe un segundo puerto accesible sólo a través de los puntos de prueba de la tarjeta). • Puerto PS/2 para teclado o ratón. • Visualizador con cuatro dígitos de siete segmentos . • Ocho interruptores deslizantes. • Ocho LED. • Cuatro pulsadores. • Un reloj de 50 MHz (es posible usar también un reloj externo). • Tres conectores de expansión de 40 patillas. • Un puerto JTAG. Con estos recursos resulta posible implementar desde las más sencillas máquinas de estados hasta un sistema de procesamiento digital de señal en tiempo real (FFT, filtros, MP3…), pasando por un sistema microprocesador con su controlador de vídeo (SoC). Los detalles sobre la tarjeta, necesarios para la realización de las prácticas, se encuentran en el manual que la acompaña. Prácticas de Electrónica de Microelectrónica 15 EUITI - MADRID DEPARTAMENTO ELAI EL BUS JTAG Aunque los encapsulados actuales pueden tener varios cientos de patillas, el número de patillas no puede crecer indefinidamente. Al mismo tiempo, los dispositivos lógicos actuales albergan en su interior varios millones de puertas a las que únicamente se puede acceder a través de esas patillas y que en muchos casos ni siquiera tienen conexión funcional con el exterior. Dada la cantidad limitada de patillas disponibles, resulta inviable dedicar muchas de ellas a monitorizar el funcionamiento del circuito. Así pues, se llega a un callejón sin salida a la hora de comprobar el funcionamiento correcto del dispositivo y/o del diseño. Una de las soluciones adoptadas ha sido el Boundary-Scan, una técnica que emplea un registro de desplazamiento especializado con tantos bits como nodos lógicos interese explorar y que puede leer o modificar su valor. Los datos obtenidos o que se desea introducir se transmiten en serie, por lo que el número de patillas necesarias es muy reducido y no depende del tamaño del dispositivo. Los registros de desplazamiento de varios dispositivos se pueden enlazar formando una “cadena de Boundary-Scan”, de modo que es posible monitorizar el estado de una tarjeta completa a través de unos pocos terminales (por supuesto, también es posible enlazar varias tarjetas y así sucesivamente). Con el tiempo, se le ha añadido nueva funcionalidad, p.ej.: • Identificación de dispositivos: modelo, versión, fabricante. Esto permite que una tarjeta se reconfigure automáticamente en función de los dispositivos presentes en un momento dado. • Detección de componentes averiados. • Configuración de lógica programable “in situ”. • Visualización y modificación del estado interno del dispositivo: existen programas de depuración “semejantes” a los empleados en el desarrollo de software. Figura 9: Bus JTAG Prácticas de Electrónica de Microelectrónica 16 DEPARTAMENTO ELAI EUITI - MADRID El bus JTAG es un bus serie síncrono que normaliza el acceso a la cadena para todos los dispositivos sean lógica fija, programable, memorias, microprocesadores o circuitos especializados. Consta de cuatro líneas: dos de datos (TDI y TDO), una de modo (TMS) y otra de reloj (TCK). Una implementación habitual en los sistemas de desarrollo más económicos emplea líneas del puerto paralelo de un PC como líneas del bus JTAG. En estas prácticas emplearemos un conector de este tipo. CONTROL DEL PROCESO DE SÍNTESIS Una vez descrito nuestro sistema en VHDL sintetizable el resto del proceso hasta obtener el fichero o la máscara de programación es automático. Sin embargo, existen formas de dirigir ese proceso. La primera forma tiene que ver con la posibilidad de elegir el tipo de optimizaciones a emplear y la segunda con la aplicación de “restricciones”. Optimizaciones Normalmente, velocidad y área son características antagónicas. Por ello las aplicaciones de síntesis permiten optimizar un diseño para hacerlo lo más rápido posible (a costa de ocupar más espacio) o lo más pequeño posible (a costa de su velocidad). En la actualidad, con la proliferación de dispositivos portátiles la potencia consumida también es un parámetro a optimizar. Otro área donde es posible la optimización es en la partición del diseño. La aplicación de síntesis, por defecto, conservará nuestra partición, es decir, los componentes que hayamos definido, nuestras interfaces y señales. Esto es útil en las primeras fases de la verificación del diseño puesto que en el simulador veremos nuestros objetos, con los que estamos familiarizados. Sin embargo, esto limita en muchas ocasiones una mayor optimización: supongamos un componente con una salida invertida conectada a una entrada invertida de otro componente; si se respeta la partición se crearán dos inversores cuando realmente no era necesario ninguno. Es posible indicarle a la aplicación que realice este tipo de optimización, aunque puede que las señales y componentes finales nos resulten irreconocibles. Restricciones La descripción en VHDL sintetizable contiene la funcionalidad de nuestro diseño, pero esto no es suficiente para garantizar el cumplimiento de los requisitos de la especificación. En efecto, normalmente será necesario garantizar una frecuencia mínima de funcionamiento, que determinadas señales vayan a determinadas patillas o que el diseño quepa en un dispositivo concreto. Mediante las restricciones es posible forzar a la aplicación de síntesis a que cumpla con ciertos criterios. Es importante ser consciente de que cuantas más restricciones se impongan, más difícil será conseguir el objetivo final, por lo que sólo deben imponerse aquellas realmente necesarias. Es perfectamente posible que la herramienta aborte la síntesis al no poder cumplir unas restricciones poco realistas. Las restricciones más típicas en el caso de los dispositivos lógicos programables son las de los retardos máximos en ciertas líneas (camino crítico) y la asignación de determinadas señales a determinadas patillas o bloques funcionales. Prácticas de Electrónica de Microelectrónica 17 EUITI - MADRID DEPARTAMENTO ELAI PROGRAMAS DE PRUEBA Una simulación no es nada más que un experimento virtual realizado para verificar el comportamiento de un circuito ante unos estímulos de entrada. Puesto que sólo nosotros comprendemos el funcionamiento de nuestro diseño y sólo nosotros podemos analizarlo no podemos esperar que baste con pulsar un botón y que la máquina lo haga todo. Es nuestra responsabilidad escribir un programa de pruebas o testbench que alimente nuestro diseño con un número de entradas suficiente como para verificar su funcionamiento. Para ser estrictos, se debería empezar siempre por escribir el testbench de un componente y luego el propio componente. En efecto, todo diseño debe superar dos pruebas: su validación y su verificación. La validación supone comprobar si la especificación de un determinado diseño resuelve realmente el problema que motivó el diseño y, por tanto, sólo puede hacerla el cliente y/o el analista de sistemas. La verificación consiste en comprobar que un diseño concreto cumple la especificación. Este último proceso sí que puede automatizarse. Es ahí donde entra el testbench. Una vez validada la especificación se debe escribir un programa que compruebe de forma exhaustiva que un componente dado la cumple. Cada vez que se refine el diseño o se realice un cambio se ejecutará el tesbench para comprobar su validez. La creación de un programa de pruebas no es trivial y en muchas ocasiones lleva más tiempo y esfuerzo que la creación de un componente, pero resulta fundamental. Un programa de pruebas puede consistir en la aplicación de una tabla de vectores de test almacenada en el propio programa o en un archivo en disco, o en una descripción algorítmica de las pruebas. La comprobación de los resultados puede hacerse por inspección visual de las formas de onda, pero cuando el circuito es complejo este método se vuelve inviable. Lo mejor es emplear la instrucción ASSERT. Esta instrucción verifica que se cumple una condición y si no es así imprime un mensaje y, dependiendo de la gravedad del error, puede llegar a detener la simulación. Su sintaxis es: ASSERT condición [REPORT mensaje] [SEVERITY gravedad]; Cada componente creado debería tener uno o más tesbench para su verificación. LA ENTIDAD DE NIVEL SUPERIOR Normalmente, el objetivo último de nuestro diseño será convertir nuestro dispositivo lógico programable en un componente a medida. La entidad de nivel superior se corresponde con este componente y define la interfaz de nuestro diseño con el exterior. Lo habitual es que consista en una descripción estructural en la que se describe la interconexión entre los componentes de nivel jerárquico inferior de nuestro diseño. Prácticas de Electrónica de Microelectrónica 18 DEPARTAMENTO ELAI EUITI - MADRID Es a esta entidad a la que se le aplican las restricciones de asignación de señales a patillas concretas. REALIZACIÓN DE LA PRÁCTICA En esta práctica vamos a utilizar los cuatro dígitos de la placa para visualizar un número introducido a través de los interruptores deslizantes. Se empezará por controlar un solo dígito y se irá progresando hasta controlar los cuatro disponibles. EL DECODIFICADOR El principal componente de este diseño será un decodificador de BCD a siete segmentos. Un decodificador es un circuito combinacional que realiza la operación inversa a la de un codificador de datos, por eso también se puede definir un decodificador como circuito que convierte un código binario concreto en una forma sin codificar. Los dígitos de la tarjeta son de tipo LED. Cada segmento es un LED uno de cuyos terminales es común para todos los segmentos: existen versiones de cátodo común y de ánodo común. En nuestro caso se trata de un ánodo común, por lo que para que luzca un segmento debemos aplicar al terminal no común un ‘0’. Los cuatro dígitos comparten las mismas señales de control de los segmentos. La forma de mostrar números distintos en cada dígito consiste en irlos encendiendo en secuencia haciendo que las líneas de control de los segmentos reflejen el número correspondiente al dígito activo en ese momento. Si está secuencia se ejecuta a suficiente velocidad el ojo resulta engañado y percibe todos los dígitos iluminados a la vez. Para iluminar un dígito concreto en esta tarjeta es necesario aplicar un ‘0’ a la línea de control pertinente. Figura 10: Visualizador de 4 dígitos y líneas correspondientes de la FPGA. Prácticas de Electrónica de Microelectrónica 19 EUITI - MADRID DEPARTAMENTO ELAI Figura 11: Secuencia de encendido de los dígitos. Teniendo esto en cuenta podemos obtener fácilmente la tabla de verdad de este decodificador: A B C D a b c d e f g 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 1 1 1 0 0 1 0 0 0 1 0 0 1 0 0 0 1 1 0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 1 0 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 Ahora estamos en condiciones de crear el tesbench: LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY decoder_decoder_tb_vhd_tb IS END decoder_decoder_tb_vhd_tb; ARCHITECTURE behavior OF decoder_decoder_tb_vhd_tb IS COMPONENT decoder PORT( code : IN std_logic_vector(3 downto 0); led : OUT std_logic_vector(6 downto 0) ); END COMPONENT; SIGNAL code : std_logic_vector(3 downto 0); SIGNAL led : std_logic_vector(6 downto 0); TYPE vtest is record code : std_logic_vector(3 downto 0); Prácticas de Electrónica de Microelectrónica 20 DEPARTAMENTO ELAI EUITI - MADRID led : std_logic_vector(6 downto 0); END RECORD; type vtest_vector is array (natural range <>) of vtest; constant test: (code => (code => (code => (code => (code => (code => (code => (code => (code => (code => (code => (code => (code => (code => (code => (code => ); vtest_vector := ( "0000", led => "0000001"), "0001", led => "1001111"), "0010", led => "0010010"), "0011", led => "0000110"), "0100", led => "1001100"), "0101", led => "0100100"), "0110", led => "0100000"), "0111", led => "0001111"), "1000", led => "0000000"), "1001", led => "0000100"), "1010", led => "1111110"), "1011", led => "1111110"), "1100", led => "1111110"), "1101", led => "1111110"), "1110", led => "1111110"), "1111", led => "1111110") BEGIN uut: decoder PORT MAP( code => code, led => led ); tb: PROCESS begin for i in 0 to test'high loop code <= test(i).code; wait for 20 ns; assert led = test(i).led report "Salida incorrecta." severity failure; end loop; assert false report "Simulación finalizada. Test superado." severity failure; end process; END; Y nuestro decodificador: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; Prácticas de Electrónica de Microelectrónica 21 EUITI - MADRID DEPARTAMENTO ELAI entity decoder is port ( code : in std_logic_vector(3 downto 0); led : out std_logic_vector(6 downto 0) ); end entity decoder; architecture dataflow of decoder is begin with code select led <= "0000001" "1001111" "0010010" "0000110" "1001100" "0100100" "0100000" "0001111" "0000000" "0000100" "1111110" when when when when when when when when when when when "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", others; end architecture dataflow; TAREA 1 Ejecutar el tesbench y comprobar que no hay errores. Crear una arquitectura de tipo estructural que incluya el decodificador para la siguiente entidad de nivel superior: entity top is port ( code digsel digctrl segment end top; : : : : in in out out std_logic_vector(3 std_logic_vector(3 std_logic_vector(3 std_logic_vector(7 downto downto downto downto 0); 0); 0); 0)); El código BCD se debe poder introducir por los cuatro interruptores deslizantes de menor peso y el dígito activo, a través de los cuatro de más peso. Estos interruptores ponen a ‘0’ su línea asociada cuando están abajo (hacia el exterior de la tarjeta) y a ‘1’ cuando están arriba (hacia el interior). SW7 SW6 SW5 SW4 SW3 SW2 SW1 SW0 K13 K14 J13 J14 H13 H14 G12 F12 Figura 12: Conexión de los interruptores a la FPGA Prácticas de Electrónica de Microelectrónica 22 DEPARTAMENTO ELAI EUITI - MADRID Una vez creada la arquitectura procederemos a asociar la señales con las patillas adecuadas de la FPGA. Para ello crearemos un fichero de restricciones (figura 13 y figura 14): 1. Seleccionar la entidad de nivel superior (top). 2. Seleccionar User Constraints -> Assign package pins. 3. Seleccionar Package View. 4. Arrastrar las señales hasta las patillas seleccionadas o escribir el nombre de la patilla en la columna LOC de la señal. 5. Salvar el fichero. A continuación generaremos el fichero de programación haciendo doble clic sobre la entrada del árbol Generate Programming File. Cuando termine el proceso descargaremos el fichero sobre la FPGA haciendo doble clic sobre Configure Device (iMPACT) y seleccionado en el diálogo que se abre a continuación Boundary-Scan Mode (figura 15). Deben detectarse dos dispositivos en la cadena: la FPGA y la memoria flash. La aplicación de configuración abre justo después dos diálogos para introducir el nombre de los ficheros de programación: se debe elegir top.blt para la FPGA y pulsar el botón Bypass para la memoria (no la vamos a programar en esta práctica). Para ejecutar la programación seleccionaremos la FPGA y, a través del menú de contexto, Program. TAREA 2 Crear un nuevo componente: un contador Jonhson o de anillo de 4 bits utilizando para ello una descripción comportamental. Usar como reloj la señal interna de 50 MHz (T9) y como reset el pulsador BTN3 (L14). Usar este componente para encender secuencialmente todos los dígitos. Para ello añadirlo a top, eliminar la entrada digsel y conectar digctrl a la salida del contador. Prácticas de Electrónica de Microelectrónica 23 EUITI - MADRID DEPARTAMENTO ELAI Figura 13: Asignación de patillas (I). Figura 14: Asignación de patillas (y II). Prácticas de Electrónica de Microelectrónica 24 DEPARTAMENTO ELAI EUITI - MADRID Figura 15: Programación del dispositivo. Prácticas de Electrónica de Microelectrónica 25 EUITI - MADRID Práctica nº 3: Diseño de una Aritmética DEPARTAMENTO ELAI Unidad Lógico OBJETIVOS DE LA PRÁCTICA Con la realización de esta práctica se persiguen los siguientes objetivos: • Profundizar en el uso de la descripción comportamental y sus construcciones sintácticas para describir y sintetizar dispositivos complejos. • Uso de genéricos para mejorar la reusabilidad del código. • Introducción del concepto de datapath y programación de un ejemplo típico. • Introducirse en la programación temporal de las señales de control. INTRODUCCIÓN El corazón de cualquier sistema de procesamiento es la Unidad Central de Proceso (CPU). Ésta, en su versión más clásica, está compuesta a su vez por tres elementos: la Unidad de Control, el Banco de Registros y la Unidad Lógico-Aritmética (ALU). El Banco de Registros se emplea para almacenar el contador de programa, los registros de índice y los operandos y resultados de las operaciones efectuadas. La ALU efectúa todas las operaciones lógicas Prácticas de Electrónica de Microelectrónica 26 DEPARTAMENTO ELAI EUITI - MADRID (operadores lógicos, desplazamientos, etc.) y aritméticas (sumas, restas, negación, etc.). Por último, la Unidad de Control interpreta las instrucciones del programa y genera la secuencia de señales de control necesarias para ejecutarlas. Esta partición es típica de un sistema orientado a datos o lo que es lo mismo, en el que lo importante es de dónde vienen lo datos, qué se hace con ellos y a dónde van después. En estos casos el diseño se suele dividir en dos partes: por un lado tenemos la “ruta de datos” o datapath que contiene los buses, registros y operadores que deben atravesar los datos, y, por otra, una máquina de estados finitos (la Unidad de Control) que genera las señales necesarias para el control del datapath. En está práctica nos ocuparemos de la programación en VHDL de parte del datapath descrito: una ALU y sus registros auxiliares. Figura 16:Representación esquemática de una ALU. Normalmente, para su operación la ALU se auxilia de dos registros: uno es el acumulador, visible para el programador, y el otro es un registro auxiliar, que no suele ser visible nada más que para el diseñador del procesador, cuya misión es mantener el valor del operando estable mientras se ejecuta la operación. Los operandos sobre los que se opera deben almacenarse en estos registros para que la operación pueda efectuarse. Finalmente, el resultado de la operación suele almacenarse en el acumulador, sobrescribiendo el operando original. A parte del resultado de la operación, la ALU suele informar de ciertas propiedades del éste como, por ejemplo, si es cero, o negativo, o si se ha producido algún tipo de error o acarreo. Esta información es fundamental pues permite variar el curso del programa en función del resultado o de si se ha producido algún error y también permite encadenar operaciones para operar sobre operandos con un número de bits mayor que el de la ALU. Esta información está disponible a través de un conjunto de marcas o flags que se almacenan en un registro específico: el Registro de Condición de Estado o CCR. Flags típicos del registro de estado son: • Cero (Z): toma el valor 1 si el resultado de una operación es cero. • Signo (N): toma el valor 1 si el resultado de una operación es negativo (MSB = 1). Prácticas de Electrónica de Microelectrónica 27 EUITI - MADRID DEPARTAMENTO ELAI • Acarreo (C): se ve afectado por las instrucciones de desplazamiento (se pone a 1 ó 0 según el valor del bit desplazado) y por las operaciones aritméticas. • Desbordamiento (V): se pone en 1 si ocurre un desbordamiento en una operación aritmética, es decir, si el tamaño del resultado es mayor que el tamaño del registro en el que ha de almacenarse y hay, por tanto, pérdida de información. La operación concreta a realizar por la ALU se selecciona a través de un bus de control que opera la Unidad de Control. En nuestro caso las operaciones dependerán del siguiente código: Valor del bus Operación 0000 Suma 0001 Resta 0010 Negación 0011 Inversión binaria del valor del registro auxiliar 0100 OR binaria del valor del registro auxiliar 0101 AND binaria del valor del registro auxiliar 0110 XOR binaria del valor del registro auxiliar 0111 Desplazamiento lógico/aritmético a la izquierda 1000 Desplazamiento lógico a la derecha 1001 Desplazamiento aritmético a la derecha 1010 Rotación a la izquierda 1011 Rotación a la derecha 1011 Rotación a la derecha OTHERS Se pone a cero el acumulador REALIZACIÓN DE LA PRÁCTICA En primer lugar partiremos del siguiente código (ula.vhd) que describe una ALU con funcionalidad limitada: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY ULA IS GENERIC ( nbits : integer ); PORT ( a : IN b : IN opcode: IN carry : OUT zero : OUT neg : OUT result: OUT ); END ENTITY ULA; := 4 std_logic_vector(nbits - 1 DOWNTO 0); std_logic_vector(nbits - 1 DOWNTO 0); std_logic_vector(3 DOWNTO 0); std_logic; std_logic; std_logic; std_logic_vector(nbits - 1 DOWNTO 0) Prácticas de Electrónica de Microelectrónica 28 DEPARTAMENTO ELAI EUITI - MADRID ARCHITECTURE Behavioral OF ULA IS CONSTANT zeroval : std_logic_vector(nbits - 1 DOWNTO 0) := (OTHERS => '0'); SIGNAL result_int: std_logic_vector(nbits - 1 DOWNTO 0); BEGIN ula: PROCESS(a, b, opcode) BEGIN carry <= '0'; CASE opcode IS WHEN "0000" => result_int <= a + b; WHEN "0001" => result_int <= a - b; WHEN "0010" => -- NEG result_int <= zeroval - a; WHEN "0011" => -- NOT result_int <= NOT a; WHEN "0100" => -- OR result_int <= a OR b; WHEN "0101" => -- AND result_int <= a AND b; WHEN "0110" => -- XOR result_int <= a XOR b; WHEN "0111" => -- LSL, ASL result_int <= a(2 DOWNTO 0) & '0'; carry <= a(3); WHEN "1000" => -- LSR result_int <= '0' & a(3 DOWNTO 1); carry <= a(0); WHEN "1011" => -- ROR result_int <= a(0) & a(3 DOWNTO 1); carry <= a(0); WHEN OTHERS => result_int <= (OTHERS => '0'); END CASE; END PROCESS ula; zero <= '1' WHEN result_int = zeroval ELSE '0'; result <= result_int; END ARCHITECTURE Behavioral; De esta descripción cabe destacar: • El uso de genéricos (nbits) para determinar el ancho de palabra de la ALU: el mismo código puede usarse para ALUs de 4, 8 o n bits. • No se genera el bit de negativo (N) ni el de desbordamiento (V). Prácticas de Electrónica de Microelectrónica 29 EUITI - MADRID • DEPARTAMENTO ELAI No se implementan las operaciones ROL ni ASR. La primera parte de esta práctica consistirá enañadir parte de la funcionalidad perdida y escribir un testbech para comprobar su correcto funcionamiento. La segunda parte consistirá en completar un datapath elemental para poder implementar la ALU en la tarjeta de desarrollo y ejecutar operaciones sencillas. EJERCICIOS TAREA 1 Para una ALU de 4 bits: • Completar el código suministrado de forma que implemente correctamente el bit de negativo (N) y las operaciones ROL y ASR. • Escribir un testbench que compruebe el funcionamiento de las dos nuevas operaciones y del bit N con los números 516 y A16. TAREA 2 Para completar el datapath: • Crear un multiplexor 2 a 1 de un ancho de bits arbitrario, por defecto de 4 bits. • Crear un registro tipo D con reset asíncrono de un ancho de bits arbitrario, por defecto 4 bits. Con estos elementos y la ALU crear una nueva entidad (datapath) con una arquitectura estructural que responda al siguiente esquema: DOUT DIN SEL2 SEL1 LOAD1 RESET ACC2 ACC1 ULA LOAD2 RESET CCR LOAD3 RESET El CCR debe almacenar las marcas de acarreo (C), cero (Z) y negativo (N). Comprobar que el código es correcto y que puede implementarse en la tarjeta de prácticas. Prácticas de Electrónica de Microelectrónica 31 EUITI - MADRID Práctica nº 4: Diseño de una Aritmética (y II) DEPARTAMENTO ELAI Unidad Lógico OBJETIVOS DE LA PRÁCTICA Con la realización de esta práctica se persiguen los siguientes objetivos: • Practicar con el diseño de una máquina de estados finitos de Moore. • Introducción a la problemática de la planificación de la secuencia de operaciones. • Familiarizarse con el uso de la herramienta StateCAD de Xilinx para la captura de máquinas de estados finitos (FSM). INTRODUCCIÓN En la práctica anterior se desarrolló una ULA que luego se incorporó a un datapath muy parecido al de los microprocesador reales más sencillos. Por sí sólo este datapath no puede realizar ninguna operación: necesita de una lógica de control que active las señales adecuadas en los momentos precisos. Esta lógica de control consiste habitualmente en una máquina de estados. Prácticas de Electrónica de Microelectrónica 32 DEPARTAMENTO ELAI EUITI - MADRID El diseño de esta máquina de estados se realiza en dos pasos: 1. Establecimiento de la secuencia de operaciones. 2. Establecimiento de los estados necesarios y de los valores de las señales en cada uno de esos estados. En efecto, en un datapath se dispone de unos recursos limitados y es necesario aprovecharlos al máximo. En muchas ocasiones las operaciones no se ejecutan de una vez, sino que es necesario dividirlas en operaciones más pequeñas. En cada suboperación pueden usarse todos los recursos o no por lo que cabe la posibilidad de que, eligiendo el orden correcto en la ejecución de las mismas, se puedan ejecutar varias al mismo tiempo o que se necesite menos hardware para hacerlo. Por eso es necesario establecer la secuencia de operaciones tras un análisis cuidadoso de todas las posibilidades. Existen dos aproximaciones fundamentales: búsqueda de la secuencia que máximiza el número de operaciones por unidad de tiempo (pero penaliza el área) y búsqueda de la secuencia que minimiza el hardware (área) necesario (pero que penaliza la velocidad). También puede buscarse la secuencia que minimiza el consumo de energía. Una vez establecida la secuencia cada paso se traduce a uno o más estados de una máquina de estados para los que es necesario determinar que valores han de tomar las señales de control del datapath. En esta práctica se va a desarrollar la FSM necesaria para operar el datapath desarrollado en la práctica anterior y también se van a incorporar al diseño los elementos necesarios para poder descargarla sobre la tarjeta de desarrollo y usarla como una sencilla calculadora. Estos elementos van a ser el decodificador de 7 segmentos que se desarrollo en la segunda práctica, un circuito antirrobote que obtendremos de las plantillas de VHDL que viene con el entorno de desarrollo ISE de Xilinx y la adición de las restricciones necesarias (asignación de pines) para adecuar el diseño a la tarjeta. El interfaz externo del circuito completo puede verse en la siguiente figura: Figura 17: Interfaz externa del circuito de la práctica. Prácticas de Electrónica de Microelectrónica 33 EUITI - MADRID DEPARTAMENTO ELAI En la figura siguiente se muestra el esquema interno del circuito: Figura 18: Esquema interno. Las señales están conectadas a los dispositivos físicos de la tarjeta de la siguiente manera: • din: conectado a los interruptores SW3 a SW0. • opcode: conectado a los interruptores SW7 a SW4. • clk: conectado al reloj interno de 50 MHz. • confirm: conectada al pulsador BTN0. • reset: conectada al pulsador BTN3. • digit: conectado a los ánodos AN3 a AN0. • segment: conectado a las líneas de segmentos dp, a, b, c, d, e, f y g. • status: conectado a los LED LD2 (N), LD1 (Z) y LD0 (C ). La forma de operar el circuito será la siguiente: 1. Reiniciar el circuito. 2. Introducir el código de la operación a ejecutar. 3. Introducir el primer operando. 4. Confirmar la introducción del primer operando (BTN0). 5. Introducir el segundo operando. Prácticas de Electrónica de Microelectrónica 34 DEPARTAMENTO ELAI EUITI - MADRID 6. Confirmar la introducción del segundo operando. 7. Pulsar de nuevo BTN0 para volver a 2. El único display activo será el correspondiente a AN0, el resto permanecerá apagado. Durante la mayor parte del tiempo este display deberá reflejar el número introducido a través del bus din, únicamente mostrará el resultado de la operación en los pasos 6 y 7. DISEÑO DE LA MÁQUINA DE ESTADOS FINITOS En la figura 3 se vuelve a mostrar el datapath desarrollado en la práctica anterior: DOUT DIN SEL2 SEL1 LOAD1 RESET ACC2 ACC1 ULA LOAD2 RESET CCR LOAD3 RESET CC Figura 19: Datapath. El primer multiplexor permite cargar ACC1 con el valor introducido por el bus de entrada din (sel1 = 0) o con el resultado de la operación actual (sel1 = 1). El segundo multiplexor permite seleccionar que valor sale al exterior para su visualización: el valor actual del bus de entrada din (sel2 = 0) o el contenido de ACC1 (sel2 = 0). El registro ACC1 guarda el primer (y, en ocasiones, único) operando de la próxima operación y el resultado de la operación anterior. El registro ACC2 guarda el segundo operando (si lo hubiere). Por último el registro CCR guarda el Código de Condición de la última operación realizada. Para la ejecución de operaciones binarias se ha desarrollado el siguiente diagrama de estados: Prácticas de Electrónica de Microelectrónica 35 EUITI - MADRID DEPARTAMENTO ELAI RESET confirm = '1' STATE0 sel1 = '0'; sel2 = '0'; load1 = '0'; load2 = '0'; load3 = '0'; STATE5 sel1 = '0'; sel2 = '1'; load1 = '0'; load2 = '0'; load3 = '0'; confirm = '1' STATE1 sel1 = '0'; sel2 = '0'; load1 = '1'; load2 = '0'; load3 = '0'; STATE4 sel1 = '1'; sel2 = '1'; load1 = '1'; load2 = '0'; load3 = '1'; STATE2 sel1 = '1'; sel2 = '0'; load1 = '0'; load2 = '0'; load3 = '0'; STATE3 sel1 = '1'; sel2 = '0'; load1 = '0'; load2 = '1'; load3 = '0'; confirm = '1' Figura 20: diagrama de estado para operaciones binarias. STATE0 es el estado inicial al que se llega después de un reset o de completarse un ciclo completo. STATE1 y STATE2 generan un pulso sobre load1 para cargar ACC1 con el primer operando. STATE3 y STATE4 generan un pulso sobre load2 para cargar ACC2 con el segundo operando. STATE4 inicia además el pulso sobre load1 y load3 para cargar ACC1 con el resultado de la operación y CCR con el Código de Condición. STATE5 termina los pulsos sobre load1 y load3 y presenta el resultado en el exterior. Las máquinas de estados que genera StateCAD son síncronas, por lo que el cambio de estado se produce al ritmo marcado por el reloj del sistema. Aquellas transiciones en las que no se indica condición alguna se producen en el ciclo de reloj siguiente. Aquellas otras en las que se indica una condición sólo se producen cuando la condición es cierta. Prácticas de Electrónica de Microelectrónica 36 DEPARTAMENTO ELAI EUITI - MADRID REALIZACIÓN DE LA PRÁCTICA En esta práctica se entrega directamente al alumno todos los ficheros necesarios para el diseño de la calculadora con operaciones binarias salvo los correspondientes al diagrama de estados, el fichero VHDL generado a partir de éste y el fichero de restricciones. TAREA 1 La primera tarea consistirá en la introducción del diagrama de estados, la generación del fichero VHDL con el código fuente de la máquina de estados y su inclusión en el diseño propuesto. TAREA 2 Crear un tesbench para comprobar el funcionamiento del diseño con el simulador. Comprobar la operación XOR con los números A16 y F16 . Tener en cuenta que, debido al mecanismo de funcionamiento de los circuitos antirrobote, los pulsos de la señal confirm deben durar al menos tres ciclos de reloj y que se deben dejar pasar otros tantos después del pulso para que el circuito vuelva al estado inicial. TAREA 3 Modificar la máquina de estados para permitir la realización de operaciones unarias. Se trata de evitar el estado STATE3 cuando se detecte un operador unario como NOT o NEG. Prácticas de Electrónica de Microelectrónica