UNIVERSIDAD SIMÓN BOLÍVAR Decanato de Estudios Profesionales Coordinación de Electrónica Implementación Básica de Procesador de Propósito Didáctico para cursos básicos de Organización y Arquitectura del Computador Por Luis Ernesto Black Martínez Sartenejas, Septiembre 2008 UNIVERSIDAD SIMÓN BOLÍVAR Decanato de Estudios Profesionales Coordinación de Electrónica Implementación Básica de Procesador de Propósito Didáctico para cursos básicos de Organización y Arquitectura del Computador Por Luis Ernesto Black Martínez Realizado con la Asesoría de Prof. Osberth de Castro PROYECTO DE GRADO Presentado ante la Ilustre Universidad Simón Bolívar como requisito parcial para optar al título de Ingeniero Electrónico Sartenejas, Septiembre 2008 UNIVERSIDAD SIMÓN BOLÍVAR Decanato de Estudios Profesionales Coordinación de Electrónica Implementación Básica de Procesador de Propósito Didáctico para cursos básicos de Organización y Arquitectura del Computador PROYECTO DE GRADO presentado por Luis Ernesto Black Martínez REALIZADO CON LA ASESORIA DE Prof. Osberth de Castro RESUMEN Debido a la necesidad de mejorar la experiencia práctica de los estudiantes en el aprendizaje de la Organización y Arquitectura de Computadores en las carreras de Ingeniería en Electrónica, se implementó un procesador de propósito didáctico en hardware, que permite el estudio de su comportamiento y diseño sin muchas de las desventajas presentes en simuladores por software, herramienta típica de enseñanza en las carreras de computación, y las de más amplia difusión. En el desarrollo del proyecto se lograron implementar 2 sistemas de procesador didáctico, por lo cual se presenta la oportunidad de tener 2 herramientas educativas que pueden ser utilizadas en diferentes etapas de enseñanza de los temas estudiados en los cursos correspondientes. Estas herramientas poseen tanto el hardware con el procesador y la lógica de comunicación, control y monitoreo, junto con una interfaz gráfica de visualización en software, que muestra la información adquirida al usuario. Además, el proyecto permitió evaluar la flexibilidad de las plataformas de hardware reconfigurable, y la potencialidad del desarrollo de plataformas mediante el uso de los recursos disponibles en las comunidades de desarrollo de código abierto de descripción de hardware. PALABRAS CLAVE Procesadores, Didáctico, FPGA, VHDL Aprobado con mención:__________ Postulado para el premio:____________ Sartenejas, Septiembre 2008 Dedico este libro A mis abuelos Vernon, América y Ernesto (Q.E.P.D) Y especialmente mi abuelita Charo A mis padres, por su incondicional apoyo A Alifer, por empujarme a dedicarme y no distraerme de lo importante A Maritza, Mary, Lila, Hernán y la Sra. Dilia (Q.E.P.D.) por el cariño y apoyo que me brindaron A mi tía Belkys y mi tío Junior, por brindarme un hogar lejos del hogar A mi familia, por el apoyo que me brindaron A mis profesores, sobre sus hombros me apoyé para completar mi criterio ingenieril i Índice General CAPITULO 1 INTRODUCCIÓN .............................................................................................................................. 1 CAPITULO 2 PLANTEAMIENTO DEL PROBLEMA .......................................................................................... 3 2.1. 2.2. 2.3. 2.4. ANTECEDENTES Y JUSTIFICACIÓN.................................................................................................................. 3 OBJETIVOS GENERALES ................................................................................................................................. 4 OBJETIVOS ESPECÍFICOS ................................................................................................................................ 4 ALCANCES Y LIMITACIONES .......................................................................................................................... 5 CAPITULO 3 FUNDAMENTOS TEÓRICOS .......................................................................................................... 7 3.1. MICRO-ARQUITECTURA Y ORGANIZACIÓN EN LA ENSEÑANZA ...................................................................... 7 3.1.1. Arquitectura MIPS ............................................................................................................................. 12 3.2. PLATAFORMA FPGA ................................................................................................................................... 14 3.3. PROGRAMACIÓN PARA FPGA – LENGUAJES HDL ....................................................................................... 16 3.4. COMUNICACIÓN MEDIANTE PUERTO SERIAL ............................................................................................... 17 3.5. FENÓMENO DE REBOTE DE CONTACTOS ...................................................................................................... 18 3.6. DESARROLLO DE APLICACIONES MEDIANTE NATIONAL INSTRUMENTS LABVIEW...................................... 19 CAPITULO 4 METODOLOGÍA DEL DISEÑO .................................................................................................... 23 CAPITULO 5 SISTEMAS DE PROCESADORES DIDÁCTICOS ...................................................................... 30 5.1. DESCRIPCIÓN FUNCIONAL ........................................................................................................................... 30 5.2. ELEMENTOS COMUNES ................................................................................................................................ 32 5.2.1. Módulo UART .................................................................................................................................... 34 5.2.2. Lógica Anti-Rebotes ........................................................................................................................... 34 5.2.3. Lógica de Reloj .................................................................................................................................. 35 5.3. SISTEMA MIPS-SINGLECYCLE .................................................................................................................... 36 5.3.1. CPU MIPS .......................................................................................................................................... 36 5.3.2. Lógica de Control y Monitoreo del CPU ........................................................................................... 42 5.3.3. Aplicación GUI VI.............................................................................................................................. 45 5.4. SISTEMA MIPS-PIPELINED .......................................................................................................................... 46 5.4.1. CPU MIPS Pipelined ......................................................................................................................... 47 5.4.2. Lógica de Control y Monitoreo del CPU Pipelined ........................................................................... 54 5.4.3. Aplicación GUI VI.............................................................................................................................. 56 5.5. HERRAMIENTAS DE DESARROLLO Y DEPURACIÓN....................................................................................... 57 CAPITULO 6 RESULTADOS Y ANÁLISIS DE RESULTADOS ........................................................................ 60 CAPITULO 7 CONCLUSIONES Y RECOMENDACIONES............................................................................... 62 7.1. 7.2. 7.3. CONCLUSIÓN GENERAL ............................................................................................................................... 62 CONCLUSIONES TÉCNICAS ........................................................................................................................... 62 RECOMENDACIONES .................................................................................................................................... 62 CAPITULO 8 REFERENCIAS BIBLIOGRÁFICAS............................................................................................. 64 CAPITULO 9 BIBLIOGRAFÍA ............................................................................................................................... 66 CAPITULO 10 APÉNDICES .................................................................................................................................... 67 ii Índice de Tablas y Figuras FIGURA 1. ESQUEMA DE LA MICRO-ARQUITECTURA DEL PROCESADOR MIC-1................................................................ 8 FIGURA 2. SIMULADOR DEL PROCESADOR MIC-1: MIC1EMU ........................................................................................ 9 FIGURA 3. DIAGRAMA DE BLOQUES DEL MCU M68HC08 ........................................................................................... 10 FIGURA 4. AMBIENTE DE PROGRAMACIÓN WINIDE/IN-CIRCUIT SIMULATOR ............................................................... 11 FIGURA 5. AMBIENTE DE PROGRAMACIÓN CODEWARRIOR FOR HC08/HCS08 ............................................................. 12 FIGURA 6. DIAGRAMA GENERAL DE UN PROCESADOR MIPS ........................................................................................ 14 FIGURA 7. GRÁFICO DE OSCILOSCOPIO OBSERVANDO UN REBOTE DE INTERRUPTOR..................................................... 19 FIGURA 8. PANEL TRASERO DE UN VI ........................................................................................................................... 21 FIGURA 9. PANEL FRONTAL DE UN VI ........................................................................................................................... 21 FIGURA 10. ESQUEMA DE FASES DEL PROYECTO .......................................................................................................... 23 FIGURA 11. SISTEMAS DE PROCESADORES DIDÁCTICOS – ESQUEMA GENERAL ............................................................ 31 FIGURA 12. REPORTE DE IMPLEMENTACIÓN EN EL MODELO DISPONIBLE PARA LOS ESTUDIANTES ................................ 33 FIGURA 13. TRAMAS DE RELOJ UTILIZADAS EN LOS SISTEMAS MIPS ........................................................................... 35 FIGURA 14. ESQUEMA GENERAL DE HARDWARE: SISTEMA MIPS-SINGLECYCLE ......................................................... 36 FIGURA 15. ESQUEMÁTICO: CPU MIPS-SINGLECYCLE ................................................................................................ 37 FIGURA 16. DIAGRAMA DE ESTADOS LÓGICA DE CONTROL Y MONITOREO – SISTEMA MIPS - SINGLECYCLE ............. 43 FIGURA 17. TRAMA DE ENVÍO DE DATOS – SISTEMA MIPS-SINGLECYCLE .................................................................. 44 FIGURA 18. SIMULACIÓN MIPS-SINGLECYCLE: PROCEDIMIENTO DE INICIALIZACIÓN ................................................. 44 FIGURA 19. INTERFAZ GRÁFICA DE USUARIO – MIPS-SINGLECYCLE ........................................................................... 45 FIGURA 20. ESQUEMA GENERAL DE HARDWARE: SISTEMA MIPS-PIPELINED................................................................ 46 FIGURA 21. ESQUEMÁTICO: CPU MIPS - PIPELINED ..................................................................................................... 48 FIGURA 22. DIAGRAMA DE ESTADOS DE LÓGICA DE CONTROL Y MONITOREO – SISTEMA MIPS-PIPELINED................ 54 FIGURA 23. TRAMA DE ENVÍO DE DATOS – SISTEMA MIPS-PIPELINED ........................................................................ 55 FIGURA 24. INTERFAZ GRÁFICA DE USUARIO – SISTEMA MIPS-PIPELINED .................................................................. 56 FIGURA 25. MUESTRA DE RESULTADOS DE SIMULACIÓN: MODELSIM .......................................................................... 57 FIGURA 26. CAPTURA DE REALTERM: SISTEMA MIPS-SINGLECYCLE .......................................................................... 58 FIGURA 27. CAPTURA DE REALTERM: SISTEMA MIPS-PIPELINED ................................................................................ 59 iii Lista de Símbolos y Abreviaturas • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • ALU: Arithmetic-Logic Unit – Unidad Lógico-Aritmética Bit: Binary Unit - Unidad binária Byte: Conjunto de 8-bit CISC: Complex Instruction Set Computing – Computación de Conjunto de Instrucciones Complejo CPU: Central Processing Unit – Unidad de Procesamiento Central DLX: Arquitectura basada en RISC de propósitos académicos FIFO: First-In, First-Out – Primero en llegar, primero en salir FP: Floating Point – Punto Flotante FPGA: Field-Programmable Gate Array – Arreglo de Compuertas Programable en Campo GUI: Graphical User Interface – Interfaz Gráfica de Usuario HDL: Hardware Description Language – Lenguaje de Descripción de Hardware IEEE: Institute of Electrical and Electronics Engineers – Instituto de Ingenieros Eléctricos y Electrónicos IJVM: Integrated Java Virtual Machine – Maquina Virtual de Java Integrada JTAG: Joint Test Action Group – Grupo de Acción de Pruebas en Conjunto LabVIEW: Laboratory Virtual Instrumentation Engineering Workbench – Mesa de trabajo de laboratorio de ingeniería de instrumentación virtual LED: Light-Emitting Diode – Diodo Emisor de Luz MAL: Micro-Assembly Language – Lenguaje Micro-Ensamblador MHz: Megahercio - Unidad equivalente a 1000 Hercios. MIC-#: Arquitectura de propósitos académicos MIPS: Microprocessor without Interlocked Pipeline Stages – Microprocesador con etapas de cauce segmentado sin inter-bloqueos Ns: Nanosegundo – Unidad equivalente a 0,000000001segundos Pipelined: Cauce Segmentado – Operación em múltiples ciclos. POWER: Performance Optimization with Enhanced RISC – Optimización de desempeño con RISC mejorado RAM: Random Access Memory – Memoria de Acceso Aleatorio RISC: Reduced Instruction Set Computing – Computación de Conjunto de Instrucciones Reducido RS-232: Recommended Standard 232 – Estándar Recomendado 232. Estándar de comunicación binaria SingleCycle: Ciclo Sencillo o único. SPARC: Scalable Processor Architecture – Arquitectura de Procesador Escalable UART: Universal Asynchronous Receiver/Transmitter – Receptor/Transmisor Universal Asíncrono USB: Universal Serial Bus – Bus Serial Universal Verilog : Verify Logic – Verificación de Lógica iv • • • • • VGA: Video Graphics Array – Arreglo de Gráficos y Video VHDL: VHSIC Hardware Description Language – Lenguaje de Descripción de Hardware VHSIC VHSIC: Very-High-Speed Integrated Circuits – Circuitos Integrados de Muy Alta Velocidad VI: Virtual Instrument – Instrumento Virtual X86: Arquitectura Dominante de Computadores Personales (Intel, AMD) CAPITULO 1 INTRODUCCIÓN La implementación de un procesador con propósitos didácticos encierra como proyecto muchos y variados elementos que controlar, de manera que el producto final sea útil para la formación de nuevos ingenieros, y permitir potenciar la capacidad de aprendizaje de los temas cubiertos en los cursos de Organización y Arquitectura del Computador. Actualmente, los cursos de Organización y Arquitectura del Computador se dictan principalmente como materias teóricas que cuentan con tiempo de laboratorio incluido como complemento. Para el trabajo práctico de éstos, se realizan actividades de programación tanto en simuladores como en dispositivos de hardware como son los micro-controladores, que no permiten gran estudio a nivel de micro-arquitectura del sus procesadores. Aun así, el contacto que tienen los estudiantes con procesadores y arquitecturas a nivel de circuitos es únicamente el provisto por los simuladores, así como las investigaciones superficiales que ellos puedan realizar sobre éstas. El principal problema de los simuladores radica en que, a pesar que es posible simular el comportamiento de una arquitectura mediante software, es difícil modelarla para cubrir todos los casos posibles, por lo cual éstos incurren en errores que inducen conflictos para comprender el funcionamiento del dispositivo. Dichos errores no son debido a fallas estructurales de los simuladores en sí mismos, sino son a raíz del enfoque que se le da a su uso, que es para el estudio de arquitecturas, más no el estudio de micro-arquitecturas. El propósito de este proyecto es proveer de una plataforma física, no simulada, con la implementación de un procesador típico real, que permita experiencia a nivel de circuitos con el dispositivo, enfocado más al nivel de micro-arquitectura que requieren los cursos de Organización y Arquitectura del computador de la carrera de Ingeniería Electrónica de la Universidad Simón Bolívar. Se busca implementar en hardware un procesador simplificado, así como los elementos necesarios para su monitoreo y control. De esta manera, este dispositivo puede ser utilizado como herramienta educativa para el estudio a nivel de micro-arquitectura de un procesador típico real. 2 Esta herramienta, cuya principal interacción con el usuario es vía un computador con un programa de interfaz gráfica, comunicándose con el dispositivo implementado en una tarjeta FPGA. Esta contiene los elementos de hardware, que consisten en el procesador en sí, la unidad de control y monitoreo, la lógica de comunicación, y la lógica de interacción física con el usuario. Con el fin de lograr una herramienta flexible pero sencilla, se trabajó sobre los elementos compositivos del sistema, de manera que éstos presentaran la mayor cantidad de información disponible. De esta forma, encontramos que las fuentes que son código se encuentran comentadas, y el dispositivo está implementado en alto nivel de forma esquemática. Así, encontramos que se desarrollaron 2 implementaciones de procesador didáctico, donde una se deriva de la otra. Dichas implementaciones poseen un juego completo de herramientas, permitiendo el estudio a nivel de micro-arquitectura de dos formas distintas de ejecutar instrucciones en un procesador típico real, abriendo las puertas al análisis comparativo entre ellos. Estos procesadores implementan la operación SingleCycle (Ciclo Sencillo) y Pipelined (Cauce Segmentado Multi-ciclo) de una simplificación de la arquitectura MIPS. El presente libro se estructura a partir de éste, en los capítulos de Planteamiento del Problema, que entra en detalle en los antecedentes, objetivos y limitaciones de este proyecto; Fundamentos Teóricos, que contiene un recorrido somero por los conceptos necesarios para el desarrollo de este proyecto; Metodología del Diseño, que describe las fases del desarrollo de este proyecto; Sistemas de Procesadores Didácticos, en el cual se describen los sistemas que se desarrollaron durante el proyecto; Resultados y Análisis, donde se presentan los resultados del proyecto, con su respectivo análisis; y las Conclusiones y Recomendaciones, donde se indican las ideas finales del proyecto, así como sugerencias para la evolución del mismo. CAPITULO 2 PLANTEAMIENTO DEL PROBLEMA 2.1. Antecedentes y Justificación Actualmente, en los cursos de Organización y Arquitectura del Computador dictados en la Universidad Simón Bolívar a estudiantes de Ingeniería Electrónica, se enfocan al estudio de modelos teóricos desarrollados para de facilitar la comprensión general de los temas, y posteriormente se estudia el comportamiento de arquitecturas como X86, POWER (Performance Optimization with Enhanced RISC – Optimización de desempeño con RISC mejorado), SPARC (Scalable Processor Architecture – Arquitectura de Procesador Escalable) entre otras. En particular, se emplea la arquitectura MIC, descrita en la literatura de Andrew Tanenbaum, como objeto de estudio para desarrollar el conocimiento de arquitectura del computador, y luego se complementa estudiando las arquitecturas antes mencionadas. Para complementar el aprendizaje en los temas estudiados, se emplean tanto herramientas de software que permiten observar el comportamiento del MIC, como herramientas que simulan el comportamiento de otras de las arquitecturas estudiadas, como es SPIM, MIDAS o DLXide. Además, se entrena a los estudiantes en el uso de micro-controladores, en particular basado en la familia HC08 de Freescale, lo cual permite realizar prácticas de programación empleando dispositivos de software cuyo funcionamiento puede ser relacionado con la arquitectura estudiada en la teoría. A pesar que esta metodología permite a los estudiantes adquirir conocimientos del funcionamiento de los procesadores en general, además de proporcionar experiencia práctica en la programación y manejo de recursos de hardware en un dispositivo, la experiencia con procesadores de filosofía RISC está limitada al manejo de los simuladores, a la información que se ofrece en los cursos y las investigaciones superficiales que puedan hacer los estudiantes. Y aunque la experiencia con los simuladores enriquece el conocimiento, no permite analizar el comportamiento de los procesadores que representan a nivel de microarquitectura. Esto no se debe a una falla estructural intrínseca de los simuladores, sino a que el enfoque que los creadores de dichas herramientas le dan a éstas, es para su uso en cursos dirigidos a estudiantes de carreras de computación, enfoque compartido por la literatura que 4 se emplea en para dictar los cursos, donde el funcionamiento físico tiene menor prioridad que el nivel de arquitectura global. En la industria del diseño profesional de arquitecturas y procesadores, se están empleando herramientas de hardware reconfigurable, como son los FPGA (Field Programmable Gate Array – Arreglo de Compuertas Programables en Campo) para el diseño y prueba en caliente de modelos futuros. Esto aplica para las aéreas de procesadores de propósito general, el desarrollo acelerado de arquitecturas y dispositivos, siendo esto una manera de acortar los ciclos de diseño y corrección. Para un ejemplo de sistemas de desarrollo, y el sistema final, véase [1] [2] [3]. Dado que en las clases de Circuitos Digitales ya se hace uso de dichos dispositivos reconfigurables, y debido a que se percibe la necesidad de herramientas más enfocadas a las necesidades de la carrera de Ingeniería Electrónica de la Universidad Simón Bolívar, se desea implementar un sistema didáctico de enseñanza práctica del funcionamiento de un procesador típico real. De esta manera, es posible un contacto más cercano con procesadores de propósito general reales y un estudio más enfocado al nivel de micro-arquitectura, empleando una arquitectura MIPS (Microprocessor without Interlocked Pipeline Stages – Microprocesador sin etapas bloqueadas entre sí en el cauce segmentado) básica cómo marco. 2.2. Objetivos Generales Obtener un sistema de procesador didáctico basado en el modelo MIPS simplificado, que permita la enseñanza básica de micro-arquitectura de computadores mediante el uso de una implementación en hardware y una interfaz de usuario interactiva. 2.3. Objetivos Específicos 1. Adaptar una implementación simplificada del modelo MIPS para su funcionamiento en el chip FPGA Spartan-3 de Xilinx, en una tarjeta de desarrollo preestablecida y disponible 5 2. Implementar controles básicos de operación normal del sistema MIPS en la tarjeta de desarrollo del Spartan-3 3. Implementación de una interfaz de comunicación entre el sistema desarrollado en la tarjeta y un computador (interfaz serial) 4. Implementación de una interfaz gráfica de visualización en un computador, que permita la observación de señales, registros, etapas de ejecución entre otros 5. Estructuración y redacción de una documentación para el uso y modificación de los componentes del sistema 2.4. Alcances y Limitaciones Este proyecto abarca la implementación física del modelo MIPS simplificado, junto con los elementos necesarios para que se pueda observar el comportamiento del mismo mediante una interfaz, incluyendo lógica de control del procesador y lógica de comunicación de datos del sistema. Para el desarrollo del procesador, se contempla la posibilidad de utilizar una implementación pre-existente, para ser adaptada a las necesidades del presente proyecto. Junto con la implementación física del proyecto, se incluye la generación de una interfaz de usuario en un computador, tal que se pueda interpretar la información que se envía desde la tarjeta que contiene el sistema físico, y se pueda mostrar de manera comprensible y didáctica a un usuario. Como complemento a las implementaciones, se encuentra la documentación del sistema en su totalidad, la documentación de usuario y la documentación técnica para futuras modificaciones tanto de la implementación reconfigurable como de la interfaz de usuario. Se tuvo en cuenta, que el propósito final del sistema en su totalidad es su implantación en las clases de Organización y Arquitectura del Computador, para los estudiantes de Ingeniería Electrónica de la Universidad Simón Bolívar. Esto implica el enfoque de micro-arquitectura, así como las necesidades y recursos disponibles en el laboratorio para los estudiantes. 6 Por otra parte, el uso de herramientas de programación o de trabajo debe limitarse a aquellas que posean un acuerdo de licencia abierta, o de compañías con las cuales la Universidad posea acuerdos de licencia, de manera que su uso práctico en los laboratorios no se vea empañado por problemáticas de índole legal. CAPITULO 3 FUNDAMENTOS TEÓRICOS Para el desarrollo de este proyecto, se emplearon conocimientos que abarcan varias de las disciplinas de Ingeniería Electrónica. Primeramente, dado que se buscó realizar una implementación en hardware de una arquitectura, fue necesario trabajar con dispositivos reconfigurables y sus herramientas asociadas, de manera que fuese posible contar con una plataforma de implementación física, pero como ya se indicó, modificable. Además, se empleó una arquitectura con antecedentes de uso didáctico y bien documentada, de manera que el proyecto no fuese una arquitectura nueva, sino que fuese un sistema más cercano a un procesador típico de propósito general, por lo cual se estudió la implementación de un procesador MIPS simplificado. Como complemento, se revisaron los posibles problemas de rebotes en el uso de interruptores de botón (push switch), el uso de puerto serial para la comunicación con un computador y el uso de la herramienta LabVIEW para el desarrollo de un instrumento virtual que cumpla con la función de interfaz de usuario en un computador. 3.1. Micro-arquitectura y Organización en la Enseñanza En los cursos de Organización y Arquitectura del Computador dictados a los estudiantes de Ingeniería Electrónica de la Universidad Simón Bolívar, se observa una progresión en los conceptos que se le imparten. Para la enseñanza básica del funcionamiento de un procesador, se estudia una arquitectura CISC (Complex Instruction Set Computing – Computación de Conjunto de Instrucciones Complejo) desarrollada por Andrew S. Tanenbaum específicamente con el propósito de facilitar la enseñanza del tema, pero ésta está enfocada a los estudiantes de carreras de computación. La arquitectura MIC consiste en 3 procesadores, comenzando por un procesador CISC micro-programado, al cual se le introducen mejoras al nivel de micro-arquitectura para realizar un análisis comparativo del rendimiento del mismo a medida que se modifica. Está basado en el conjunto de instrucciones IJVM (Integrated Java Virtual Machine – Máquina Virtual de Java Integrada), que es compatible con el lenguaje de programación Java, y su unidad de control es un bloque de memoria que posee rutinas paras las instrucciones IJVM, y está programado en otro lenguaje, llamado MAL (Micro-Assembly Language – Lenguaje 8 Micro-Ensamblador). Como parte de los objetivos del curso, se estudia tanto el conjunto IJVM como sus implementaciones internas en MAL, además de tomar como ejercicio para los estudiantes el escribir instrucciones en MAL que puedan ser agregadas al conjunto preexistente de instrucciones. Inicialmente, los estudiantes estudian el procesador MIC-1, que consiste en un procesador sencillo de 32-bit, con las características descritas anteriormente. Un dato interesante es que para el manejo de memoria de programa, el MIC-1 emplea una pila, por lo cual los estudiantes deben siempre cuidar el uso de la misma para el funcionamiento correcto del sistema. Seguidamente, se introduce el MIC-2, que posee una modificación en la microarquitectura de su antecesor en que permite mayor flexibilidad para las entradas de la ALU (Arithmetic-Logic Unit – Unidad Lógico-Aritmética) del procesador, ya que el MIC-1 posee 1 bus libre de entrada a ésta, y su otro puerto de entrada solo puede ser accedido por un registro, mientras que el MIC-2 posee 2 buses para acceder a la ALU. Finalmente, se muestra el MIC-3, que agrega registros de almacenamiento a la entrada y la salida de la ALU, efectivamente agregando 3 registros al sistema, asociados directamente a la ALU. Figura 1. Esquema de la micro-arquitectura del procesador MIC-1 9 Durante el estudio de la arquitectura MIC, los estudiantes cuentan con herramientas de simulación de la misma, dado que estos procesadores son parte de la teoría, y no se cuenta con dispositivos de hardware que los representen. Estos programas permiten al estudiante tener una guía para observar el comportamiento de la arquitectura, bien desde la programación en lenguaje IJVM o en lenguaje MAL, con una interfaz gráfica que presenta la micro-arquitectura y su comportamiento. Para esta familia de procesadores se hace relativamente fácil la implementación de esta clase de software, dado que el enfoque de la arquitectura es precisamente simplificar su simula simulación. ción. Para un estudio más profundo de la familia MIC, véase [4]. Figura 2. Simulador del Procesador MIC-1: MIC1Emu Una vez los estudiantes tienen un poco de experiencia manejando un procesador, se les introduce como parte de la experiencia de laboratorio al uso de un micro-controlador, el cual utilizan durante los cursos antes mencionados, pero que son el corazón de los proyectos que los estudiantes deben realizar en cursos posteriores, en los cuales deben emplear muchas de las destrezas adquiridas en el transcurso de su carrera, con énfasis en el manejo de éste dispositivo. 10 Específicamente, se emplea un MCU M68HC08GP32A, que cuenta con un CPU (Central Processing Unit – Unidad de Procesamiento Central) de la familia M68HC08 de 8-bit, 2 módulos contadores de 16-bit con capacidad de generar PWM, 1 modulo de conversión analógico-digital de 8-bit de aproximaciones sucesivas, 1 contador de 8-bit general, un puerto de 8-bit de teclado entre otros periféricos integrados. Para conocer con mayor detalle los elementos del MCU, véase [5]. Figura 3. Diagrama de Bloques del MCU M68HC08 Inicialmente, los estudiantes aprenden la programación para este MCU utilizando lenguaje ensamblador. Esto se hace con la intención que los estudiantes adquieran un conocimiento integral de los registros de control del MCU, así como el comportamiento del mismo para ejecutar las diferentes rutinas, interrupciones, y manejo de los periféricos integrados de éste. Durante esta etapa del aprendizaje, se emplea un ambiente de programación llamado WinIDE, desarrollado por P&E Micro, en el cual la programación se realiza en ensamblador de HC08. Además incluye la posibilidad de ejecución de un programa que se quiera escribir en el MCU, en modo de depuración, monitoreando directamente el dispositivo. Nótese que es necesario contar con circuitería extra, que para los eestudiantes studiantes usualmente es una tarjeta 11 básica de HC08 provista por el laboratorio en modo de préstamo, para lograr la funcionalidad necesaria para el modo de depuración. Figura 4. Ambiente de Programación WinIDE/In-circuit Simulator A pesar que el manejo de lenguaje ensamblador descubre mucho del funcionamiento de bajo nivel del MCU, es muy engorroso el desarrollo de proyectos de cierto nivel de complejidad, ya que el manejo de los datos y periféricos puede hacerse bastante problemático. Debido a esto, una vez los estudiantes logran realizar proyectos de cierta magnitud programados en ensamblador, son introducidos a la herramienta CodeWarrior, desarrollada en conjunto por Freescale y Metrowerks. Esta herramienta permite la programación de proyectos en lenguaje C, simplificando la codificación. Además, incluye herramientas para la configuración de los periféricos, de manera que el estudiante se concentre sólo en la programación, evitando la manipulación directa de los registros de configuración. Para proyectos de mayor nivel de complejidad, la herramienta ofrece un modo de programación avanzado, en el cual no sólo se hace la configuración de los periféricos necesarios, sino que también se generan rutinas básicas para su manipulación, junto con las interrupciones en caso que éste cuente con ellas, y que sean así configuradas para su uso en el proyecto. 12 Figura 5. Ambiente de programación CodeWarrior for HC08/HCS08 3.1.1. Arquitectura MIPS La arquitectura MIPS fue desarrollada a principio de la década de los años ’80 buscando incrementar el rendimiento y desempeño de los microprocesadores mediante la implementación de la filosofía de diseño RISC (Reduced Instruction Set Computing – Computación de Conjunto de Instrucciones Reducido) y de otras ideas para mejorar la capacidad de procesamiento de este diseño. Desde entonces, se han hecho muchas evoluciones al diseño de la arquitectura, encontrando finalmente que MIPS Technologies Inc., la compañía que creó la arquitectura, logró un éxito importante a través de los años y decidió licenciar la arquitectura MIPS a otras compañías para el desarrollo de productos. De esta manera encontramos que muchos dispositivos embebidos, como son decodificadores de televisión, agendas electrónicas, computadoras de mano y enrutadores de red tienen como motor principal de sus funciones un núcleo derivado de un MIPS. Dada esta fuerte presencia de mercado, y debido a que la arquitectura está basada en la filosofía RISC, encontramos material didáctico que estudia y simula el comportamiento de procesadores MIPS simplificados, de manera que es fácil observar el comportamiento del mismo, mediante estas herramientas. 13 A pesar que existen diversas versiones del procesador MIPS, con extensiones específicas para ciertas necesidades, así como versiones de funcionalidad reducida para cumplir otros requisitos como alto nivel de integración y muy bajo consumo energético, en general encontramos que los procesadores basados en la arquitectura MIPS comparten ciertas características básicas. En primer lugar, encontramos 3 tipos de instrucciones: registro a registro, registro valor inmediato y salto. Como puede observarse, las operaciones que ejecuta el procesador son entre registros, y esta es la segunda característica de la arquitectura. Las instrucciones con valor inmediato, y las instrucciones de salto usualmente calculan una dirección de memoria para realizar lecturas o escrituras, o saltos en la continuidad del programa. Una tercera característica es el uso de una página de registros, donde se pueden direccionar individualmente y todos son iguales entre sí, con ciertas excepciones como el registro de dirección 0, que usualmente está cableado al valor 0 y no se puede escribir sobre él. El acceso a memoria, característica particular de ésta arquitectura, se hace mediante procedimientos de carga o descarga, y usualmente no cuentan con modos de acceso avanzado, como movimientos de memoria a memoria, o manejo de arreglos de datos, lo cual le ganó a la arquitectura la fama de ineficiencia en ésta área en particular. El propósito de la arquitectura en general es simplificar el conjunto de instrucciones lo más posible, de manera que sea posible la implementación de pipelining tan profundo en el camino de datos del procesador como sea posible. Así, se busca que cada etapa de funcionamiento del procesador pueda operar tan rápido como sea posible. A pesar que el simplificar la ejecución y eliminar instrucciones que pueden ser útiles puede parecer una desventaja ante otras arquitecturas, junto con el numero de ciclos requerido desde que una instrucción es leída desde la memoria de instrucciones, hasta que el resultado de dicha instrucción se escribe nuevamente en su destino correspondiente, en la práctica dicha desventaja no se presenta como tal. La combinación de hardware operando a mayor frecuencia, junto con un conjunto de instrucciones sencillas que se ajustan con mayor facilidad a la mayoría de las cargas de los programas en general, permite a la arquitectura MIPS gozar de un muy buen rendimiento, sin necesidad de optimizaciones agresivas por parte de compiladores complejos para extraer el máximo rendimiento, como ocurre en otras arquitecturas. 14 Figura 6. Diagrama General de un procesador MIPS La simplificación de la arquitectura de 32-bit del MIPS pasa por la reducción del conjunto de instrucciones, la simplificación de las ALU y la eliminación del procesamiento de FP (Floating-Point – Punto Flotante). Encontramos que dicha simplificación conlleva a que el conjunto de instrucciones disponibles para el desarrollo en cuestión se vea reducido a 7, de las cuales tenemos 4 operaciones entre registros, 2 operaciones de memoria y 1 operación de salto. De esta manera tenemos el MIPS de 32-bit, manejando un conjunto de instrucciones reducido, en el cual es posible alcanzar un rendimiento de 1 ciclo por instrucción. Para mayor referencia respecto a la arquitectura MIPS, así ccomo omo sus desarrollos, y su uso para la enseñanza, véase [6] [7]. 3.2. Plataforma FPGA El uso de hardware reconfigurable como plataforma para el desarrollo del proyecto se debe a la premisa de una implementación real, y no un simulador de una arquitectura conocida. Esto permite que el proyecto pueda trabajar bajo condiciones no necesariamente previstas en el momento del desarrollo del sistema, y que éste continúe operando de la manera que el hardware dicta. Así, a diferencia que un simulador, no existe una condición de operación 15 “forzada” mediante correcciones especiales, sino que se puede observar cómo se resuelve prácticamente cualquier condición que pueda ser ejecutada por el conjunto de instrucciones implementado en el sistema. La tecnología de hardware reconfigurable está representada en la actualidad por distintas propuestas, siendo el de mayor crecimiento y popularidad la de los sistemas de arreglos de compuertas programables en campo, mejor conocidos como FPGA por sus siglas en inglés. Como su nombre lo indica, estos dispositivos cuentan con un arreglo interno de compuertas cuya interconexión puede ser modificada para representar el comportamiento de lógica electrónica, como pueden ser sistemas muy simples con compuertas digitales como AND u OR, hasta diseños más complejos con elementos de memoria, flip-flops, multiplexores, decodificadores o funciones matemáticas. Usualmente, la lógica programable está contenida dentro de un chip, el cual suele estar montado en una tarjeta de desarrollo que permite hacer interfaz con las patillas (pines) del FPGA mediante diferentes accesos, como son interfaces seriales, interfaces de video VGA (Video Graphics Array – Arreglo de Gráficos y Video) entre otras dependiendo de la tarjeta seleccionada. Aunque lo más usual es el empleo de los FPGA para el desarrollo de dispositivos, también es posible encontrarlos como parte de un diseño completo, como se puede observar en [8]. Escapa el enfoque de este proyecto un estudio profundo del funcionamiento de los FPGA (véase [9]), así como el estado del arte (véase [10]) de ésta tecnología. Existen varios fabricantes de sistemas FPGA, tanto de los chips en sí mismos, como tarjetas de desarrollo de diferentes niveles de integración y complejidad, buscando cubrir desde las necesidades simples de diseño, a las necesidades profesionales de validación de productos. Normalmente, los fabricantes de los sistemas proveen un ambiente de programación para sus soluciones, y en estas se cubren todos los aspectos de la programación de éstas, desde la creación de las fuentes que pueda manejar, esquemáticas o de código HDL (Hardware Description Language – Lenguaje de Descripción de Hardware), hasta los pasos subsiguientes que le correspondan a cada sistema, como son la asignación de contactos, la ubicación y la asignación de caminos (routing) del diseño en cuestión, y la programación final en el FPGA. Aunque las capacidades intrínsecas de los FPGA no cambian en términos generales entre los distintos fabricantes, lo que cambia son las opciones tanto de los sistemas de desarrollo (integración de sistemas en un chip, interfaces avanzadas, mayor densidad de compuertas por 16 dispositivo, entre otras) como el comportamiento y características del ambiente de programación (software). 3.3. Programación para FPGA – Lenguajes HDL Para el desarrollo de diseños en FPGA, generalmente se pueden tomar 2 enfoques, aunque esto depende totalmente del ambiente de desarrollo con el cual se cuente: realizar el diseño mediante esquemáticos, en los cuales los elementos son todos conectados de la misma manera como se haría en un programa de diseño de circuitos eléctricos o digitales, o se puede diseñar empleando algún HDL. Aunque las opciones de cada ambiente de diseño para FPGA varían, es usual encontrar en todos ellos la opción de manejar proyectos cuyas fuentes son híbridas, es decir, el software es capaz de manejar tanto esquemáticos como fuentes codificadas en HDL. Todas las fuentes del diseño son luego verificadas, procesadas y, en caso de los ambientes completos de desarrollo de proyectos, preparados para ser finalmente programados en el FPGA. Existen 2 lenguajes HDL como estándares industriales utilizados para el diseño de proyectos, que son Verilog (Verify Logic – Verificar Lógica) y VHDL (VHSIC Hardware Description Language – Lenguaje de Descripción de Hardware VHSIC), y ambos pueden ser empleados para la creación de fuentes para dispositivos FPGA, siempre que el ambiente de programación así lo permita. Estos lenguajes no son fundamentalmente disímiles, y muchas de las características de uno son replicadas en el otro. Aunque la sintaxis de ambos es similar a la sintaxis de lenguaje C, cada uno implementa una manera distinta de manejar la descripción de hardware, pero la mayoría de los diseños pueden ser desarrollados tanto en VHDL como en Verilog. No entra dentro de los alcances de este proyecto el presentar una comparación de las capacidades de ambos lenguajes [11] o un estudio profundo de la trayectoria de ambos lenguajes [12] [13]. Es necesario acotar, sin embargo, que la selección de lenguaje de descripción de hardware dentro de un proyecto tendrá como limitante principal las capacidades del ambiente de diseño con el cual se cuente para el desarrollo del mismo, ya que si este no es capaz de manejar alguno de los lenguajes, entonces el desarrollador se verá forzado a emplear bien el otro lenguaje, o modificar el enfoque de diseño del sistema en cuestión, en el caso de no ser posible el cambiar el ambiente de programación. Pero no todo con respecto a los ambientes de programación es negativo, dado que a medida que se ha popularizado el uso de FPGA para el diseño, se ha extendido la programación en HDL y a 17 crecido la comunidad de desarrolladores, han aparecido librerías de diseño, tanto de fuente abierta como propietarias y de propiedad intelectual que puede ser usado bajo licencia del autor, que facilitan el trabajo de los diseñadores al proveerlos con implementaciones de diversos dispositivos de uso general, como son ALU’s optimizadas, transmisores/receptores de puerto serial, entre otras, que terminan permitiéndole enfocarse en su diseño más que en los periféricos de éste. Por otra parte, dado que los lenguajes HDL son controlados por cuerpos colegiados, que una vez encuentran los puntos a los cuales es necesario actualizar cualquiera de los lenguajes, los envían a la IEEE (Institute of Electrical and Electronics Engineers – Instituto de Ingenieros Eléctricos y Electrónicos)para que estos sean discutidos y convertidos en estándar IEEE oficial, de manera que el desarrollo de los lenguajes sea uniforme, y además evitar que se desarrollen de manera desordenada variantes similares, pero de sintaxis diferente, de un mismo lenguaje. Esto ha permitido la existencia de plantillas, un formato de código que los ambientes de programación siempre reconocen como un tipo específico de hardware, para simplificar la programación en HDL, y para mejorar el rendimiento de la etapa de síntesis de los proyectos HDL, bien sea en Verilog o VHDL. 3.4. Comunicación mediante Puerto Serial La comunicación con un computador mediante el uso de un puerto serial es una de las vías más sencillas de hacer interfaz con un dispositivo, dado que no es necesario el agregar ningún software especial para poder ver lo que se está transmitiendo. A pesar que existen buses de mayor velocidad disponibles para hacer interfaz con un computador, la parte de hardware muchas veces no se encuentra disponible, o su costo es mucho mayor para los dispositivos de hardware que usualmente se construyen de forma artesanal, es decir, cuando manualmente se construye un circuito o dispositivo. Además, las tarjetas de desarrollo que usualmente se emplean en el laboratorio para el manejo de varios dispositivos cuentan con un puerto serial, junto con la circuitería necesaria para conectar los dispositivos al puerto, por lo cual el uso de este bus de comunicación de baja velocidad es una manera sencilla de conectarse a un computador. Es necesario conocer un poco de las opciones más simples que ofrece el puerto de comunicaciones serial para entender fácilmente su operación. Principalmente, es importante destacar que la comunicación serial transmite un bit a la vez, por lo cual la tasa de datos en bits por segundo es igual a la tasa de símbolos, medida en baudios. Aun así, es importante destacar que la tasa efectiva de datos está sujeta a la 18 configuración del puerto, ya que la velocidad incluye todos los bits que envía el puerto, incluidos los de control que estén en uso. Aunque la especificación RS-232-C (Recommended Standard 232 – Estándar Recomendado 232) especifica que la velocidad máxima de conexión es de 20000 baudios, o bits por segundo para este puerto en particular, los puertos en la actualidad pueden ser configurados en velocidades mayores, aunque esta configuración no siempre significa que la conexión se pueda conseguir. Además, para lograr la comunicación se deben configurar en el puerto la cantidad de bits, el uso de paridad, control de flujo y el número de bits de parada del puerto. Tanto el transmisor como el receptor deben tener una configuración idéntica para lograr una comunicación correcta. La tasa de datos efectiva del puerto dependerá del uso de paridad y bits de parada, dado que ambas opciones agregan bits a la transmisión, aumentando el total de bits enviados por el puerto. Para la visualización de los datos una vez establecida la conexión, es necesario capturar la información del puerto en cuestión. Es posible ver los datos del puerto mediante un software de terminal de comunicación que pueda acceder el puerto, como son HyperTerminal o RealTerm. Estos programas permiten configurar y capturar la información de un puerto serial, y observar los caracteres que por ellos se reciben, con la posibilidad de enviar caracteres por éstos. Esta es una manera interesante de verificar la comunicación por el puerto, y puede emplearse para manejo sencillo de datos. En caso que se desee manejar el puerto serial fuera de un programa terminal, usualmente se debe hacer interfaz con los controladores del sistema operativo que manejan el puerto, por lo cual es necesario emplear un programa que se comunique con el sistema operativo. Para mayor detalle en el uso de puerto de comunicación serial, véase [14]. 3.5. Fenómeno de Rebote de Contactos En el trabajo con elementos electrónicos discretos, es importante considerar el comportamiento físico de dicho elemento, de manera que ante un problema en el momento de la operación, se pueda utilizar la información para rastrear las fuentes del fallo. Un ejemplo de dispositivo cuyo comportamiento mecánico pudiese interferir en la operación de un sistema es el Push-Button Switch (interruptor de botón). El principio de funcionamiento de un interruptor de este tipo, en el caso de un botón de cerrado al accionar, es precisamente ése. Estos dispositivos se pueden encontrar tanto en modalidad normalmente abierto (NO por sus 19 siglas en inglés) o normalmente cerrados (NC por sus siglas en inglés). El interruptor, al estar colocado en un circuito, se comporta como un circuito abierto, y al accionarlo (presionarlo como indica su nombre) se cierra y se comporta como un cable en caso ideal (véase [15]). Durante la operación de estos dispositivos, es posible que, por las características de los mismos, no sea posible obtener un flanco limpio a partir de su accionamiento, lo que podría causar errores de operación en un circuito, en particular en los circuitos digitales que los empleen como medio de entrada. Figura 7. Gráfico de Osciloscopio observando un rebote de interruptor Como se puede observar, es necesario tomar acciones correctivas para que las características mecánicas del sistema no afecten su operación. Para resolver este problema, se pueden tomar diferentes medidas, que muchas veces dependen de la naturaleza del trabajo que se esté realizando. Las soluciones pueden ser desde abrir el circuito y físicamente modificarlo, que podría modificar sus características ligeramente, como la utilización de circuitos de filtrado o de accionamiento retardado, o de ser posible, una solución implementada totalmente en software, al hacer revisión rápida del interruptor para verificar que no se esté dentro de la condición de rebote [16]. 3.6. Desarrollo de aplicaciones mediante National Instruments LabVIEW Existen muchas herramientas que permiten la programación de software, tanto de la lógica como de la interfaz de usuario del mismo, en caso de necesitarla. Estas pueden ser desde herramientas muy sencillas con poco nivel de integración entre sus diferentes elementos, 20 como conjuntos completos de herramientas con gran nivel de integración y sofisticación. Una de las herramientas que se ha destacado por la posibilidad de manejar tanto la interfaz gráfica como el comportamiento en sí del programa es LabVIEW (Laboratory Virtual Instrumentation Engineering Workbench – Mesa de trabajo de laboratorio de ingeniería de instrumentación virtual), de la compañía National Instruments. El enfoque de esta herramienta apunta más al trabajo con sistemas de adquisición de señales y del procesamiento de dichas señales, para su posterior monitoreo, por lo cual se encuentra integrado dentro de esta herramienta un amplio soporte para el manejo de dispositivos externos al computador. El uso de LabVIEW se ha popularizado en las áreas de adquisición de datos, control instrumental y automatización industrial, y National Instruments promueve su uso en ambientes académicos. A diferencia del uso de un ambiente de programación, en el cual para poder utilizar dispositivos del computador muchas veces es necesario tener una rutina de negociación con el sistema operativo a través del controlador del mismo, lo cual agrega un nivel de complejidad al proyecto para el manejo de la entrada/salida requerida por éste, LabVIEW integra la negociación dentro de las funciones del ambiente, por lo cual manejar alguno de los puertos del computador, así como el manejo de herramientas de adquisición de datos más avanzadas, se puede realizar de manera fácil, sin necesidad de entrar en las profundidades del manejo de hardware directamente en el proyecto. La programación dentro de LabVIEW se maneja de forma esquemática, en la cual mediante el uso de cajas y líneas conectoras, se elabora el programa, que dentro del ambiente se les llama VI (Virtual Instrument – Instrumento Virtual). Un VI cuenta con 2 partes principales: el panel frontal, que es la interfaz con la cual interactúa el usuario, y el panel trasero, que es el área en la cual se emplea el esquemático para programar la funcionalidad del mismo. Dada la orientación de instrumentación del ambiente, el panel frontal muchas veces se asemeja a un panel de instrumentación industrial, debido al uso de controles en forma de perillas, interruptores, controles deslizantes, indicadores luminosos estilo LED (Light Emitting Diode – Diodo Emisor de Luz) así como indicadores numéricos y textuales. 21 Figura 8. Panel Trasero de un VI Figura 9. Panel Frontal de un VI 22 Para la programación de los VI, se sigue un esquema de flujo de datos, en el cual, cada cajita, o nodo, está conectada con las demás por medio de líneas, que sirven como transmisores de datos, donde cada uno de estas líneas tiene definido un tipo de dato especifico, de manera que sea más fácil diferenciar los datos que se están manejando. De esta forma, el VI realiza las operaciones sobre los datos de manera secuencial, iniciando la ejecución con los elementos que estén más a la izquierda primero y progresando hacia la derecha en el orden que estén los nodos. Además, existe un segundo “orden” de ejecución, de arriba abajo, en caso de no ser posible ejecutar en paralelo las funciones de los nodos que estén alineados verticalmente, así encontramos maneras de realizar operaciones en paralelo para conjuntos de datos distintos, y secuenciales para un conjunto de datos, en caso que sea necesario procesarlos para alcanzar el estado deseado de los mismos. Muchas veces es necesario procesar los datos de forma tal que su presentación al usuario sea más adecuada. Aparte de los nodos que incluye el ambiente de programación, tanto para el procesamiento de datos como para la presentación de los mismos en el panel, es posible usar librerías de funciones como en otros lenguajes y ambientes de programación, además de tener la posibilidad de generar subVI, que no son más que una agrupación de una cantidad de nodos para re-utilizarlos dentro de otro de mayor tamaño, como podría ser necesario al tener varios conjuntos de datos simultáneos a los cuales se le deba realizar la misma secuencia de operaciones para presentarlos al usuario. A pesar que es posible preparar los VI de manera que puedan ser utilizados sin necesidad de instalar el ambiente LabVIEW completo, las librerías necesarias para que éstos puedan utilizarse por su cuenta no suelen incluirse con los sistemas operativos soportados por National Instruments (Linux, Windows, OS X), por lo cual es necesario instalar un paquete de librerías en tiempo de ejecución (run-time) que soporte la versión del ambiente de programación en el cual fue creado el VI. Para mayor información sobre LabVIEW, véase [17] [18]. CAPITULO 4 METODOLOGÍA DEL DISEÑO El desarrollo del proyecto puede ser desglosado en fases, en las cuales el enfoque era completar parte del trabajo que era necesario para fundamentar el desarrollo de las etapas subsiguientes. Figura 10. Esquema de Fases del Proyecto 24 Fase 1: Investigación y Documentación • Se realizó una investigación buscando la existencia de proyectos similares en otras universidades o institutos politécnicos. • La investigación se llevó a cabo mediante el uso de internet, principalmente fuera de la Universidad. • El uso de referencias de internet para algunos tópicos, el acceso restringido a la información de algunas universidades. • Para el momento de la investigación, se encontró que los proyectos similares se encuentra como parte de cursos similares a los dictados en la Universidad, con la execpcion que se encuentran orientados a estudiantes de carreras de computación. En particular, en el sitio web del Georgia Institute of Technology se encontró el código fuente para la implementación simulada de un MIPS simplificado. Dado que las fuentes son en VHDL, se tomaron como marco para trabajar sobre las mismas. Fase 2: Selección de herramientas y familiarización con los sistemas • Búsqueda, selección y familiarización con los dispositivos de hardware y ambientes de programación necesarios para el desarrollo del proyecto. • Mediante la investigación entre los recursos del Laboratorio de Electrónica, los recursos a la disposición del Tutor y los recursos disponibles para los estudiantes de la Universidad Simón Bolívar. • La experiencia muy baja para el trabajo con herramientas de codificación HDL, comportamiento errático del ambiente FPGA, requerimientos no expresados para el correcto funcionamiento del software, la obtención de licencias necesarias para el uso de las herramientas hicieron que esta etapa tomase más tiempo del previsto. • Se obtuvo la tarjeta de desarrollo Digilent, basada en un chip FPGA Spartan-3 de Xilinx, que es una versión superior a la empleada por los estudiantes en el Laboratorio de Circuitos Digitales. Como ambiente de desarrollo del FPGA se obtuvo el Xilinx ISE Webpack 9.1i, que posee licencia de uso gratuito con 25 registrarse en el sitio de la compañía, ya que este posee soporte para el dispositivo de hardware seleccionado y, y es capaz de procesar diversas fuentes, entre las que está el diseño esquemático, fuentes VHDL y fuentes Verilog. Para la validación de los modelos, así como para la simulación de los sistemas desarrollados, se seleccionó ModelSim, la versión provista por Xilinx, ya que la licencia para su uso con el ambiente Xilinx es gratuita y porque es el software que se emplea en la práctica original de las fuentes seleccionadas. Para el desarrollo de las interfaces de usuario se seleccionó LabVIEW de National Instruments, debido a la amplia experiencia desarrollando aplicaciones en éste ambiente, la disponibilidad del laboratorio de licencias para su uso, y la integración del manejo de puertos periféricos en un computador, en particular del puerto serial. Fase 3: Implementación de Fuentes MIPS en el FPGA • Implementación de fuentes del procesador MIPS en la tarjeta FPGA. Dichas fuentes se encontraron en la Práctica de Laboratorio 2, del curso de Arquitectura del Computador y Sistemas Operativos del Prof. Hsien-Hsin Lee, de Georgia Institute of Technology. • Mediante el uso de las herramientas ModelSim, Xilinx ISE Webpack 9.1i, se implementaron las fuentes en el FPGA, y se simuló el comportamiento de las fuentes VHDL • Dificultades inicialmente para la simulación de las fuentes, problemas para la asignación de las salidas del dispositivo FPGA. • Se estudió el comportamiento del procesador en ModelSim, luego se llevaron las fuentes para su implementación dentro del dispositivo FPGA. Sin embargo, se observó que el procesador no responde favorablemente ante lógica de control sencilla. Fase 4: Modificación de Fuentes MIPS a diseño esquemático • Se modificaron las fuentes del procesador, de manera que estuviese representado de forma esquemática. 26 • Mediante el uso de ISE Webpack 9.1i, se generaron símbolos de cada uno de los elementos compositivos del procesador. Una vez el modelo esquemático del procesador está finalizado, se simuló su comportamiento en ModelSim, para verificar su comportamiento con el diseño original. • La conversión del procesador completo a un diseño esquemático requirió la generación de elementos adicionales, para manejar la separación de las señales como requieren las unidades compositivas de éste, la necesidad de modificar el código de las unidades funcionales, para adaptar las porciones netamente de simulación a código traducible a hardware. • Se obtuvo una implementación del procesador en forma esquemática, que se comporta análogamente a las fuentes originales. Fase 5:.Implementacion y Desarrollo de Lógica de Comunicaciones, Control y Monitoreo MIPS – SingleCycle • Se desarrolló e implementó una unidad de control y monitoreo para el procesador, además de implementar un módulo de comunicaciones serial, que se agregó al sistema. • Utilizando ISE Webpack 9.1i, se desarrolló la unidad de control y monitoreo, modelada empleando una máquina de estados. Además, se agregó un módulo de comunicación serial utilizando la herramienta antes mencionada. • El desarrollo de la unidad de control tomó mayor tiempo del previsto, dado que inicialmente no se intentó trabajar con una máquina de estados. • Se implementó una máquina de estados como lógica de control y monitoreo del procesador. Ésta opera a una frecuencia superior al procesador, se encarga de los procedimientos necesarios para la inicialización del mismo, y recibe las señales monitoreadas de éste, les da formato de trama serial y las envía al módulo de comunicaciones seriales del sistema, cuidando enviarlos con un retardo entre byte y byte para no saturarlo. El módulo de comunicaciones serial consiste en una implementación disponible gratuitamente en la red, que posee un transmisor/receptor UART (Universal Asynchronous Receiver-Transmitter – 27 Receptor-Transmisor Universal Asíncrono) que debe operar a 50MHz y transmite a 115200bps los datos por el puerto serial, por lo cual éste es compatible con el proyecto y fue integrado a éste. Fase 6: Desarrollo de la Interfaz Gráfica del Modelo MIPS – SingleCycle • Programación de una interfaz gráfica de usuario para la fácil observación del funcionamiento del sistema. • Mediante el entorno LabVIEW para el desarrollo de la aplicación, y RealTerm como herramienta de depuración de la comunicación. • Problemas de operación del envío de los datos, por cuestiones de manejo de memoria, sincronía de los datos en la Interfaz de Usuario. • Se desarrolló una intrfaz en el computador, dependiente del entorno LabVIEW, en la cual se puede observar el funcionamiento del sistema, así como controlar la velocidad de operación del procesador, permitiendo la detención y continuación de la ejecución de instrucciones. Fase 7: Desarrollo e Implementación del modelo MIPS-Pipelined • Extensión del procesador MIPS para implementar una versión de cauce segmentado. • Siguiendo la teoría contenida en el capítulo 6 de [19], empleando ISE Webpack 9.1i como plataforma de desarrollo y ModelSim como herramienta de simulación y validación de las modificaciones introducidas. • Elevado nivel de complejidad del diseño esquemático, necesidad de desarrollar lógica para el manejo de algunos buses de datos sin formar parte directamente de las unidades del cauce segmentado, problemas internos de sincronía de señales, detalles en el proceso de síntesis e implementación de las fuentes en el ambiente ISE Webpack 9.1i, que requieren atención sobre las opciones activas para estos procesos. 28 • Se obtuvo una implementación de un procesador MIPS con cauce segmentado de datos a partir del primer sistema, bautizando éste desarrollo MIPS-Pipelined. Fase 8: Desarrollo Sistema de Lógica de Control y Monitoreo MIPS – Pipelined • Adecuación de la lógica de control para las necesidades del sistema MIPSPipelined. • Se utilizó ISE Webpack 9.1i para las modificaciones a la estructura de la lógica de control y monitoreo, ModelSim para la simulación del comportamiento. • Dificultades en las pruebas funcionales dada la gran cantidad de datos que se manejan, detalles en la sincronización del envío de los datos al módulo de comunicación serial UART, número importante de estados internos de la nueva unidad de control hace engorrosa la corrección de errores en ésta. • Se implementó una lógica de control adaptada a las necesidades del procesador modificado. Fase 9: Desarrollo de la Interfaz Gráfica del modelo MIPS – Pipelined • Desarrollo de una Interfaz Gráfica de usuario para el modelo MIPS – Pipelined, análoga a la ya existente para el modelo MIPS - Single Cicle. • Ambiente LabVIEW para desarrollo, ModelSim para la validación, Xilinx ISE para la implementación y RealTerm para pruebas de puerto serial. • Problemas en la implementación del Transmisor/Receptor en el ambiente LabVIEW, manejo de datos en el sistema MIPS – Pipelined, problemas en las convenciones de decodificación de datos por parte de las funciones de conversión. • Se obtuvo una Interfaz Gráfica de usuario en la cual se puede ver el comportamiento del procesador MIPS-Pipelined a medida que ejecuta las instrucciones. Esta puede cambiar la velocidad de operación, así como detener y reanudar la ejecución de instrucciones. Fase 10: Estudio de Optimizaciones al Modelo MIPS – Pipelined 29 • Exploración de las optimizaciones de rendimiento disponibles para el modelo MIPS – Pipelined. • Documentación de las mejoras, Xilinx ISE, ModelSim y LabVIEW para la implementación, validación y observación en la Interfaz Gráfica de usuario de las optimizaciones estudiadas. • Niveles de complejidad del modelo MIPS - Pipelined sin optimizar, tiempo de desarrollo de las optimizaciones individuales. • Se logró implementar en su totalidad el forwarding (adelantamiento de información) en el modelo MIPS - Pipelined, se hicieron estudios y avances en las optimizaciones a la instrucción de salto (branch) y a una unidad de predicción de saltos (branchprediction). Se modificó la Interfaz Gráfica de usuario para acomodar la información de la optimización por forwarding. . CAPITULO 5 SISTEMAS DE PROCESADORES DIDÁCTICOS Este proyecto generó 2 sistemas, así como las bases para el desarrollo de otros basados en los actuales. Se generaron 2 dispositivos que pueden ser empleados como herramientas didácticas para los cursos de Organización y Arquitectura del Computador, de la carrera de Ingeniería Electrónica de la Universidad Simón Bolívar. Debido a que estos sistemas fueron desarrollados de forma concurrente, y que uno de éstos es la evolución natural del otro, ambos comparten muchos de sus elementos constituyentes, así como la plataforma sobre la cual trabajan. Los sistemas implementados se denominan MIPS-SingleCycle y el MIPS-Pipelined, encontrándose su principal diferenciación en las características del procesador. Los elementos que son diferentes entre los sistemas son el CPU y la lógica de control y monitoreo de cada uno de éstos. El procesador se desarrolló a partir de las fuentes del Prof. Lee de GeorgiaTech, pero se implementó de manera esquemática. Luego, se le agregaron las estructuras necesarias para alcanzar la operación con un Pipeline (Cauce Segmentado de Datos). El grueso del trabajo realizado reside en la lógica que acompaña al CPU, que fue necesaria para lograr el funcionamiento de éste en primera instancia, además de ser el responsable de ordenar los datos que se extraen de él, de manera que puedan ser enviados y visualizados en la interfaz gráfica correspondiente. Además, se implementó el transmisor UART, que es común en ambos sistemas, así como la lógica de reloj y anti-rebotes, que habilitan la interacción manual con el sistema además de la interacción desde el computador. 5.1. Descripción Funcional El sistema consiste de un dispositivo de hardware, en la forma de una tarjeta FPGA, a la cual se le programa uno de los proyectos MIPS y luego se conecta a un computador vía puerto serial. En éste, se ejecuta la interfaz gráfica correspondiente y se verifica la configuración del puerto serial de manera que la tarjeta FPGA esté conectada al puerto seleccionado en la interfaz gráfica. 31 Figura 11. Sistemas de Procesadores Didácticos – Esquema General Al iniciar el funcionamiento del sistema, se activa la ejecución de instrucciones en la interfaz gráfica de usuario y comienza la recepción de información, que es presentada en la ésta. Mediante el uso de los controles en la interfaz gráfica, es posible acelerar y reducir la velocidad de ejecución, además de poder detener y reanudar la ejecución totalmente. Para reiniciar desde el principio la operación del sistema, es necesario pulsar un botón en la tarjeta de desarrollo, mientras el reloj de operación del procesador está en funcionamiento. Esto ocasiona que todos los registros de funcionamiento, así como la lógica de control del sistema regresen a un estado inicial de funcionamiento, similar a cuando éste se inicia por primera vez. Se debe tomar en consideración que el procedimiento para programar alguno de los proyectos en la tarjeta FPGA es independiente de la operación del sistema, utiliza la interfaz JTAG (Joint Test Action Group – Grupo de Acción de Pruebas en Conjunto) que puede usar la interfaz de puerto paralelo o de puerto USB (Universal Serial Bus – Bus Serial Universal) y el sistema sale de operación cuando se realiza la programación. Se recomienda que se detenga la operación previamente, de manera que no se detenga el funcionamiento de la interfaz gráfica de usuario con errores. Entre las capacidades de los sistemas tenemos: • Monitoreo del funcionamiento del CPU. • Variación de la velocidad de ejecución de las instrucciones. • Posibilidad de detener y reanudar la ejecución. • Restablecimiento del sistema a un estado inicial presionando un botón en la tarjeta de desarrollo. 32 • Activación de un (1) ciclo de reloj del procesador mediante accionamiento de un botón en la tarjeta de desarrollo. • Operación asíncrona del CPU y el resto de la lógica del sistema. Las limitantes de los sistemas son: • El código a ejecutar debe ser modificado en la fuente VHDL de la unidad funcional IFETCH en formato hexadecimal. • El sistema no puede ser restablecido desde la interfaz gráfica de usuario. • No cuenta con la posibilidad de controlar la ejecución de forma dependiente de las instrucciones, como ejecutar hasta la instrucción N, o ejecutar sólo N instrucciones. • El funcionamiento sin la interfaz gráfica de usuario se limita al monitoreo del puerto serial mediante programas terminales, como RealTerm o HyperTerminal. • La automatización de la ejecución depende de la automatización del envío de las señales de control correspondientes por puerto serial, no existe automatización sin su uso. 5.2. Elementos Comunes En primera aproximación, ambos sistemas requieren de los mismos elementos generales, que son la tarjeta de desarrollo FPGA basada en un chip Spartan3 y de un computador que cuente con una interfaz serial RS-232 UART. El computador debe exceder, como mínimo, las especificaciones mínimas necesarias para la ejecución del ambiente de desarrollo National Instruments LabVIEW, de manera que sea posible ejecutar en ella las herramientas VI desarrolladas como GUI (Graphical User Interface – Interfaz Gráfica de Usuario) para su uso con su sistema correspondiente. El software GUI en cuestión, es diferente para cada sistema por lo cual será desarrollado en la sección correspondiente. La tarjeta de desarrollo Digilent Spartan3-1000 es uno de los modelos de una familia de tarjetas que comercializa la dicha empresa. Los recursos disponibles en ésta son varios, pero los que nos interesan debido a su uso dentro del proyecto son: interfaz serial RS-232 UART, 33 oscilador integrado, indicadores LED y switches de botón. El dispositivo FPGA integrado en esta tarjeta es un Xilinx Spartan-3 modelo XC3S1000-FT256, que cuenta con un millón de compuertas para la implementación de diseños diseños.. Aún así, el diseño más complejo no excede el 21% de utilización de las compuertas disponibles para el diseño, lo cual se traduce a 41096 compuertas equivalentes para la implementación del diseño. Dado que las tarjetas de desarrollo disponibles para los estudiante estudiantess cuentan con menores recursos, se revisó la posibilidad de implementar el diseño que más recursos necesita, en uno de los chips disponibles para los estudiantes, y se encontró que el diseño cabe mediante el uso de optimizaciones de área al sistema. Figura 12. Reporte de Implementación en el modelo disponibl disponiblee para los estudiantes Los elementos que constituyen el diseño de cada sistema pueden ser enumerados como el Módulo UART, la Lógica Anti-Rebotes, la Lógica de Reloj, el CPU MIPS y la lógica de Control y Monitoreo del CPU. Para ambos sistemas, los primeros 3 elementos son comunes, por lo cual se describen a continuación. 34 5.2.1. Módulo UART Consiste en un módulo que se encarga de tomar los datos en forma de bytes que recibe de la lógica del sistema, y los envía vía comunicación serial a cualquier dispositivo que pueda recibirlos. El módulo cuenta con 4 entradas y 4 salidas, que podemos enumerar como 2 pines de transmisión/recepción, dos pines de estado del puerto UART y los puertos de entrada/salida de datos, que son de tamaño 8-bit. Completan las entradas el pin de entrada de reloj del módulo y finalmente la señal de control de transmisión de datos, que debe estar en nivel activo para que éstos se transmitan. Internamente, se cuenta con una memoria de transmisión (buffer) ordenada 16x8, por lo cual se cuenta con 16 bytes de almacenamiento para el envío o recepción de información. Este buffer opera bajo la modalidad FIFO (First-in First-Out – Primero en llegar, primero en salir), también conocido como cola, por lo cual los datos no pierden su secuencia al entrar o salir del mismo. Él opera usando la frecuencia del oscilador de la tarjeta, es decir 50MHz, a partir de la cual deriva su velocidad de transmisión de 115200bps. Además, la transmisión está configurada como 8-bit de datos, sin paridad y 1-bit de parada, por lo cual alcanzamos una tasa efectiva de transmisión de datos de 11520 bytes por segundo, tomando aproximadamente 86,81µs para enviar 1 byte. Como herramienta de diagnostico, durante el desarrollo y depuración de los sistemas, se empleó la señal de estado del UART que indica problemas de transmisión por saturación de la memoria, en un indicador LED de la tarjeta de desarrollo, de forma que fuese posible descartar la conexión serial como la fuente de problemas en los mismos. La señal de estado que indica presencia de datos recibidos por el módulo serial se dejó sin conectar, ya que no aportaba mayor funcionalidad. 5.2.2. Lógica Anti-Rebotes Consiste en dos estructuras idénticas, que miden la duración, en ciclos del reloj interno del sistema, que la señal conectada a su entrada mantiene un nivel lógico determinado, en este caso nivel alto, para corroborar que no es un rebote sino una transición válida. 35 Dado que existen 2 señales que pueden ser accionadas mediante el uso de un switch de la tarjeta de desarrollo, cada un unaa de éstas está conectada a la lógica, de manera que se le eliminen los rebotes mecánicos. Dado que el reloj interno tiene un periodo bastante corto, de 20ns, se modificó la lógica de manera que el periodo de muestreo fuese más cercano al orden de tiempo en el cual ocurren los rebotes, establecido alrededor de 20µs. Este tiempo se tomó debido a que, aunque sigue siendo más rápido que los reflejos de los seres humanos, permite corregir el problema del rebote de los switches. 5.2.3. Lógica de Reloj El sistema cuenta internamente con dos (2) señales de reloj que alimentan las unidades que lo componen. Internamente, se cuenta con un oscilador que genera una señal de 50MHz, que se utiliza para toda la lógica excepto el CPU, cuya señal de reloj se genera a partir de lógica combinatoria. La señal de reloj del CPU se origina de una compuerta OR, que puede ser activada desde un switch de la tarjeta FPGA, o desde la interfaz gráfica de usuario mediante una trama de reloj del CPU. Para accionar el reloj del CPU desde la GUI, el procedimiento comienza en la tarjeta en el momento que recibe una trama de control. Este byte se envía a una unidad que lo decodifica, y en caso que ésta así lo indique, activa o desactiva la señal de reloj del CPU, que se conecta a la compuerta OR. Las tramas empleadas para ésta operación se presentan a continuación: Figura 13. Tramas de Reloj utilizadas en los Sistemas MIPS 36 La generación por switch consiste principalmente de una señal, que se activa al accionarlo. Esta señal llega a la lógica anti-rebotes, y de ser válida, continúa a la compuerta OR, para luego activar el CPU. 5.3. Sistema MIPS-SingleCycle Este sistema implementa el procesador MIPS simplificado, convertido de fuente totalmente codificada a fuente esquemática, cuya operación está controlada por una máquina de estados que realiza los procedimientos necesarios para la inicialización del CPU, así como las tareas de monitoreo de las variables que serán enviadas a la aplicación GUI en el computador vía la lógica de comunicaciones. Figura 14. Esquema general de hardware: Sistema MIPS-SingleCycle Este sistema incluye todos los elementos compartidos ya descritos en el presente capitulo, y sus elementos diferenciadores, tanto en hardware como en software, son: el CPU, la lógica de control, y la aplicación VI correspondiente. 5.3.1. CPU MIPS Es una implementación simplificada de la arquitectura MIPS, en la cual, las unidades funcionales se encuentran ag agrupadas rupadas por las etapas que existen para la ejecución de instrucciones dentro de la arquitectura. Éste funciona en una modalidad, en la cual las instrucciones se ejecutan todas en 1 ciclo del reloj, por lo cual se le denomina SingleCycle. Fue desarrollado een n el Georgia Institute of Technology como parte del curso 37 de Arquitectura del Computador y Sistemas Operativos dictado por el Prof. Hsien-Hsin Lee. El enfoque de las asignaciones de laboratorio de este curso es el manejo de la herramienta ModelSim, para me mediante diante programación VHDL realizar simulaciones de la arquitectura MIPS. Dado que el enfoque de éste proyecto es la implementación en físico, con énfasis en la operación de hardware por encima de la simulación, fue necesario realizar modificaciones en las fuentes originales, y así lograr el desarrollo deseado. La idea fue, convertir las estructuras del MIPS, tal que el CPU funcionase de forma esquemática. Así, sería posible manejar más simplemente las unidades funcionales, y permite una representación gráfica de éste al momento de manejar las fuentes. Además, para los estudiantes es más natural y accesible el manejo de esquemáticos que el manejo de código para representar hardware. Primeramente, se tomó el código original y se separó, de manera que pudiese generarse un esquemático, lo cual conllevó la creación de otras unidades para preservar en lo posible las unidades funcionales, sin modificar la estructura general de las mismas. El trabajar el CPU de forma esquemática no es un requisito del proyecto, pero se consideró un valor agregado al mismo, aportando al objetivo de utilizarlo como herramienta didáctica por las razones antes expuestas. Figura 15. Esquemático: CPU MIPS-SingleCycle En general, el CPU cuenta con 2 entradas y 10 salidas como unidad monolítica, y está compuesto por 8 unidades funcionales, cuyo esquemático puede ser estudiado con mayor 38 detalle en el Apéndice 1. Este maneja 3 tipos de instrucciones: Lógico-Aritméticas, que trabajan sobre el contenido de 2 registros y cuyo resultado se escribe nuevamente a un registro; de Referencia a Memoria, que leen o escriben a la memoria de datos; y las Ramificaciones consisten en un salto en la continuidad del programa si las condiciones de igualdad se cumplen. A continuación se describen las unidades funcionales, tanto originales como agregadas. 5.3.1.1. IFETCH La unidad IFETCH encierra la primera etapa de la ejecución de una instrucción en la arquitectura MIPS, que consiste en buscar una instrucción para que sea ejecutada. Las instrucciones se almacenan en una memoria de instrucciones, y ésta se direcciona mediante un contador, que se incrementa para progresar por la secuencia de instrucciones de un programa. Esta unidad cuenta con 5 entradas y 3 salidas, de las cuales 2 son salidas también de la unidad monolítica del CPU. En ésta se engloba la memoria de instrucciones y la lógica de PC (Program Counter – Contador de Programa) que permite la progresión por el programa que se encuentra dentro de la memoria de instrucciones, así como el manejo de saltos o ramificaciones en el mismo. Durante su operación, el sistema toma el PC para extraer de la memoria la instrucción correspondiente, lo incrementa y verifica la existencia de las condiciones para una ramificación o salto en la continuidad del programa. En caso de haber un salto, el próximo PC a decodificar no será el previamente incrementado, sino uno recibido por ésta unidad a partir de un cálculo externo. De esta unidad se monitorean, externas al CPU, tanto la instrucción buscada, que es una señal de 32-bit (4-byte), y la dirección de PC actual, que es una señal de 10-bit. Además, esta unidad también envía la dirección del próximo PC, que es la adición de PC+4 direcciones. De esta manera, esta señal se puede utilizar en la etapa correspondiente para el cálculo de la dirección de salto. 39 5.3.1.2. IDECODE La unidad IDECODE representa la etapa en la cual se toma la instrucción buscada por IFETCH, y se le decodifica, dependiendo de su tipo, para permitir la lectura y escritura de los registros indicados, o para generar la extensión de signo necesaria para calcular una dirección de memoria. Ésta cuenta con 8 entradas y 3 salidas, de las cuales 2 son monitoreadas fuera del CPU. En ella encontramos la página de 32 registros del CPU, y se encarga de colocar a su salida los datos de aquellos que se vean involucrados y la extensión de signo. Internamente, se maneja la escritura a registro tal que, en caso de haber una lectura de un dato desde la RAM, o de haber una operación, el resultado se almacene donde corresponde. Encontramos en esta unidad un diseño que permite que, durante un ciclo, las operaciones de escritura a la página de registros tengan precedencia sobre la lectura, permitiendo trabajar sobre el resultado más actualizado. Las señales de salida son los datos de los registros que solicite la instrucción, que son monitoreados externamente al CPU, y la extensión de signo calculada por la unidad, señales todas de 4-bytes (32-bit). Cabe destacar que el valor inicial de cada registro es su número de identificación, por lo cual el contenido del registro 1 es 1, del registro 2 es 2, etc. Es importante recordar que el registro 0 es un 0 forzoso, como lo indica la arquitectura MIPS, y no puede ser modificado. 5.3.1.3. EXECUTE La unidad EXECUTE representa la etapa en la cual se realizan las operaciones del procesador, así como el cálculo de la dirección de memoria RAM y de la dirección de PC necesaria en caso de haber un salto en la continuidad de la ejecución del programa, en la forma de una ramificación. Esta unidad cuenta con 9 entradas y 3 salidas, de las cuales 2 están monitoreadas externamente del módulo monolítico del CPU. Dentro de ésta, encontramos 2 unidades aritméticas, un sumador y una ALU, entre las cuales se manejan las operaciones lógicas y aritméticas del CPU. 40 El sumador se encarga de las adiciones necesarias para el cálculo de las direcciones correspondientes a una ramificación, enviando el resultado a la unidad IFETCH donde se resuelve finalmente la existencia o no del salto de continuidad del programa. La ALU se encarga de realizar las operaciones de suma, resta, AND lógico y OR lógico sobre los datos que la instrucción indique. Internamente, dependiendo de la activación o no de ciertas señales de control, se seleccionan los datos sobre los cuales opera la ALU, bien sea para generar una dirección de memoria, o para realizar una operación sobre éstos. A la salida de esta unidad encontramos el resultado del sumador, el resultado de la operación de la ALU, y una bandera que se activa cuando el resultado de la operación es cero, siendo estas últimas las señales monitoreadas externamente. 5.3.1.4. DMEMORY La unidad DMEMORY cumple la función de la memoria de datos a la cual acede el CPU. En ella, se almacenan datos con los cuales trabaja el procesador, y representa un medio de almacenamiento de mayor capacidad, y menor velocidad de acceso, que los registros. Para nuestro sistema en particular, esta unidad no representa realmente mayor capacidad con respecto a la que ofrecen los registros, pero si representa un medio de almacenamiento de menor velocidad de acceso. Esta unidad cuenta con 6 entradas y 1 salida. Implementa internamente una memoria RAM (Random Access Memory – Memoria de Acceso Aleatorio) distribuida como 32x8-bit, que implica en 32 bytes de capacidad, permitiendo almacenar 8 palabras de 32-bit (8x4 bytes). Dado que el MIPS no permite maneja direcciones de memoria en las instrucciones, éste las calcula basado en el contenido de un registro al cual se le suma un valor inmediato. Durante su operación, se activan las banderas de lectura o escritura, seguidamente la unidad, empleando la dirección que recibe, pasa a extraer o escribir la palabra de 4 bytes correspondientes a la dirección. Cabe destacar, que para la extracción de palabras de la RAM, existe un retardo desde el ciclo en que se acciona para la lectura y disponibilidad de los datos a la salida de la unidad, que es aproximadamente el flanco de bajada del siguiente ciclo del reloj al cual se solicitó. 41 La señal de salida de la unidad son los datos leídos de la RAM. En caso de haber una escritura, no se modifica la salida de la unidad, por lo cual se mantiene la última señal. De esta unidad solo se monitorea la información que se le escribe, que procede de la ALU. 5.3.1.5. CONTROL La unidad CONTROL genera las señales que permiten el funcionamiento correcto del CPU, indicando efectivamente a las unidades funcionales que tareas deben realizar para que la instrucción presente se ejecute sin problemas. Esta unidad posee 3 entradas y 8 salidas, de las cuales se monitorean 3 señales externamente al CPU monolítico. Encontramos que se generan las banderas de control de las otras unidades, y estas se generan a partir de los 6-bit más significativos de la instrucción. Durante su operación, se generan las señales de control de IDECODE, EXECUTE y MEMORY, junto con la señal de salto, que junto con la señal cero, se utilizan para determinar si existe o no un salto en la continuidad de la ejecución del programa. Dependiendo del tipo de instrucción, se activan las lecturas de memoria, la escritura de registros, los destinos de los datos y controla parte de la operación de EXECUTE. Las señales de salida son principalmente binarias, y se monitorean las que indican escritura de registro, escritura de memoria y ramificación de la ejecución de instrucciones. Las señales no monitoreadas son las que controlan el registro de destino para la escritura, la fuente de la una de las entradas de la ALU, la bandera que indica una operación de memoria a registro, la bandera que activa la lectura desde RAM, y el operando de 2-bit para la ALU. 5.3.1.6. Decodificador de Instrucción Esta unidad fue agregada para proveer a las unidades CONTROL y EXECUTE con las partes de la instrucción que requieren sin necesidad de modificar los puertos de entrada de las estas. Cuenta con 1 entrada y 2 salidas. 42 Durante su operación, de la entrada que es la instrucción, separa los bits que necesita cada unidad, que son los 6-bit más significativos para CONTROL, y los 6-bit menos significativos para EXECUTE. Esta unidad no tiene monitoreo, ya que fue agregada al diseño para facilitar la implementación esquemática del CPU con un mínimo de modificaciones a las unidades principales. 5.3.1.7. Decodificador de Dirección de RAM Esta unidad básicamente se encarga de decodificar la dirección a la cual se va a leer o escribir en la RAM. Ésta se realiza a partir de la señal de salida de la ALU, y fue necesaria para no modificar las fuentes de las otras unidades funcionales y lograr la implementación esquemática del CPU. Cuenta con 1 entrada y 1 salida, y sus señales no se monitorean externamente. 5.3.1.8. Separador de Bus de Datos a la RAM Esta unidad cuenta con 1 entrada y 1 salida, y solo cumple la función de separar el bus de entrada de los datos a ser escritos en la RAM, de manera que pueda ser monitoreado por separado de su señal de origen, que es la salida de datos del segundo registro de la unidad IDECODE. Esta unidad se agregó para hacer posible la implementación esquemática del CPU con las mismas señales de monitoreo que se encuentran en las fuentes originales. 5.3.2. Lógica de Control y Monitoreo del CPU Esta unidad consiste en una máquina de estados, que se encarga del monitoreo de las señales extraídas del CPU, así como de manejar el restablecimiento y la inicialización del CPU para su operación correcta. Encontramos 13 entradas y 3 salidas en esta unidad, de las cuales 10 son las señales monitoreadas del CPU (174-bit) y las otras 3 son el reloj interno del FPGA, el reloj generado para el CPU y la señal de restablecimiento (reset) del sistema. 43 Figura 16. Diagrama de Estados Lógica de Control y Monitoreo – Sistema MIPS - SingleCycle El funcionamiento de la máquina de estados, cuyo diagrama puede ser consultado en detalle en el Apéndice 2, trabaja como un monitor de alta velocidad. La frecuencia de operación es de 50MHz, y verifica las señales de salida y el reloj del CPU, de manera que los datos que se lean sean los correspondientes al ciclo monitoreado. Una vez leídos los datos, estos se estructuran en una trama, que puede verse en la Figura 16, que seguidamente se envía al módulo UART. Para este envío, se implemento un retardo para cada byte generado por la unidad de control, que inicialmente se calculó en aproximadamente 70µs. Ante un cálculo posterior, tomando en cuenta el comportamiento de la unidad UART bajo la configuración actual, se encontró que por cada byte enviado se envían 10-bit, 1-bit de inicio, 8-bit de datos y 1-bit de parada, por lo cual, el retardo por byt bytee no puede ser calculado en base a los bits que componen un dato, sino como los bits que debe enviar el sistema para enviarlo, y se modificó el retardo para cumplir con este nuevo valor, que es aproximadamente 87µs. 44 Figura 17. Trama de Envío de Datos – Sistema MIPS-SingleCycle La secuencia de inicialización del procesador comienza tan pronto como se inicia señal del reloj del CPU. Entonces, la unidad de control envía una señal de reset al CPU, ya que éste necesita que esta señal se cicle para operar correctamente. En el siguiente ciclo, se desactiva la señal de reset y comienza el monitoreo de las variables del CPU. Esto puede ser visto en detalle en las simulaciones de ejecución del sistema. Figura 18. Simulación MIPS-SingleCycle: Procedimiento de Inicialización Una vez culmina la inicialización del CPU, esta unidad comienza el procedimiento de monitoreo de los datos para su posterior envío. En primera instancia, se espera que exista un nivel lógico alto, momento en el cual la máquina de est estados ados cambiará al siguiente. Una vez comprobado el reloj en alto, la máquina de estados espera al flanco de bajada del reloj, tal que los datos que estén disponibles a la salida del CPU sean actuales actuales.. Seguidamente, el sistema inicia una secuencia de estados en la cual, para todos los bytes que debe enviar, primero 45 verifica que la unidad esta activa, comparando los valores leídos del CPU con los almacenados, operación que se realiza para enviar una señal que indique la actividad de la unidad. Una vez verificado esto, se inicia la transmisión de los datos recibidos, byte a byte, con el retardo especificado anteriormente para cada uno de ellos. Los datos de cada unidad se envían por separado, y para cada una de ellas deben repetir el procedimiento de verificación de actividad. Además, todos los estados verifican que la señal de reloj no ha cambiado del nivel lógico bajo, y en caso contrario regresan al estado de espera por flanco de bajada. Para controlar el envío de cada dato, se cuenta con una señal que activa o desactiva la transmisión del módulo UART. De esta manera, es posible dosificar el flujo de datos tal que se eviten problemas de saturación de la interfaz serial. 5.3.3. Aplicación GUI VI La aplicación de la interfaz gráfica de usuario para el modelo MIPS-SingleCycle, consiste en un sistema de transmisión y recepción de datos por puerto serial, desarrollada a partir de un ejemplo avanzado contenido entre el material de entrenamiento del ambiente de programación LabVIEW. Figura 19. Interfaz Gráfica de Usuario – MIPS-SingleCycle 46 En esta, se pueden configurar todos los parámetros del puerto, y es posible controlar el periodo de operación del CPU, así como detenerlo completamente. La interfaz muestra, de manera muy simple, el contenido de cada una de las variables monitoreadas del CPU, así como el estado de actividad o inactividad de las unidades funcionales. Además, se muestra el número total de bytes recibidos desde el dispositivo, y la trama completa, como medida de comprobación de los datos observados. Internamente, el VI recibe los 48 bytes de la trama y los decodifica, de manera que recupera los datos de ésta y los organiza para ser obser observados vados en la GUI. Seguidamente, se encarga de formatear los datos, de manera que lo que se muestre al usuario sea en formato hexadecimal. 5.4. Sistema MIPS-Pipelined El desarrollo del sistema Pipelined se origino a partir de la revisión de la literatura de la arquitectura MIPS. En ésta, se encontró que la implementación del sistema MIPSSingleCycle podía ser desarrollada para obtener un procesador con cauce segmentado así como con optimizaciones de operación. Figura 20. Esquema general de hardware: Sistema MIPS-Pipelined El trabajo sobre el sistema MIPS-SingleCycle se enfocó en la implementación de las modificaciones contenidas en la literatura (Véase [19]) dentro de la implementación 47 esquemática que se realizó en el primer sistema. Como resultado, fue necesario agregar lógica al CPU, así como la modificación de las fuentes originales para acomodar las nuevas señales del modelo Pipelined. Cabe destacar que las optimizaciones que se le realizaron al sistema, solo incluyen el forwarding de datos, ya que la operación con cauce segmentado dicta que se incluya una unidad de detección de problemas en éste, que se encarga de introducir las burbujas entre las instrucciones para su correcta ejecución. El esquemático de este sistema completo puede ser consultado en el Apéndice 1. El enfoque de esta sección serán las modificaciones realizadas al sistema para obtener el modelo Pipelined con forwarding. Se revisarán las modificaciones realizadas a las unidades existentes, y se observaran por completo las nuevas unidades añadidas al sistema para lograr la funcionalidad deseada. Además, se simplificó la Lógica de Control y Monitoreo de Datos, dado que ésta unidad ya no debe hacer tantas comprobaciones sobre los datos monitoreados, y se encarga más de la estructuración y codificación de la trama de comunicación con la aplicación VI. En el campo de software, la aplicación debió ser modificada acordemente para acomodar los cambios que se realizaron al par CPU-Lógica de Control, además del incremento en la cantidad de datos que se envían desde el sistema a la interfaz gráfica de usuario. 5.4.1. CPU MIPS Pipelined A un procesador se le llama Pipelined cuando sus unidades funcionales son capaces de trabajar de forma independiente entre sí. De esta manera, es posible implementar otras optimizaciones al sistema como un todo y permite mejorar el desempeño de éste, así como permitir la implementación de mejoras internas al mismo desde el punto de vista de sus capacidades. La principal característica de un procesador Pipelined es el cauce segmentado, que no es más que la separación de sus unidades funcionales, reduciendo la cantidad de trabajo que éste realiza por ciclo, pero buscando que en general el procesador tenga mejor rendimiento debido a la capacidad de mantener más instrucciones trabajando al mismo tiempo. Al reducir la 48 cantidad trabajo por ciclo del CPU podría argumentarse que se reduce el desempeño del sistema, pero esto permite aumentar la frecuen frecuencia cia de operación del procesador y el flujo de trabajo por el mismo, por lo cual el rendimiento aumenta. Figura 21. Esquemático: CPU MIPS - Pipelined El CPU Pipelined monolítico cuenta con 2 entradas y 33 salidas, totalizando 709-bit de datos que se envían a la Lógica de Control y Monitoreo. El incremento de la cantidad de información que se envía tiene por objetivo permitir una observación más detallada del comportamiento de éste. Para la evolución a modo Pipelined del sistema MIPS-SingleCycle, fue necesario modificar las unidades funcionales de manera que pudiesen aceptar las nuevas señales de control. Además, se agregaron nuevas unidades que son necesarias para la implementación del cauce segmentado y se eliminó una unidad, ya que los caminos de dato datoss quedan naturalmente separados y la función de ésta era separarlos para permitir el monitoreo separado de la información de tal señal. En total, se agregaron 7 estructura estructurass al diseño, se modificaron 6 de las existentes y se eliminó una. En general, el funcionamiento del procesador como un todo puede describirse como una secuencia de tareas que realizan 5 estructuras, mientras que las demás se encargan de dirigir el producto de dichas tareas de manera efectiva entre ellas, tal que no interfieran gravemente en el desenvolvimiento de las de las otras estructuras. Idealmente, en cada ciclo las 49 estructuras deben hacer disponible el producto de sus tareas, así como tomar los insumos para llevar a cabo sus tareas en el presente ciclo. Debido a que los sistemas reales distan del comportamiento ideal, las unidades funcionales no siempre son capaces de llevar a cabo sus tareas en el transcurso de sólo 1 ciclo del reloj, por lo cual es necesario que existan estructuras de control que permitan a las primeras culminar sus operaciones sin interferir en el funcionamiento del CPU como un todo. Seguidamente, se presentan las unidades que fueron modificadas para la implementación del sistema Pipelined, seguidas de las unidades nuevas que fueron agregadas para lograr la funcionalidad deseada. El dibujo esquemático de la implementación de este sistema puede ser consultado en el Apéndice 1. 5.4.1.1. IFETCH Esta unidad fue modificada para permitir el envío de parte de la instrucción ya decodificada, de manera que la HDU (Hazard Detection Unit – Unidad Detectora de Atascos) pudiese leer los operandos directamente desde esta unidad. Además, se agrego una entrada a la unidad para detener el avance del programa como parte del control necesario para el funcionamiento adecuado del cauce segmentado (pipeline). Internamente, se modifico la estructura de la unidad para habilitar la funcionalidad necesaria por parte de las nuevas señales que se manejan. De interés es la señal de control de avance del PC, ya que internamente se evita que éste se actualice, de manera que las operaciones de búsqueda de instrucción se realizan sobre la misma dirección, así como los cálculos subsiguientes que se realizan al PC no se actualizan, obteniendo en la práctica una “parada” de la unidad, sin restablecerla a su estado inicial. 5.4.1.2. IDECODE Sobre esta unidad se realizaron considerables cambios en términos de las entradas y salidas. En término de entradas se eliminaron 2, se agregó una y se modificó una de las existentes, llevando el número a 7 en total. Con respecto a las salidas, se agrego una, debido a que, dada la naturaleza del pipeline, una función que realizaba internamente ésta unidad pasó a ser manejada de manera externa. 50 Las entradas eliminadas fueron primordialmente las señales de control de la escritura de manejo de memora, así como las entradas redundantes, ya que por el desarrollo del pipeline, esta unidad no necesita la señal de manejo de memoria. Por otra parte, se combinaron las entradas de datos para escritura a registros por 1 sola entrada, además de agregarse un puerto para recibir la dirección de escritura y la señal de control que la habilita. Las modificaciones al comportamiento interno de esta unidad radican principalmente en la adecuación del manejo de la escritura a la página de registros, así como el envío de la dirección de escritura. Además, se eliminaron las referencias a la señal de control que fue removida de esta unidad, junto con la correspondiente modificación de la lógica que era controlada por ésta, simplificando la escritura a los registros. 5.4.1.3. EXECUTE Esta unidad se modificó para acomodar las optimizaciones de desempeño contenidas en el concepto de forwarding. En general, vio incrementada sus entradas, pasando a ser 13 en total, y sus salidas no sufrieron cambios con respecto al sistema MIPSSingleCycle. Las entradas incluyen tanto nuevas señales de control como entradas de datos, muchos de los cuales representan la misma ubicación, pero en diferentes etapas de la ejecución. Internamente, se modificó el comportamiento de las entradas de la ALU, ya que la optimización de Forwarding dicta que estas deban ser capaces de recibir datos de unidades que se encuentren más adelante en la ejecución de las instrucciones, así como los datos provenientes de las unidades precedentes. En detalle, dependiendo de las señales que controlan la fuente de los datos de la ALU, generadas en la FU (Forwarding Unit – Unidad de Forwarding), se seleccionan los datos sobre los cuales se realizarán las operaciones. Esta unidad no recibió modificaciones en la operación interna de la ALU o del sumador, por lo cual su funcionalidad, así como la salida de datos de la unidad completa no cambia respecto al sistema MIPS-SingleCycle. 51 5.4.1.4. CONTROL La unidad de control recibió pequeñas modificaciones para acomodar los elementos necesarios para un correcto funcionamiento del MIPS-Pipelined. Se le agregó una señal de entrada nueva, de manera que se adecúe a la introducción de burbujas en la ejecución de instrucciones. Esta señal es generada por la unidad HDU, y es necesaria para mantener la sincronía de las instrucciones por todo el pipeline. Internamente, la señal ocasiona que la unidad de control genere una operación nula, denominada nop, de manera que no se modifique el contenido de los registros ni el contenido de la memoria RAM. La otra modificación importante de la unidad radica en la decisión de monitorear todas sus señales, desde que se originan y a medida que van avanzando por el camino de datos del CPU. 5.4.1.5. Decodificador de Instrucción Se extendió el trabajo decodificador, ya que hace disponible las direcciones de los registros de la instrucción que se encuentra en la etapa de decodificación, de manera que puedan ser monitoreados por la Lógica de Control y Monitoreo. 5.4.1.6. Decodificador de dirección de RAM Esta unidad ahora permite también ejecutar la optimización de forwarding a la unidad DMEMORY sin hacer grandes modificaciones a ésta. Internamente, dependiendo de la señal de forwarding se decide qué dato es el que se escribe a la RAM. La función de decodificación de la dirección de memoria no se modificó. 5.4.1.7. WRITEBACK Esta unidad se agregó al sistema de acuerdo con la teoría a pesar que no se le considera una etapa per sé. Cuenta con 3 entradas y 1 salida, y se encarga de seleccionar el dato que va a ser escrito en la página de registros en la unidad IDECODE. 52 Internamente, la unidad recibe tanto el resultado de la ALU como el dato leído de la RAM, y dependiendo de una señal de control, selecciona uno u otro dato y lo hace disponible a la unidad IDECODE. De esta manera, la selección que antes se realizaba internamente ahora se realiza sin colisionar con la sincronía de la ejecución de la instrucción por el pipeline. 5.4.1.8. Registros del Cauce Segmentado Representan el grueso del trabajo necesario para la implementación del pipelining, y son registros que se encargan de mantener la información entre las unidades funcionales de manera que esté disponible en el siguiente ciclo de reloj para la próxima etapa del Pipeline. En el diseño encontramos 4 registros de pipeline, que separan las unidades IFETCH, IDECODE, EXECUTE, DMEMORY y WRITEBACK. La intención es, dado que cada unidad toma un ciclo de reloj en realizar su trabajo, mantener el resultado ésta para que esté disponible para la siguiente. De esta manera, es posible que existan varias instrucciones al mismo tiempo siendo ejecutadas por el procesador. Por diseño, se decidió que el contenido entero de los registros del pipeline sea monitoreado, por lo cual estas unidades cuentan con una salida especial, que se envía fuera del CPU, por donde los datos salen ya formateados para su envío a la en la trama al GUI en el computador. Además, se envía la instrucción por todo el pipeline, por lo cual todos los registros tienen internamente la instrucción que origino las otras señales que éstos almacenan, como una manera de observar más fácilmente la existencia de más de una instrucción en ejecución al mismo tiempo dentro del CPU. 5.4.1.9. Unidad de Detección de Atascos (Hazard Detection Unit) Esta unidad se encarga de manejar el comportamiento de las estructuras del CPU de manera que se puedan resolver problemas de sincronía en el Pipeline, dadas las asimetrías de las unidades funcionales en el tiempo que les pueda tomar el llevar a cabo sus tareas. Cuenta con 7 entradas y 4 salidas, y maneja principalmente señales de control. 53 Internamente, se revisa el tipo de instrucción que busca la unidad IFETCH, así como los valores de las señales de control para el acceso a memoria cuando están por el registro de Pipeline ID_EX, y las direcciones de los registros que se ven involucrados en las instrucciones que se encuentran en las primeras etapas de su ejecución. De esta manera, es posible detener a ciertas unidades del pipeline, y efectivamente congelar la ejecución del CPU, permitiéndole a las unidades más lentas culminar su labor y a todo el sistema mantener la sincronía del pipeline. De no implementarse las burbujas en el pipeline, no sería posible la operación del CPU Pipelined, dado que los datos no estarían sincronizados entre las unidades funcionales y las instrucciones serían imposibles de ejecutar correctamente. 5.4.1.10. Unidad de Forwarding (Forwarding Unit) La unidad de forwarding se encarga de monitorear el comportamiento del Pipeline, con énfasis en las etapas de ejecución y memoria de datos (EXECUTE y DMEMORY). Dependiendo del cumplimiento de ciertas condiciones, como son la realización de operaciones sobre registros que en la instrucción inmediata anterior se les modificó, así como la modificación de un valor en memoria RAM de forma repetida, permite que las unidades mencionadas anteriormente utilicen como datos de entrada la información más reciente disponible, usualmente contenida en uno de los registros del Pipeline. Esta unidad cuenta con 10 entradas y 3 salidas, su función es implementar una optimización de rendimiento que permite acelerar ciertas operaciones que utilizan las unidades EXECUTE y DMEMORY. Sin la optimización de forwarding, el CPU debe implementar burbujas (stalls), es decir congelar la operación de las instrucciones durante muchos ciclos tal que, tanto la ALU como la RAM trabajen sobre el conjunto de datos correcto. Esta optimización permite que dichas unidades puedan tomar la data correcta de las etapas de ejecución posteriores, de manera que se evite mantener la ejecución paralizada por un gran número de ciclos. Dado que esta unidad también se presenta como una unidad de control, todas sus salidas se monitorean externamente al CPU monolítico. 54 5.4.2. Lógica de Control y Monitoreo del CPU Pipelined Las modificaciones que fueron implementadas a esta unidad se fundamentan principalmente en su adecuación para manejar las modificaciones que se le realizaron al CPU con su conversión a Pipelined. Para comenzar, el número de entradas se extendió a un total de 36. El número de salidas no requirió modificación, así como la rutina de inicialización del CPU, ya que la versión Pipelined no cambió los requerimientos de dicho procedimiento. Figura 22. Diagrama de Estados de Lógica de Control y Monitoreo – Sistema MIPS-Pipelined En general la unidad se simplificó, dado que se manejan en total 709 709--bit brutos de datos, que al darles formato y adecuarlos para el envío se convierten en 712-bit de datos formateados, lo que equivale a 89-bytes de información. El razonamiento detrás de la simplificación de la unidad reside en reducir el presupuesto de compuertas dedicadas a este componente, ya que el paso de almacenaje consume un número considerable de recursos y no aporta ventajas competitivas, dado que en este caso se envían más datos desde el CPU. Una vez que la unidad prepara la trama, se envían 98-bytes a la 55 aplicación del computador. La trama que se envía a la aplicación se puede observar en la Figura 23. Figura 23. Trama de Envío de Datos – Sistema MIPS-Pipelined Durante la operación de esta unidad, el primer paso que se realiza es la inicialización del CPU, de la misma manera como fue descrito en la sección del Sistema MIPS-SingleCycle. Seguidamente, la máquina de estados monitorea el reloj del CP CPU, U, de manera que comience el procedimiento de estructuración y envío de los datos una vez que éstos sean válidos para el ciclo presente. Cumplida esta condición, se inicia el proceso de estructuración de los datos, de manera que estos estén adecuados para su envío por el puerto serial. Mucha de esta adecuación consiste en agrupar las señales de control como bytes, codificando “bytes de control” que luego son decodificados en la aplicación GUI VI. Originalmente, se realizaba una verificación de la actividad de una unidad comparando el dato leído del CPU con los almacenados internamente para el envío. Este paso se obvió, dada la gran cantidad de señales y datos que se extraen del CPU, y que la interpretación de estos permite observar el nivel de actividad de las unidades internas del CPU. Finalmente, durante la etapa de pruebas se encontraron problemas con la velocidad a la cual se enviaban los datos al modulo UART, indicando inconsistencias con el valor del retardo introducido para evitar problemas de rebosado del buffer de envío. Para solucionarlo, se duplico el valor de dicho retardo, ya que se observó que aún bajo dichos parámetros no se afectaba adversamente el comportamiento del sistema. 56 5.4.3. Aplicación GUI VI Sobre la aplicación del computador, se debió modificar la cantidad de datos que maneja para adecuarlo a las necesidades del nuevo sistema. Como primer paso, se preparó el sistema para recibir los 98 bytes de la trama. Una vez se comprobó que no habían problemas para la recepción de la trama completa, se trabajó para la decodificación de los bytes que compactaban la información de las señales de control, que son los que requirieron un mayor nivel de procesamiento, dado que fue necesario separarlos a sus bits compositivos. Seguidamente, se fueron separando los datos por etapa del sistema, y agrupándolos para presentarlos en conjuntos lógicos para el usuario. A medida que se verificaba que la información recibida era correcta, se estructuraba la información para semejar el diagrama esquemático del procesador MIPS-Pipelined. Se puede observar la interfaz gráfica de usuario en la Figura 24. Figura 24. Interfaz Gráfica de Usuario – Sistema MIPS-Pipelined Para presentar los datos, encontramos indicadores binarios, en forma de LED, que se emplean para observar el estado de las diferentes señales de control que se encuentran dentro del CPU. Además, se presentan los datos relevantes de todas las unidades funcionales, así 57 como el contenido completo de los registros del pipeline. La información de las unidades especiales de control del sistema se condensa y presenta en las unidades que hacen uso de ellas, como son la ALU en la unidad EXECUTE, y la unidad DMEMORY. Las flechas azules representan el orden del camino que recorren los datos dentro del CPU Pipelined como ayuda visual. La mayoría de las modificaciones realizadas son netamente cosméticas, para simplificar el panel frontal y mejorar la visibilidad. Las únicas modificaciones que afectan el comportamiento del GUI radican en que se fijó el valor de ciertos parámetros de configuración de la interfaz serial, dado que son valores que en la presente versión del sistema no requieren manipulación. 5.5. Herramientas de Desarrollo y Depuración Durante el desarrollo del proyecto, se emplearon diversas herramientas para que a medida que se avanzaba, se pudiese verificar el funcionamiento del mismo. Dada la gran complejidad de los diseños emprendidos, no era prudente el avance a ciegas, por lo cual se tomaron diversas medias para depurar los problemas que pudiesen encontrarse. Figura 25. Muestra de Resultados de Simulación: ModelSim Como primer paso, se simulaba el comportamiento de los componentes de funcionamiento complejo, como el CPU, la lógica de control y hasta el sistema completo. Inclusive, en caso que las unidades requiriesen entradas para poder observar su funcionamiento, fue posible simularlas, como una señal de estimulo al diseño, para observar el comportamiento bajo 58 distintas condiciones. Gracias al uso de esta herramienta, se pudo observar el funcionamiento del CPU, para configurar correctamente la Lógica de Control y Monitoreo para la inicialización del sistema. Figura 26. Captura de RealTerm: Sistema MIPS-SingleCycle A pesar que la simulación permite observar el comportamiento esperado, esto debió ser validado en la práctica, de manera que la interfaz gráfica pudiese ser programada correctamente. Como la comunicación se realiza por medio de un puerto serial, se utilizó el software de captura terminal RealTerm como herramienta de depuración, dado que permitió observar el funcionamiento del sistema ya implementado, para efectuar correcciones en caso de no ser consistente la operación con la simulación previa, y facilitar la generación de la interfaz gráfica en LabVIEW. La progresión de las herramientas de depuración llegó a la necesidad de generar VI’s de prueba, para validar el funcionamiento de la comunicación serial con éste. De esta manera, se realizaron instrumentos de prueba, y eventualmente se desarrolló la interfaz, pero haciendo uso de indicadores que están ocultos en el panel frontal para en para el usuario, que pueden ser activados por un desarrollador como variables de depuración. Esto permitiría, junto con el campo que muestra la trama completa que se envía al computador, observar el 59 comportamiento del GUI para procesar los datos enviados desde el dispositivo, y ayudar en el proceso de depuración del proyecto ante algún cambio. Figura 27. Captura de RealTerm: Sistema MIPS-Pipelined Esta interfaz en el VI se hace particularmente útil para la depuración del sistema MIPSPipelined, dado que la captura de datos directamente desde el puerto serial se hace bastante engorroso, ya que se debe recurrir a la decodificación de bytes en mayor número de ocasiones que en el sistema MIPS-SingleCycle, sin contar que el volumen de datos a manejar en sí mismo hace casi prohibitivo el trabajo eficiente en RealTerm. Además, se realizaron programas de prueba, tanto en la tarjeta FPGA como en LabVIEW, para comprobar el funcionamiento del Módulo UART, así como parte de los experimentos de la funcionalidad de la tarjeta y de los diseños que dentro del FPGA se implementen. CAPITULO 6 RESULTADOS Y ANÁLISIS DE RESULTADOS Se obtuvieron 2 sistemas de procesador didáctico como producto de este proyecto, con el agregado de tener los fundamentos de la implementación de 3 desarrollos aparte, los cuales fueron parcialmente implementados, más no se realizo un trabajo exhaustivo sobre los mismos. Dado que los sistemas comparten una plataforma común, es posible realizar una progresión programática secuencial con ellos, permitiendo observar las diferencias que existen entre los sistemas de forma empírica. Para el sistema MIPS-SingleCycle, tenemos la implementación de un CPU junto con una interfaz gráfica de usuario que permite observar el comportamiento del sistema durante su operación. La interfaz gráfica de usuario puede ser empleada de manera didáctica, pero su funcionalidad se orienta mejor para realizar corridas de corrección de errores (debugging) y como medio para comparar con otros sistemas MIPS disponibles. A pesar que es necesario modificar la fuente VHDL para cambiar el programa que se desea ejecutar, es posible incrementar el tamaño de la memoria de instrucciones del sistema, siempre que la tarjeta de desarrollo del FPGA cuente con los recursos suficientes para manejar dicho incremento. La posibilidad de controlar la velocidad de ejecución de los programas, y la posibilidad de monitorear el sistema sin la interfaz gráfica de usuario le añaden flexibilidad al sistema, y abre las puertas para el desarrollo de interfaces distintas a la provista por medio de este proyecto. Para el desarrollo MIPS-Pipelined, encontramos que la plataforma de hardware del sistema tiene mucho en común con el sistema MIPS-SingleCycle, pero la interfaz gráfica de usuario cambia considerablemente. Dado que a partir de este sistema se puede derivar una “familia” de implementaciones diferentes, la interfaz gráfica de usuario se diseñó con la idea de que fuese común entre todas éstas. De la misma forma De la misma forma que la interfaz gráfica de usuario del sistema MIPS-SingleCycle, la funcionalidad de ésta se presta más para actividades de debugging, dada la gran cantidad de información que se le presenta al usuario. Aunque como el primer sistema, este también es capaz de operar sin la interfaz provista, la gran cantidad de datos hace que sea ligeramente engorroso el procedimiento de decodificar la información observada directamente desde el puerto serial empleando software de terminal de 61 comunicaciones, como son RealTerm o HyperTerminal. Este desarrollo comparte igualmente la posibilidad de expansión de la memoria de instrucciones, con la misma dependencia de la capacidad del dispositivo FPGA sobre el cual se implemente. Debido a la disponibilidad de evoluciones para el sistema MIPS-Pipelined, se generaron las fuentes para la implementación de versiones mejoradas de éste. Pero no se realizó una implementación completa de todas las mejoras, debido principalmente a la falta de tiempo para realizar todas las pruebas y validaciones necesarias. Aun así, las fuentes de implementación de las mejoras se incluyen en el software del proyecto. CAPITULO 7 CONCLUSIONES Y RECOMENDACIONES 7.1. Conclusión General Se han desarrollado un par de herramientas didácticas, que permiten complementar el aprendizaje de los estudiantes de Ingeniería Electrónica de la Universidad Simón Bolívar en las áreas de Organización y Arquitectura del Computador. 7.2. Conclusiones Técnicas • Es posible tener implementaciones físicas de arquitecturas de procesadores reales, gracias a herramientas reconfigurables, permitiendo la corrección, mejora o modificación de dicho sistema. • El uso de VI’s para el desarrollo de aplicaciones simplifica el ciclo de programación en caso de ser necesario el uso de periféricos conectados al computador por medio de puertos, como el puerto serial. • El desarrollo de proyectos de implementación de hardware en un FPGA requiere, cuando éste alcanza cierto nivel de complejidad, de un estudio cuidadoso de las optimizaciones que el ambiente de programación ofrece. • Existe una ventaja competitiva en el desarrollo de proyectos complejos empleando lenguajes HDL, ya que existe un gran número de fuentes abiertas de dispositivos de pequeña y mediana complejidad, disponibles para su incorporación como elementos de otros proyectos 7.3. Recomendaciones • Implementar una interfaz nativa, independiente de licencias y de intérpretes como el LabVIEW. • Implementar una interfaz serial ASCII para ser usado como diagnostico sin el uso de programas instalados en el PC. 63 • Agregar a la plataforma la capacidad de modificar el programa a ejecutar libremente, mediante un sistema de conversión lexicográfica y escritura en la memora de instrucciones de los CPU. • El uso de éste proyecto como base para el desarrollo de interfaces más avanzadas. • El desarrollo de la implementación FPGA de este proyecto, para añadirle funcionalidad más avanzada. • Estudio de la posibilidad de implementar componentes complejos del sistema, como la memoria RAM, de forma externa al FPGA, de manera que el presupuesto de recursos de éste disminuya. • Estudio de la conversión de las fuentes del proyecto de lenguaje VHDL a lenguaje Verilog, verificando los beneficios y desventajas que pudiesen existir como producto de dicha conversión. • Estudio del uso de una plataforma de programación de los dispositivos FPGA basados en puertos USB (Universal Serial Bus – Bus de Serie Universal), para mejorar la compatibilidad del sistema con equipos de computación modernos, y añadir la flexibilidad de uso de computadores portátiles (laptops) al sistema. CAPITULO 8 REFERENCIAS BIBLIOGRÁFICAS [1] Shimpi, A. Inside ATI & NVIDIA: How they make frames fly. AnandTech – http://www.anandtech.com . Publicado 23-Sept-2002. Disponible en la dirección: http://www.anandtech.com/showdoc.aspx?i=1711&p=3. Consultado: 25 de Julio de 2008. [2] Valich, T. Intel's microcore future shown in pictures. The Inquirer – http://www.theinquirer.net. Publicado 26-Sept-2006. Disponible en la dirección: http://www.theinquirer.net/en/inquirer/news/2006/09/26/intels-microcore-future-shown-inpictures. Consultado: 26 de Septiembre de 2006. [3] Held, J. et al. White Paper: From a Few Cores to Many: A Tera-scale Computing Research Overview. Intel Corporation. Junio 2006. Documento disponible desde: http://techresearch.intel.com/articles/Tera-Scale/1449.htm. Consultado: 28 de Julio de 2008. Más referencias en: http://www.intel.com/go/terascale. [4] Tanenbaum, A. Structured Computer Organization. Prentice-Hall. 4ta. Edición. 1998. [5] Freescale Semiconductor. MC68HC08GP32A Data Sheet. Freescale Semiconductor – http://www.freescale.com. Revisión 1.0 Marzo 2006. [6] Sweetman, D. See MIPS Run. Morgan Kaufmann. 1ra. Edición. 15 de Abril de 1999 [7] Lee, H. ECE 3055 Fall 2006 – Programming Assignment 2. Georgia Institute of Technology - http://www.gatech.edu/. Documento disponible desde: http://users.ece.gatech.edu/~leehs/ECE3055/. Consultado: 15 de Febrero de 2007 [8] Schmid, P. Can Gigabyte’s i-RAM Replace Existing Hard Drives? Tom’s Hardware – http://www.tomshardware.com . Publicado 7-Sept-2006. Disponible en la dirección: http://www.tomshardware.com/reviews/gigabyte,1111.html . Consultado: 12 de Septiembre de 2006. [9] Brown, S. et al. Field-Programmable Gate Arrays, Kluwer Academic Publishers, Mayo 1992. Documento disponible en la dirección: http://books.google.co.ve/books?id=8s4MqYOWZIC [10] Freidin, P. FPGA FAQ. Fliptronics - http://www.fliptronics.com/ Documento disponible en la dirección: http://www.fpga-faq.org. Consultado: 02 de Agosto de 2008 [11] Smith, D.J. VHDL and Verilog compared and contrasted-plus modeled example written in VHDL, Verilog and C. Design Automation Conference Proceedings 1996, 33rd.Paginas: 771776 Publicado: 06 de Agosto de 2002. Documento disponible en versión digital desde: http://www.angelfire.com/in/rajesh52/verilogvhdl.html. Consultado: 05 de Agosto de 2008. [12] Sagdeo, V. The Complete Verilog Book. Springer. 1ra. Edición. 30 de Junio de 1998 65 [13] Yalamanchili, S. VHDL: A Starter’s Guide. Prentice Hall. 2da. Edición. 09 de Junio de 2005 [14] Peacock, C. Interfacing the Serial/RS232 Port V5.0. Interfacing the PC – Beyond Logic – http://www.beyondlogic.com Documento disponible desde: http://www.beyondlogic.org/serial/serial1.htm. Consultado: 05 de Agosto de 2008 [15] GlobalSpec – Electric and Electronic Components. About Pushbutton Switches GlobalSpec – http://www.globalspec.com. Documento disponible desde: http://electroniccomponents.globalspec.com/learnmore/electrical_electronic_components/switches/pushbutton_s witches. Consultado: 05 de Agosto de 2008. [16] All About Circuits – Vol. 4 Digital. Contact “bounce”. All About Circuits http://www.allaboutcircuits.com. Documento disponible desde: http://www.allaboutcircuits.com/vol_4/chpt_4/4.html . Consultado: 05 de Agosto de 2008 [17] National Instruments. What is LabVIEW? National Instruments. Documento disponible desde: http://www.ni.com/labview/whatis/ . Consultado: 05 de Agosto de 2008. [18] Travis, J. Kring, J. LabVIEW for Everyone: Graphical Programming Made Easy and Fun. Prentice Hall PTR. 3ra. Edición. 6 de Agosto de 2006. [19] Patterson, D. Hennessy, J. Computer Organization and Design: The Hardware/Software Interface. Morgan Kaufmann. 3ra. Edición, 2005. CAPITULO 9 BIBLIOGRAFÍA Patterson, D. Hennessy, J. Computer Organization and Design: The Hardware/Software Interface. Morgan Kaufmann. 3ra. Edición, 2005. Stallings, W. Organización y Arquitectura de Computadores. Pearson Prentice Hall. 5ta. Edición. 2004. CAPITULO 10 APÉNDICES