PONTIFICIA UNIVERSIDAD CATOLICA DE CHILE ESCUELA DE INGENIERIA PLATAFORMA DE DESARROLLO DE LÓGICA PROGRAMABLE DE ALTO DESEMPEÑO JUAN PABLO CARAM WIGDORSKY Memoria para optar al título de Ingeniero Civil Electricista Profesor Supervisor: MARGELO GUARINI Santiago de Chile, 2008 PONTIFICIA UNIVERSIDAD CATOLICA DE CHILE ESCUELA DE INGENIERIA Departamento de (departamento) PLATAFORMA DE DESARROLLO DE LÓGICA PROGRAMABLE DE ALTO DESEMPEÑO JUAN PABLO CARAM WIGDORSKY Memoria presentada a la Comisión integrada por los profesores: MARCELO GUARINI MIGUEL RIOS SERGIO ENRIQUE GUTIÉRREZ Para completar las exigencias del título de Ingeniero Civil Electricista Santiago de Chile, 2008 A mis Padres, hermanos y amigos, que me apoyaron mucho. ii iii Índice 1. Motivación y Objetivos 9 1.1. Plataforma Educacional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.2. Placa Madre multipropósito . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2. Teoría 2.1. Lógica Programable y FPGAs . . . . . . . . . . . . . . . . . . . . . . 2.1.1. Introducción y Reseña Histórica . . . . . . . . . . . . . . . . . 2.1.2. Arquitectura de los dispositivos lógicos programables . . . . . 2.1.3. Lenguajes de modelamiento de hardware . . . . . . . . . . . . 2.2. Dimensión Analógica de la Electrónica Digital . . . . . . . . . . . . . 2.2.1. Interconexiones como Líneas de Transmisión . . . . . . . . . . 2.2.2. Tipos de Líneas de Transmisión . . . . . . . . . . . . . . . . . 2.2.3. Efectos de las Líneas de Transmisión sobre las señales . . . . . 2.2.4. Línea con fuente de baja impedancia y carga de alta impedancia 2.2.5. Corrientes de retorno y Continuidad en las líneas de transmisión 2.2.6. Interferencia cruzada o Crosstalk . . . . . . . . . . . . . . . . 2.2.7. Distribución de Poder . . . . . . . . . . . . . . . . . . . . . . 2.2.8. Rebote de Tierra (Ground Bounce) . . . . . . . . . . . . . . . . 2.2.9. Simulación y modelamiento . . . . . . . . . . . . . . . . . . . 2.2.10. Conclusión . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3. Diseño 3.1. Diseño del Sistema . . . . . . . . . . . . . . . . . . . . . 3.1.1. FPGA, Configuración y Alimentación . . . . . . . 3.1.2. Periféricos . . . . . . . . . . . . . . . . . . . . . 3.1.3. Microcontrolador . . . . . . . . . . . . . . . . . . 3.2. Diseño del Circuito . . . . . . . . . . . . . . . . . . . . . 3.2.1. Diseño resistente a errores . . . . . . . . . . . . . 3.2.2. JTAG y configuración del FPGA a 3.3V . . . . . . 3.2.3. Controlador USB en la cadena JTAG . . . . . . . 3.2.4. USB con alimentaciones del bus USB y de la placa 3.2.5. Circuitos de Reseteo . . . . . . . . . . . . . . . . 3.2.6. Buses de las memorias SRAM y SDRAM . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 12 12 13 14 15 16 17 19 20 22 24 26 28 29 30 . . . . . . . . . . . 32 32 32 35 36 38 38 39 39 40 41 41 3.2.7. Configuración de la fuente de poder . . . . . . . 3.2.8. ICSP a 5V y PIC alimentado con 3.3V . . . . . . 3.2.9. Particularidades en el circuito de conversión A/D 3.3. Diseño del PCB . . . . . . . . . . . . . . . . . . . . . . 3.3.1. Restricciones al diseño . . . . . . . . . . . . . . 3.3.2. Parámetros de las líneas de transmisión . . . . . 3.3.3. Proceso de diseño . . . . . . . . . . . . . . . . . 3.3.4. Diseño flexible . . . . . . . . . . . . . . . . . . 3.4. Recursos, Técnicas y Herramientas . . . . . . . . . . . . 3.4.1. Software de Diseño . . . . . . . . . . . . . . . . 3.4.2. Software de Simulación . . . . . . . . . . . . . 3.4.3. Otro Software . . . . . . . . . . . . . . . . . . . 3.4.4. Herramientas de Soldadura y Montaje . . . . . . 3.4.5. Instrumentos de Medición . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4. Implementación y verificación del prototipo 4.1. Fabricación de la PCB . . . . . . . . . . . . . . . . . . . . . 4.2. Adquisición de componentes . . . . . . . . . . . . . . . . . . 4.3. Ensamblaje . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4. Verificación . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4.1. Prueba de Fuente de Poder . . . . . . . . . . . . . . . 4.4.2. Verificación de la cadena JTAG . . . . . . . . . . . . 4.4.3. APP1: Divisor de reloj . . . . . . . . . . . . . . . . . 4.4.4. Programación del PIC vía ICSP . . . . . . . . . . . . 4.4.5. APP2: Generación de onda cuadrada en el PIC . . . . 4.4.6. APP3: Comunicación entre el PIC y el FPGA . . . . . 4.4.7. APP4: Comunicación Serial . . . . . . . . . . . . . . 4.4.8. APP5: Lectura de los ADCs y transmisión serial al PC 4.4.9. APP6: Uso de memoria FLASH . . . . . . . . . . . . 4.4.10. APP7: Uso de memoria SRAM . . . . . . . . . . . . 4.4.11. APP8: Comunicación USB . . . . . . . . . . . . . . . 5. Aplicaciones y ejercicios propuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 42 43 43 43 45 46 54 54 54 55 55 56 57 . . . . . . . . . . . . . . . 59 59 59 59 60 60 60 61 63 63 64 65 67 68 69 71 72 2 6. Producción 6.1. Adquisiciones . . . . . . . . . 6.1.1. Circuitos Impresos . . 6.1.2. Componentes . . . . . 6.2. Ensamblaje . . . . . . . . . . 6.2.1. Indicaciones Generales 6.2.2. Procedimiento . . . . 6.3. Pruebas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 75 75 75 75 75 75 77 Índice de cuadros 1. 2. 3. 4. 5. 6. Tiempo de propagación de campos electromagnéticos en distintos medios. . Distribución de condensadores balanceada [Xapp623]. . . . . . . . . . . . Fuentes de poder para las secciones de comunicación USB y TTL/CMOS del chip USB. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Restricciones técnicas de Advanced Circuits para la promoción de prototipos de 4 capas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tiempos de levantamiento Tr para distintas configuraciones de los estándares de E/S del FPGA, LVCMOS33 y LVTTL según los modelos IBIS de Xilinx, y la longitud critica de la línea de transmisión correspondiente. . . . . . . . Opciones de ensamblaje. . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 . 17 . 27 . 40 . 44 . 45 . 124 Índice de figuras 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. Arquitectura de una CI GAL22V10 (Lattice Semiconductor) . . . . . . . . . Arquitectura de un FPGA . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos de líneas de transmisión utilizadas en circuitos digitales. . . . . . . . . Formas de onda en una línea de transmisión ideal en circuito abierto. . . . . . Simulación de una compuerta CMOS de la familia HC sobre una línea de 75 Ω y un retardo de 100 ps, terminada en 1.0 M Ω. . . . . . . . . . . . . . . . . Misma configuración de la figura 5 pero con una línea con retardo de 3ns. . . Camino de las corrientes de retorno a alta y baja frecuencia. . . . . . . . . . Corrientes de retorno y plano de tierra interrumpida. . . . . . . . . . . . . . . Corrientes de retorno y cambio de lado de una pista. . . . . . . . . . . . . . . Mecanismos de interferencia cruzada. . . . . . . . . . . . . . . . . . . . . . Circuito equivalente de un condensador de desacoplo en una PCB y su curva de impedancia en función de la frecuencia. . . . . . . . . . . . . . . . . . . . Ejemplo de impedancia versus frecuencia de un sistema de distribución de potencia [Xapp623]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Causa del Rebote de tierra. . . . . . . . . . . . . . . . . . . . . . . . . . . . Diagrama de bloques del diseño . . . . . . . . . . . . . . . . . . . . . . . . Circuito externo de reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . Geometría de la PCB de 4 capas de Advanced Circuits . . . . . . . . . . . . Dibujo tri-dimensional y huella de un empaquetado de circuito integrado DPAK. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Casos críticos (a) y (b): Líneas con 2 cargas. Caso (c): líneas largas paralelas. Especificación de la geometría y materiales del PCB para el programa HyperLynx. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Simulación del caso (a) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Simulación del caso (b) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Simulación del caso (c) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Osciloscopio Tektronix 5054B-NV . . . . . . . . . . . . . . . . . . . . . . . Cadena JTAG de la Plataforma de Desarrollo . . . . . . . . . . . . . . . . . Formas de onda de APP1. Izquierda: LVTTL a 2mA. Derecha: LVTTL a 8mA. APP2, Onda rectangular generada en el PIC . . . . . . . . . . . . . . . . . . APP3, FSK Controlada desde el PIC . . . . . . . . . . . . . . . . . . . . . . Señal serial en niveles TTL (canal 1) y RS232 (canal 2). . . . . . . . . . . . 5 13 15 18 21 22 22 23 24 24 25 26 28 28 33 41 45 46 49 50 51 51 53 58 61 62 63 65 65 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. Terminal que la operación de la aplicación APP4. . . . . . . . . . . . Señal original en osciloscopio . . . . . . . . . . . . . . . . . . . . . Sinusoidal capturada. (a) Datos en terminal serial. (b) Gráfico para el número 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . APP6 en terminal serial . . . . . . . . . . . . . . . . . . . . . . . . . Máquina de estados APP7 . . . . . . . . . . . . . . . . . . . . . . . Terminal exhibiendo la actividad de la aplicación. . . . . . . . . . . . Fotografía de la plataforma completamente armada y operando. . . . . Esquemáticos: Diagrama principal . . . . . . . . . . . . . . . . . . . Esquemáticos: Configuración del FPGA . . . . . . . . . . . . . . . . Esquemáticos: Memoria . . . . . . . . . . . . . . . . . . . . . . . . Esquemáticos: Comunicaciones . . . . . . . . . . . . . . . . . . . . Esquemáticos: Microcontrolador . . . . . . . . . . . . . . . . . . . . Esquemáticos: I/O del FPGA . . . . . . . . . . . . . . . . . . . . . . Esquemáticos: Fuente de Poder . . . . . . . . . . . . . . . . . . . . . Esquemáticos: Puertos de Expansión . . . . . . . . . . . . . . . . . . Serigrafía cara superior. No a escala. . . . . . . . . . . . . . . . . . . Cobre cara superior. No a escala. . . . . . . . . . . . . . . . . . . . . Cobre capa de alimentación (Vcc). No a escala. . . . . . . . . . . . . Plano de tierra (Negativo). No a escala. . . . . . . . . . . . . . . . . Serigrafía cara inferior (Invertida). No a escala. . . . . . . . . . . . . Cobre cara inferior (Invertida). No a escala. . . . . . . . . . . . . . . 6 . . . . . . ADC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 . 67 . . . . . . . . . . . . . . . . . . . 68 69 70 70 72 81 82 83 84 85 86 87 88 89 89 90 90 91 91 Resumen Esta memoria explora y analiza los conceptos teóricos y prácticos del desarrollo de circuitos electrónicos digitales de alta velocidad, y describe el diseño e implementación de una plataforma de desarrollo de aplicaciones digitales mediante lógica programable y basada en un FPGA1 . Los propósitos de este desarrollo son aplicar la teoría estudiada, proveer una plataforma de aprendizaje de estos conceptos y permitir el desarrollo de aplicaciones digitales avanzadas, mediante técnicas y hardware modernos. Para facilitar el aprendizaje se proporcionan ejemplos del uso de esta plataforma. Sin embargo, este trabajo se enfoca ante todo en los aspectos de hardware, mientras que las aplicaciones y su programación son ejercicio para el lector. 1 Field Programmable Gate Array, que en castellano significa Arreglo de Compuertas programable en Terreno. Este concepto es central en esta memoria y es desarrollado en profundidad en el capítulo 2 7 Abstract This document explores and studies the concepts involved in the development of highspeed digital circuits. It describes the design and fabrication of a multi-purpose programmable logic circuit board based on an FPGA2 . It’s intended to provide a hardware platform to aid in the teaching and learning of advanced digital electronics concepts. Examples and guidelines for software application development are provided. However this work focuses mainly in the hardware and analog aspects of digital design. The programmable logic tasks are left to the application developer. 2 Field Programmable Gate Array. This is a crucial concept in this thesis and will be developed further in chapter 2. 8 1. 1.1. Motivación y Objetivos Plataforma Educacional La motivación original de este proyecto surgió con la intención de facilitar la ampliación del currículo de Ingeniería Eléctrica de la Pontificia Universidad Católica de Chile (PUC) en el área de la electrónica digital. Si bien al momento de desarrollar esta memoria existen ramos de aplicación en sistemas digitales, tales como Procesamiento Digital de Señales, Arquitectura de Computadores y Comunicaciones Digitales, el aprendizaje en el currículum podría favorecerse y potenciarse, mediante la ayuda de tecnologías, metodologías y procedimientos prácticos, que permitan la implementación de sistemas que en otros ramos son descritas únicamente en forma teórica. La importancia de completar la cadena de aprendizaje en sistemas digitales no solo radica en el nexo entre los conceptos básicos y los de aplicación. También en que, dados los requerimientos del mercado mundial, la Ingeniería Eléctrica a nivel educacional universalmente se está enfocando cada vez más en la electrónica digital. El autor ha tenido la oportunidad de conocer y participar poco tiempo atrás del programa educacional en Ingeniería Eléctrica de la universidad Carnegie Mellon (Pittsburg, Pensylvania, EE.UU.). Pudo observar allí la marcada tendencia hacia la electrónica digital del currículo. Los ramos cubren desde los aspectos de fabricación en silicio hasta el diseño digital asistido por computadora, donde a alumnos de tercero y cuarto año de pregrado ya se les asigna el diseño completo de CPUs a nivel de silicio como proyecto de ramo. Aspectos como la actual duración del plan de estudios, limitaciones presupuestarias, y la realidad tecnológica nacional, sin duda hacen poco factible agregar al currículo de ingeniería eléctrica de la PUC ramos con tal nivel de profundidad. El alumno, sin embargo puede adquirir conocimientos con un nivel de abstracción levemente mayor, si se le entregan los conceptos necesarios para comprender lo que puede fabricarse hoy, así como los bloques constructivos básicos de diseño y fabricación actuales de circuitos digitales. Los FPGA son una parte de estos bloques constructivos. A la vez, estos últimos están construidos sobre la base de bloques constructivos menores interconectables mediante software. Con FPGAs, complejos sistemas digitales pueden diseñarse e implementarse en forma de productos finales (cuando el número de unidades es pequeño), o como prototipos para ser fabricados posteriormente como ASICs (Application Specific Integrated Circuits). Estas dos vías son las preferidas en la industria a menos que la complejidad del sistema requiera algún tipo de control específico sobre los parámetros de fabricación en el sustrato. Si los alumnos 9 alcanzan el dominio de los conceptos involucrados en la estructura y diseño con FPGAs y desarrollan habilidad práctica con ellos, estarán capacitados para diseñar los más complejos sistemas digitales a nivel de prototipo o producción. El acceso a una placa de desarrollo con FPGA, que sea versátil, de bajo costo y a la vez de alto desempeño, permite acceder a la experiencia práctica necesaria para alcanzar los objetivos mencionados. Adicionalmente, una adecuada documentación, con ejemplos de diferente complejidad, son necesarios para acelerar el proceso de aprendizaje y hacer factible la creación de proyectos en ramos relacionados. Los conceptos teóricos que acompañen el hardware deben ser transmitidos a los alumnos a través de ramos específicos, cuyos nombres podrían ser, por ejemplo “Electrónica Digital de Alta Velocidad” y “Diseño Digital asistido por Computadora”, donde se describiesen las técnicas de diseño a nivel de hardware y a nivel de software respectivamente. Estos ramos requieren ser dictados por profesores especializados en el área de electrónica digital. Se espera que esta memoria pueda proveer un resumen de gran parte de los conceptos teóricos para aquellos posibles ramos, y que otorgue una estructura lógica para transmitirlos a los alumnos, así como una fuente de literatura y una guía para el diseño y confección de hardware digital sofisticado. 1.2. Placa Madre multipropósito Además de cumplir con los objetivos educacionales se espera que el diseño del hardware propuesto cumpla con condiciones de versatilidad y desempeño, de manera tal que permita su uso como parte de sistemas más complejos, en el ejercicio profesional y la investigación. Estas son característica difícil de encontrar en placas de desarrollo con FPGAs disponibles en el mercado, debido a que estas últimas están diseñadas con el objetivo de familiarizar al desarrollador con las funcionalidades del dispositivo específico embedido en la placa, y no a obtener su máximo desempeño. Tampoco están diseñadas para utilizarlas embedidas en productos de tipo comercial. La forma de alcanzar estos objetivos, que sin duda no son sencillos - y considerando que el autor no tiene experiencia ni educación formal en profundidad en esta área, sino sólo autoaprendizaje y el desarrollo de algunos proyectos personales relacionados - será hacer uso de los recursos que el alumno dispone actualmente en su entorno de trabajo. Esto es, el National Radio Astronomy Observatory (NRAO) en los EE.UU, que cuenta con un equipamiento de punta y expertos a nivel mundial en esta y otras áreas. Ante un resultado exitoso, el hardware desarrollado podrá ser de utilidad para desarrollar 10 productos a la medida o de consumo, en las más variadas áreas, como son, por ejemplo el procesamiento digital de señales, control automático, instrumentación, telecomunicaciones, y muchos otros. 11 2. Teoría 2.1. Lógica Programable y FPGAs 2.1.1. Introducción y Reseña Histórica Hacia el principio de los años 80, los medios para desarrollar circuitos digitales eran, principalmente, la interconexión de numerosos circuitos integrados (chips) de compuertas lógicas discretas en un gran circuito impreso3 , o la fabricación de un circuito integrado especializado (aquel en que toda la aplicación es fabricada en un único chip) que implementase las funciones específicas deseadas. La primera opción tenía las desventajas de tener un alto costo unitario, gran tamaño, bajo desempeño debido a las longitudes de la interconexiones, y de tomar mucho tiempo en su fabricación. La segunda opción tenía las desventajas de tener un costo inicial muy alto, haciéndola muy desfavorable para diseños con pocas unidades de producción o prototipos. En aquellos tiempos los dispositivos de lógica programable - entendidos como circuitos integrados cuyos componentes y estructura son fijos pero que cuentan con elementos que el usuario puede modificar para definir o alterar su función - estaban limitados a memorias PROM (Programmable Read-Only Memory) para la implementación de lógica combinacional4 . A la vez primeros PLDs (Programmable Logic Devices) contaban sólo con unas cuantas decenas de compuertas lógicas que podían interconectarse, en el momento de su fabricación o, posteriormente por el usuario5 . Estas limitaciones hacían que los circuitos de lógica programable disponibles en aquel entonces, sólo fueran de interés para aplicaciones de baja densidad y baja velocidad. En 1984, Ross Freeman, fundador de la compañía Xilinx6 , inventó el FPGA. El diseño de los primeros FPGAs estaba basado en el de los CPLDs (Complex Programmable Logic Devices), predecesores de esta tecnología, pero de mucha menor densidad. Los FPGAs incluyen un gran número de compuertas, tanto combinacionales como secuenciales, un flexible sistema de interconexión, y re-programabilidad por el usuario, lo que resuelve los principales inconvenientes que enfrentaba hasta entonces el diseñador. En otras palabras, los FPGAs son dispositivos lógicos programables con muchas más 3 O en un circuito tipo wire-wrap. Donde las entradas al circuito son la dirección de memoria en la PROM y las salidas son las líneas de datos. 5 Electrónicamente, y cuyo borrado (deshacer las interconexiones) generalmente no era posible, o mediante exposición a luz ultravioleta. 6 Xilinx, San José, California. www.xilinx.com. Actualmente es la empresa líder en la fabricación de circuitos lógicos programables como FPGAs y CPLDs. 4 12 Figura 1: Arquitectura de una CI GAL22V10 (Lattice Semiconductor) macroceldas (a definir más adelante) que sus predecesores, muchos más recursos de interconexión, y cuya estructura ha madurado durante casi tres décadas para que los diseños lógicos basados e implementados en ellos resulten más eficientes. 2.1.2. Arquitectura de los dispositivos lógicos programables La figura 1 muestra la arquitectura de un dispositivo de lógica programable GAL22V10 de Lattice Semiconductor. A pesar de ser un dispositivo muy limitado en comparación con los CPLDs y FPGAs en términos de flexibilidad, velocidad y número de compuertas, lleva casi dos décadas en el mercado y, estructuralmente, es representativo de la arquitecturas de los actuales dispositivos lógicos programables. Es un ejemplo de los circuitos lógicos de la antigüedad, pero su legado es fundamental. Este cuenta con 22 pines, todos los cuales pueden operar como entradas, pero solo 10 de ellos como salidas. Estructuralmente, cuenta con una gran matriz de interconexión de las 22 entradas, que conectan a la vez con las 10 etapas de salida. Cada etapa de salida contiene varias compuertas lógicas y registros, cuyo conjunto se conoce como Macro-celda. En la figura están identificadas como OLMCs (Output Logic Macrocells) y su estructura se muestra en el costado derecho. La figura 2 muestra la estructura típica de un FPGA destacando sus principales elementos, que se describen a continuación. Los elementos fundamentales de la arquitectura de los FPGAs son los bloques lógicos 13 configurables (CLB, Configurable Logic Blocks), descendientes de las Macro-celdas, y que permiten la implementación de lógica combinacional mediante elementos conocidos como “Look-up tables”, similares a una memoria, donde las entradas equivalen a la dirección y la salida al valor en memoria correspondiente. Permiten también la implementación de lógica secuencial mediante registros que pueden ser utilizados como flip-flops o latches. Los bloques lógicos se encuentran distribuidos físicamente en forma matricial en el FPGA, y pueden interconectarse con cualquiera de los bloques lógicos vecinos, con un bloque de entrada y salida u otro recurso en el FPGA. Los bloques de entrada y salida (E/S) permiten interfasar el circuito digital interno al FPGA con el exterior. Éstos permiten controlar las características analógicas de las señales digitales, como por ejemplo, si una línea de datos será referida a tierra o será diferencial (utilizando 2 pines), los niveles de voltaje, las velocidad de los flancos de subida y bajada y la capacidad de corriente de cada pin. La mayoría de los fabricantes incorpora algún tipo de controlador de reloj, que permite, a partir de una señal de reloj externa de frecuencia fija, generar distintas frecuencias y alterar su fase (introducir retardo). Estos sistemas pueden ser de tres tipos: completamente digitales y que se conocen como DDLs (Digital Delay Loops), donde la síntesis de frecuencias se implementa mediante retardos, contadores y otras compuertas; completamente analógicos cuya implementación es mediante PLLs (Phase-Locked Loops); o híbridos. La mayoría de los fabricantes incorporan memoria RAM y elementos para acelerar operaciones matemáticas requeridas en el procesamiento digital de señales (DSP), principalmente multiplicadores. El detalle de la estructura de los distintos circuitos integrados de lógica programable puede encontrarse en su respectiva hoja de datos. Es esencial conocer la arquitectura de estos dispositivos si se ha de optimizar el uso de recursos y el desempeño en el diseño final. 2.1.3. Lenguajes de modelamiento de hardware Los lenguajes de modelamiento de hardware o HDLs (Hardware Description Languages) son un tipo de lenguaje computacional que permite describir circuitos digitales en su dimensión temporal (comportamiento) y espacial (física). Los primeros HDLs fueron creados a fines de los años 70, y los dos más utilizados actualmente, Verilog y VHDL (VHSIC - Very High Speed Integrated Circuit - Hardware Description Language), fueron creados en 1985 y 1987 respectivamente. Estos lenguajes difieren de los lenguajes de computador en hecho que están especialmente 14 Figura 2: Arquitectura de un FPGA diseñados para describir procesos paralelos, lo que es una característica propia del hardware. Adicionalmente, algunos de estos lenguajes permiten describir un set de estímulos externos para simular el comportamiento de un diseño. En general, permiten describir hardware con distintos niveles de abstracción, facilitando el diseño de sistemas complejos, dejando que un software compilador realice la tarea de traducir el diseño a nivel físico. El compilador está optimizado para aprovechar al máximo los recursos físicos provistos por un determinado dispositivo de lógica programable. El proceso de traducción de un diseño en HDL a una especificación de interconexión de recursos en un dispositivo de lógica programable se conoce como síntesis. El desarrollo de aplicaciones con FPGAs se realiza hoy mediante lenguajes de descripción de hardware. El desarrollador debe dominar estos lenguajes para diseñar aplicaciones digitales. Sin embargo, debe tener claros los niveles de abstracción que se están utilizando. Éstos van desde el nivel más bajo y que corresponde a la estructura interna de los bloques constructivos del dispositivo específico que se pretende utilizar, hasta la representación al nivel de transferencia de registros utilizada en el lenguaje de su elección para lograr aplicaciones eficientes. 2.2. Dimensión Analógica de la Electrónica Digital Los circuitos digitales han alcanzado velocidades de reloj y tiempos de transición que acentúan las características “parásitas” (como se conocen las no idealidades de los compo15 nentes electrónicos a bajas frecuencias) en las interconexiones de los componentes. En la actualidad, la interconexión de circuitos integrados digitales presenta un gran desafío y es parte esencial del diseño del sistema. El diseño presentado en esta memoria considera velocidades de reloj y tiempos de transición de estado que requieren un análisis analógico electromagnético para poder predecir su comportamiento. A continuación se presenta un resumen de los conceptos fundamentales que permiten enfrentar el problema de diseño en cuestión y que constituyen la base teórica de esta memoria y del hardware desarrollado. 2.2.1. Interconexiones como Líneas de Transmisión Toda interconexión eléctrica7 entre dos puntos es una línea de transmisión. Cuando la longitud de esta conexión es relativamente pequeña en comparación con la longitud de onda de la señal transmitida por ella, es válido hacer aproximaciones basándose en el supuesto de que la onda se transfiere infinitamente rápido. De esta manera, asumimos que cuando un determinado voltaje y corriente se presentan en cierto instante en un extremo de la línea, estos son invariables a lo largo de toda su longitud. Para tratar una conexión como línea de transmisión se utiliza como criterio la longitud de ésta. A saber, una longitud tal que causa efectos importantes sobre las señales transmitidas por ella. Esto ocurre usualmente cuando la longitud de la línea l y la longitud de onda λ de la componente de mayor frecuencia de la señal transmitida cumplen con la siguiente relación8 : λ (1) 6 En el caso de las señales digitales, la mayor frecuencia relevante (correspondiente a λ en la ecuación 1) puede ser de varios órdenes de magnitud por sobre la frecuencia de reloj, ya que se trata de ondas (idealmente) cuadradas, que contienen armónicas de magnitudes dependientes de los tiempo de elevación Tr y caída de los flancos de las señales. La frecuencia a considerar como máxima relevante en una señal digital, en tanto la potencia de la señal por sobre dicha frecuencia es una fracción despreciable de la potencia total de la señal, está dada por:9 : l> 7 De dos conductores, donde uno es considerado para las corrientes de retorno. Este criterio es sólo de referencia y su validez dependerá de la sensibilidad de la aplicación. 9 Esta también es una aproximación. El nombre fknee , donde knee significa rodilla en ingles, proviene de la característica gráfica del espectro de una señal digital donde se produce un incremento en la pendiente negativa de la amplitud. La frecuencia a la que ocurre este incremento en la pendiente (punto que denominamos knee o rodilla) se considera como la frecuencia máxima relevante. 8 16 Cuadro 1: Tiempo de propagación de campos electromagnéticos en distintos medios. Medio Retardo Tp [ns/m] Constante del dieléctrico r Aire (Ondas de Radio) 3.35 1.0 Cable Coaxial (75 % velocidad) 4.45 1.8 Cable Coaxial (66 % velocidad) 5.08 2.3 FR4 PCB, pista externa 5.51-7.09 2.8-4.5 FR4 PCB, pista interna 7.09 4.5 Alumina PCB, pista interna 9.45-10.63 8-10 fknee = 0,5 Tr (2) Para el cálculo de la longitud de onda es necesario conocer la velocidad de propagación de ésta, la cual depende únicamente del dieléctrico10 a través del cual la onda se propaga. El cuadro 1 presenta los tiempos de propagación en algunos medios (dieléctricos) comunes. Teniendo la información de la tabla conviene escribir la ecuación 1 en función del tiempo total de propagación T = Tp × l y el tiempo de levantamiento de una señal digital Tr como: T > 2.2.2. Tr 3 (3) Tipos de Líneas de Transmisión La figura 3 muestra las secciones transversales de 4 tipos comunes de líneas de transmisión. Entre estos, Microstrip y Stripline son los más comunes en circuitos impresos digitales. Ambos pueden coexistir en un mismo circuito impreso de varias capas, donde aquellas pistas en las caras de la placa corresponden a los primeros, mientras que los segundos corresponden a las pistas en sus capas internas entre planos de tierra. En el caso de Stripline, las líneas de campo eléctrico sólo cruzan el dieléctrico del circuito impreso, por lo tanto, la constante efectiva o permitividad del dieléctrico es la del material de la placa. Para Microstrip en cambio, las líneas de campo que emergen del lado superior del conductor, cruzan el aire antes de penetrar en el dieléctrico. La permitividad efectiva depende, entonces, de cuánto se concentre el campo eléctrico bajo la pista, en comparación con cuánto cruza el aire, lo que a la vez depende de la geometría de la línea. En [Johnson93] se pueden encontrar fórmulas para calcular parámetros de distintos tipos de líneas de transmisión en función de su geometría y del dieléctrico. 10 La constante del dieléctrico r se conoce también como permitividad relativa del dieléctrico. 17 Figura 3: Tipos de líneas de transmisión utilizadas en circuitos digitales. Para Microstrip, las siguientes aproximaciones para la impedancia natural Z0 y el tiempo de propagación Tp entregan buenos resultados cuando 0,1 < w/h < 2,0 y 1 < r < 15, donde w, h y t son el ancho de la pista, la separación entre la pista el plano de tierra, y el espesor del conductor respectivamente. r es la permitividad realtiva del dieléctrico: 87 5,98h ln Z0 = √ r + 1,41 0,8w + t ! [Ω] (4) ns ] (5) m Para Stripline, las siguientes aproximaciones son válidas cuando w/b < 0,35 y t/b < 0,25, donde w, b y t son el ancho de la pista, la separación entre ambos planos de tierra y el espesor del conductor respectivamente: q Tp = 3,35 0,475r + 0,67 [ 60 1,9b Z0 = √ ln r 0,8w + t ! √ ns Tp = 3,35 r [ ] m 18 [Ω] (6) (7) 2.2.3. Efectos de las Líneas de Transmisión sobre las señales La respuesta en frecuencia entre la fuente y la carga a través de una línea de transmisión, considerando infinitas reflexiones entre la carga y la fuente, está dada por [Johnson93]: S∞ = A(ω)Hx (ω)T (ω) 1 − R2 (ω)Hx2 (ω)R1 (ω) (8) A(ω) representa la fracción de la señal que es transmitida desde la fuente hacia la línea. Depende de la impedancia de salida Zs de la fuente y de la impedancia natural de la línea Z0 . Z0 es la impedancia instantánea que “ve” una señal hacia la línea de transmisión. Esto causa que una señal que emerge de la fuente se vea afectada por un divisor de voltaje durante el tiempo que toma a la señal en viajar por la línea y reflejarse de vuelta, afectando su amplitud con un factor A(ω): A(ω) = Z0 (ω) Zs (ω) + Z0 (ω) (9) Este efecto puede observarse en la figura 4, donde la señal en el origen solo alcanza una fracción de su amplitud final en el flanco de subida. HX (ω) es la respuesta de la línea a una distancia X de la fuente y considera las pérdidas y el desfase causado por el comportamiento LC distribuido11 : HX (ω) = e−X √ (R(ω)+jωL)(jωC) (10) T (ω) representa cuánto es transmitido hacia la carga de impedancia ZL , mientras que R2 (ω) representa cuánto es reflejado de vuelta a la fuente. T (ω) = 2ZL ZL (ω) + Z0 (ω) (11) R2 (ω) = ZL (ω) − Z0 (ω) ZL (ω) + Z0 (ω) (12) R1 (ω) representa cuánto es reflejado nuevamente de la señal incidente en la fuente de vuelta hacia la línea. R1 (ω) = Zs (ω) − Z0 (ω) Zs (ω) + Z0 (ω) 11 (13) La inductancia y capacitancia por unidad de longitud p están dadas √ por L = Z0 Tp y C = Tp /Z0 respectivamente. Estas relaciones se desprenden de que Z0 = L/C y Tp = LC. 19 Estas ecuaciones resumen los efectos que las líneas de transmisión tienen sobre las señales que viajan por ellas. Es importante destacar que siempre se producirán reflexiones cuando haya una discontinuidad en la impedancia, y que siempre se verán afectadas la amplitud y la fase a lo largo de la línea. Es importante destacar que los parámetros y ecuaciones presentadas en esta sección son todos funciones de la frecuencia debido a los materiales involucrados en la fabricación del circuito. En general, las variaciones de los parámetros debido a la frecuencia se presentan a muy altas frecuencias. Esto se debe a fenómenos como el efecto pelicular, donde las corrientes tienden a viajar por la superficie de los conductores (siguiendo el camino de mínima inductancia) causando un aumento en la resistividad del conductor, así como pérdidas en el dieléctrico, lo que se debe a que la resistividad del material comienza a reducir su valor. 2.2.4. Línea con fuente de baja impedancia y carga de alta impedancia El efecto más evidente de las líneas de transmisión utilizadas en circuitos digitales de un solo circuito impreso (sin cables de interconexión), se debe a que la impedancia de salida de las compuertas lógicas es muy baja y es comparable a la impedancia natural de la línea, y al hecho que la impedancia de la carga (la impedancia de entrada de las compuertas lógicas) es muy alta y típicamente capacitiva. La figura 4 muestra, el voltaje entregado por una compuerta cuya resistencia de salida es 10Ω y su tiempo de levantamiento es de 1ns, así como el voltaje recibido en una compuerta cuya impedancia de entrada es de 5pF . La señal se transmite por una línea de transmisión ideal cuyo tiempo de propagación es de 10ns y Z0 = 50Ω. En este caso, T (ω) ≈ +2, R1 (ω) ≈ −1 y R1 R2 ≈ −1, lo que resulta en sucesivos cambios de signo de las señales reflejadas, produciendo oscilaciones. Éstas tienen un período igual a 4 veces el tiempo total de propagación en la línea y su constante de decaimiento está dada por: √ X LC τ= −ln(|R1 (2πfknee )R2 (2πfknee )|) (14) Las formas de onda pueden comprenderse sobre la base de que las reflexiones en el destino son positivas y de amplitud prácticamente igual a la magnitud del flanco incidente, y que en el origen éstas son de valor negativo y amplitud similar. El problema de esta situación es que debido a la amplitud de las oscilaciones posteriores a un flanco de subida o bajada, el voltaje puede interpretarse con un valor lógico erróneo, par- 20 Origen Destino 8 Voltaje [V] 6 4 2 0 −2 4 5 6 7 8 9 Tiempo [s] 10 11 12 13 −7 x 10 Figura 4: Formas de onda en una línea de transmisión ideal en circuito abierto. ticularmente en señales de reloj que afectan al sistema mediante un flanco. Adicionalmente, se reduce el margen disponible para tolerar ruido de diferentes índoles. Simulación La figura 5 muestra un modelo de simulación bajo un software especializado en la simulación de compuertas digitales y su efecto sobre las líneas de transmisión. La compuerta en este caso es un modelo SPICE de la etapa de salida de una compuerta de la familia 74HC alimentada con 5V, cuyo tiempo de levantamiento es aproximadamente 6 ns. La línea de transmisión es de 75 Ω, y un tiempo de propagación de 100 ps, que es considerablemente menor al tiempo de levantamiento de la compuerta (la línea es muy corta). Ya que la línea es tan corta, aún cuando la carga de 1 M Ω está muy desbalanceada con la impedancia natural de la línea, se puede observar en el resultado de la simulación, que la forma de onda en el origen y el destino son coincidentes. No se produce sobrepaso ni oscilaciones. 21 Forma de onda en el origen y el destino en una línea muy corta y carga de alta impedancia 6 5 Voltaje [V] 4 3 2 Tr≈ 6ns 1 0 −1 0 10 20 30 40 50 Tiempo [ns] Figura 5: Simulación de una compuerta CMOS de la familia HC sobre una línea de 75 Ω y un retardo de 100 ps, terminada en 1.0 M Ω. La figura 6 sin embargo muestra los resultados de la simulación donde se ha reemplazado la línea de transmisión por una cuyo tiempo de propagación es de 3 ns. Las reflexiones en el destino causan un sobrepaso debido a la suma de las ondas incidente y reflejada del mismo signo. En el origen, el flanco de subida pierde impulso (toma más tiempo en alcanzar su máximo), debido a que la compuerta “ve” 75 Ω por más tiempo (Esto puede puede calcularse en forma aproximada como Tr + 2Tp ≈ 6ns + 2 × 3ns = 12ns y es visible en la figura 6). Formas de onda en el origen y el destino en una línea de transmisión con 3ns de tiempo de propagación. 7 Destino Origen 6 5 Voltaje [V] 4 3 2 1 0 −1 −2 0 10 20 30 40 50 Tiempo [ns] Figura 6: Misma configuración de la figura 5 pero con una línea con retardo de 3ns. 2.2.5. Corrientes de retorno y Continuidad en las líneas de transmisión Al trabajar con líneas de transmisión Microstrip o Stripline, donde se tienen amplios planos de tierra, es importante comprender cuál es el camino que toman las corrientes de retorno a través de ellos y por qué. 22 Carga Carga Plano de Tierra Fuente Corriente de retorno Fuente (A) Alta Frecuencia (B) DC o baja frecuencia Figura 7: Camino de las corrientes de retorno a alta y baja frecuencia. Las corrientes que fluyen de la fuente hacia la carga están confinadas a la pista conductora, sin embargo las corrientes de regreso a la fuente viajan por el plano de tierra y siempre seguirán el camino de menor impedancia. A frecuencias bajas, la resistividad del plano de tierra es el factor dominante en la impedancia (el factor mínimo de la impedancia), por lo tanto, las corrientes siguen el camino más corto (Figura 7 (B)). Sin embargo, a altas frecuencias, es la inductancia el factor dominante, por lo tanto, las corrientes de retorno seguirán el camino que las minimice. Como la inductancia es proporcional al área que encierra el camino de la corriente, la mínima inductancia se obtiene cuando las corrientes de retorno viajan por el plano de tierra justo bajo la pista (Figura 7 (A)). El caso A de la figura 7 es el que más nos concierne, dadas las posibles interrupciones que puedan producirse en el camino ideal de la corriente de retorno. La figura 8 muestra una interrupción en el plano de tierra bajo dos líneas de transmisión Microstrip. La corriente de retorno se ve obligada a bordear la interrupción. El área encerrada por el lazo de corriente resulta en un incremento de la inductancia total de la línea de transmisión y, por lo tanto, del tiempo que toma en propagarse por ella una señal. Otra discontinuidad en el camino de retorno de la corriente ocurre cuando una pista cambia de capa en el circuito impreso y el plano de tierra deja de estar inmediatamente adyacente a la pista. La figura 9 muestra un circuito impreso de 4 capas, en la cual la superior y la inferior son de señal, mientras que la segunda es plano de tierra y la tercera es plano de alimentación. La señal se origina en la fuente y la corriente de retorno fluye por el plano de tierra (Gnd) hasta que la pista cambia a la otra cara del circuito impreso. En este segmento el plano de alimentación (Vcc) se interpone entre el plano de tierra y la señal, aislándolos 23 Figura 8: Corrientes de retorno y plano de tierra interrumpida. Fuente Carga C Gnd Vcc C Figura 9: Corrientes de retorno y cambio de lado de una pista. electromagnéticamente. El camino de retorno ideal para la corriente en este segmento es a través del plano de alimentación. La forma de crear continuidad entre ambos planos (sin cortocircuitarlos, naturalmente), es mediante un condensador muy cerca del punto de cambio de lado de la pista. Mientras más cerca se encuentre el condensador, menor será la inductancia de la línea. 2.2.6. Interferencia cruzada o Crosstalk La figura 10 representa los 2 principales mecanismos por los cuales la señal en una pista puede interferir la señal en una pista cercana. El primero (A) y el más importante, es que cualquier corriente inducirá un campo magnético alrededor de dicha corriente. Este campo a la vez puede inducir corriente en cualquier otra pista a la que enlace. La figura muestra las líneas de campo generadas por la corriente en la pista m, que a su vez enlazan la pista n induciendo una corriente en ella. Este tipo de interferencia cruzada se conoce como interferencia inductiva, debido a que al compartirse flujo magnético entre las pistas existe inductancia 24 m n (A) Gnd m n (B) Gnd Figura 10: Mecanismos de interferencia cruzada. mutua entre ellas. El segundo mecanismo (B) se debe a las corrientes de retorno por el plano de tierra. La figura muestra las distribuciones de la corriente en el plano de tierra para las señales transmitidas en cada pista. Si las pistas están suficientemente cerca, las corrientes de retorno se pueden interferir. En general, la interferencia cruzada entre dos pistas paralelas se mide como el porcentaje de la amplitud del voltaje de la señal de la pista m que es inducido sobre la pista n. La interferencia cruzada es dependiente de la distancia D entre los centros de las pistas en cuestión y la distancia entre las pistas y el plano de tierra H. K es función de los tiempos de levantamiento por las líneas y de la longitud en la cual las pistas se interfieren. Crosstalk ∝ K 1 + (D/H)2 (15) La interferencia puede ser mucho más severa si se da el caso de la figura 8. En este caso, las superficies creadas por los lazos de corriente de ambas señales cubren un área común por la que atraviesan líneas de campo magnético de ambas señales. En este caso la interferencia cruzada es proporcional al área común de flujo magnético. Lo mismo puede ocurrir cuando varias pistas cambian de capa en un circuito impreso. Si no hay un condensador que permita el flujo de corriente de retorno muy cerca del cambio de capa de la pista, las corrientes de retorno pueden ir muy lejos, creando grandes lazos de corriente por cuya área pueden pasar las líneas de campo de muchas otras señales. 25 2.2.7. Distribución de Poder La función del sistema de distribución de potencia en un circuito es responder a la corriente demandada por las cargas, y responder tan rápido como sea posible a los cambios en dicha demanda. Cuando no se logra cumplir estas demandas, se observa un cambio en el voltaje de alimentación de los dispositivos y esto, a la vez, afecta las señales trasmitidas en forma de ruido. El consumo de potencia de los circuitos digitales modernos se concentra en las etapas de entrada y salida de los circuitos integrados. Este consumo a su vez, ocurre principalmente durante las transiciones de estado y se debe a la baja impedancia de las etapas de salida y al comportamiento capacitivo de las etapas de entrada. Para permitir altas velocidades de reloj, las transiciones de estado deben ocurrir muy rápido, requiriendo altas corrientes por períodos muy breves. En otras palabras, se requieren I y dI/dt muy altos. Para cumplir con estos requerimientos la fuente de alimentación de los circuitos integrados digitales debe tener la capacidad de corriente necesaria y una baja impedancia de salida, principalmente la inductiva. Generalmente, las demandas transitorias en los circuitos digitales son tan altas que si se usase una fuente que sea capaz de suministrarla en régimen permanente, ella sería absurdamente voluminosa. La forma de resolver esto es mediante condensadores conectados entre los pines de alimentación y tierra de los circuitos integrados para proveer la corriente durante las transiciones, y ubicados tan cerca de los pines de alimentación como sea posible para minimizar la inductancia. Z L1 L2 LS CI C F (b) Impedancia (a) Circuito equivalente Figura 11: Circuito equivalente de un condensador de desacoplo en una PCB y su curva de impedancia en función de la frecuencia. 26 Cuadro 2: Distribución de condensadores balanceada [Xapp623]. Valor Cantidad Tipo Inductancia Típica 470 uF a 1000 uF 4% Tantalio E 2.8 nH 1.0 a 4.7 uF 14 % X7R 0805 2.0 nH 0.1 a 0.47 uF 27 % X7R 0603 1.8 nH 0.01 a 0.047 uF 55 % X7R 0402 1.5nH La figura 11 (a) muestra el circuito equivalente del sistema de distribución de potencia con un condensador de desacoplo12 (recuadro gris). El circuito equivalente de este último se compone de un condensador ideal C y una inductancia en serie Ls . Ls es una característica propia del encapsulado del condensador, motivo por el cual al elegir un condensador para este propósito (desacoplo), debe escogerse aquel con un encapsulado del menor tamaño posible. Igualmente, para un mismo encapsulado debe elegirse el condensador de mayor capacitancia. L1 generalmente es de un valor relativamente alto, dado que es difícil ubicar la fuente de voltaje cerca de cada uno de los circuitos integrados. L2 es la inductancia entre el condensador y los pines de alimentación del circuito integrado. Esta inductancia puede minimizarse ubicando el condensador lo más cerca posible de los pines de alimentación de CI. Esto último, no solo para minimizar la inductancia, sino también para minimizar el tiempo que toman los condensadores en entregar corriente al CI. El tiempo es igual a la velocidad de propagación en el medio por el doble de la distancia entre el condensador y el CI. A una distancia de λ/4 o superior, el condensador no puede entregar energía al CI. Una distancia adecuada es < λ/40 [Xapp623]. La figura 11 (b) muestra la impedancia del condensador equivalente en función de la frecuencia. A frecuencias bajo la frecuencia de resonancia indicada en el eje de las abscisas, el condensador se comporta como tal, mientras que por sobre la frecuencia de resonancia se comporta como inductancia. A la frecuencia de resonancia el condensador presenta su mínima impedancia, logrando su efectividad máxima. Una regla empírica para el número y tamaño de los condensadores es agregar al menos, uno por cada par de pines de alimentación y tierra, ubicando los condensadores de encapsulado más pequeños más cerca de estos pines, y distribuido según el cuadro 2. La figura 12 muestra un ejemplo de la impedancia total de los condensadores de desacoplo del sistema de distribución de poder en un circuito. Al utilizar distintas capacitancias, encapsulados y factores de calidad Q, se obtiene un amplio ancho de banda efectivo. 12 Nombre con el cual se conocen los condensadores utilizados con el fin de proveer corrientes transitorias. 27 Z (Ohm) 7 x 2.2uF X7R 0805 13 x 0.22uF X7R 0603 26 x 0.022uF X7R 0402 2 x 680uF Tantalum E 1 0.1 0.01 10 1 100 1000 F (MHz) Figura 12: Ejemplo de impedancia versus frecuencia de un sistema de distribución de potencia [Xapp623]. Vcc GND Via al plano de tierra (A) (B) Figura 13: Causa del Rebote de tierra. 2.2.8. Rebote de Tierra (Ground Bounce) El rebote de tierra es un fenómeno que se debe a la inductancia entra el plano de tierra de un circuito impreso y la tierra interna a un circuito integrado. Esta inductancia depende de la longitud de la conexión entre ambas tierras. A esta longitud contribuyen la longitud del pin del circuito integrado y la longitud de la pista desde el pin hasta el plano de tierra. Esta situación se ilustra en la figura 13 (A). El fenómeno que ocurre a causa de esta inductancia, es que el voltaje en la tierra interna al circuito integrado puede variar considerablemente con respecto a la tierra del circuito impreso. Cuando ocurre una transición lógica de “0” a “1” en la salida de la compuerta, la corriente que fluye entre la tierra interna y externa presenta un dI/dt muy grande y de signo 28 negativo, causando que el voltaje en la tierra interna al CI con respecto a la tierra del circuito impreso se haga negativa. Del mismo modo, al haber una transición de “1” a “0” en la salida, ocurre un dI/dt grande de signo positivo, causando un incremento en el voltaje de la tierra interna con respecto a la del circuito impreso. El efecto que producen estos cambios de voltaje en la tierra interna sobre el voltaje de salida de las compuertas es pequeño, sin embargo, como se puede observar en la figura 13 (B), el voltaje de entrada de la compuerta es comparado con un valor de referencia que es función del voltaje de la barra de tierra interna al circuito integrado (que se encuentra conectada con la tierra del circuito impreso mediante una inductancia). Por, las tanto variaciones en el voltaje de tierra interno pueden inducir a una interpretación errónea del valor lógico de entrada. En grandes circuitos integrados como los FPGAs, generalmente existen varios pines de entrada y salida por cada pin de tierra. Por lo tanto, la problemática del rebote de tierra es proporcional al número de pines de salida que estén simultáneamente cambiando de estado lógico. Generalmente los fabricantes especifican el número máximo de pines de salida por cada pin de tierra que pueden estar simultáneamente en transición y que mantienen el rebote de tierra dentro de márgenes aceptables. Este criterio sólo considera la inductancia de los pines de tierra, la que es constante, mientras que la inductancia de la pista que conecta el pin de tierra al plano de tierra del circuito impreso, puede ser varias veces mayor, debiendo, por lo tanto, cuidarse de mantener su longitud tan corta como sea posible. 2.2.9. Simulación y modelamiento La simulación del comportamiento analógico de los circuitos digitales requiere poder modelar, cuantitativa y temporalmente, sobretodo, las etapas de entrada y salida de las compuertas digitales, así como las líneas de transmisión que las interconectan. Las etapas de entrada y salida generalmente se modelan mediante estructuras SPICE, que representan la interconexión de elementos circuitales y sus características técnicas, o bien, mediante modelos IBIS. Estos últimos describen el comportamiento de una compuerta solamente mediante tablas de voltaje y corriente en función del tiempo, y tienen la ventaja para el fabricante de no revelar cómo están construidas dichas compuertas. Las líneas de transmisión son elementos pasivos lineales (Combinaciones R, L y C) aunque distribuidos, y existen como elementos discretos bajo SPICE y otros simuladores de circuitos. Como se ha ilustrado anteriormente, sus parámetros son fáciles de calcular, sin embargo, en un circuito impreso pueden existir interacciones entre múltiples líneas de transmisión, o entre líneas de transmisión y otros elementos, como son por ejemplo las vías, 29 interrupciones en los planos de tierra, etc. Estos fenómenos, aunque generalmente de carácter lineal, son mucho más difíciles de predecir y cuantificar, y más aún, de modelar mediante los elementos provistos por los simuladores de circuitos basados en SPICE o similares. Cuando las frecuencias involucradas en un circuito son muy altas comienzan a cobrar relevancia aspectos no-lineales como el efecto pelicular y las pérdidas en el dieléctrico. Ambos son efectos resistivos en función de la frecuencia, aunque respectivamente, en serie o en paralelo con respecto a la línea. Cuando se combinan muchos efectos como los recién descritos, el modelo SPICE de línea de transmisión resulta poco preciso y es preferible utilizar software especializado en el modelamiento de líneas de transmisión. Ver 3.4.2. En casos de complejidad extrema, es a veces necesario recurrir a la simulación electromagnética, donde ya no se requiere utilizar equivalentes circuitales de líneas de transmisión y otros elementos presentes en un circuito impreso. En este caso, se modela mediante estructuras físicas tridimensionales de distintos materiales bajo el estímulo de ondas electromagnéticas. Naturalmente, este es el método más exacto y preciso, sin embargo, exige modelar el circuito impreso como un objeto físico tridimensional. Esto que puede tomar mucho tiempo si es que el software de diseño de la PCB no facilita la trasformación. Requiere además, largos tiempos de simulación y los programas disponibles son extremadamente costosos. Ejemplos de este tipo de programas son Ansoft Designer, utilizado en la simulación de estructuras planares como PCBs, y Ansoft HFSS, que permite la simulación de estructuras tridimensionales complejas. Ver www.ansoft.com. 2.2.10. Conclusión La teoría recién presentada, como en todas las otras disciplinas de la ingeniería, puede ser aplicada en forma analítica, experimental o en simulación para resolver un problema. Entre los métodos analíticos aplicables al estudio de la dimensión analógica de la electrónica digital es poco lo que se puede extraer que no haya sido ya resuelto y que se aplique como norma. Si se entienden bien los fundamentos y modos de aplicación de estas normas, ellas pueden ser suficientes para resolver problemas y diseñar sistemas de un gran nivel de complejidad, es decir, circuitos con velocidades de reloj de hasta GigaHertz de frecuencia, y así es como se ha procedido en el diseño del hardware que acompaña esta memoria. Durante el proceso de diseño del proyecto práctico de esta memoria, se ha recurrido a la simulación de casos extremos en que se transgreden estas normas, intentando verificar la funcionalidad y el desempeño. Por último, las simulaciones han revelado un margen de seguridad tal, que no 30 se ha requerido validarlas mediante el uso intensivo de instrumentos de medición, salvo para ilustrar algunos conceptos. El análisis instrumental, al igual que la simulación, se vuelven indispensables cuando ocurren o se sospecha que pueden ocurrir muchos de los fenómenos antes descritos. En sistemas complejos y a GigaHertz de frecuencias de reloj, recurrir a estos métodos se vuelve extremadamente costoso. Los equipos de medición, ya sea el osciloscopio, analizador de espectro, analizador de red, u otro, deben ser capaces de medir fidedignamente varias veces mayor a la frecuencia de reloj para dar cuenta de la integridad de las señales. A la vez, estudiar un problema de diseño mediante experimentación puede requerir el desarrollo de sucesivos prototipos y otros subsistemas de prueba, incrementando todavía más el costo y el tiempo de desarrollo. Por otro lado, la simulación electromagnética, que es la opción actual para estudiar el comportamiento de los sistemas digitales más complejos, involucra la adquisición de licencias de software cuyo costo es del orden de cientos de miles de dólares. A demás, toma mucho tiempo modelar los circuitos en estructuras tridimensionales de múltiples materiales, y se requiere de una poderosa infraestructura computacional para resolver estos modelos. En resumen, cada ingeniero debe aprovechar las oportunidades de involucrarse en el desarrollo de hardware, y aprender de los éxitos y fracasos propios y ajenos para poder desarrollar un conjunto de normas propias. Ésta deberían permitirle diseñar en forma predominantemente eficiente y segura y, a la vez, minimizar costos en estudios de laboratorio y licencias de software. [Johnson93] presenta varias configuraciones experimentales que son simples y de bajo costo de implementación. Además existe software de simulación gratis aunque limitado. Ambas son alternativas que deben ser tomadas en consideración. 31 3. Diseño El diseño y a la implementación, son las dos etapas conducentes a obtener el producto entregado junto a esta memoria. La etapa de diseño puede descomponerse en 3 principales niveles de abstracción: el nivel de sistema o funcional, el circuital esquemático y el físico o pre-implementacional. Ese orden de abstracción descendente en el proceso es imperativo, no solo por el ordenamiento jerárquico de las distintas etapas, sino además por la combinación de dicha jerarquía con la naturaleza diferente de cada nivel de abstracción. Ésta metodología difiere de aquella que se utiliza en el diseño en otras disciplinas, como es el caso del desarrollo de software, en que ambas direcciones de nivel de abstracción son válidas al desarrollar un proyecto. Las tres etapas de diseño pueden segmentarse a la vez en niveles de abstracción y desarrollarse en nivel de abstracción creciente o decreciente. Esto se debe a que los segmentos de una misma etapa son de igual naturaleza. 3.1. Diseño del Sistema La plataforma de desarrollo está representada en un diagrama de bloques en la figura 14. Ésta cuenta con 2 unidades de procesamiento, una de bajo nivel (de abstracción) para procesamiento paralelo de alto desempeño y que consiste en un FPGA, y otra de alto nivel para procesos secuenciales, compuesta por un microcontrolador. Estos son los elementos que permiten a quien desarrolle aplicaciones con este hardware, implementar sus diseños vía software. Otras unidades en la plataforma permiten el almacenamiento de datos y la comunicación con el exterior. 3.1.1. FPGA, Configuración y Alimentación El elemento principal del sistema es el FPGA. Se ha optado por el FPGA Spartan 3E de Xilinx en su versión de 250k compuertas, ya que es el más grande (según número de CLBs) en encapsulado QFP13 - con pines en su periferia, a diferencia del encapsulado BGA14 que tiene contactos en su cara posterior y es mucho más difícil de soldar - y que es soportado por el software de desarrollo gratuito de Xilinx. Los principales recursos con los que cuenta este dispositivo se resumen a continuación: Número equivalente de macroceldas: 5508 13 14 QFP: Quad Flat Pack. BGA: Ball Grid Array. 32 Figura 14: Diagrama de bloques del diseño CLBs (Configurable Logic Blocks): 612 Los Bloques Lógicos Configurables contienen LUTs (Look-Up Tables) que implementan lógica combinacional, además de elementos de almacenamiento como Flip-Flops o Latches, y que permiten el desarrollo de lógica secuencial. Slices: 2448 Cada CLB está compuesto de 4 Slices, que replican exactamente el mismo hardware. RAM distribuida: 38Kb Elementos de memoria distribuida a través de los CLBs del dispositivo. RAM en bloque: 216Kb Bloques exclusivos de 18Kb de memoria RAM de doble puerto (un puerto para entrada y otro para salida). Multiplicadores dedicados: 12 Multiplicadores de 18 x 18 bits implementados mediante recursos exclusivos. DCMs (Digital Clock Managers): 4 Los Administradores Digitales de Reloj proveen distribución, retardo, multiplicación, división y ajuste de fase de las señales de reloj. 33 Máx. I/O: 17215 Los pines de entrada y salida permiten una amplia variedad de estándares digitales, facilitando en gran medida la interfaz con otros dispositivos. Max. I/O diferenciales: 6816 Estos datos permiten estimar la complejidad y tamaño de los diseños que pueden ser implementados sobre este dispositivo, aunque la práctica común es diseñar primero la aplicación y luego seleccionar el dispositivo. Naturalmente, en una plataforma de propósito general esto no es posible. Información detallada del dispositivo puede encontrarse en la hoja de datos [DS312]. La gran mayoría de los FPGAs tiene memoria de configuración (aquella donde se almacena el programa que determina su funcionalidad) de carácter volátil, es decir, que no retiene su configuración cuando se desconecta el voltaje de alimentación. Por este motivo, la mayoría de los diseños con FPGA incorpora una memoria EPROM en el circuito impreso, con el propósito de almacenar la configuración del FPGA. El FPGA la leerá cada vez que se le aplique voltaje y entre en funcionamiento. Para este propósito pueden utilizarse distintos tipos de EPROM, sin embargo, el más común es aquel para operar en modo “Master Serial”, donde el FPGA inicia la comunicación con le EPROM y lee los datos serialmente. Xilinx provee memorias especializadas para este propósito. Esta ha sido la opción en el diseño de la plataforma. La hoja de datos de cada FPGA indica el tamaño requerido de la EPROM para almacenar su configuración. Para cargar la configuración en el FPGA existen dos métodos en este diseño. En el primero, el FPGA lee la configuración de la EPROM automáticamente al inicializarse. En el segundo, la configuración puede escribirse externamente mediante la interfaz JTAG (Joint Test Action Group, un estándar de comunicación y monitoreo de circuitos). Para escribir la configuración en la EPROM también se utiliza JTAG. Además, se ha incluido un chip de comunicación USB que permite comunicación JTAG, en caso que el usuario desarrollador quisiera implementar software para utilizar USB como medio de programación. El FPGA requiere 3 distintos voltajes de alimentación, 1.2V para su operación interna, 2.5V para configuración, y 3.3V para entrada y salida (este último es una opción de diseño y puede tomar otros valores). Ello determina, en parte, los requerimientos para la fuente de 15 El diseño de la plataforma ya ha hecho uso de parte de estos recursos, por lo que la disponibilidad para el usuario es menor. 16 Ídem. 34 poder. En este caso se ha optado por generarlos a partir de un voltaje de alimentación principal de 5V. Probablemente la aplicación más simple de un FPGA es la de matriz de interconexión. Por este motivo, en la figura 14 se lo ubica en el centro con todos los otros dispositivos a su alrededor y ninguno de ellos conectado directamente. En el FPGA estas interconexiones se pueden implementar de manera flexible y óptima. 3.1.2. Periféricos Dos elementos esenciales en sistemas embedidos son el almacenamientos de datos y las comunicaciones. Por este motivo se han incorporado 3 tipos de memoria: 4Mb de almacenamiento no volátil con tecnología Flash, y dos tipos de memoria RAM: SRAM (100MHz) y SDRAM (133MHz). La ventaja de la primera es que es muy fácil uso en términos de interfaz lógica con el dispositivo al cual se comunica, peor su tamaño (en bytes) y velocidad son relativamente reducidos debido a la tecnología utilizada en su implementación y estructura interna. La segunda, tiene las ventajas de ser de gran tamaño y generalmente operar más rápido que las SRAM. Sin embargo, la interfaz de esta última es compleja, requiriendo que el usuario desarrolle código adicional para acceder a sus datos con una sencillez equivalente a la de la SRAM. RS232 y USB son las interfaces de comunicación incorporadas. El circuito integrado USB elegido, el FT2232 de FTDI (www.ftdichip.com), es extremadamente flexible y cuenta con 2 interfases independientes que pueden operar, desde el punto de vista del chip, como doble FIFO, una para entrada y otra para salida, o en modo Bit-Bang, donde los pines de cada interfaz pueden usarse como pines de entrada y salida en forma arbitraria. Adicionalmente, una de las interfases permite implementar distintos tipos de protocolos seriales, incluido JTAG. Por este motivo, se ha diseñado en el circuito la posibilidad de conectar el chip USB como parte de la cadena JTAG. Desde el punto de vista del PC, el fabricante provee controladores que permiten acceder al dispositivo como si fuera un puerto serial, minimizando el desarrollo de software requerido, y también provee una interfaz de programación para acceder a funciones más complejas. Se han incorporado también al diseño dos convertidores análogo-digitales (ADC) AD9283 de Analog Devices (www.analog.com) cuyas características principales son: 8 bits de resolución de cuantización 100 Mega-muestras por segundo 35 Circuito Track & Hold incorporado 475 MHz de ancho de banda analógico (-3dB). SNR = 46.5 dB @ 41 MHz a 100M-muestras/seg. Rango de entrada de 1Vp-p. Voltaje de referencia interno. Estas características lo hacen muy versátil, ya que este ADC mantiene un excelente desempeño en los distintos factores que definen su desempeño global y a lo largo de todo su rango de operación. En [AN282] se explican en detalle los parámetros de desempeño, tipos de convertidores análogo-digitales, y los efectos prácticos bajo distintas aplicaciones. Este documento permite interpretar en profundidad todas las características técnicas de estos convertidores, descritas en la lista anterior y en la hoja de datos del dispositivo. Es buena práctica incorporar los ADCs en el lado digital de un sistema de procesamiento de señales. A velocidades de reloj de 100MHz la integridad de señal (digital) se puede ver muy deteriorada si el dispositivo está lejos del FPGA. Si, por el contrario, se incorporan los ADCs en una placa de procesamiento analógico externa, puede contaminarse severamente la integridad de las señales analógicas en dicha placa debido al bus de datos digitales que debe llegar hasta ella. 3.1.3. Microcontrolador Se ha incorporado un microcontrolador de 8 bits, el PIC18F458 de Microchip (www.microchip.com) para realizar tareas de alto nivel (de abstracción), tareas que al ser programadas en el FPGA, pueden resultar tediosas y requerir una innecesaria cantidad de tiempo y recursos. Tener un microcontrolador en la plataforma de desarrollo permite concentrarse en el motivo principal del proyecto basado en lógica programable. Al mismo tiempo, una interesante metodología de desarrollo puede ser la de implementar funcionalidad prototipo en el PIC para transferirla, en etapas posteriores, al FPGA cuando se requiera mejorar el desempeño. También constituye un desafío la forma en que se reparten en una aplicación, las tareas entre el microcontrolador, un dispositivo basado en una CPU y un programa, y un dispositivo de lógica programable como el FPGA. Este desafío involucra eficiencia y metodología en el diseño y desempeño final. 36 El microcontrolador puede acelerar y simplificar el proceso de desarrollo de aplicaciones ya que por una parte, es posible programarlo en lenguajes de alto nivel y, por otra, que muchos ingenieros están familiarizados con la arquitectura del PIC. Las características principales de este dispositivo se señalan a continuación: Memoria de programa: 32KB (16384 Instrucciones) Memoria RAM: 1536 Bytes Memoria EPROM: 256 Bytes I/O: 3317 ADC: 8 Canales de 10 bits de resolución Comparadores Analógicos: 2 CCP (Capture, Compare and PWM (Captura, Comparación y Modulación por ancho de pulso)) Puerto serial síncrono que soporta: SPI (Serial Peripheral Interface (Interfaz de periférico serial)) e I2 C Maestro Hasta 10 Mips18 Interrupciones con prioridad configurable Multiplicador de 8 x 8 bits de un solo ciclo de instrucción 3 Pines de interrupción externa 3 Contadores, 2 de 16 bits, 1 de 8 bits Puerto serial asíncrono Interfaz CAN19 2.0B hasta 1 Mbps Ejemplos en la distribución de tareas entre una CPU y un FPGA son muchos instrumentos de medición o procesamiento de datos, en que el FPGA realiza la medición y cálculos, mientras que la CPU se encarga de la interfaz del usuario y otras funcionalidades secundarias del aparato. 17 El diseño de la plataforma ya ha hecho uso de parte de estos recursos, por lo que la disponibilidad para el usuario es menor. 18 Millones de instrucciones por segundo. 19 Controller Area Network, un estándar de comunicaciones industriales desarrollado por Bosch. 37 3.2. Diseño del Circuito Esta etapa de diseño permite implementar la funcionalidad explicitada en la sección anterior, en función de los requerimientos específicos de cada componente. Para lograr esto, primero deben haberse elegido los componentes adecuados que permitan y faciliten la interfaz entre ellos, así como la implementación de la funcionalidad deseada. Esto requiere estudiar en profundidad las especificaciones técnicas (hojas de datos) de todos los componentes del circuito. Es ésta la etapa en que se cometen la mayor cantidad de errores de diseño, por lo tanto es relevante recalcar la importancia de este proceso. Al mismo tiempo, debe considerarse cómo afectarán al diseño del circuito impreso las decisiones de diseño que se toman a nivel de circuito . Las huellas (foot-prints) de cada componente deben diseñarse u obtenerse de una librería de componentes, considerándose la disponibilidad del mercado. Generalmente, es conveniente adquirir los componentes con anticipación para poder realizar mediciones para diseñar la huella. El diseño de circuitos digitales es relativamente sencillo comparado con el diseño de circuitos analógicos a nivel esquemático. Por lo general el diseñador debe concentrarse más que nada en cómo satisfacer mejor las especificaciones de sistema. Más aún, en el caso de una plataforma multipropósito como ésta, ello es crítico. Por otra parte, las hojas de datos de los distintos componentes describen el circuito de soporte que debe implementarse para que aquellos operen correctamente. El diseñador debe mantenerse dentro de los márgenes especificados y si, por algún motivo, debe o desea modificar estos circuitos, es importante que comprenda su propósito para lograr mantener la funcionalidad con su propio diseño. En esta sección se describen algunas estrategias utilizadas y algunas partes del circuito que son relevantes al funcionamiento y uso del hardware desarrollado. 3.2.1. Diseño resistente a errores Debe tenerse presente que en proyectos de este nivel de complejidad los errores de diseño son frecuentes, e incluir en el circuito recursos que permitan implementar modificaciones posteriores a la fabricación del circuito impreso. En este caso, algunos de esto recursos son: Resistencias de 0Ω: Éstas permiten cortocircuitar dos segmentos o dejarlos en circuito abierto si no son soldadas en su lugar. Pueden también ser reemplazadas por resistencias de valor finito si fuese necesario. Puentes de Soldadura: Cumplen el mismo propósito de las resistencias de 0Ω, sin embargo, permiten mayor paso de corriente. 38 Jumpers: Cumplen el mismo propósito que las resistencias de 0Ω, sin embargo, los cambios pueden ser realizados por el usuario sin requerir soldar o de-soldar componentes. Usar el FPGA como matriz de interconexión: Al conectar la gran mayoría de los componentes al FPGA, debido a su reprogramabilidad, éste puede usarse para interconectar componentes vía software, lo que flexibiliza el diseño. Resistencias pull-up y pull-down: Si se estima que eventualmente podrían requerirse, pueden incluirse en el diseño. Si finalmente no se requieren, simplemente no son soldadas en su lugar. 3.2.2. JTAG y configuración del FPGA a 3.3V La interfaz JTAG y la de configuración (comunicación con la EPROM de configuración) del Spartan 3E utilizan 2.5V. Algunos pines del FPGA son dedicados a estas tareas, pero otros, luego de que la configuración del FPGA ha concluido, pueden utilizarse como pines de E/S. La configuración estos pines para trabajar con 2.5V, requiere alimentar un banco de E/S20 completo a 2.5V, obligando al usuario a trabajar con todos los pines de ese banco a dicho voltaje. Es deseable evitar esta situación por dos motivos. Primero, porque en una plataforma de desarrollo es preferible usar el/los estándares de E/S más comunes, que son LVCMOS33 y LVTTL33 que operan a 3.3V. Segundo, porque es más fácil encontrar programadores JTAG que operen a 3.3V que aquellos que operan a 2.5V. Para lograr la operación de todos los bancos y la interfaz JTAG a 3.3V se han implementado las modificaciones a la interfaz del FPGA, su memoria de configuración y el circuito de soporte según se describe en [Xapp453]. Dichas modificaciones se pueden observar en el diagrama esquemático del proyecto (Ver Apéndice), figura 37. 3.2.3. Controlador USB en la cadena JTAG Como ya se ha mencionado, el chip USB puede ser usado como dispositivo maestro o programador de la cadena JTAG. Sin embargo, sólo puede existir solo un dispositivo maestro en el circuito, por lo tanto, por defecto, este chip se ha dejado fuera de la cadena, aunque con la capacidad de incorporarlo, exclusivamente mediante configuración con jumpers. 20 Los pines de E/S del XC3S250E están separados en 4 bancos, los que pueden alimentarse con distintos voltajes para operar mediante distintos estándares de E/S. 39 Normalmente, los pines 3 y 5 del conector JTAG_TAP (Ver figura 39 del esquemático del proyecto en el Apéndice) se cortocircuitan dejando todos los demás desconectados. Esto deja al chip USB fuera de la cadena. Para incorporarlo, es necesario cortocircuitar los pines 2 (TDI) y 3 (TDO) del conector JTAG (Figura 37), y cortocircuitar los pares 1 y 2, 3 y 4, 5 y 6, 7 y 8, en el conector JTAG_TAP. Con esta modificación debiera ser evidente cómo se ha reemplazado el conector JTAG por el chip USB. 3.2.4. USB con alimentaciones del bus USB y de la placa El chip USB requiere una alimentación de 5V para la sección de comunicación con el BUS serial USB y de 3.3V o 5V para sus buses de datos (interfaz con otros dispositivos TTL/CMOS). El bus USB provee 5V y hasta 500mA de corriente, por lo que puede usarse esta u otra fuente regulada de 5V para alimentar dicha sección del chip. La hoja de datos del dispositivo proporciona esquemáticos para la distribución de poder con las siguientes configuraciones: Cuadro 3: Fuentes de poder para las secciones de comunicación USB y TTL/CMOS del chip USB. Comunicación USB TTL/CMOS Bus USB (5V) Bus USB (5V) Bus USB (5V) Bus USB regulado a 3.3V Externa a 5V Externa de 5V Externa a 5V Externa de 5V regulada a 3.3V En el diseño se ha deseado usar el bus USB como fuente de 5V para la comunicación USB. La placa puede ser alimentada externamente no sólo con 5V regulados, sino que acepta leves variaciones, las que no serían apropiadas para alimentar el chip. Mientras tanto, se ha deseado alimentar la interfaz TTL/CMOS del chip mediante los 3.3V provistos por la placa. Es innecesario utilizar potencia adicional del bus USB y agregar otro regulador de 3.3V a la placa para obtener dicho voltaje. Esta configuración, con fuentes independientes, no se incluye entre los esquemáticos guía de la hoja de datos. Sobre la base del segundo caso de la tabla se improvisó con éxito una solución como la deseada. Posteriormente, se encontró en la página web del fabricante una nota que sugería no utilizar fuentes independientes. Sin embargo, el único inconveniente encontrado consiste en que el chip completo se resetea al encenderse o apagarse la fuente de 3.3V del circuito, lo que no tiene consecuencias operacionales. 40 3.2.5. Circuitos de Reseteo En el diseño de este proyecto el microcontrolador y el FPGA pueden resetearse independientemente mediante pulsadores, mutuamente uno al otro, o desde una conexión externa. El chip USB también puede ser reseteado desde el FPGA. Los pines de reset de estos dispositivos son todos “Active Low”, por lo que se diseñan para estar normalmente en estado lógico “1” , mediante una resistencia pull-up y un condensador a tierra para obtener un filtro pasa-bajos. Esta estructura facilita la incorporación de fuentes de reseteo externas e independientes mediante un circuito como el que se observa en la figura 15 Figura 15: Circuito externo de reset Este ejemplo, extraído del esquemático del proyecto (figura 37), utiliza un transistor de propósito general con la suficiente capacidad de corriente para descargar rápidamente el condensador del filtro - si es que existe - y así llevar el pin de Reset a tierra gracias a la caída de voltaje que se produce en la resistencia pull-up. La resistencia de la base a tierra (R120 en este caso), asegura que el transistor esté en corte si es que la fuente externa de reset está “flotando”. Ésta debe ser considerablemente más grande que la resistencia en series (R119) para no producir entre ambas un divisor de voltaje muy grande. El propósito de esta resistencia es limitar la corriente y debe calcularse en función de la ganancia del transistor elegido, la resistencia pull-up, el tamaño del condensador del filtro y la rapidez con que se desea que el pin de reset llegue a un voltaje lo suficientemente bajo que resetee el dispositivo. 3.2.6. Buses de las memorias SRAM y SDRAM Estas memorias comparten el bus de dirección y el bus de datos. Sus líneas de control son independientes y llevan resistencias pull-up en su pin de activación para prevenir colisiones. 41 3.2.7. Configuración de la fuente de poder La placa debe ser alimentada por una fuente regulada de 5,0 ± 0,5V. En su entrada comprende un diodo Zenner de 5.6V y 3W entre los terminales de entrada. De esta manera, si la fuente principal de alimentación cuenta con limitador de corriente, el diodo proveerá protección en el caso que se supere el máximo voltaje de alimentación o que se conecte la fuente en polaridad inversa. A partir del voltaje de alimentación principal se generan: 3.3V para la alimentación de todos los dispositivos mediante un regulador switching o conmutado capaz de entregar hasta 2.5A. 2.5V para la configuración del FPGA mediante un regulador lineal tipo Low-dropout. 3.0V para la alimentación la parte analógica de los convertidores A/D mediante un regulador lineal tipo Low-dropout. Adicionalmente, y a partir de los 3.3V ya generados, se generan 1.2V para la lógica interna del FPGA, también mediante un regulador lineal tipo Low-dropout, capaz de entregar hasta 800mA. Las fuentes de 5V, 3.3V, 2.5V y 1.2V alimentan LEDs para indicar su funcionamiento. 3.2.8. ICSP a 5V y PIC alimentado con 3.3V El PIC18F458 puede operar con un voltaje de alimentación entre 1.8V y 6V. Como la plataforma opera con todas sus señales digitales a 3.3V, el PIC debe, naturalmente, operarse al mismo voltaje. Sin embargo, durante su proceso de programación, el PIC debe ser alimentado con 5V que son entregados por el programador. Por este motivo, la alimentación normal del PIC se realiza a través de un diodo Schottky de potencia. Esto último para que al aplicar los 5V en los pines de alimentación del PIC, este voltaje no se propague al resto del circuito y cause un corto-circuito con la fuente de 3.3V de la placa. Ver el esquemático del proyecto, figura 40. Este diodo tiene el efecto de reducir el voltaje de alimentación del PIC cuando éste demanda mucha corriente. Cuando la corriente demandada es mínima, el voltaje de alimentación es de aproximadamente 3V. Se han observado casos, sin embargo, en que éste se ha reducido casi a 2.5V. Esto no es problema para la operación del PIC y generalmente tampoco en su interfaz con el FPGA, ya que el umbral entre estados lógicos de este dispositivo es el valor medio del voltaje de alimentación del banco de E/S, que en este caso corresponde a 3,3V /2 = 1,65V . 42 Por si la caída de voltaje en el diodo causase problemas, se ha incluido un jumper (JP63) en paralelo al diodo con el fin de cortocircuitarlo. Es importante recordar que hay que quitarlo cuando se programe el microcontrolador. Otro aspecto a considerar durante la programación de PIC es que se aplican 13V en su pin de reset o MCLR/Vpp. Se han tomado las precauciones en el diseño para que este voltaje no se propague al resto del circuito. 3.2.9. Particularidades en el circuito de conversión A/D El principal objetivo al diseñar un circuito de conversión análogo-digital, es mantener la integridad de la señal analógica. Para este propósito, se ha tenido gran cuidado en el sistema de alimentación, utilizando varios condensadores de filtro, antes y después de la regulación, y una ferrita en la entrada para eliminar las componentes de alta frecuencia que se pudieran haber propagado a la fuente de 5V debido a la fuente conmutada de 3.3V o las transiciones digitales en la placa. Luego, por simplicidad, se optó por utilizar los convertidores con su entrada analógica referida a tierra, aún cuando pudiese haberse configurado la entrada en forma diferencial. En el lado digital, las líneas PWRDOWN, que permiten deshabilitar el dispositivo (ActiveLow), se conectaron vía resistencias pull-up a Vcc y se incorporó un filtro RC para evitar que el ADC se resetease por ruido inducido en dicha línea. 3.3. Diseño del PCB 3.3.1. Restricciones al diseño Lo primero a considerar son las posibles restricciones a los objetivos planteados. La versatilidad en el diseño ya se ha establecido a nivel de sistema. Al diseñar la PCB los parámetros a optimizar son costo, tamaño y desempeño. Este último, se refiere principalmente a la integridad de señal, la cual es la principal limitante a las altas velocidades de reloj. Como se ha ilustrado anteriormente, la integridad de señal requiere de conexiones cortas entre componentes (dado que no es factible incluir terminaciones en todas las líneas), lo que naturalmente hace que el circuito impreso sea más pequeño (menor superficie). Entonces, el tamaño y el desempeño se optimizan mutuamente. Sin embargo, comprimir un circuito impreso en un área menor, implica por lo general, aumentar el número de capas de cobre. El número de capas de cobre es el factor principal en el costo de la PCB. A la vez la PCB constituye gran parte del costo del circuito. Por este motivo el costo juega en sentido opuesto a los otros dos 43 Cuadro 4: Restricciones técnicas de Advanced Circuits para la promoción de prototipos de 4 capas. Parámetro Restricción Tiempo de Fabricación 5 días Número de capas 4 Dieléctrico FR-4 Espesor del cobre 1 oz/f t2 (0.035mm) Ancho/Espacio entre líneas >0.006” (0.15mm) Diámetro de agujeros >0.015” (0.38mm) factores mencionados. Las empresas en el rubro de fabricación de circuitos impresos en los EE.UU. generalmente ofrecen promociones para la fabricación de prototipos en 2 y en 4 capas. Más de 4 capas implica un costo desproporcionadamente mayor. Considerando el número de componentes (~250), de pines en cada uno (~1000 en total), y el número de distintos voltajes de alimentación requeridos (5), se ha estimado que no son necesarias más de 4 capas. Es prácticamente imposible implementar el diseño en sólo 2 capas a menos que se utilice una placa muy grande, lo que requeriría pistas muy largas y con muchos cambios de lado (capa). Esto deterioraría el desempeño. La empresa que se seleccionó en el presente trabajo para fabricar la placa es Advanced Circuits (www.4pcb.com) ya que sus precios son razonables y varios de los ingenieros que han apoyado este trabajo han tenido buena experiencia con esta empresa. El precio por la fabricación de prototipos de 4 capas no es más que el doble del precio de aquellos de 2 capas. Esta elección implica las restricciones técnicas impuestas por la compañía para esta promoción. Éstas se encuentran resumidas en la tabla 4. El grosor de las distintas capas, la elección de utilizar las pistas exteriores para las señales y las interiores para la tierra y alimentación pueden observarse en la figura 16. A partir de esta información se ha elegido arbitrariamente un ancho de pista de 0.010” (0.254 mm) y una separación entre pistas de al menos 0.010”, lo que cumple con las restricciones con un buen margen de seguridad, y se adecua bien al ancho y separación de los pines de todos los circuitos integrados en este diseño. Las vías se han diseñado con un agujero de 0.015” de diámetro y un diámetro exterior de 0.028”. Con esta información sabemos que las pistas en ambos lados forman líneas Microstrip, y contamos con la información suficiente para calcular sus parámetros. 44 Figura 16: Geometría de la PCB de 4 capas de Advanced Circuits Cuadro 5: Tiempos de levantamiento Tr para distintas configuraciones de los estándares de E/S del FPGA, LVCMOS33 y LVTTL según los modelos IBIS de Xilinx, y la longitud critica de la línea de transmisión correspondiente. Estándar Tr [ns] fknee [MHz] λ/6 [mm] LVTTL_S_2 1.27 394.9 38 LVTTL_S_8 1.20 418.4 36 LVTTL_F_2 0.36 1408 11 LVTTL_F_8 0.33 1502 10 LVCMOS_S_2 1.27 394.6 38 LVCMOS_S_16 1.02 488.8 30 LVCMOS_F_2 0.36 1404 11 LVCMOS_F_16 0.32 1558 10 3.3.2. Parámetros de las líneas de transmisión Evaluando las fórmulas 4 y 5 con la información anterior sobre geometría y material, obtenemos una impedancia característica Z0 = 61,6 Ω y un tiempo de propagación de Tp = 5,61 ns . m El cuadro 5 muestra la longitud de la línea de transmisión, λ/6, longitud a la cual se comienza a comportar como tal para distintos tiempos de levantamiento, y que corresponden a distintos estándares de entrada y salida soportados por el Spartan 3E. La información de esta tabla permite discriminar si las pistas en el diseño requieren atención especial por estar cerca o sobre el límite de λ/6, en cuyo caso deben realizarse simu- 45 laciones para verificar la integridad de la señal en ellas. Si ésta no es adecuada, puede ser necesario redistribuir componentes para disminuir la longitud de las pistas, minimizar bifurcaciones, u otros. 3.3.3. Proceso de diseño El proceso de diseño de una PCB de nivel profesional es un proceso iterativo entre actualizaciones de los esquemáticos, simulaciones circuitales, simulaciones electromagnéticas y actualizaciones de la PCB. La base teórica para el diseño de la PCB es principalmente lo que se describe en la sección 2.2. A continuación se presentan los distintos pasos requeridos en este proceso. (a) Verificar todas las huellas La huella de un componente es el patrón de cobre sobre el cual va soldado el componente en el circuito impreso. La figura 17 muestra la huella y las dimensiones sugeridas para un componente de empaquetado DPAK. Esta información se encuentra en las hojas de datos de los componentes, por lo que puede contrastarse con librerías preexistentes o pueden crearse nuevas librerías a partir de la información del fabricante. Es importante asegurarse que el componente que se adquiere finalmente tenga la geometría que se ha utilizado en la PCB. Figura 17: Dibujo tri-dimensional y huella de un empaquetado de circuito integrado DPAK. (b) Distribuir componentes Consiste en ubicar los componentes del circuito estratégicamente sobre las caras de la placa para cumplir varios propósitos. Dos de los principales son a) facilitar la interconexión entre los componentes, tanto para minimizar el tiempo y esfuerzo de ruteo y mantener una 46 buena integridad de señal y, b) lograr un diseño espacialmente adecuado, como sería por ejemplo, ubicar aquellos componentes destinados a la interfaz del circuito con el exterior en la periferia de la placa. Algunos programas computacionales realizan la distribución de componentes en forma automática, intentando optimizar ciertas variables predefinidas o especificadas por el usuario, como las mencionadas anteriormente. (c) Verificar sugerencias de diseño de cada CI en hojas de datos En muchos casos, los fabricantes ya han determinado los circuitos de soporte óptimos para ciertos circuitos integrados, al igual que su distribución geométrica en la PCB. Particularmente, en el diseño de este circuito, el fabricante de los convertidores A/D establece una serie de reglas y sugerencias para evitar la contaminación de la señal analógica. En el caso de circuitos integrados digitales de alta velocidad, como el reloj de 100MHz, se especifica dónde ubicar el condensador de desacoplo en relación al dispositivo. (d) Establecer reglas de diseño Entre las reglas principales se encuentran el ancho mínimo de las pistas, la distancia mínima entre pistas de distinta señal, el diámetro mínimo de los agujeros, el diámetro mínimo del cobre alrededor de una vía, entre muchas otras. La gran mayoría de los programas de diseño de circuitos impresos permite definir estas reglas y muchas más. Es importante que el software elegido para el diseño cuente con a) la factibilidad de definir con precisión reglas de diseño en las áreas de funcionalidad electrónica, de factibilidad de fabricación, de costos, de integridad de señal, y otros y, b) permita verificar dichas reglas en un diseño. No es posible para una persona llevar a cabo esta tarea en forma metódica, completa y en tiempo razonable. Un computador puede llevarla a cabo en segundos o minutos y sin omisiones. (e) Realizar ruteo21 tentativo El ruteo consiste en definir geométricamente las conexiones eléctricas determinadas previamente en forma esquemática entre dispositivos. La dificultad de esta tarea radica en que, a su vez, consiste en optimizar el proceso en varias variables con los recursos limitados de 21 Castellanización de Routing. Formalmente debiese ser Enrutamiento. 47 área y número de capas de la PCB (Tiempo y presupuesto también son restricciones de un enfoque no técnico). La mayoría de los paquetes de software de diseño de circuitos impresos de nivel profesional, incluye la funcionalidad de ruteo automático con optimización de parámetros, incluido el software utilizado para desarrollar este proyecto. Desafortunadamente, el proceso es tan complejo, que el resultado del ruteo automático es generalmente poco óptimo. Por este motivo, muchos ingenieros prefieren realizar manualmente el ruteo completo o, al menos de las partes críticas, dejando el resto al sistema de ruteo automático. Esto, si el tiempo lo permite y/o si es absolutamente necesario, ya que el ruteo es un proceso iterativo que comprende un gran porcentaje del diseño total de un circuito electrónico. El ruteo automático puede lograr resultados aceptables en pocas horas o minutos, permitiendo minimizar el tiempo de salida al mercado. En esta etapa el ruteo es tentativo, ya que se encontrarán numerosas dificultades que harán necesario re-intentar o cambiar una estrategia de ruteo, o volver a reacomodar componentes para facilitar el proceso. En el caso de la interconexión de dispositivos con un FPGA, el proceso consiste en intentar el ruteo y luego reasignar las señales del FPGA a distintos pines. Como se puede observar en los diagramas del circuito impreso del proyecto, muchas interconexiones mantienen el orden de las señales en el FPGA según el orden de los pines del dispositivo al cual se conecta, sin la necesidad de cambios de capa. (f) Simular integridad de señal En aquellos casos en que las pistas sean muy largas, tengan muchas bifurcaciones, cambios de capas en la PCB, estén enrutadas con muy poca separación entre una y otra, o cualquier otra situación en la que se sospeche que pueda verse afectada la integridad de las señales, puede ser necesario realizar simulaciones para comprobar esta posibilidad. A pesar de que existe software que permite verificar la integridad de señal en todo un circuito impreso en forma automatizada y en base a restricciones predefinidas, la relativa simplicidad de esta PCB, es decir pocas capas, líneas de transmisión relativamente cortas, pocas vías y pocas bifurcaciones, solo hicieron necesaria la verificación por simulación de algunas situaciones que significaban casos extremos y, por lo tanto, representarían a todos los otros casos si es que se cumple con la integridad de señal mínima necesaria. La figura 18 ilustra los 3 casos que se han considerado como críticos. (a) y (b) son líneas con 2 cargas en distintas configuraciones y relativamente largas en las que se presume puede 48 existir oscilaciones debido a las reflexiones en 3 distintos puntos. El caso (c) puede presentar un alto acoplamiento inductivo y, por lo tanto, interferencia cruzada. Estos casos se han simulado bajo distintos escenarios. Figura 18: Casos críticos (a) y (b): Líneas con 2 cargas. Caso (c): líneas largas paralelas. Para simular con precisión es necesario contar a la vez con los modelos más precisos de los distintos elementos involucrados en la simulación. Los modelos de las compuertas del FPGA utilizados son modelos IBIS descargados del sitio web de Xilinx, mientras que las compuertas utilizadas como carga son modelos SPICE de compuertas genéricas CMOS de 3.3V que se encuentran incluidas en la librería de componentes del programa utilizado. El modelo de las líneas de transmisión puede especificarse mediante los parámetros ya calculados en 3.3.2, o especificando la geometría y materiales del circuito impreso. Se ha optado por este segundo método, ya que ofrece mayor precisión que las aproximaciones provistas por las fórmulas de la sección 3 y que se observa en la figura 19. Compárese los valores obtenidos para Z0 , en este caso, con aquellos calculados en 3.3.2. 49 Figura 19: Especificación de la geometría y materiales del PCB para el programa HyperLynx. La simulación de los casos (a) y (b) se ha ejecutado utilizando 3 distintos estándares de salida configurables en el FPGA: LVCMOS33_S_6, LVCMOS33_S_12 y LVCMOS33_F_12. Ver la tabla 5. La figura 20 muestra el modelo de simulación para (a) donde U3.1 representa la compuerta de salida del FPGA, U4.1 representa la compuerta de entrada de la SDRAM y U6.1 la compuerta de entrada de la SRAM. TL3 y TL7 representan los segmentos de línea que interconectan estas compuertas. Los gráficos posteriores representan las formas de onda en los distintos nodos para los 3 estándares de I/O mencionados, con una frecuencia de reloj de 75 MHz. La última fila muestra los diagramas de ojo respectivos para un tren de datos aleatorio a la misma frecuencia. La figura 21 muestra lo mismo para el caso (b) a excepción de los diagramas de ojo. 50 Formas de onda en fuente y cargas utilizando una etapa de salida LVCMOS33_S_6 Formas de onda en fuente y cargas utilizando una etapa de salida LVCMOS33_S_12 4 Formas de onda en fuente y cargas utilizando una etapa de salida LVCMOS33_F_12 5 FPGA SDRAM SRAM 3.5 3 5 FPGA SDRAM SRAM 4 FPGA SDRAM SRAM 4 3 2 1.5 1 Voltaje [V] 3 Voltaje [V] Voltage [V] 2.5 2 2 1 1 0 0.5 0 −1 0 −0.5 0 5 10 Tiempo [ns] 15 −1 20 0 5 10 Tiempo [ns] 15 −2 20 0 5 10 Tiempo [ns] 15 20 Figura 20: Simulación del caso (a) Formas de onda en fuente y cargas utilizando una etapa de salida LVCMOS33_S_6 Formas de onda en fuente y cargas utilizando una etapa de salida LVCMOS33_S_6 4 Formas de onda en fuente y cargas utilizando una etapa de salida LVCMOS33_F_12 5 FPGA SDRAM SRAM 3.5 3 5 FPGA SDRAM SRAM 4 FPGA SDRAM SRAM 4 3 2 1.5 1 Voltaje [V] 3 Voltaje [V] Voltaje [V] 2.5 2 2 1 1 0 0.5 0 −1 0 −0.5 0 5 10 Tiempo [ns] 15 20 −1 0 5 10 Tiempo [ns] 15 20 Figura 21: Simulación del caso (b) 51 −2 0 5 10 Tiempo [ns] 15 20 La figura 22 muestra el modelo y los resultados de la simulación para el caso (c). Este modelo requiere la especificación, adicional a la provista e ilustrada en la figura 19, de la interacción entre ambas líneas de transmisión, que consta básicamente en la longitud de la región de acoplamiento, el ancho de las pistas y la separación entre sus centros. La línea punteada diagonal entre las líneas de la figura indica que se encuentran acopladas. U7.1 se encuentra en el estado “0” durante toda la simulación, mientras que U3.1 oscila a una frecuencia de 75 MHz. El objetivo es observar el efecto de TL8 sobre TL7 en la carga (R1 y R2 están balanceadas con la impedancia de la línea). Por este motivo, denominamos la línea TL8 como Agresor y a la TL7 como víctima. Los gráficos de la figura muestran distintas configuraciones. La primera, utiliza un estándar LVCMOS33_S_6 y el resto de los parámetros son tal como se han construido el circuito impreso real. Las configuraciones utilizadas en los otros casos están descritas en los títulos de los gráficos. Compárese entre gráficos y verifique la validez de la ecuación 15. 52 Formas de onda en línea agresora y línea víctima utilizando una etapa de salida LVCMOS33_S_6 Formas de onda en línea agresora y línea víctima utilizando una etapa de salida LVCMOS33_F_12 0.2 0.2 0.15 0.15 Formas de onda en línea agresora y línea víctima utilizando una etapa de salida LVCMOS33_S_6 y doble longitud 0.4 R1 (Agresor) R2 (Víctima) 0.3 0.1 0.1 0.05 0.05 0 −0.05 Voltaje [V] Voltage [V] Voltaje [V] 0.2 0 0.1 −0.05 0 −0.1 −0.1 R1 (Agresor) R2 (Víctima) −0.15 −0.2 0 5 10 15 Tiempo [ns] 20 25 30 −0.2 0 5 10 15 Tiempo [ns] Formas de onda en línea agresora y línea víctima utilizando una etapa de salida LVCMOS33_S_6 y mitad de separación 20 25 30 −0.2 0 5 10 15 Tiempo [ns] 20 25 30 Formas de onda en línea agresora y línea víctima utilizando una etapa de salida LVCMOS33_S_6, doble longitud y carga capacitiva de 10pF 0.5 R1 (Agresor) 0.4 R2 (Víctima) 0.2 R1 (Agresor) R2 (Víctima) 0.15 0.3 0.2 Voltaje [V] 0.1 Voltaje [V] −0.1 R1 (Agresor) R2 (Víctima) −0.15 0.05 0 0.1 0 −0.1 −0.2 −0.3 −0.05 −0.4 −0.1 0 5 10 15 Tiempo [ns] 20 25 −0.5 30 0 5 10 15 Tiempo [ns] 20 25 30 Figura 22: Simulación del caso (c) (g) Reacomodar componentes o intercambiar líneas en el FPGA: Gracias a que en el FPGA, la líneas de entrada y salida pueden configurarse vía software, las interconexiones entre el FPGA y otros dispositivos pueden reacomodarse para facilitar el diseño de la PCB. Por este motivo, puede observarse, en casos como las memorias RAM, que todas las líneas de datos, control y dirección, se encuentran paralelas y en la misma cara de la placa. 53 (h) Verificar las reglas de diseño Aunque esta es una tarea que realiza el software de diseño, siempre es necesario inspeccionar visualmente los resultados. Imprimir el diseño en tamaño doble puede ayudar a localizar zonas críticas y potenciales problemas. 3.3.4. Diseño flexible Como se ha mencionado antes, es crucial tener los potenciales errores en mente al momento de diseñar. Además, en el caso de la PCB, es importante considerar las potenciales dificultades de ensamblaje y uso que puedan surgir debido a un inadecuado diseño mecánico. 3.4. Recursos, Técnicas y Herramientas 3.4.1. Software de Diseño Altium DXP (www.altium.com) Este es un paquete de software integrado para el diseño completo de sistemas electrónicos embedidos. Está orientado principalmente al diseño de aplicaciones con FPGAs. Del conjunto de herramientas provistas por este software se han utilizado únicamente el editor esquemático de circuitos y el diseñador de circuitos impresos. Ambos trabajan en forma integrada permitiendo exportar las modificaciones al circuito de un ambiente a otro. Altium DXP es uno de los paquetes de diseño más utilizados hoy en la industria electrónica. Provee funcionalidad para desarrollar los proyecto más complejos que se puedan concebir. Aprender su uso y desarrollar habilidad con este software es una inversión valiosa para el ingeniero. La última versión de este software se conoce como Altium Designer. Xilinx ISE Webpack 9.2i (www.xilinx.com) Esta es la versión gratuita del ambiente de desarrollo para dispositivos de lógica programable de Xilinx. Permite desarrollar aplicaciones para FPGAs y CPLDs en los lenguajes de descripción de hardware VHDL y Verilog, al igual que en forma esquemática. Pueden combinarse en un mismo proyecto componentes lógicos desarrollados mediante estas distintas vías. 54 Adicionalmente, el software realiza la síntesis del diseño para el dispositivo específico a utilizar, y genera las archivos de configuración para ser cargados directamente en los dispositivos de lógica programable o en memorias de configuración no volátiles. Este software se ha utilizado para el desarrollo de las aplicaciones de prueba del hardware que requieren de la intervención del FPGA. CCS PIC C Compiler 3.2 (www.ccsinfo.com) PIC C es un compilador de lenguaje C (ANSI con pequeñas modificaciones para adaptarlo a microcontroladores) para microcontroladores PIC de Microchip. Este compilador se ha utilizado para el desarrollo de las aplicaciones de prueba del hardware, en la que se requiere la intervención del microcontrolador. 3.4.2. Software de Simulación Microcap 7.0 (www.spectrum-soft.com) Microcap es un popular software de captura de esquemáticos y simulación SPICE. Permite diseñar y verificar componentes analógicos incorporados en el diseño, al igual que el comportamiento de líneas de transmisión bajo la presencia de pulsos cuadrados con distintos tiempos de levantamiento. HyperLynx 7.5 (www.mentor.com) Este es un software especializado en la simulación de líneas de transmisión con señales digitales, permitiendo especificar, en particular, mediante distintos modelos, las etapas de entrada y salida de las compuertas digitales, todos los parámetros de las líneas, y simular la interferencia cruzada entre líneas de transmisión paralelas. 3.4.3. Otro Software PICkit 2 v2.11 (www.microchip.com) Este es un kit de hardware y software para la programación (cargar el programa en el dispositivo) y depuración de microcontroladores PIC en forma In Circuit Serial Programming (ICSP) o programación del dispositivo en circuito, lo que quiere decir que el dispositivo no requiere ser retirado de su circuito huésped para ser programado, siempre y cuando el circuito huésped esté diseñado con este propósito en mente y cuente con el conector adecuado. 55 Digilent Export 1.8.0 (Adept Suite, www.digilent.com) Este es un software que en combinación con el cable USB-JTAG de Digilent, permite cargar programas y monitorear circuitos mediante el estándar JTAG, como es el caso de los FPGAs y sus memorias de configuración. MProg 3.0a (www.ftdichip.com) Este software permite configurar los dispositivos USB de FTDI. La configuración es grabada en la EPROM externa conectada al dispositivo, si es que la memoria está presente. En el caso del dispositivo utilizado en este hardware, el FT2232, MProg permite configurar el chip para operar en sus distintos modos, ya sea RS232, FIFO, BitBang, y otros, así como explicitar qué controladores, Puerto Serial Virtual o D2XX, se utilizará para acceder al dispositivo desde el PC. 3.4.4. Herramientas de Soldadura y Montaje Estación de soldadura de temperatura regulable y puntas intercambiables Es imprescindible contar con control de temperatura en la punta de soldar, ya que existen componentes de tamaño físico muy variado, al igual que las superficies de cobre a las cuales serán conectados. Por lo tanto, es necesario adecuar la temperatura del cautín a la cantidad de calor disipada por estas combinaciones. Por ejemplo, para soldar adecuadamente un pin de un dispositivo QFP a una pista de 0.010 pulgadas, se requiere muchísima menos temperatura que para soldar un diodo de potencia a un plano de tierra. Microscopio Estereoscópico Debido a los tamaños de los componentes en el circuito impreso, para soldar y verificar la soldadura, es necesario trabajar bajo un microscopio. Es importante que sea estereoscópico para poder tener una visión tridimensional de los componentes y para poder trabajar con comodidad durante períodos prolongados utilizando ambos ojos. Es indispensable que los niveles de aumento y la intensidad de la luz sean regulables. Horno de Soldadura Esta herramienta permite un método de soldadura alternativo al cautín y presenta ventajas cuando se desea soldar una gran cantidad de componentes a la vez. El procedimiento de 56 soldadura con esta herramienta consiste en la aplicación de soldadura en pasta en los puntos a soldar sobre la placa, poner los componentes en su lugar, con sus contactos sobre la soldadura. Luego la placa se introduce en el horno, el que aplica un perfil de temperatura genérico, que en la mayoría de los casos es adecuado, o puede ser configurado por el usuario. Si se van a soldar componentes en ambos lados de la placa mediante este mismo método, es necesario que aquellos componentes soldados en el primer lado sean pequeños y de poco peso, de manera que al voltear la placa para soldar los componentes en el otro lado, aquellos componentes que quedan cara abajo en el horno, se sostengan en su lugar por la tensión superficial de la soldadura cuando ésta se funda. 3.4.5. Instrumentos de Medición Se han utilizado distintos instrumentos de medición en el proceso de verificación del hardware, no tanto así durante el ensamblaje, donde se utilizaron más que nada para verificar conexiones y corto-circuitos. Osciloscopio Este es el instrumento principal para verificar sistemas cuyas señales eléctricas evolucionan en el tiempo. Ya que el hardware desarrollado es principalmente digital, gran parte de la verificación se ha realizado enviando datos al puerto serial del PC. Sin embargo, el osciloscopio es imprescindible en aquellos casos en que lo anterior falla y/o en que se desea verificar la integridad de las señales estudiadas. En otras palabras, permite una observación del sistema a más bajo nivel. Este instrumento debe cumplir con ciertas características técnicas, específicas para la observación de señales digitales. Debe permitir, principalmente, observar sin distorsión los flancos de subida y bajada de las señales digitales. Esto se logra cuando el instrumento cuenta con un ancho de banda superior a fknee y una frecuencia de muestreo varias veces la tasa de Nyquist para esta frecuencia. Algunos osciloscopios poseen una tasa de Nyquist inferior a la correspondiente a su ancho de banda, lo que permite igualmente, mostrar señales con componentes de frecuencia hasta dicho ancho de banda, pero sólo cuando éstas son periódicas. La figura 23 muestra el osciloscopio utilizado para las pruebas del circuito, el que cuenta con un ancho de banda de 500MHz y una tasa de muestreo de 5 Giga-muestras por segundo. 57 Figura 23: Osciloscopio Tektronix 5054B-NV Fuente DC, Generador de señales, multímetro, etc. Es evidentemente necesario utilizar una fuente de poder para alimentar el circuito. Idealmente, debe tener limitador de corriente en caso de ocurrir cualquier falla o que se haya invertido la polaridad. Un multímetro es necesario para verificar los voltajes de alimentación, cortocircuitos, circuitos abiertos e impedancias. Se ha utilizado un generador de señales, únicamente para verificar la operación de los convertidores análogo-digitales. 58 4. 4.1. Implementación y verificación del prototipo Fabricación de la PCB Como se mencionó anteriormente, la empresa seleccionada para la fabricación de las PCB fue Advanced Circuits (www.4pcb.com). Ellos imponen ciertas restricciones técnicas que debe cumplir el diseño antes de que se lo acepte para ser fabricado. Estas restricciones pueden ser verificadas por el usuario mediante la funcionalidad de chequeo de reglas o DRC (Design Rule Check) provista por la mayoría de los programas de diagramación de PCBs, o bien, mediante un sistema en línea que provee el fabricante para verificar que se cumpla su set de restricciones. Para este proyecto se utilizaron ambos métodos de verificación. No tan solo deben verificarse las restricciones técnicas de fabricación, sino también, errores circuitales, orientación de componentes, facilidad de ensamblaje, entre otros. El costo de la PCB es un porcentaje importante dentro del costo total del producto, por lo que las verificaciones mencionadas son sumamente importantes. Pasar por alto errores puede significar que se deba rehacer por completo el prototipo, dañar componentes, limitar la utilidad, o requerir reparación “artesanal” que puede afectar considerablemente la presentación visual y confiabilidad de la placa. 4.2. Adquisición de componentes Los componentes fueron adquiridos vía Internet en la compañía Digi-key (www.digikey.com), proveedora de componentes electrónicos más grandes de Norteamérica. Se realizaron varios pedidos. Los primeros destinados a realizar mediciones físicas a los componentes para diseñar su huella (foot-print). Los que siguieron completaban los componentes requeridos y, los últimos consistieron en la adquisición de componentes olvidados o que fueron dañados en alguna etapa del proceso de implementación. 4.3. Ensamblaje Se utilizaron dos métodos de soldadura: soldadura en horno para los componentes en la cara posterior de la PCB y soldadura manual con cautín para los componentes de la capa superior. La soldadura en horno consiste en aplicar soldadura en pasta en todas las huellas de los componentes en una sola cara de la PCB y luego poner los componentes en su lugar. Posteriormente, se introduce la PCB en el horno, el cual aplica un perfil de temperatura ideal 59 que primero activa la pasta y posteriormente derrite la soldadura. Después de esperar que la placa se enfríe lentamente, puede limpiarse con alcohol y una brocha. Este método es ideal para la cara posterior de la PCB debido a que contiene casi únicamente condensadores y resistencias, ambos en gran cantidad. La capa superior contiene componentes muy diversos en estructura y tamaño, lo que la hace más apta para soldadura manual con cautín. Además, es recomendable soldar los componentes en etapas, para poder realizar pruebas antes de proseguir con la siguiente. Esto es especialmente importante en el caso de la fuente de poder, de la cual hay que asegurarse que esté entregando los voltajes adecuados antes de soldar el resto de los circuitos integrados. El tamaño de los componentes, así como el tamaño y separación de los pines hacen necesario trabajar constantemente bajo el microscopio durante el proceso de soldadura y ensamblaje. La soldadura manual requiere mucha práctica y conocimiento. No es el propósito de esta memoria profundizar en esto, pero determina la calidad y durabilidad del producto. 4.4. Verificación Para la verificación de la placa se han diseñado las pruebas enumeradas a continuación. APP1 a APP8 son pequeños diseños de prueba y que se recomiendan como ejercicio para nuevos usuarios. En el caso puntual de esta memoria sólo cumplen con la función de demostrar el correcto diseño y su funcionalidad. 4.4.1. Prueba de Fuente de Poder Esta prueba debe realizarse después de soldar los componentes de la fuente de poder y antes que los componentes restantes. El propósito es verificar que la fuente de poder esté entregando los voltajes esperados, y así evitar que se dañe algún componente. Al agregar más componentes y realizar aplicaciones más complejas los voltajes se mantuvieron estables y en ninguno de los componentes de la fuente de poder aumentó significativamente temperatura. La corriente en las aplicaciones más complejas alcanzó aproximadamente 400mA. 4.4.2. Verificación de la cadena JTAG Esta prueba puede llevarse a cabo una vez que se han soldado en su lugar el FPGA y la EPROM de configuración con todos sus componentes anexos. Ambos conforman la cade60 na JTAG. Si el programador reconoce ambos componentes, quiere decir que ya pueden ser programados. La mayoría de los programadores JTAG despliega una representación gráfica de la cadena, que en el caso de este proyecto, debería ser similar a lo ilustrado en la figura 24 Figura 24: Cadena JTAG de la Plataforma de Desarrollo 4.4.3. APP1: Divisor de reloj Esta prueba consiste en escribir un pequeño programa en VHDL que divide la frecuencia del reloj principal (100MHz), compilarlo y cargarlo en la EPROM de configuración para que sea ejecutado en el FPGA. Esto permite demostrar que la EPROM puede ser programada vía JTAG, que el FPGA puede leer su configuración de la EPROM, y que puede ejecutar su función. El programa divide la frecuencia del reloj por 16 y está implementado como un contador de 4 bits donde el bit más significativo es asignado a la salida. 61 Listado 1 Divisor de reloj (VHDL) library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity div16 is Port ( clock : in STD_LOGIC; reset : in STD_LOGIC; divided : out STD_LOGIC); end div16; architecture Behavioral of div16 is begin process (clock) variable count: STD_LOGIC_VECTOR (3 downto 0); begin if (reset = ’1’) then count := "0000"; elsif (clock’event and clock = ’1’) then count := count + 1; end if; divided <= count(3); end process; end Behavioral; Figura 25: Formas de onda de APP1. Izquierda: LVTTL a 2mA. Derecha: LVTTL a 8mA. La figura 25 muestra la forma de onda de salida resultante para dos estándares de E/S posibles en el FPGA. Se puede observar que el período es de 160ns, lo que corresponde a 6.25 MHz, o 100/16 MHz. 62 4.4.4. Programación del PIC vía ICSP Esta prueba, pretende demostrar la programabilidad “en circuito” del PIC. Puede no funcionar o ser dañinamente invasiva para el resto del circuito si es que no se ha diseñado para aceptar este proceso. La sección 3.2.8 describe las dificultades presentes en este segmento del diseño y el modo se han enfrentado. Está prueba está implícita en APP2. 4.4.5. APP2: Generación de onda cuadrada en el PIC En esta prueba se programa una simple rutina que crea una onda rectangular con duraciones distintas para los dos estados lógicos. Está implementada en lenguaje C (Compatible con el compilador PIC C) y consiste en un loop infinito, donde se cambia de estado lógico y se aplica un retardo diferente para cada uno. Listado 2 Generador de onda rectangular en el PIC (C para PIC C) #include "app2.h" void main() { // Set pin directions SET_TRIS_C(0b11110111); // 1=Input, 0=Output while(1) { // PF6 <=>Pin C3 <->EXP4-2 Connector <->FPGA Pin 200 delay_us(6); OUTPUT_HIGH(PIN_C3); delay_us(4); OUTPUT_LOW(PIN_C3); } } Figura 26: APP2, Onda rectangular generada en el PIC 63 La figura 26 muestra la señal resultante. Al costado derecho se encuentra información temporal de la señal y que confirma los tiempos especificados en el programa. 4.4.6. APP3: Comunicación entre el PIC y el FPGA En el FPGA se ha generado una señal de frecuencia en función del estado lógico de una de sus entradas. A esta entrada se ha conectado la señal generada por el PIC y que se obtuvo en la prueba anterior. La figura 27 muestra la señal del PIC en el canal 1 del osciloscopio y la señal resultante en el FPGA en el canal 2. El programa está implementado como un contador síncrono de 6 bits, del cual se utiliza el bit 6 (más significativo) cuando la entrada es ’1’, y el bit 4 cuando la entrada es ’0’. Esto equivale a dividir el reloj principal de 100 MHz en 64 (1.5625 MHz) y 16 (6.25 MHz) respectivamente. Listado 3 APP3, Modulador FSK (VHDL) library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity dual_freq is Port ( clock : in STD_LOGIC; choice : in STD_LOGIC; output : out STD_LOGIC); end dual_freq; architecture Behavioral of dual_freq is begin process (clock,choice) variable count: STD_LOGIC_VECTOR(5 downto 0) := "000000"; begin if (clock’event and clock = ’1’) then count := count + 1; end if; if (choice = ’1’) then output <= count(5); else output <= count(3); end if; end process; end Behavioral; 64 Figura 27: APP3, FSK Controlada desde el PIC 4.4.7. APP4: Comunicación Serial Esta prueba involucra al PIC, al FPGA y a la interfaz RS232. En primera instancia, se programó una pequeña rutina en el PIC, que envía en forma serial, reiteradamente un caracter a una frecuencia fija de 10 Hz. La señal TTL resultante se observó en el osciloscopio. Posteriormente, se escribió un programa en VHDL para el FPGA que interconecta las líneas seriales del PIC con las de la interfaz RS232. La conversión de niveles LVTTL a RS232 se pudo verificar en el osciloscopio como se muestra en la figura 28. Figura 28: Señal serial en niveles TTL (canal 1) y RS232 (canal 2). Finalmente, para verificar la comunicación serial bidireccional, se escribió un programa 65 en el PIC que envía a una frecuencia fija el caracter ’-’, y cuando recibe un caracter lo envía de vuelta. Listado 4 Programa simple de RS232 bidireccional #include "APP4.h" char received_ch; int1 got_data; #int_RDA RDA_isr() { received_ch = getc(); got_data = 1; } void main() { enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); while(1) { if (got_data) { putc(received_ch); got_data = 0; } putc(’-’); delay_ms(100); } } Figura 29: Terminal que la operación de la aplicación APP4. 66 4.4.8. APP5: Lectura de los ADCs y transmisión serial al PC En esta aplicación se alimentan los convertidores análogo-digitales con una señal sinusoidal de baja frecuencia. Se les suministra una señal de reloj de 25 MHz (El reloj principal del FPGA dividido en 4). La salida de uno u otro es muestreada y entregada en paralelo al microcontrolador en función de una línea de control. Listado 5 Extracto de APP5 process (clock, adcA, adcB, get) variable last_get : STD_LOGIC := ’0’; begin if (clock’event and clock = ’1’) then if (last_get = ’0’ and get = ’1’) then adc_out <= adcA; elsif (last_get = ’1’ and get = ’0’) then adc_out <= adcB; end if; last_get := get; end if; end process; process (clock) variable clk_count : STD_LOGIC_VECTOR (1 downto 0) := "00"; begin if (clock’event and clock = ’1’) then clk_count := clk_count + 1; end if; adcA_clk <= clk_count(1); -- 25 MHz adcB_clk <= clk_count(1); -- 25 MHz end process; Figura 30: Señal original en osciloscopio 67 ADC #1 200 180 160 Valor (8 bits) 140 120 100 80 60 40 20 0 300 350 400 450 500 550 Muestras (a) (b) Figura 31: Sinusoidal capturada. (a) Datos en terminal serial. (b) Gráfico para el ADC número 1. Es importante destacar que esta prueba solamente demuestra que los ADCs no están dañados y que se encuentran correctamente conectados al FPGA. Se deja como ejercicio al lector demostrar la correcta operación de los ADCs a su máxima tasa de muestreo. Esto puede hacerse entregando una señal sinusoidal de entre 1 y 5 MHz a los ADCs, muestreando a 100 Mega-muestras por segundo y almacenando al menos 200 muestras consecutivas en la memoria interna del FPGA. Posteriormente ésta puede ser transferida a un PC a una tasa menor, para poder graficar los puntos y observar la reconstrucción de la señal. El uso de una señal triangular puede revelar mejor, a simple vista la integridad de la señal capturada. 4.4.9. APP6: Uso de memoria FLASH Para demostrar el funcionamiento de la memoria FLASH se ha utilizado el FPGA, simplemente para interconectar el microcontrolador con la memoria y con la interfaz RS232. La memoria utiliza una interfaz SPI al igual que el microcontrolador, lo que hace que la comunicación entre ellos sea muy simple. En el microcontrolador se han implementado 4 rutinas que se comunican con la memoria. Éstas son: la lectura del identificador (3 bytes que identifican el fabricante y el tamaño de la memoria), el borrado de la memoria completa, la escritura de una frase pre-definida en una ubicación predefinida de la memoria, y la lectura de un número fijo de bytes de esa ubicación. La figura 32 muestra un terminal serial donde se observa la ejecución del programa del microcontrolador. Se observa el resultado de la secuencia de comandos: Lectura del identificador, borrado, escritura, lectura, borrado y lectura. 68 Figura 32: APP6 en terminal serial 4.4.10. APP7: Uso de memoria SRAM Esta prueba consiste en generar una secuencia de números pseudo-aleatorios, almacenarlos en la memoria SRAM y luego recuperarlos desde el microcontrolador, para finalmente transmitirlos en forma serial al PC y verificar que todo el proceso ha funcionado correctamente. Para esto se ha diseñado una máquina de estados (ver figura 33) que contiene 2 estados principales, READ (y READ_B22 ), en el cual se puede realizar la lectura de la RAM desde el PIC, y WRITE, donde se genera la secuencia de números pseudo-aleatóreos y se escriben en la RAM. El paso de un estado a otro se realiza con la línea de control W generada desde el PIC. Los estados intermedios TO READ y TO WRITE existen para asegurar que en la transición de WRITE a READ y viceversa, se hayan deshabilitado los pines de salida del FPGA o de la RAM, respectivamente. Al estado FULL se llega desde WRITE cuando la memoria se ha llenado. El estado READ_B permite acceder al segundo byte entregado por la RAM. READ sólo presenta el primer byte. El paso de READ_B a READ obtiene la palabra siguiente de la RAM. La línea de control get_clk controla el paso entre estos dos estados. La figura 33 es una simplificación de la máquina de estados. El detalle puede observarse en el código VHDL de esta aplicación en el anexo. 22 READ y READ_B se requieren para obtener los bits 0 a 7 y 8 a 15 respectivamente ya que el PIC trabaja solo con 8 bits a la vez. 69 W=1 TO WRITE READ get_clk=0 W=0 READ_B W=1 get_clk=1 TO READ WRITE W=0 FULL ADDR="111..." W=0 Figura 33: Máquina de estados APP7 Figura 34: Terminal exhibiendo la actividad de la aplicación. La generación de números pseudo-aleatorios se ha realizado mediante la técnica de registros (shift-registers) con re-alimentación. Se ha utilizado un registro de 16 bits de largo y los bits realimentados han sido elegidos según [[Xapp052]] para obtener una secuencia de máxima longitud sin repetición. La implementación sólo requiere 2 líneas en VHDL: lfsr(15 downto 1) <= lfsr(14 downto 0); lfsr(0) <= lfsr(16) xnor lfsr(15) xnor lfsr(13) xnor lfsr(4); 70 En la primera línea se desplaza el registro (lfsr), y en la segunda, se genera el primer bit en función de los bits 16,15,13 y 4. En este caso se ha usado una semilla de valor 0xAAAA. 4.4.11. APP8: Comunicación USB Esta prueba utiliza el segundo canal del chip USB FT2232 en el modo USB a puerto serial asíncrono, y el FPGA se configura para reproducir en la línea de transmisión lo que recibe en la línea de recepción (interfaz loopback). La primera parte de la prueba consiste en verificar que el PC detecte el dispositivo USB al conectarlo. Para esto deben estar instalados los controladores para puerto serial virtual (www.ftdichip.com). La primera vez que se conecta al PC, éste debe reportar que ha encontrado 2 puertos seriales virtuales USB y que están listos para ser utilizados. El programa que implementa la interfaz loopback debe instalarse en el FPGA. Este no se muestra aquí pero es muy simple y puede encontrarse en el Apéndice. Cuando estos pasos se han completado, puede realizarse la prueba accediendo mediante Hyperterminal u otro terminal serial, al puerto serial virtual correspondiente a la segunda interfaz del chip. Luego, puede seleccionarse cualquier velocidad de transmisión, y sin control de flujo. Finalmente, cualquier caracter que se tipee en la ventana debe aparecer en ella, ya que es enviado a la placa y devuelto inmediatamente. En condiciones normales, el terminal serial no muestra lo que uno escribe, solo lo que se recibe remotamente. La prueba resultó exitosa transmitiendo a la máxima velocidad permitida por Hyperterminal, es decir, 921600 bps. 71 5. Aplicaciones y ejercicios propuestos Figura 35: Fotografía de la plataforma completamente armada y operando. Las posibles aplicaciones de esta plataforma de desarrollo están limitadas sólo por la creatividad. La motivación original fue carácter educacional, para contribuir a la enseñanza de ramos de la carrera universitaria de Ingeniería Eléctrica. De muchos de estos ramos se desprenden aplicaciones que corresponden a la implementación de lo que se enseña teóricamente. Por ejemplo, en ramos del área de Sistemas Digitales, puede utilizarse la plataforma para la práctica de lógica programable; en Procesamiento Digital de Señales, para la implementación de filtros digitales y transformadas rápidas de Fourier (FFT); en Comunicaciones Digitales para la implementación de codificadores y códigos correctores de errores; en Arquitectura de Computadores, para el diseño de CPUs; en Control Automático, para el desarrollo de los más complejos controladores; en Electrónica de Potencia, para implementar las unidades de control de convertidores de potencia, etc. En fin, en casi cualquier ramo se le puede aprovechar eficientemente. Esta versatilidad se detectó tempranamente y surgieron nuevas motivaciones, como por ejemplo el uso de la plataforma para el desarrollo de soluciones industriales y científicas a la medida, el desarrollo de instrumentos de medición u otros productos para su comercialización, o, simplemente para distribuir el diseño o venta de la plataforma ya ensamblada, lo que a cierto plazo crearía una comunidad de desarrolladores interactuando, potenciando el 72 conocimiento de esta comunidad y ampliando posibles aplicaciones del producto. Ejemplos En el área de los instrumentos de medición, el osciloscopio de muestreo digital es uno de los más versátiles. La plataforma, en este caso, además de servir de unidad de control para la sección de procesamiento digital y para la interfaz de usuario, puede realizar el almacenamiento temporal de las muestras digitalizadas, analizar los datos para determinar el momento del disparo, calcular frecuencia, amplitud, etc., y luego mostrar los resultados o enviarlos a un PC mediante alguna de las interfaces de comunicaciones incorporadas. En el caso de un analizador de espectro, la señal convertida a banda base puede ser digitalizada y convertida a su espectro de frecuencia mediante FFT, permitiendo una resolución de ancho de banda mucho mayor que la obtenida con instrumentos analógicos. Al igual que en un osciloscopio, lo mismo se aplica en el caso de control de la sección analógica, las comunicaciones y la interfaz de usuario. La implementación de analizadores lógicos y contadores de frecuencia es definitivamente una tarea fácil. La generación de señales mediante el método DDS también es una aplicación fácil de implementar. Es posible implementar en el FPGA un Procesador Digital de Señales (DSP) completo, o partes de uno. Por este motivo, las tareas que los DSP realizan pueden también llevarse a cabo en esta plataforma y hasta con mejor desempeño, ya que el procesador se puede diseñar a la medida de la aplicación. Por ejemplo es posible procesar video (de baja y mediana resolución y unos pocos niveles de colores) y realizar detección de objetos, rutas, contornos, etc., lo que puede ser de utilidad en robótica, líneas de producción, etc. Lo mismo es aplicable para procesar sonido, ejemplo de la cual es la detección de voz. En esta área se consideran también aplicaciones de compresión, encriptación, y filtrado, entre muchos otros. También es aplicable esta unidad a sistemas de control, tanto en lazo cerrado, como en control de procesos. En el caso de sistemas de control de lazo cerrado, el FPGA puede usarse para aquellas tareas intensivas en procesamiento aritmético, mientras que en el microcontrolador, se puede implementar el algoritmo principal, funcionando bajo un sencillo sistema operativo de tiempo real. En esta área el FPGA también puede procesar los datos de entrada de muchos sensores a la vez, ya sea aquellos con respuesta analógica mediante los ADCs incorporados (o adicionales externos a la placa), o aquellos con respuesta digital, como en73 coders, switches, etc. También puede controlar actuadores, mediante la generación de señales PWM, o Convertidores Digital-Analógicos (DACs). Otros recursos El sitio de Internet OpenCores.org ofrece una inmensidad de aplicaciones de código abierto para FPGAs, dentro de las cuales las más populares son: CPUs de distintas arquitecturas, microcontroladores y DSP. Controladores Ethernet de 10, 100 y 1000 Mbps Controladores USB, I2C, CAN, etc. Controladores de Video VGA, TFT LCD, Plasma, etc. Criptografía y generadores de números aleatorios La variedad encontrada en este sitio web puede ser de utilidad inmediata, usando directamente algunos de los desarrollos disponibles o, quizás, la combinación de ellos, para realizar aplicaciones más complejas y creativas. Por último, puede constituir una fuente de estímulo para estudiar las posibles aplicaciones de los dispositivos de lógica programable modernos. Los ejemplos mencionados aquí son tan solo un ínfimo subconjunto de las posibles aplicaciones. Se encuentran concentradas en ciertas áreas debido al inevitable sesgo profesional del autor respecto a las necesidades humanas y de la industria. Sin embargo, se tiene la certeza de que otros podrán hallar soluciones creativas a sus propios problemas, aplicándolos en sus particulares mundos profesionales o personales. 74 6. Producción Esta sección se presenta como una ayuda para quienes pretendan llevar a producción sus propias unidades. 6.1. Adquisiciones 6.1.1. Circuitos Impresos Los Circuitos impresos deben ser solicitados al autor de esta memoria para ser adquiridos con el fabricante original en USA. Si es factible, puede enviarse una autorización al fabricante para que la Universidad realice pedidos directamente. 6.1.2. Componentes Todos los componentes utilizados en este proyecto fueron adquiridos en línea en Digikey (www.digikey.com), por lo tanto, se sugiere utilizar esta vía para minimizar el número de compras. Es posible no encontrar exactamente los mismos componentes utilizados en los prototipos originales, debido a falta de stock o porque han quedado obsoletos. En el primer caso, pueden encontrarse sustitutos con características técnicas similares aunque de otros fabricantes, u otros que utilizan otras tecnologías y/o materiales logrando el mismo resultado. En el segundo caso, generalmente los fabricantes sugieren un dispositivo de reemplazo que es compatible con aquel que ha sido retirado del mercado. Siempre es necesario verificar que el dispositivo es mecánicamente compatible con el circuito impreso y que podrá ser soldado. En ambos casos, se sugiere consultar con el autor de esta memoria antes de tomar una decisión. 6.2. Ensamblaje 6.2.1. Indicaciones Generales 6.2.2. Procedimiento 1. Montar todos los condensadores de formato 0402 en de la cara posterior del circuito impreso. Todos éstos tienen la misma capacitancia de 0,01µF . 2. Montar todos los condensadores cerámicos de formato 0805 de capacitancia 1µF en la cara posterior del circuito impreso. 75 3. Montar todos los condensadores cerámicos de formato 0805 de capacitancia 0,1µF en la cara posterior del circuito. No todos los condensadores de este formato en la cara posterior son de esta capacitancia, por lo que hay que guiarse por la lista de componentes de la cara posterior. 4. Montar el resto de los condensadores de la cara posterior guiándose por la lista de componentes. Debe tenerse precaución con los condensadores de Tantalio, ya que son polarizados y no hay forma de determinar su orientación en la placa que no sea identificando los voltajes que hay en ambos terminales. 5. Los transistores Q51 y Q52 deben modificarse para ser montados en forma invertida, es decir, la cara superior debe ir contra la placa. Para esto basta doblar los 3 pines hacia la cara contraria. Luego se montan en forma invertida y se sueldan. 6. Montar el resto de los componentes de la cara posterior guiándose por la lista de componentes. 7. Verificar que entre los terminales de alimentación de 5V no exista un cortocircuito, y que la impedancia entre ellos sea de al menos 1,5kΩ. 8. Montar los componentes de la fuente de poder que corresponden a la etapa de entrada de 5V y al regulador conmutado de 3.3V, guiándose por el esquemático de la figura 42 que se encuentra en el Apéndice. 9. Alimentar la placa con 5V desde una fuente limitada en corriente, al mínimo amperaje posible. Incrementar el límite lentamente hasta que el voltaje y la corriente se estabilicen. La corriente entregada por la fuente no debería superar los 100mA. Hay que asegurarse también, durante este proceso, que ningún componente aumente considerablemente su temperatura. Verificar que el voltaje de salida del regulador de 3.3V sea efectivamente aquel. 10. Complete el montaje de la fuente de poder según la figura 42 y verifique que todos los voltajes de salida sean los correctos. 11. Montar el FPGA, la memoria PROM de configuración y todo el circuito de soporte según la figura 37. 12. Alimentar el circuito y comprobar la cadena JTAG con un programador. 76 13. Completar el montaje de los componentes de la cara superior en un orden tal que facilite el acceso a cada nuevo componente soldado con la punta del cautín en caso de que sea soldado manualmente. 6.3. Pruebas Una vez que haya completado el ensamblaje pueden realizar las pruebas descritas en la sección 4.4. Estas deberían ser suficientes para probar el correcto ensamblaje. 77 Referencias [Johnson93] Johnson, Howard W. y Graham, Martin (1993) High Speed Digital Design, A Handbook of Black Magic. Prentice Hall PTR. [Johnson03] Johnson, Howard W. y Graham, Martin (2003) High Speed Signal Propagation: Advanced Black Magic. Prentice Hall PTR. [Ashenden02] Ashenden, Peter J. (2002) The Designer’s Guide to VHDL. Morgan Kaufmann, 2nd Edition. [Xapp623] Alexander, Mark Power Distribution System (PDS) Design: Using Bypass/Decoupling Capacitors. Xilinx, Application Note 623 v2.1. www.xilinx.com. [CYP1] SRAM System Design Guidelines. Cypress Semiconductor Corporation, October 25, 2002. www.cypress.com. [DS312] Spartan-3E FPGA Family: Complete Datasheet. Xilinx, May 19, 2006. www.xilinx.com [Xapp453] GoldBlatt, Kim (2006) The 3.3V Configuration of Spartan-3 FPGAs. Xilinx Application Note 453 v1.1, 2006. www.xilinx.com [Xapp052] Alfke, Peter (1996) Efficient Shift Registers, LFSR Counters, and Long Pseudo-Random Sequence Generators. Xilinx, Application Note 052 v1.1, 1996. www.xilinx.com. [Horowitz89] Horowitz, Paul y Hill, Winfield (1989) The Art of Electronics, 2nd Edition. Oxford University Press. [IEEE1] Yong-Ju Kim, Han-Sub Yoon, Seongsoo Lee, Gyu Moon, Joungho Kim, and Jae-Kyung Wee (2004) An Efficient Path-Based Equivalent Circuit Model for Design, Synthesis, and Optimization of Power Distribution Networks in Multilayer Printed Circuit Boards. IEEE Transactions on Advanced Packaging, VOL. 27, No 1, February 2004. [IEEE2] Sharawi, Mohammad S. (2004) Practical Issues in High Speen PCB design. IEEE Potencials, IEEE, 2004. 78 [IEEE3] Jae Kwon Han y Dong Chul Park (2006) Crosstalk Analysis Between Non-Parallel Coupled Lines Connected With Vias in a 4-layer PCB. CEEM’2006/DALIAN. [IEEE4] Frank Ye Yuan Analysis of Power/Ground Noises and Decoupling Capacitors in Printed Circuit Board Systems. Quad Design Group, Viewlogic Systems, Inc. [IEEE5] LaMeres, Brock J. y Kalkur, T.S. (2001) The Effect of Ground Vias on Changing Signal Layers in a Multilayered PCB. Department of Electrical and Computer Engineering, University of Colorado. IEEE Microwave and Optical Technilogy Letters / Vol. 28, No. 4, February 20, 2001. [AN282] Application Note AN-282: Fundamentals of Sampled Data Systems. Analog Devices, Norwood, Massachusetts. www. analog.com. 79 Apéndices A: Esquemáticos B: Diagramas del circuito impreso C: Pines, nombres. números e interconexiones D: Lista de componentes E: Código VHDL y C de las aplicaciones de prueba F: Opciones durante el ensamblaje G: Estadísticas de trabajo 80 Apéndice A: Esquemáticos Figura 36: Esquemáticos: Diagrama principal 81 Figura 37: Esquemáticos: Configuración del FPGA 82 Figura 38: Esquemáticos: Memoria 83 Figura 39: Esquemáticos: Comunicaciones 84 Figura 40: Esquemáticos: Microcontrolador 85 Figura 41: Esquemáticos: I/O del FPGA 86 Figura 42: Esquemáticos: Fuente de Poder 87 Figura 43: Esquemáticos: Puertos de Expansión 88 Apéndice B: Diagramas del circuito impreso Figura 44: Serigrafía cara superior. No a escala. Figura 45: Cobre cara superior. No a escala. 89 Figura 46: Cobre capa de alimentación (Vcc). No a escala. Figura 47: Plano de tierra (Negativo). No a escala. 90 Figura 48: Serigrafía cara inferior (Invertida). No a escala. Figura 49: Cobre cara inferior (Invertida). No a escala. 91 Apéndice C: Pines, números, nombres e interconexiones. 92 93 94 95 96 Apéndice D: Lista de componentes 97 98 99 100 101 102 Todas las resistencias son de 1/4W, 5 % Todos los componentes estaban disponibles en Digikey (www.digikey.com) al momento de desarrollo. 103 Apéndice E: Código VHDL y C de las aplicaciones de prueba APP1 Listado 6 APP1, Divisor de reloj (VHDL) library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity div16 is Port ( clock : in STD_LOGIC; reset : in STD_LOGIC; divided : out STD_LOGIC); end div16; architecture Behavioral of div16 is begin process (clock) variable count: STD_LOGIC_VECTOR (3 downto 0); begin if (reset = ’1’) then count := "0000"; elsif (clock’event and clock = ’1’) then count := count + 1; end if; divided <= count(3); end process; end Behavioral; Listado 7 APP1, Configuración de E/S del FPGA (UCF) #PACE: Start of Constraints generated by PACE #PACE: Start of PACE I/O Pin Assignments NET "clock" LOC = "P80" | IOSTANDARD = LVTTL ; NET "divided" LOC = "P33" | IOSTANDARD = LVTTL | DRIVE = 2 ; #PACE: Start of PACE Area Constraints #PACE: Start of PACE Prohibit Constraints #PACE: End of Constraints generated by PACE 104 APP2 Listado 8 APP2, Generador de onda rectangular en el PIC (C para PIC C) #include "app2.h" void main() { // Set pin directions SET_TRIS_C(0b11110111); // 1=Input, 0=Output while(1) { // PF6 <=>Pin C3 <->EXP4-2 Connector <->FPGA Pin 200 delay_us(6); OUTPUT_HIGH(PIN_C3); delay_us(4); OUTPUT_LOW(PIN_C3); } } APP3 Listado 9 APP3, Modulador FSK (VHDL) library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity dual_freq is Port ( clock : in STD_LOGIC; choice : in STD_LOGIC; output : out STD_LOGIC); end dual_freq; architecture Behavioral of dual_freq is begin process (clock,choice) variable count: STD_LOGIC_VECTOR(5 downto 0) := "000000"; begin if (clock’event and clock = ’1’) then count := count + 1; end if; if (choice = ’1’) then output <= count(5); else output <= count(3); end if; end process; end Behavioral; 105 Listado 10 APP3, Configuración de E/S del FPGA (UCF) #PACE: Start of Constraints generated by PACE #PACE: Start of PACE I/O Pin Assignments NET "choice" LOC = "P200" | IOSTANDARD = LVTTL ; NET "clock" LOC = "P80" | IOSTANDARD = LVTTL ; NET "output" LOC = "P33" | IOSTANDARD = LVTTL | DRIVE = 2 ; #PACE: Start of PACE Area Constraints #PACE: Start of PACE Prohibit Constraints #PACE: End of Constraints generated by PACE APP4 Listado 11 APP4, Programa simple de RS232 bidireccional (C para PIC C) #include "APP4.h" char received_ch; int1 got_data; #int_RDA RDA_isr() { received_ch = getc(); got_data = 1; } void main() { enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); while(1) { if (got_data) { putc(received_ch); got_data = 0; } putc(’-’); delay_ms(100); } } 106 Listado 12 APP4, paso de señales seriales (VHDL) library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity serial_pass is Port ( tx_in : in STD_LOGIC; -- From PIC(44-TX) to FPGA(190) tx_out : out STD_LOGIC; -- From FPGA(55) To RS232(4) transceiver rx_in : in STD_LOGIC; -- From RS232(6) transceiver to FPGA(54) rx_out : out STD_LOGIC);-- From FPGA(189) To PIC(1-RX) end serial_pass; architecture Behavioral of serial_pass is begin process (tx_in,rx_in) begin tx_out <= tx_in; rx_out <= rx_in; end process; end Behavioral; Listado 13 APP4, Configuración de E/S del FPGA (UCF) #PACE: Start of Constraints generated by PACE #PACE: Start of PACE I/O Pin Assignments NET "rx_in" LOC = "P54" | IOSTANDARD = LVTTL ; NET "rx_out" LOC = "P189" | IOSTANDARD = LVTTL | DRIVE = 2 ; NET "tx_in" LOC = "P190" | IOSTANDARD = LVTTL ; NET "tx_out" LOC = "P55" | IOSTANDARD = LVTTL | DRIVE = 2 ; #PACE: Start of PACE Area Constraints #PACE: Start of PACE Prohibit Constraints #PACE: End of Constraints generated by PACE 107 APP5 Listado 14 APP5, Muestreo de los ADCs según señal del PIC (VHDL) library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity adc_to_pc is Port ( clock : in STD_LOGIC; -- 80 adcA : in STD_LOGIC_VECTOR (7 downto 0); -- 12,11,9,8,5,4,3,2 adcB : in STD_LOGIC_VECTOR (7 downto 0); -- 28,25,24,23,22,19,18,16 get : in STD_LOGIC; -- (PIC RB0) 181 adc_out : out STD_LOGIC_VECTOR (7 downto 0); -adcA_pwrdn : out STD_LOGIC; -- FPGA(61) adcB_pwrdn : out STD_LOGIC; -- FPGA(62) adcA_clk : out STD_LOGIC; -- FPGA(15) adcB_clk : out STD_LOGIC; -- FPGA(29) tx_in : in STD_LOGIC; -- From PIC(44-TX) to FPGA(190) tx_out : out STD_LOGIC; -- From FPGA(55) To RS232(4) transceiver rx_in : in STD_LOGIC; -- From RS232(6) transceiver to FPGA(54) rx_out : out STD_LOGIC); -- From FPGA(189) To PIC(1-RX) end adc_to_pc; architecture Behavioral of adc_to_pc is begin process (clock, adcA, adcB, get) variable last_get : STD_LOGIC := ’0’; begin if (clock’event and clock = ’1’) then if (last_get = ’0’ and get = ’1’) then adc_out <= adcA; elsif (last_get = ’1’ and get = ’0’) then adc_out <= adcB; end if; last_get := get; end if; end process; process (clock) variable clk_count : STD_LOGIC_VECTOR (1 downto 0) := "00"; begin if (clock’event and clock = ’1’) then clk_count := clk_count + 1; end if; adcA_clk <= clk_count(1); -- 25 MHz adcB_clk <= clk_count(1); -- 25 MHz end process; adcA_pwrdn <= ’0’; adcB_pwrdn <= ’0’; tx_out <= tx_in; rx_out <= rx_in; end Behavioral; 108 Listado 15 APP5, Configuración de E/S del FPGA (UCF) #PACE: Start of Constraints generated by PACE #PACE: Start of PACE I/O Pin Assignments NET "adc_out<0>" LOC = "P199" ; NET "adc_out<1>" LOC = "P197" ; NET "adc_out<2>" LOC = "P205" ; NET "adc_out<3>" LOC = "P203" ; NET "adc_out<4>" LOC = "P202" ; NET "adc_out<5>" LOC = "P200" ; NET "adc_out<6>" LOC = "P193" ; NET "adc_out<7>" LOC = "P192" ; NET "adcA<0>" LOC = "P2" ; NET "adcA<1>" LOC = "P3" ; NET "adcA<2>" LOC = "P4" ; NET "adcA<3>" LOC = "P5" ; NET "adcA<4>" LOC = "P8" ; NET "adcA<5>" LOC = "P9" ; NET "adcA<6>" LOC = "P11" ; NET "adcA<7>" LOC = "P12" ; NET "adcA_clk" LOC = "P15" ; NET "adcA_pwrdn" LOC = "P61" ; NET "adcB<0>" LOC = "P16" ; NET "adcB<1>" LOC = "P18" ; NET "adcB<2>" LOC = "P19" ; NET "adcB<3>" LOC = "P22" ; NET "adcB<4>" LOC = "P23" ; NET "adcB<5>" LOC = "P24" ; NET "adcB<6>" LOC = "P25" ; NET "adcB<7>" LOC = "P28" ; NET "adcB_clk" LOC = "P29" ; NET "adcB_pwrdn" LOC = "P62" ; NET "clock" LOC = "P80" ; NET "get" LOC = "P181" ; NET "rx_in" LOC = "P54" ; NET "rx_out" LOC = "P189" ; NET "tx_in" LOC = "P190" ; NET "tx_out" LOC = "P55" ; #PACE: Start of PACE Area Constraints #PACE: Start of PACE Prohibit Constraints #PACE: End of Constraints generated by PACE 109 Listado 16 APP5, Control del muestreo y envío al PC (C para PIC C) #include "C:\Documents and Settings\jcaram\My Documents\fpga\pic\projects\APP5\APP5.h" #byte PORTD=0xF83 #byte PORTC=0xF82 #byte PORTB=0xF81 void read_send(int1 nl) { int8 adc_val; adc_val=((PORTD&0x3)< <6)|(PORTC&0x3F); printf(" %u ",adc_val); if(nl) printf("\n\r"); } void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_psp(PSP_DISABLED); setup_spi(FALSE); setup_wdt(WDT_OFF); setup_timer_0(RTCC_INTERNAL); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_timer_3(T3_DISABLED|T3_DIV_BY_1); setup_comparator(NC_NC_NC_NC); SET_TRIS_B(0xFE); // 1=Input, 0=Output while(1) { if (got_data) { putc(received_ch); got_data = 0; } delay_ms(50); output_high(pin_b0); read_send(0); delay_ms(50); output_low(pin_b0); read_send(1); } } 110 APP6 Listado 17 APP6, Paso de señales seriales y SPI por el FPGA (VHDL) library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity serial_and_spi_pass is Port ( tx_in : in STD_LOGIC; tx_out : out STD_LOGIC; rx_in : in STD_LOGIC; rx_out : out STD_LOGIC; sck_in : in STD_LOGIC; sck_out : out STD_LOGIC; sdo_in : in STD_LOGIC; sdo_out : out STD_LOGIC; sdi_in : in STD_LOGIC; sdi_out : out STD_LOGIC; flash_ns_in : in STD_LOGIC; -- PIC(RD0-38) flash_ns_out : out STD_LOGIC; flash_nw : out STD_LOGIC; flash_nhold : out STD_LOGIC); end serial_and_spi_pass; architecture Behavioral of serial_and_spi_pass is begin tx_out <= tx_in; rx_out <= rx_in; sck_out <= sck_in; sdo_out <= sdo_in; sdi_out <= sdi_in; flash_ns_out <= flash_ns_in; flash_nw <= ’1’; flash_nhold <= ’1’; end Behavioral; 111 Listado 18 APP6, Configuración de E/S del FPGA (UCF) #PACE: Start of Constraints generated by PACE #PACE: Start of PACE I/O Pin Assignments NET "flash_nhold" LOC = "P102" ; NET "flash_ns_in" LOC = "P199" ; NET "flash_ns_out" LOC = "P100" ; NET "flash_nw" LOC = "P99" ; NET "rx_in" LOC = "P54" ; NET "rx_out" LOC = "P189" ; NET "sck_in" LOC = "P200" ; NET "sck_out" LOC = "P98" ; NET "sdi_in" LOC = "P101" ; NET "sdi_out" LOC = "P193" ; NET "sdo_in" LOC = "P192" ; NET "sdo_out" LOC = "P97" ; NET "tx_in" LOC = "P190" ; NET "tx_out" LOC = "P55" ; #PACE: Start of PACE Area Constraints #PACE: Start of PACE Prohibit Constraints #PACE: End of Constraints generated by PACE 112 Listado 19 APP6, Aplicación de prueba de memoria FLASH, Parte 1 de 4 (C para PIC C) #include "C:\Documents and Settings\jcaram\My Documents\fpga\pic\projects\APP6_real\APP6_real.h" char ch_in; int1 ch_received; char data[]="Juan Pablo Caram"; char data_len = 16; #int_RDA RDA_isr() { ch_received = 1; ch_in = getc(); } void flash_program(char sector, char page) { char i; output_low(PIN_D0); spi_write(0x06); // Write Enable output_high(PIN_D0); output_low(PIN_D0); spi_write(0x02); // Page Program // 3 Byte Address MSB first spi_write(sector); spi_write(page); spi_write(0); // Data for(i=0;i<data_len;i++) { spi_write(data[i]); } output_high(PIN_D0); } void flash_read(char sector, char page) { char i; char data_in; output_low(PIN_D0); spi_write(0x03); // Read // Address spi_write(sector); spi_write(page); spi_write(0); 113 Listado 20 APP6, Aplicación de prueba de memoria FLASH, Parte 2 de 4 (C para PIC C) // Data for(i=0;i<data_len;i++) { spi_write(0); data_in = spi_read(); putc(data_in); } printf("\n\r"); output_high(PIN_D0); } int1 flash_busy() { char status; output_low(PIN_D0); spi_write(0x05); spi_write(0); status = spi_read(); output_high(PIN_D0); if(status&0x01) return 1; else return 0; } void wait_for_flash() { char status; output_low(PIN_D0); spi_write(0x05); spi_write(0); status = spi_read(); while(status&0x01) { spi_write(0); status = spi_read(); } output_high(PIN_D0); } void bulk_erase_flash() { // This might take up to 40 seconds. output_low(PIN_D0); spi_write(0x06); // Write Enable output_high(PIN_D0); output_low(PIN_D0); spi_write(0xC7); // Bulk Erase output_high(PIN_D0); } 114 Listado 21 APP6, Aplicación de prueba de memoria FLASH, Parte 3 de 4 (C para PIC C) void read_flash_id() { char v1, v2, v3; output_low(PIN_D0); spi_write(0x9F); spi_write(0); v1 = spi_read(); spi_write(0); v2 = spi_read(); spi_write(0); v3 = spi_read(); output_high(PIN_D0); printf(" %x %x %x\n\r",v1,v2,v3); } void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_psp(PSP_DISABLED); setup_spi(SPI_MASTER|SPI_H_TO_L|SPI_CLK_DIV_4|SPI_SAMPLE_AT_END); setup_wdt(WDT_OFF); setup_timer_0(RTCC_INTERNAL); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_timer_3(T3_DISABLED|T3_DIV_BY_1); setup_comparator(NC_NC_NC_NC); enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); SET_TRIS_D(0xFE); // DO is output output_high(PIN_D0); SET_TRIS_C(0b11010111); delay_ms(100); printf("APP6 Started.\n\r"); while(1) { if (ch_received) { ch_received = 0; switch(ch_in) { case ’e’: printf("Bulk Erase\n\r"); bulk_erase_flash(); while(flash_busy()) { putc(’.’); delay_ms(250); } printf("\n\rDone.\n\r"); break; 115 Listado 22 APP6, Aplicación de prueba de memoria FLASH, Parte 4 de 4 (C para PIC C) case ’w’: printf("Writing\n\r"); flash_program(0,0); printf("Done.\n\r"); break; case ’r’: printf("Reading\n\r"); flash_read(0,0); printf("Done\n\r"); break; case ’i’: printf("Chip ID\n\r"); read_flash_id(); break; default: printf("Unknown command %c\n\r",ch_in); } } } } 116 APP7 Listado 23 APP7, Escritura y lectura de números Pseudo-aleatorios en SRAM. Parte 1 de 3 (VHDL) library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity noise_store is Port ( clk_in : in STD_LOGIC; w : in STD_LOGIC; full : out STD_LOGIC; get_clk : in STD_LOGIC; byte_choose : in STD_LOGIC; addr : inout STD_LOGIC_VECTOR (15 downto 0); data : inout STD_LOGIC_VECTOR (15 downto 0); data_out : out STD_LOGIC_VECTOR (7 downto 0); nOE : out STD_LOGIC; nWE : out STD_LOGIC; nCE : out STD_LOGIC; nBHE : out STD_LOGIC; nBLE : out STD_LOGIC; rx_in : in STD_LOGIC; rx_out : out STD_LOGIC; tx_in : in STD_LOGIC; tx_out : out STD_LOGIC; state : out STD_LOGIC_VECTOR (2 downto 0)); end noise_store; architecture Behavioral of noise_store is type MachState is (Reading, Reading_B, toWriting, Writing, toReading, RamFull); signal clock : STD_LOGIC; signal clk_div : STD_LOGIC := ’0’; signal CurrentState: MachState := toReading ; signal NextState: MachState; signal lfsr : STD_LOGIC_VECTOR (15 downto 0) := "1010101010101010"; begin tx_out <= tx_in; rx_out <= rx_in; nCE <= ’0’; nBHE <= ’0’; nBLE <= ’0’; process (clk_in, clk_div) begin if clk_in’event and clk_in = ’1’ then clk_div <= not clk_div; end if; end process; 117 Listado 24 APP7, Escritura y lectura de números Pseudo-aleatorios en SRAM. Parte 2 de 3 (VHDL) clock <= clk_div; process (CurrentState, w, addr, lfsr, clock, get_clk, data) begin case CurrentState is when Reading => state <= "000"; full <= ’0’; nWE <= ’1’; nOE <= ’0’; data <= "ZZZZZZZZZZZZZZZZ"; if byte_choose = ’0’ then data_out <= data (7 downto 0); else data_out <= data (15 downto 8); end if; if w = ’1’ then NextState <= toWriting; elsif get_clk = ’0’ then NextState <= Reading_B; else NextState <= Reading; end if; when Reading_B => state <= "001"; full <= ’0’; nWE <= ’1’; nOE <= ’0’; data <= "ZZZZZZZZZZZZZZZZ"; data_out <= "00000000"; if get_clk = ’1’ then NextState <= Reading; else NextState <= Reading_B; end if; when toWriting => state <= "010"; full <= ’0’; nWE <= ’1’; nOE <= ’1’; data <= "ZZZZZZZZZZZZZZZZ"; data_out <= "00000000"; if w = ’1’ then NextState <= Writing; else NextState <= toWriting; end if; when Writing => state <= "011"; full <= ’0’; nWE <= clock; nOE <= ’1’; data <= lfsr; data_out <= "00000000"; if w = ’0’ then NextState <= toReading; elsif addr = "1111111111111111" then NextState <= RamFull; else NextState <= Writing; end if; 118 Listado 25 APP7, Escritura y lectura de números Pseudo-aleatorios en SRAM. Parte 3 de 3 (VHDL) when toReading => state <= "100"; full <= ’0’; nWE <= ’1’; nOE <= ’1’; data <= "ZZZZZZZZZZZZZZZZ"; data_out <= "00000000"; if w = ’0’ then NextState <= Reading; else NextState <= toReading; end if; when RamFull => state <= "101"; full <= ’1’; nWE <= ’1’; nOE <= ’1’; data <= "ZZZZZZZZZZZZZZZZ"; data_out <= "00000000"; if w = ’0’ then NextState <= toReading; else NextState <= RamFull; end if; when others => state <= "111"; full <= ’0’; nWE <= ’1’; nOE <= ’1’; data <= "ZZZZZZZZZZZZZZZZ"; data_out <= "00000000"; NextState <= toReading; end case; end process; process (clock) begin if clock’event and clock = ’1’ then if CurrentState = toWriting then lfsr <= "1010101010101010"; addr <= "0000000000000000"; end if; if CurrentState = Writing then lfsr(15 downto 1) <= lfsr(14 downto 0); lfsr(0) <= lfsr(15) xnor lfsr(15) xnor lfsr(13) xnor lfsr(4); addr <= addr + 1; end if; if CurrentState = Reading_B and get_clk = ’1’ then addr <= addr + 1; end if; if CurrentState = toReading then addr <= "0000000000000000"; end if; CurrentState <= NextState; end if; end process; end Behavioral; 119 Listado 26 APP7, Configuración de E/S del FPGA (UCF) #PACE: Start of Constraints generated by PACE #PACE: Start of PACE I/O Pin Assignments NET "addr<0>" LOC = "P150" ; NET "addr<10>" LOC = "P147" ; NET "addr<11>" LOC = "P133" ; NET "addr<12>" LOC = "P145" ; NET "addr<13>" LOC = "P146" ; NET "addr<14>" LOC = "P144" ; NET "addr<15>" LOC = "P132" ; NET "addr<1>" LOC = "P151" ; NET "addr<2>" LOC = "P152" ; NET "addr<3>" LOC = "P153" ; NET "addr<4>" LOC = "P140" ; NET "addr<5>" LOC = "P139" ; NET "addr<6>" LOC = "P138" ; NET "addr<7>" LOC = "P137" ; NET "addr<8>" LOC = "P135" ; NET "addr<9>" LOC = "P134" ; NET "byte_choose" LOC = "P175" ; NET "clk_in" LOC = "P80" ; NET "data<0>" LOC = "P106" ; NET "data<10>" LOC = "P127" ; NET "data<11>" LOC = "P126" ; NET "data<12>" LOC = "P123" ; NET "data<13>" LOC = "P122" ; NET "data<14>" LOC = "P120" ; NET "data<15>" LOC = "P119" ; NET "data<1>" LOC = "P107" ; NET "data<2>" LOC = "P108" ; NET "data<3>" LOC = "P109" ; NET "data<4>" LOC = "P112" ; NET "data<5>" LOC = "P113" ; NET "data<6>" LOC = "P115" ; NET "data<7>" LOC = "P116" ; NET "data<8>" LOC = "P129" ; NET "data<9>" LOC = "P128" ; NET "data_out<0>" LOC = "P199" ; NET "data_out<1>" LOC = "P197" ; NET "data_out<2>" LOC = "P205" ; NET "data_out<3>" LOC = "P203" ; NET "data_out<4>" LOC = "P202" ; NET "data_out<5>" LOC = "P200" ; NET "data_out<6>" LOC = "P193" ; NET "data_out<7>" LOC = "P192" ; NET "full" LOC = "P187" ; NET "get_clk" LOC = "P180" ; NET "nBHE" LOC = "P172" ; NET "nBLE" LOC = "P177" ; NET "nCE" LOC = "P167" ; NET "nOE" LOC = "P168" ; NET "nWE" LOC = "P171" ; NET "rx_in" LOC = "P54" ; NET "rx_out" LOC = "P189" ; NET "state<0>" LOC = "P33" ; NET "state<1>" LOC = "P30" ; NET "state<2>" LOC = "P49" ; NET "tx_in" LOC = "P190" ; NET "tx_out" LOC = "P55" ; NET "w" LOC = "P181" ; 120 Listado 27 APP7, Control de la máquina de estados y envío de los datos al PC via serial. Parte 1 de 2 (C para PIC C) #include "C:\Documents and Settings\jcaram\My Documents\fpga\pic\projects\APP7\APP7.h" #byte PORTD=0xF83 #byte PORTC=0xF82 #byte PORTB=0xF81 char received_char; int1 char_received; #int_RDA RDA_isr() { char_received = 1; received_char = getc(); } void fill_ram() { // w = 1 output_high(PIN_B0); // Wait until Full = 1 while( !input(PIN_D4) ); return; } #define RAMMAX 65536 void read_ram() { int32 i; char value; // w = 0 output_low(PIN_B0); // Iterate over ram for(i=0;i<RAMMAX;i++) { // byte_choose = 1, MSB output_high(PIN_B2); // Read and print // C5=MSB, C4, C3, C2, C1, C0, D1, D0=LSB value=(PORTC&0x3F)< <2|(PORTD&0x3); printf(" %2x ",value); // byte_choose = 0 output_low(PIN_B2); // Read and print value=(PORTC&0x3F)< <2|(PORTD&0x3); printf(" %2x \n\r",value); // get_clk LOW output_low(PIN_B1); delay_us(10); // get_clk HIGH output_high(pin_B1); delay_us(10); 121 Listado 28 APP7, Control de la máquina de estados y envío de los datos al PC via serial. Parte 2 de 2 (C para PIC C) delay_ms(100); } return; } void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_psp(PSP_DISABLED); setup_spi(FALSE); setup_wdt(WDT_OFF); setup_timer_0(RTCC_INTERNAL); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_timer_3(T3_DISABLED|T3_DIV_BY_1); setup_comparator(NC_NC_NC_NC); enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); // B0 ->w, B1 ->get_glk, B2 ->byte_choose, D4 <- Full SET_TRIS_B(0xFD); // 1=Input, 0=Output //SET_TRIS_C(0xFF); //SET_TRIS_D(0xFF); // get_clk should start high output_high(PIN_B1); // w should start low output_low(PIN_B0); delay_ms(100); printf("APP7 Started.\n\r"); while(1) { if (char_received) { char_received = 0; switch(received_char) { case ’w’: printf("Filling Ram...\n\r"); fill_ram(); printf("Done.\n\r"); break; case ’r’: printf("Reading RAM...\n\r"); read_ram(); printf("Done.\n\r"); break; default: printf("Unknown command %c\n\r",received_char); } } } } 122 APP8 Listado 29 APP8, Loopback (VHDL) library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity LoopBack is Port ( tx_in : in STD_LOGIC; rx_out : out STD_LOGIC); end LoopBack; architecture Behavioral of LoopBack is begin rx_out <= tx_in; end Behavioral; 123 Apéndice F: Opciones durante el ensamblaje Buscar OPT[n] donde n es el número en la primera columna de la tabla, en la serigrafía del circuito impreso, para reconocer los componentes involucrados en dicha opción. OPT[] 1 2 3 4 5 6 7 Cuadro 6: Opciones de ensamblaje. Opción Por defecto Notas Modo de configuración 0,0,0 = Master Serial Crear un puente de soldadudel FPGA ra entre el cuadro central y aquel marcado con un ’0’. En este modo el FPGA leerá su configuración automáticamente desde la memoria de configuración en la PCB. Voltaje del banco de 3.3V Crear un puente de soldaduE/S número 3 ra entre los recuadros correspondiente para 3.3V HSWAP Soldar R205 = 0Ω. Esto habilita pull-ups en to(HSWAP = ’0’) dos los pines de E/S durante la configuración del FPGA. HSWAP tiene un pullup interno durante la configuración, pero debe ser activamente comandado antes de comenzar la configuración. RS232 directo al PIC NO. No soldar Soldar solo para propósitos de depuración. En este caso debe asegurarse de que los pines del FPGA conectados a estas líneas están en modo de alta impedancia. Regulador lineal de NO. No soldar. El regulador conmutado de 3.3V 3.3V se utiliza por defecto. Chip USB en la cadena NO. Corto-circuitar los Para incluir el chip USB en JTAG pines 3 y 5. la cadena cortocircuitar los pines 1 con 2, 3 con 4, 5 con 6, 7 con 8, y TDI con TDO en el conector JTAG. Voltaje de la EEPROM VCC_USB = 5V. Sol- Sólo para depuración. para el dar R11 = 0Ω chip USB. 124 Apéndice G: Estadísticas de trabajo Costos de Desarrollo: • Advanced Circuits: US $ 215 • Digikey: US $ 625 • TOTAL: US $ 840 Tiempo invertido: • Desarrollo de la Plataforma: En promedio 4 horas, 4 días por semana durante 14 meses: ~1200 horas. • Composición de la Memoria escrita: En promedio 10 horas semanales durante 12 meses: ~120 horas. 125