Universidad de Costa Rica Facultad de Ingeniería Escuela de Ingeniería Eléctrica IE – 0502 Proyecto Eléctrico Filtro Digital implementado en un PLD Por: Denic Danay Murillo Murillo Noviembre del 2004 Filtro Digital implementado en un PLD Por: Denic Danay Murillo Murillo Sometido a la Escuela de Ingeniería Eléctrica de la Facultad de Ingeniería de la Universidad de Costa Rica como requisito parcial para optar por el grado de: BACHILLER EN INGENIERÍA ELÉCTRICA Aprobado por el Tribunal: ___________________ Ing. Roberto Rodríguez Rodríguez Profesor Guía ___________________ Ing. Jorge Romero Chacón, PhD. Profesor Lector ___________________ Ing. Federico Ruiz Ugalde Profesor Lector DEDICATORIA A mi padre y a mi madre, ya que su apoyo y cariño me acompañarán por siempre. A mis hermanos y hermanas, por creer siempre en mí y en mis sueños. A toda mi familia, porque todos han sacrificado parte de su vida y me la han regalado. RECONOCIMIENTOS A los Profesores: Randolf Steinvort, Roberto Rodríguez, Jorge Romero y Federico Ruiz, por su ayuda en la elaboración de este proyecto. A todos los profesores de la Escuela, a las colaboradoras de la oficina de Secretaría y a la Universidad, porque esta ha sido mi casa. Y un reconocimiento muy especial a mi madre, porque su sola presencia es razón para seguir adelante. IE-0502 Filtro Digital Implementado en un PLD i ÍNDICE GENERAL ÍNDICE DE FIGURAS.....................................................................................ii ÍNDICE DE TABLAS......................................................................................iv NOMENCLATURA.........................................................................................v MARCAS REGISTRADAS.............................................................................vi RESUMEN .....................................................................................................vii CAPÍTULO 1: Introducción.............................................................................1 1.1 Objetivos ..........................................................................................................................2 1.1.1 Objetivo general...................................................................................................... 2 1.1.2 Objetivos específicos .............................................................................................. 2 1.2 Justificación .....................................................................................................................3 1.3 Metodología .....................................................................................................................3 CAPÍTULO 2: Desarrollo teórico.....................................................................5 CAPÍTULO 3: Diseño del Filtro.......................................................................9 3.1 3.2 El “codec”........................................................................................................................9 Diseño del Filtro a Implementar ....................................................................................11 3.2.1 Módulo de Reloj ................................................................................................... 13 3.2.2 Módulo de Canal................................................................................................... 14 3.2.3 Módulo “codec_top”............................................................................................. 17 3.2.4 Módulo de Filtro ................................................................................................... 19 3.2.5 Módulo “top_level”............................................................................................... 21 CAPÍTULO 4: Análisis de resultados.............................................................23 CAPÍTULO 5: Conclusiones y recomendaciones ...........................................32 BIBLIOGRAFÍA............................................................................................34 ANEXOS ........................................................................................................35 Anexo 1: Guía de Xilinx WebPack ................................................................................................35 Anexo 2: Código Fuente de los Módulos ......................................................................................45 Noviembre 2004 IE-0502 Filtro Digital Implementado en un PLD ii ÍNDICE DE FIGURAS Figura 2.1 Arquitectura típica de un filtro digital FIR ................................................................ 5 Figura 3.1 Diagrama del Codec CS4222 .................................................................................. 10 Figura 3.2 Conexión del Codec al FPLD .................................................................................. 11 Figura 3.3 Vista del nivel más alto del chip de filtro diseñado................................................. 12 Figura 3.4 Vista del nivel más alto del Módulo de Reloj, llamado “clockGenerator” ............. 14 Figura 3.5 Vista del nivel más alto del Módulo de Canal, llamado “channel”......................... 16 Figura 3.6 Vista del nivel más alto del Módulo “codec_top”................................................... 19 Figura 3.7 Vista del nivel más alto del módulo de filtro, llamado “filtro”............................... 21 Figura 3.8 Vista externa del Módulo “top_level” ..................................................................... 22 Figura 4.1 Respuesta a una frecuencia de entrada de 44Hz...................................................... 23 Figura 4.2 Respuesta a una frecue ncia de entrada de 100Hz.................................................... 24 Figura 4.3 Respuesta a una frecuencia de entrada de 256Hz.................................................... 24 Figura 4.4 Respuesta a una frecuencia de entrada de 545Hz.................................................... 25 Figura 4.5 Respuesta a una frecuencia de entrada de 782Hz.................................................... 25 Figura 4.6 Respuesta a una frecuencia de entrada de 1.40kHz................................................. 26 Figura 4.7 Respuesta a una frecuencia de entrada de 2.0kHz................................................... 26 Figura 4.8 Respuesta a una frecuencia de entrada de 3.22kHz................................................. 27 Figura 4.9 Respuesta a una frecuencia de entrada de 3.85kHz................................................. 27 Figura 4.10 Respuesta a una frecuencia de entrada de 4.0kHz................................................. 28 Figura 4.11 Respuesta a una frecuencia de entrada de 4.35kHz............................................... 28 Figura 4.12 Sugerencia del uso de un único multiplicador....................................................... 30 Figura Anexo 1.1 Ventana para construir un nuevo proyecto. ................................................. 36 Figura Anexo 1.2. Construcción de nuevo proyecto, selección del dispositivo. ...................... 37 Figura Anexo 1.3. Creación de nuevo proyecto, agregar una nueva fuente (programa). ......... 38 Figura Anexo 1.4. Crear nuevo proyecto, agregar una fuente existente. .................................. 39 Figura Anexo 1.5. Proceso de implementación del diseño en el Spartan II. ............................ 41 Noviembre 2004 IE-0502 Filtro Digital Implementado en un PLD iii Figura Anexo 1.6. Creación del archivo .UCF de asignación de pines. ................................... 42 Figura Anexo 1.7. Proceso de programación del FPGA. .......................................................... 44 Noviembre 2004 IE-0502 Filtro Digital Implementado en un PLD iv ÍNDICE DE TABLAS Tabla Anexo 1.1. Asignación de pines a los puertos ................................................................ 42 Noviembre 2004 IE-0502 v Filtro Digital Implementado en un PLD NOMENCLATURA CPLD: Dispositivo lógico programable complejo (Complex Programmable Logic Device). Codec: Dispositivo codificador/decodificador. Fs: Frecuencia de muestreo (sample frecuency). F: Frecuencia. FPGA: Arreglo programable de compuertas de campo (Field Programmable Gate Array). PLD: Dispositivo lógico programable (Programmable Logic Device). TAP: Se llama así a cada una de las etapas del Filtro Digital. Noviembre 2004 IE-0502 vi Filtro Digital Implementado en un PLD MARCAS REGISTRADAS Verilog® es una marca registrada de Cadence Design Systems, Inc. XILINX, FPGA, XC4005, XC2S200E son marcas registradas de Xilinx, Inc. Todos los prefijos XC para la designación de productos, Xilinx Foundation Series y Xilinx WebPack son marcas registradas de Xilinx, Inc. The Programmable Logic Company y The Programmable Gate Array Company son marcas al servicio de Xilinx, Inc. Digilab 2E y Digilent son marcas registradas de Digilent, Inc. MATLAB® es una marca registrada de The MathWorks, Inc. CIRRUS LOGIC ® y CS4222 son marcas registradas de Cirrus Logic, Inc. XESS y XStend Board son marcas registradas de X Engineering Software Systems Corporation. Todos los prefijos XS para la designación de productos son marcas registradas de X Engineering Software Systems Corporation. Noviembre 2004 IE-0502 vii Filtro Digital Impl ementado en un PLD RESUMEN El filtro digital diseñado e implementado en este proyecto es sólo una pequeña muestra de la amplia variedad de posibilidades que se tienen a la mano para poder desarrollar proyectos de gran valor educativo utilizando PLD’s. El interés por la manipulación de señales de audio surge de la importancia que tienen las comunicaciones para la humanidad, y por esta razón es que se decidió aprovechar lo s recursos que ofrecen estos dispositivos para introducir este tema que aún no se acaba de explorar. Se invirtió tiempo en el manejo del lenguaje Verilog, de tal forma que los módulos programados fueran 100% sintetizables. Además, la necesidad de estudiar el comportamiento de los filtros digitales se hizo cada vez más notoria conforme se avanzaba en la programación de los mismos. El “codec” y sus señales de control requirieron de mucho trabajo, esto para conseguir implementar un protocolo de comunicación que respondiera a los requerimientos del circuito y permitiera de esta forma el intercambio de información entre el PLD y el “codec”. Una vez finalizadas cada una de las partes del proyecto, se unieron para probar su funcionamiento en conjunto y afinar detalles, donde principalmente se trabajó con el algoritmo del filtro digital (tipo FIR) y de esta forma cumplir con los objetivos establecidos. Noviembre 2004 IE-0502 1 Filtro Digital Impl ementado en un PLD CAPÍTULO 1: Introducción La idea de este proyecto fue hacer un filtro digital utilizando los recursos de un PLD (Dispositivo Lógico Programable), con lo cual se podría motivar a otros estudiantes a utilizar estos dispositivos para probar sus diseños elaborados en el lenguaje Verilog. Entre las ventajas que ofrece este circuito integrado, es que se tiene la facilidad de que es reprogramable, esto es algo similar a construir un componente electrónico en software, con la diferencia que lo que se tiene es hardware. El objetivo final del proyecto, es permitirle a un usuario contar con un filtro que se adapta a las características y especificaciones que él mismo determine. Primeramente, el usuario debe tener claro qué tipo de filtro desea. Entiéndase por tipo de filtro si es paso bajo, paso alto o paso banda. Para esto, se debe tener conocimiento del lenguaje de MATLAB, donde es posible ingresar los parámetros como frecuencia de corte, ganancia y frecuencia de muestreo. Este software le retorna al usuario los coeficientes que debe tener el filtro para que funcione de la manera esperada. Los parámetros deben ser ingresados por el usuario al PLD modificando el archivo fuente del filtro para cambiar los coeficientes que correspondan y programando nuevamente el PLD. Noviembre 2004 IE-0502 1.1 Objetivos 1.1.1 Objetivo general • 2 Filtro Digital Impl ementado en un PLD Diseñar e implementar un filtro digital en un PLD, con la facilidad de que al variar los coeficientes de manera correcta en el filtro, este se comporte como un filtro paso bajo, paso alto o paso banda. 1.1.2 Objetivos específicos • Diseñar un filtro tipo FIR, utilizando el lenguaje Verilog y el sintetizador de Xilinx. • Crear una interfaz entre el “codec” y el PLD, de manera que ambos se puedan comunicar mediante un protocolo a establecer. • Transferir el archivo del sintetizador al PLD y probar su funcionamiento. • El filtro diseñado deberá funcionar para el caso en que la señal de entrada sea analógica y su salida también sea de manera analógica, haciendo uso de un “codec” que viene incluido en la tarjeta del PLD que se pretende utilizar. • Realizar las mejoras que correspondan y documentar todo el proceso. Noviembre 2004 IE-0502 1.2 Filtro Digital Impl ementado en un PLD 3 Justificación Lo que se pretende lograr con este proyecto, es promover el uso de los dispositivos electrónicos como el CPLD o FPGA, los cuales pueden ser de gran ayuda y complemento en el aprendizaje y comprensión de los circuitos digitales de una manera más rápida y efectiva. Esto le permitirá al estudiante probar sus diseños sin necesidad de armar todo el circuito, el cual puede ser complicado y hasta se podría incurrir en errores que den al traste con la motivación del estudiante. Para cumplir con esto, se pudo haber seleccionado cualquier circuito e implementarlo en uno de estos dispositivos, pero se seleccionó el filtro digital porque es algo útil y que podría dar paso a nuevos proyectos en el área de procesamiento de señales, tal como ecualizadores digitales y manipulación de señales, tanto de audio como de video. 1.3 Metodología Primeramente se estudió la documentación existente acerca de los FPGA y CPLD’s. Se buscaron diferentes fuentes de información, tomando como fuente principal Internet. Además es conveniente mencionar que es necesario poseer un nivel intermedio de programación en Verilog para comprender el proyecto, debido a que es este el lenguaje que se utilizó para describir los circuitos que se implementaron. Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 4 Después de haber estudiado lo anterior, se procedió a desarrollar proyectos pequeños utilizando los dispositivos ya mencionados, esto con el fin de evacuar dudas y poner en práctica la información recopilada. Cuando se comprendió de manera general el funcionamiento de los PLD’s, se empezó a diseñar el controlador necesario para manejar el “codec”. Ya diseñado e implementado en el PLD, se hicieron pruebas para asegurar su buen funcionamiento. Por otra parte, se diseñó y programó el filtro digital, y una vez finalizado, se modificaron los controladores para poner a funcionar en conjunto todas las etapas. Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 5 CAPÍTULO 2: Desarrollo teórico Un Filtro Digital es un sistema digital que es usado para filtrar señales en tiempo discreto. Las señales en tiempo discreto son señales definidas en un instante discreto, monitoreadas cada milisegundo, segundo, día, etc. Para este proyecto, es necesario diseñar un Filtro Digital, es decir, que se debe iniciar un proceso de diseño, síntesis e implementación de un filtro que al darle las excitaciones preescritas, resulten las respuestas deseadas. Existen varios tipos de filtros digitales. Aquí se diseñó un filtro tipo FIR con una arquitectura típica como el que se muestra en la Figura 2.1. Figura 2.1 Arquitectura típica de un filtro digital FIR Tomado de www.iberchip.org/IX/Articles/POST-082.pdf En este caso, el filtro tiene 8 multiplicadores, 8 registros de “w” bits organizados en una configuración de registros de desplazamiento (shift-register) y un sumador completo de ocho Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 6 datos de entrada, cada uno de “w” bits. Cada registro contiene la muestra anterior (unit sample delay), y la salida de cada registro en una etapa (TAP) y es representada por x(n), donde n es el número del TAP. Cada señal de salida de la etapa (delay inputs), es multiplicada por un coeficiente h(n) y todos los productos son sumados para producir la salida del filtro. La operación del filtro FIR de la Figura 2.1, de 8 TAP’s, puede ser representada por la ecuación: 8 y (n ) = ∑ x( n) h( n) (2.1-1) n =1 donde x(n) y h(n) son los valores de la n-ésima muestra de la señal de entrada y los coeficientes del filtro respectivamente. En el caso específico del filtro diseñado en este proyecto, el número de TAP’s es 15, y la cantidad de bits “w” de los registros es 20. Una forma de simplificar el proceso de síntesis, es con el uso de herramientas como Verilog y el WebPack de Xilinx de los cuales se hablará a continuación. El lenguaje de programación de Verilog es de gran utilidad, ya que permite describir el comportamiento de circuitos, realizar pruebas y analizar los diagramas temporales del mismo de una manera muy sencilla y rápida. El lenguaje de Verilog es un lenguaje de descripción de hardware que provee formas de especificar un sistema digital con un amplio ámbito de niveles de abstracción. El lenguaje soporta todos los conceptos de las etapas de diseño a nivel de comportamiento, y la siguiente Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 7 etapa de implementación a nivel estructural. Este lenguaje posee jerarquías de construcción, permitiéndole al diseñador el control de la complejidad de la descripción. Verilog fue originalmente diseñado en el invierno de 1983/84 como un producto con la propiedad de verificación/simulación. Luego, muchas otras propiedades de análisis fueron desarrolladas alrededor del lenguaje, incluyendo un simulador de falla y un analizador de tiempos. Más recientemente, Verilog tiene también especificaciones de entrada para las herramientas de síntesis lógica y por comportamiento. Ahora el lenguaje ha sido estandarizado como IEEE standard #1364-1995 y está abierto para cualquier herramienta en lectura y escritura. Por otra parte, el WebPack de Xilinx es una herramienta mucho más poderosa, ya que por medio de algoritmos logra traducir la descripción que se ha hecho en Verilog, a un esquemático cuya simbología es de fácil comprensión y que eventualmente se podría construir utilizando componentes digitales, o bien, pueden ser implementados y probados utilizando un Dispositivo Lógico Programable ó PLD (por sus siglas en inglés). Los PLD’s son dispositivos que proveen un espacio lleno de partes TTL y CMOS en un único chip. Cada PLD contiene cientos de compuertas lógicas digitales interconectadas por Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 8 interruptores electrónicos internos. Los interruptores pueden ser reprogramados en cualquier momento para crear un circuito lógico completamente diferente. Existen dos tipos muy conocidos de PLD’s, el FPGA (arreglo programable de compuertas de campo, por sus siglas en inglés) y el CPLD (dispositivo lógico programable complejo, por sus siglas en inglés). Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 9 CAPÍTULO 3: Diseño del Filtro 3.1 El “codec” Para la conversión analógico/digital y digital/analógico de la señal de audio, se utilizó un “codec”, por lo que se debe tener conocimiento de cómo está conectado al PLD y su protocolo de comunicación. El “codec” que se utilizó en este proyecto fue el CS4222, de CIRRUS LOGIC, ya que forma parte de los componentes con que cuenta la XStend Board V1.2. Este es un codificador/decodificador de audio capaz de digitalizar dos señales analógicas con 20 bits de resolución mientras genera simultáneamente dos señales analógicas desde los valores de los 20 bits (típicamente estas señales corresponden a los canales derecho e izquierdo de una señal de audio en estéreo). Opera con una alimentación de +5V y es de bajo consumo de potencia. Su comunicación es serial, por tanto, la entrada como la salida son de una sola línea, es decir, que los 20 bits deben transmitirse y recibirse uno a uno. Para el caso específico del filtro, se necesita trabajar con los valores de los bits en forma paralela, por lo que el circuito a diseñar debe contar con un conjunto de registros que conviertan Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 10 la entrada serial en un valor de 20 bits, y otro que convierta valores de 20 bits en una salida serial. Además de estos registros, el PLD necesita un circuito para leer y escribir en los mismos, y para indicar cuando están llenos o vacíos. Es también necesario construir un circuito que detecte el rebase positivo (overflow), y el rebase negativo (underflow) de los registros del PLD si éstos no han sido leídos o escritos a tiempo. Figura 3.1 Diagrama del Codec CS4222 Tomado de las hojas del fabricante, Cirrus Logic A continuación se muestra la conexión entre el codec de la XStendBoard y la XS Board FPGA o CPLD: Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 11 Figura 3.2 Conexión del Codec al FPLD Tomado de las hojas del fabricante, XESS Corporation En la Figura 3.2, la señal indicada como serial data out corresponde a la salida del ADC (Analogic/Digital Converter), y serial data in indica la entrada al DAC (Digital/Analogic Converter). Para efectos de este diseño, ambas señales serán llamadas sdout y sdin respectivamente. 3.2 Diseño del Filtro a Implementar Con esta información, ya se puede tener una idea general de las entradas y salidas que se necesitan para poder manejar las señales del circuito del “codec”. Por ejemplo, se sabe que el filtro necesita una señal de reloj, un reset y una entrada por donde se recibe la salida del convertidor A/D (sdout). Se requiere también de una salida para enviar el Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 12 dato digital ya procesado al convertidor D/A (sdin), el cual da como resultado la señal analógica filtrada. Además hay que agregar las salidas de control del “codec” (lrck, sclk, mclk, s), las cuales se explicarán más adelante, junto con cada uno de los módulos que forman el circuito integrado de filtro. Figura 3.3 Vista del nivel más alto del chip de filtro diseñado El bloque de la Figura 3.3 es la propuesta del circuito implementado, el cual se puede descomponer en cinco módulos, que contienen los circuitos necesarios para realizar el filtrado: • Una unidad de reloj, encargada de sincronizar la transferencia de información entre el PLD y el codec, genera una señal de reloj para los registros y las señales de selección de canales derecho/izquierdo • Un módulo de canal que contiene los registros, control de lectura/escritura y un circuito de detección del overflow/underflow (rebase positivo y negativo, respectivamente), se encarga de controlar la transferencia de datos entre el “codec” y el filtro Noviembre 2004 IE-0502 • 13 Filtro Digital Impl ementado en un PLD El módulo “codec_top”, que contiene el módulo de reloj y dos módulos de canal (estéreo), para hacer las conexiones entre ellos y así tener lista la interfaz del “codec” con el filtro • El filtro, que realiza y ejecuta el algoritmo de filtrado digital tipo FIR • Un módulo “top-level” o “superior”, que combina el módulo codec_top con el módulo del filtro para completar el circuito A continuación se analiza cada uno de los módulos y su función. 3.2.1 Módulo de Reloj Se encarga de coordinar todas las señales de control de todos los demás módulos, sincronizándolos entre sí. Como el “codec” sólo puede trabajar con relojes de frecuencias entre 1.014 a 25.6 MHz, fue necesario construir un pequeño módulo para bajar la frecuencia del reloj que posee la tarjeta del FPGA Spartan IIE, cuya frecuencia es de 32 MHz. Así, la nueva frecuencia del reloj utilizado es de 16 MHz aproximadamente, con lo que se consigue una frecuencia de muestreo de 48 KHz, suficiente para manipular señales de audio. Las entradas y salidas de este módulo se definen a continuación: clk: Esta es la entrada del reloj principal. reset: Esta entrada inicializa el contador del generador de reloj. Sincroniza el circuito. mclk: Esta salida es el reloj master para el chip. sclk: Es el reloj para sincronizar la transferencia serial de datos entre el PLD y el “codec”. Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 14 lrck: Esta salida controla la activación del circuito de canal izquierdo y derecho en el “codec” y el PLD. bit_cntr: Estas salidas indican el bit actual que ha sido transmitido y recibido en las líneas de datos. subcycle_cntr: La duración de cada bit de dato serial es dividido en cuatro fases, y estas salidas indican la fase actual. Figura 3.4 Vista del nivel más alto del Módulo de Reloj, llamado “clockGenerator” 3.2.2 Módulo de Canal Este módulo recibe los datos seriales desde el “codec” ADC para almacenarlos en un registro de desplazamiento hasta completar el dato de 20 bits. Una vez estable el contenido de este registro, queda disponible en formato paralelo para que sea leído por el filtro. Por otro lado, este módulo recibe la salida del filtro en formato paralelo para ser transmitida al “codec” DAC en forma serial. Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 15 Las entradas y salidas de este módulo se definen a continuación: clk: Entrada de reloj principal. reset: Esta entrada sincroniza e inicializa el canal. chan_on: Un “nivel alto” en esta entrada activa el canal. Esta entrada es usualmente controlada por el selector de canal “left/right”. bit_cntr: Estas entradas informan al canal del índice del bit de dato serial que está siendo transmitido y recibido. chan_sel: Un “nivel alto” en esta entrada habilita la interfaz que permite que los registros sean leídos y escritos. (Note que esta señal no controla el selector de canal “left/right”). rd: Un “nivel alto” en esta entrada, saca el valor guardado en el registro conectado al ADC. wr: Un “nivel alto” en esta entrada escribe un nuevo valor en el registro conectado al DAC. adc_out: Los bits guardados en el registro ADC son sacados en paralelo a través de estas salidas. dac_in: El registro DAC es cargado en paralelo con los bits que pasan a través de estas entradas. adc_out_rdy: Esta salida se pone en nivel alto después de que todos los bits han sido colocados desde el “codec” al registro ADC. adc_overrun: Esta salida se pone en nivel alto si un nuevo dato serial es agregado dentro del registro ADC antes de que el contenido anterior haya sido leído a través de las salidas en paralelo. Noviembre 2004 IE-0502 16 Filtro Digital Impl ementado en un PLD dac_in_rdy: Esta salida va a nivel alto después de que todos los bits en el registro DAC han sido tomados por el “codec”. dac_underrun: Esta salida va a nivel alto si el registro DAC empieza a enviar datos al “codec” antes de que estos hayan sido escritos a través de las entradas en paralelo. sdin: El dato serial para el “codec” DAC es enviado a través de esta salida. (Note que esta salida toma su nombre del pin al que está conectada en el chip del “codec”; esta no es una entrada). sdout: El dato serial desde el “codec” ADC es introducido a través de esta entrada. (Note que esta entrada toma su nombre del pin al que está conectada en el chip del “codec”; esta no es una salida). Figura 3.5 Vista del nivel más alto del Módulo de Canal, llamado “channel” Noviembre 2004 IE-0502 3.2.3 17 Filtro Digital Impl ementado en un PLD Módulo “codec_top” Combina el módulo “clockGenerator” con dos módulos “channel”. La instancia del “clockGenerator”, u0, recibe un reloj de 16 MHz aproximadamente, y genera el “master clock”, “left/right clock”, y “serial shift clock” para el “codec”. Las instancias de “channel”, u_left y u_right son las correspondientes a los canales izquierdo y derecho del “codec” , respectivamente. Estos módulos están activos , cada uno por separado, durante una mitad del periodo del “left/right clock”. Además tiene un indicador de error producido por rebase positivo y negativo para la interfase total del “codec”. El error es reportado si cualquiera de los canales reporta un error. Las entradas y salidas de este módulo se definen a continuación: clk: Esta es la entrada del reloj principal. reset: Entrada sincrónica que inicializa los dos módulos de canal y el generador de reloj. lrsel: Esta entrada selecciona entre el canal derecho o izquierdo para las operaciones de lectura/escritura en paralelo. rd: Un “nivel alto” en esta entrada, saca el valor guardado en el registro de desplazamiento seleccionado conectado al ADC. wr: Un “nivel alto” en esta entrada escribe un nuevo valor en el registro de desplazamiento seleccionado conectado al DAC. ladc_out, radc_out: Los bits guardados en los registros de desplazamiento izquierdo/derecho del ADC, son leídos afuera en paralelo a través de estas salidas. Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 18 ldac_in, rdac_in: Los registros de desplazamiento del DAC son cargados en paralelo con bits a través de estas entradas. ladc_out_rdy, radc_out_rdy: Estas salidas van a “nivel alto” después de que todos los bits han sido desplazados desde el “codec” hasta el registro izquierdo/derecho del ADC, respectivamente. adc_overrun: Esta salida va a “nivel alto” si un nuevo dato serial es desplazado dentro del registro de desplazamiento derecho o izquierdo del ADC antes de que el viejo contenido haya sido leído afuera a través de las salidas paralelas. ldac_in_rdy, rdac_in_rdy: Estas salidas van a “nivel alto” después de que todos los bits del registro de desplazamiento izquierdo o derecho del DAC, han sido desplazados al “codec”, respectivamente. dac_underrun: Esta salida va a “nivel alto” si algún registro de desplazamiento izquierdo o derecho del DAC empieza a enviar datos al “codec” antes de que haya sido escrito a través de las entradas en paralelo. mclk: Esta salida es el reloj maestro para el “codec”. sclk: Esta salida es el reloj para sincronizar la transferencia serial de datos entre el PLD y el “codec”. lrck: Esta salida controla la activación del circuito del canal izquierdo y derecho en el “codec”. sdin: Los datos seriales para el “codec” DAC son enviados a través de esta salida. sdout: Los datos seriales enviados desde el “codec” ADC son desplazados a través de esta entrada. Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 19 Figura 3.6 Vista del nivel más alto del Módulo “codec_top” 3.2.4 Módulo de Filtro Dentro de este módulo es donde se reciben los datos de los canales izquierdo y derecho para ser sometidos al proceso de filtrado (algoritmo FIR), y una vez que completa todas las operaciones, pone en “nivel alto” la salida tx_right o tx_left según corresponda, para indicar que está listo para recibir un nuevo dato. El filtro trabaja con el reloj original de 32MHz del FPGA Spartan IIE. No está de más recordar que se construyó un módulo para disminuir la frecuencia de este reloj a la mitad, debido a las limitantes presentadas por el “codec”. Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 20 Este módulo no cuenta con una señal de inicialización o “reset” debido a que el tipo de algoritmo utilizado no lo requiere. Las entradas y salidas de este módulo se definen a continuación: ladc_out: Esta entrada proviene del registro de desplazamiento que almacena la salida del canal izquierdo del “codec” ADC. radc_out: Esta entrada proviene del registro de desplazamiento que almacena la salida del canal derecho del “codec” ADC. ladc_out_rdy: Esta señal indica al filtro cuándo el dato del canal izquierdo está listo para ser leído. radc_out_rdy: Esta señal indica al filtro cuándo el dato del canal derecho esta listo para ser leído. reloj: Entrada de reloj para sincronizar el filtro con los otros módulos. lrck: Esta entrada recibe una señal que indica cuál de los dos canales debe ser leído por el filtro. Dicha señal proviene del módulo “clockGenerator”. rdac_in: Salida que envía los datos del registro de 20 bits del canal derecho, al módulo “channel” para que dicho módulo los pase de manera serial al “codec” DAC. ldac_in: Salida que envía los datos del registro de 20 bits del canal izquierdo, al módulo “channel” para que dicho módulo los pase de manera serial al “codec” DAC. tx_left: Salida para indicar que se han realizado las operaciones sobre el dato del canal izquierdo y está listo para ser transmitido. Noviembre 2004 IE-0502 21 Filtro Digital Impl ementado en un PLD tx_right: Salida para indicar que se han realizado las operaciones sobre el dato del canal derecho y está listo para ser transmitido. Figura 3.7 Vista del nivel más alto del módulo de filtro, llamado “filtro” 3.2.5 Módulo “top_level” Contiene el módulo reloj, cuya única función es la de reducir la frecuencia del reloj principal a la mitad. Además tiene un módulo “codecTop” y un módulo “filtro”. El módulo “top_level” se encarga de conectar cada uno de estos módulos como corresponde, y se encarga de controlar la señal de lrsel, que indica sobre cuál de los canales se está trabajando, y las señales rd y wr, que son las señales de lectura y escritura a los registros de desplazamiento del módulo “channel”. Este módulo coordina sus acciones sobre las señales de control gracias a que recibe las señales radc_out_rdy, ladc_out_rdy, ldac_in_rdy, rdac_in_rdy, tx_left y tx_right. Estas señales indican procesos que ya han sido finalizados y le comunican al “top_level” que los diferentes módulos están listos para un nuevo proceso. Noviembre 2004 IE-0502 22 Filtro Digital Impl ementado en un PLD A continuación se describe cada uno de los puertos I/O: reloj_in: Es la entrada de reloj al circuito. rst: Señal de inicialización del sistema. sdout: Esta entrada es la salida del “codec” ADC, donde envía los datos de manera serial. s[0]: Salida de overrun. s[1]: Salida de underrun. lrck: Salida que indica cuál de los canales debe ser manejado. mclk: Salida de reloj para el sistema. reloj_out: Esta salida de reloj tiene la misma frecuencia del reloj de entrada. sclk: Esta salida es el reloj para sincronizar la transferencia serial de datos entre el PLD y el “codec”. sdin: Esta salida es la entrada del “codec” DAC, por donde recibe el dato de manera serial. Figura 3.8 Vista externa del Módulo “top_level” Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 23 CAPÍTULO 4: Análisis de resultados Las pruebas realizadas al circuito implementado muestran resultados aceptables, como se mostrará más adelante, y abren el camino para quienes quieran investigar sobre las comunicaciones digitales, donde se podría pensar en proyectos que permitan el procesamiento de señales no sólo de audio, sino también de video, y la creación de nuevos algoritmos que hagan más eficiente la manipulación de las mismas. A continuación se muestran las señales de entrada (señal 2->) y salida (señal1->) del filtro digital FIR comportándose como filtro paso banda. Se realizó un barrido de frecuencia para observar su comportamiento, que en teoría debería permitir el paso de señales cuya frecuencia sea mayor a 300Hz e inferior a 4.8kHz. Figura 4.1 Respuesta a una frecuencia de entrada de 44Hz Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 24 La señal de entrada tiene una magnitud de aproximadamente 500mV y no se varió durante todo el barrido. Como se puede ver en las figuras, el ruido fue un factor que estuvo presente durante todas las pruebas y resultó imposible eliminarlo por completo y en algunas frecuencias se presentaba con mayor magnitud que en otras. Figura 4.2 Respuesta a una frecuencia de entrada de 100Hz En esta figura se puede observar como la salida del filtro comienza a permitir el paso de la señal. Hasta este momento, la salida no era audible pero sí observable en el osciloscopio. Figura 4.3 Respuesta a una frecuencia de entrada de 256Hz Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 25 Figura 4.4 Respuesta a una frecuencia de entrada de 545Hz Figura 4.5 Respuesta a una frecuencia de entrada de 782Hz Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 26 Figura 4.6 Respuesta a una frecuencia de entrada de 1.40kHz Figura 4.7 Respuesta a una frecuencia de entrada de 2.0kHz Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 27 Figura 4.8 Respuesta a una frecuencia de entrada de 3.22kHz Figura 4.9 Respuesta a una frecuencia de entrada de 3.85kHz Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 28 Figura 4.10 Respuesta a una frecuencia de entrada de 4.0kHz En este punto del barrido, la salida todavía era audible. Al hacer un ligero aumento en la frecuencia de la señal de entrada, ya no fue posib le escuchar la salida, aunque esta realmente desapareció por completo en el osciloscopio hasta que alcanzó una frecuencia de 4.35kHz aproximadamente. Figura 4.11 Respuesta a una frecuencia de entrada de 4.35kHz Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 29 Una etapa importante del diseño del filtro, fue la obtención de los coeficientes para los diferentes tipos. Aquí se utilizó una herramienta de MATLAB llamada Filter Design, en donde se introducen las características del filtro y esta retorna los valores de los coeficientes en decimal. Estos coeficientes, proporcionados por MATLAB, deben ser normalizados con respecto al de mayor magnitud y luego, de acuerdo a la resolución que se desea de los mismos (# de bits), se multiplica el vector normalizado por (2 n −1) en caso que existan coeficientes negativos, o 2 solamente por ( 2 n − 1) si todos los coeficientes son positivos, donde n es el # de bits. Para este caso específico n = 6 . Se considera suficiente ya que los resultados de los experimentos resultaron satisfactorios. Otro factor importante a analizar es el tiempo. La frecuencia de muestreo del “codec” es cercana a los 48000Hz, y de acuerdo al teorema de Nyquist sobre muestreo, con esa frecuencia se puede muestrear señales de 24000Hz (por encima de la frecuencia audible) o menos, según la fórmula Fs > 2 ∗ F , donde Fs es la frecuencia de muestreo, y F es la frecuencia de la señal muestreada. Por lo tanto se dice que para el objetivo de este proyecto de manipular señales de audio, la Fs es más que suficiente. Una de las conclusiones expone la posibilidad de mejorar el diseño del filtro, esto porque el que se ha mostrado en este trabajo tiene un multiplicador por cada TAP, lo cual compromete gran Noviembre 2004 IE-0502 30 Filtro Digital Impl ementado en un PLD parte de los recursos del FPGA. Como se ha mencionado en este apéndice, el tiempo no es factor crítico, lo que daría oportunidad de diseñar un único multiplicador para realizar las operaciones en cada una de las etapas (TAP´s). Para visualizar mejor esta idea, se muestra la Figura Apéndice 1.1, en donde se puede observar que se cuenta con un único módulo Multiplicador y un único módulo Sumador. Con esto se consigue reducir la cantidad de hardware (circuitería), sacrificando velocidad del filtro. Figura 4.12 Sugerencia del uso de un único multiplicador Tomado de www.iberchip.org/IX/Articles/POST-082.pdf Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 31 Los PLD’s pueden ser un complemento importante de los cursos de electrónica digital y servir de motivación en la búsqueda de nuevos circuitos, que sirvan para el desarrollo de soluciones innovadoras dentro de un mercado que evoluciona día con día. Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 32 CAPÍTULO 5: Conclusiones y recomendaciones • Se diseñó un filtro tipo FIR utilizando el lenguaje Verilog que permitió la descripción de la gran mayoría del circuito por comportamiento, ya que algunas partes debieron ser descritas de manera estructural. • La interfaz creada entre el “codec” y el PLD fue posible mediante un protocolo de comunicación que se estableció, y que permitió la transferencia de datos entre ellos. • El archivo que contiene la descripción de todo el circuito se sintetizó por medio de las herramientas de Xilinx y luego fue transferido al PLD, lo que permitió realizar pruebas para verificar su funcionamiento. • El filtro diseñado en este proyecto funciona para señales de entrada analógicas y señales de salida también analógicas. Esto es posible gracias al uso de un “codec” y a la interfaz de éste con el PLD. • El sintetizador de Xilinx junto con los PLD’s, son herramientas importantes que pueden ayudar a los estudiantes a comprender con mayor facilidad los circuitos digitales y su funcionamiento, esto porque se pueden implementar circuitos rápidamente y probar su funcionamiento sin necesidad de manipular muchos componentes, lo que disminuye considerablemente las posibilidades de incurrir en errores de tipo técnico. • Promover el uso de los PLD’s como un complemento de los cursos de electrónica digital. Noviembre 2004 IE-0502 • 33 Filtro Digital Impl ementado en un PLD La arquitectura expuesta en este proyecto emplea un área considerable de hardware (recursos del FPGA), por lo que se puede pensar en diseñar una arquitectura que use menor área, ya que la velocidad no es un factor crítico (ver Apéndice 1). • Que el estudiante conozca más acerca de los protocolos de comunicación existentes, le permitiría trabajar en proyectos complejos y de gran utilidad en materia de tecnologías de información. • Agregar en el laboratorio de circuitos digitales, un experimento que incluya el uso de un PLD para darle al estudiante una herramienta más de diseño. • Fomentar el uso del lenguaje Verilog, pero que el estilo de programación vaya orientado de manera tal que sea posible sintetizar los circuitos con la herramienta de Xilinx. Noviembre 2004 IE-0502 34 Filtro Digital Impl ementado en un PLD BIBLIOGRAFÍA Libros: 1. Van den Bout, D. “The Practical Xilinx ® Designer Lab Book”, Prentice Hall, Estados Unidos, 1998. 2. Thomas, D., Moorby, P. “The Verilog® Hardware Description Language”, 3ra Edición, Kluwer Academic Publisher, Estados Unidos, 1996. Páginas web: 1. “DigiLab 2E Reference Manual”, www.digilentinc.com 2. “Spartan-IIE 1.8V FPGA Family: Complete Data Sheet”, www.xilinx.com 3. “XStend Board V1.2 Manual”, www.wess.com 4. “20-Bit Stereo Audio Codec with Volume Control, CS4222” www.cirrus.com 5. “DISEÑO DE FUNCIONES DSP USANDO VHDL Y CPLDs-FPGA” www.iberchip.org/IX/Articles/POST-082.pdf Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 35 ANEXOS Anexo 1: Guía de Xilinx WebPack Descripción en VeriLog y programación del PLD A continuación se mostrará una breve descripción de cómo programar un PLD utilizando la herramienta de Xilinx WebPack. Para empezar, se debe seleccionar un lenguaje de programación para la descripción de Hardward, entre los que están Verilog y VHDL. Una vez que se tiene suficiente conocimiento del mismo, es recomendable que se elabore un pequeño programa con su respectivo test o prueba, y si la simulación “corre” como se esperaba, se procede a utilizar el archivo (sin el test), en el programa de “Project Navigator”. Para hacerlo siga los siguientes pasos: 1. Abra la ventana de Project Navigator. 2. Seleccione File - New Project. 3. Escriba el nombre de la carpeta del proyecto (ver Figura Anexo 1.1). 4. El “Top-Level Module Type” se selecciona en HDL si se va a utilizar un lenguaje de descripción de Hardware. Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 36 Figura Anexo 1.1 Ventana para construir un nuevo proyecto. 5. Al presionar siguiente, se debe indicar la familia del dispositivo, su nombre, el encapsulado y su grado de velocidad, así como también el lenguaje de simulación que se va a utilizar, y luego presione “Siguiente” (ver Figura Anexo 1.2). Noviembre 2004 IE-0502 37 Filtro Digital Impl ementado en un PLD Figura Anexo 1.2. Construcción de nuevo proyecto, selección del dispositivo. 6. Si ya se tienen el o los archivos que se desean sintetizar, presione “Siguiente”, donde aparecerá una ventana con la opción de “Add Source” (ver Figura Anexo 1.4), pero si aún no tiene el programa escrito, puede escribirlo directamente en el “Project Navigator” marcando la opción de “N ew Source” (ver Figura Anexo 1.3). Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 38 7. Una vez seleccionadas y añadidas la(s) fuente(s), aparecerá la ventana de la Figura Anexo 1.5. Presione “Siguiente” y compruebe que la información introducida durante el proceso es la correcta, luego presione “Finalizar”. Figura Anexo 1.3. Creación de nuevo proyecto, agregar una nueva fuente (programa). Noviembre 2004 IE-0502 39 Filtro Digital Impl ementado en un PLD Figura Anexo 1.4. Crear nuevo proyecto, agregar una fuente existente. Una vez que se han realizado los pasos anteriores, se procede a efectuar la síntesis del circuito que se haya descrito. Para explicar mejor la manera cómo debe realizarse este proceso, se mostrará un ejemplo de un circuito para implementarlo en el FPGA Spartan II, de Xilinx, el cual Noviembre 2004 IE-0502 40 Filtro Digital Impl ementado en un PLD consiste en un marcador de pulsos de reloj por medio de un led. La descripción en VeriLog del circuito se muestra en la Lista Anexo 1.1. Ya cargada la descripción en la aplicación de Project Navigator, se puede observar en la ventana de Processes for Source varias opciones. Lo que interesa en este punto es implementar el circuito en el FPGA, por lo que selecciona la opción Implement Design (ver Figura Anexo 1.5). Lista Anexo 1.1. Programa fuente para la descripción en VeriLog de un circuito marcador de pulsos. module ledSpartan(clk, reset, led); input clk, reset; output led; reg [23:0]cont; assign led=cont[23]; always @(negedge clk) begin if(reset) cont<=0; else cont<=cont+1; end endmodule Noviembre 2004 IE-0502 41 Filtro Digital Impl ementado en un PLD Figura Anexo 1.5. Proceso de implementación del diseño en el Spartan II. Cuando finaliza el proceso de implementación, se pueden observar las advertencias y/o errores en caso que existan. Además, es necesario realizar la asignación de pines, que consiste en asignarle a cada puerto del circuito diseñado, el número de pin que corresponda de acuerdo a la función de dicho puerto. Para esto, se debe seleccionar Assign Package Pins para crear un archivo UCF, el cual contiene la información de los pines (ver Figura Anexo 1.6). Noviembre 2004 IE-0502 42 Filtro Digital Impl ementado en un PLD Para este ejemplo, los puertos son clk, reset y led, y deben asignarse de la siguiente manera: Tabla Anexo 1.1. Asignación de pines a los puertos Reset P15 Led P69 Clk P80 Donde P15 es el pin #15 del Spartan y el pin #2 es el pin del puerto paralelo. Figura Anexo 1.6. Creación del archivo .UCF de asignación de pines. Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 43 Después de esto, se debe pasar a la fase final, que consiste en generar un archivo de programación, el cual será transmitido, en este caso, al Spartan II, por medio del puerto paralelo de la computadora. Conectados los dispositivos, el proceso que debe seleccionarse es el de Configure Device. Se abrirá una ventana con varias opciones de cómo configurar el dispositivo. Para el Spartan II, se selecciona el Boundary-Scan Mode y en la siguiente ventana se selecciona Enter a BoundaryScan Chain. Esto permite que se seleccione el archivo .bit de la carpeta del proyecto. Se debe recordar que en este punto, el Spartan II debe estar conectado a la computadora y alimentado con una fuente de 5V. Dentro de esta ventana, se marca el chip que aparece, y en la opción de Operations se marca Program (ver Figura Anexo 1.7). Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 44 Figura Anexo 1.7. Proceso de programación del FPGA. Ahora el circuito está listo para ser probado. Introduciendo un “nivel alto” en el pin #2 del puerto paralelo, comenzará a parpadear el LED1 de la tabla DIGILAB IIE del SpartanII. Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD Anexo 2: 45 Código Fuente de los Módulos ////////////////**** MODULO DE RELOJ PARA REDUCIR LA FRECUENCIA DEL ***////////////// // RELOJ PRINCIPAL // module reloj(reloj, clk); input reloj; output clk; reg cont; assign clk=cont; always @(posedge reloj) cont=cont+1; endmodule //////////************ FILTRO PARA COEF ICIENTES DE 6 BITS *****************//////// ///******************** Y 15 TAPS **********************//////// `define dac_width 20 `define adc_width 20 `define left 0 `define right 1 `define tap 15 module filtro(reloj, lrck, ladc_out, radc_out, ldac_in, rdac_in, ladc_out_rdy, radc_out_rdy, tx_left, tx_right); input reloj, lrck, ladc_out_rdy, radc_out_rdy; input [`adc_width-1:0]ladc_out, radc_out; output [`dac_width-1:0]ldac_in, rdac_in; output tx_left, tx_right; reg reg reg reg reg reg reg reg [`adc_width-1:0]fifo_lchannel[0:`tap-1]; [`adc_width-1:0]fifo_lchannel_aux[0:`tap-1]; [`adc_width-1:0]fifo_rchannel[0:`tap-1]; [`adc_width-1:0]fifo_rchannel_aux[0:`tap-1]; [5:0]firCoef[0:`tap-1]; [`dac_width-1:0]ldac_in, rdac_in; [26:0]left_dataTem, right_dataTem; ready_left, ready_right, ready_left_aux, Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 46 ready_right_aux, rdataTem, ldataTem, tx_right, tx_left; always @(posedge reloj) begin /* ///COEFICIENTES DE FILTRO PASO BAJO //Fstop = 7500 Hz firCoef[0] <= 6'b000000;//0 firCoef[1] <= 6'b001001;//9 firCoef[2] <= 6'b001100;//12 firCoef[3] <= 6'b010001;//17 firCoef[4] <= 6'b010110;//22 firCoef[5] <= 6'b011011;//27 firCoef[6] <= 6'b011110;//30 firCoef[7] <= 6'b011111;//31 firCoef[8] <= 6'b011110;//30 firCoef[9] <= 6'b011011;//27 firCoef[10] <= 6'b010110;//22 firCoef[11] <= 6'b010001;//17 firCoef[12] <= 6'b001100;//12 firCoef[13] <= 6'b001001;//9 firCoef[14] <= 6'b000000;//0 */ /* ///COEFICIENTES DE FILTRO PASO ALTO //Fstop = 1100Hz Fpass = 7500Hz (TEORICO) firCoef[0] <= 6'b000000;//0 firCoef[1] <= 6'b000000;//0 firCoef[2] <= 6'b000000;//0 firCoef[3] <= 6'b111110;//-2 firCoef[4] <= 6'b111101;//-3 firCoef[5] <= 6'b111011;//-5 firCoef[6] <= 6'b111010;//-6 firCoef[7] <= 6'b011111;//31 firCoef[8] <= 6'b111010;//-6 firCoef[9] <= 6'b111011;//-5 firCoef[10] <= 6'b111101;//-3 firCoef[11] <= 6'b111110;//-2 firCoef[12] <= 6'b000000;//0 firCoef[13] <= 6'b000000;//0 firCoef[14] <= 6'b000000;//0 */ //* ///COEFICIENTES DE FILTRO PASA BANDA //Fpass = 300Hz-4800Hz firCoef[0] <= 6'b111110;//-2 firCoef[1] <= 6'b111111;//-1 Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 47 firCoef[2] <= 6'b111110;//-2 firCoef[3] <= 6'b110111;//-9 firCoef[4] <= 6'b110001;//-15 firCoef[5] <= 6'b111010;//-6 firCoef[6] <= 6'b010010;//18 firCoef[7] <= 6'b011111;//31 firCoef[8] <= 6'b010010;//18 firCoef[9] <= 6'b111010;//-6 firCoef[10] <= 6'b110001;//-15 firCoef[11] <= 6'b110111;//-9 firCoef[12] <= 6'b111110;//-2 firCoef[13] <= 6'b111111;//-1 firCoef[14] <= 6'b111110;//-2 //*/ end //DESPLAZAMIENTO DE LOS REGISTROS PRINCIPALES A LOS AUXILIARES always @(posedge reloj) begin // CANAL LCHANNEL if(lrck == `left & ladc_out_rdy & ~ready_left_aux) begin fifo_lchannel_aux[14]<=fifo_lchannel[13]; fifo_lchannel_aux[13]<=fifo_lchannel[12]; fifo_lchannel_aux[12]<=fifo_lchannel[11]; fifo_lchannel_aux[11]<=fifo_lchannel[10]; fifo_lchannel_aux[10]<=fifo_lchannel[9]; fifo_lchannel_aux[9]<=fifo_lchannel[8]; fifo_lchannel_aux[8]<=fifo_lchannel[7]; fifo_lchannel_aux[7]<=fifo_lchannel[6]; fifo_lchannel_aux[6]<=fifo_lchannel[5]; fifo_lchannel_aux[5]<=fifo_lchannel[4]; fifo_lchannel_aux[4]<=fifo_lchannel[3]; fifo_lchannel_aux[3]<=fifo_lchannel[2]; fifo_lchannel_aux[2]<=fifo_lchannel[1]; fifo_lchannel_aux[1]<=fifo_lchannel[0]; fifo_lchannel_aux[0]<=ladc_out; ready_left_aux<=1; end else if(~ladc_out_rdy) ready_left_aux<=0; end // CANAL RCHANNEL always @(posedge reloj) begin if(lrck == `right & radc_out_rdy & ~ready_right_aux) begin fifo_rchannel_aux[14]<=fifo_rchannel[13]; fifo_rchannel_aux[13]<=fifo_rchannel[12]; fifo_rchannel_aux[12]<=fifo_rchannel[11]; Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 48 fifo_rchannel_aux[11]<=fifo_rchannel[10]; fifo_rchannel_aux[10]<=fifo_rchannel[9]; fifo_rchannel_aux[9]<=fifo_rchannel[8]; fifo_rchannel_aux[8]<=fifo_rchannel[7]; fifo_rchannel_aux[7]<=fifo_rchannel[6]; fifo_rchannel_aux[6]<=fifo_rchannel[5]; fifo_rchannel_aux[5]<=fifo_rchannel[4]; fifo_rchannel_aux[4]<=fifo_rchannel[3]; fifo_rchannel_aux[3]<=fifo_rchannel[2]; fifo_rchannel_aux[2]<=fifo_rchannel[1]; fifo_rchannel_aux[1]<=fifo_rchannel[0]; fifo_rchannel_aux[0]<=radc_out; ready_right_aux<=1; end else if(~radc_out_rdy) ready_right_aux<=0; end //DESPLAZAMIENTO DE LOS REGISTROS AUXILIARES A LOS PRINCIPALES always @(posedge reloj) begin if(ready_left_aux & ~ready_left) begin //CANAL LCHANNEL fifo_lchannel[14]<=fifo_lchannel_aux[14]; fifo_lchannel[13]<=fifo_lchannel_aux[13]; fifo_lchannel[12]<=fifo_lchannel_aux[12]; fifo_lchannel[11]<=fifo_lchannel_aux[11]; fifo_lchannel[10]<=fifo_lchannel_aux[10]; fifo_lchannel[9]<=fifo_lchannel_aux[9]; fifo_lchannel[8]<=fifo_lchannel_aux[8]; fifo_lchannel[7]<=fifo_lchannel_aux[7]; fifo_lchannel[6]<=fifo_lchannel_aux[6]; fifo_lchannel[5]<=fifo_lchannel_aux[5]; fifo_lchannel[4]<=fifo_lchannel_aux[4]; fifo_lchannel[3]<=fifo_lchannel_aux[3]; fifo_lchannel[2]<=fifo_lchannel_aux[2]; fifo_lchannel[1]<=fifo_lchannel_aux[1]; fifo_lchannel[0]<=fifo_lchannel_aux[0]; ready_left<=1; end else if(~ready_left_aux) ready_left<=0; end always @(posedge reloj) begin if(ready_right_aux & ~ready_right) begin //CANAL RCHANNEL fifo_rchannel[14]<=fifo_rchannel_aux[14]; Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 49 fifo_rchannel[13]<=fifo_rchannel_aux[13]; fifo_rchannel[12]<=fifo_rchannel_aux[12]; fifo_rchannel[11]<=fifo_rchannel_aux[11]; fifo_rchannel[10]<=fifo_rchannel_aux[10]; fifo_rchannel[9]<=fifo_rchannel_aux[9]; fifo_rchannel[8]<=fifo_rchannel_aux[8]; fifo_rchannel[7]<=fifo_rchannel_aux[7]; fifo_rchannel[6]<=fifo_rchannel_aux[6]; fifo_rchannel[5]<=fifo_rchannel_aux[5]; fifo_rchannel[4]<=fifo_rchannel_aux[4]; fifo_rchannel[3]<=fifo_rchannel_aux[3]; fifo_rchannel[2]<=fifo_rchannel_aux[2]; fifo_rchannel[1]<=fifo_rchannel_aux[1]; fifo_rchannel[0]<=fifo_rchannel_aux[0]; ready_right<=1; end else if(~ready_right_aux) ready_right<=0; end //MULTIPLICACION Y SUMA, PROCESO DE FILTRADO DIGITAL always @(posedge reloj) begin if(ready_right & ~rdataTem) begin //CANAL RCHANNEL right_dataTem<=(fifo_rchannel[0]*firCoef[0]+ fifo_rchannel[1]*firCoef[1]+ fifo_rchannel[2]*firCoef[2]+ fifo_rchannel[3]*firCoef[3]+ fifo_rchannel[4]*firCoef[4]+ fifo_rchannel[5]*firCoef[5]+ fifo_rchannel[6]*firCoef[6]+ fifo_rchannel[7]*firCoef[7]+ fifo_rchannel[8]*firCoef[8]+ fifo_rchannel[9]*firCoef[9]+ fifo_rchannel[10]*firCoef[10]+ fifo_rchannel[11]*firCoef[11]+ fifo_rchannel[12]*firCoef[12]+ fifo_rchannel[13]*firCoef[13]+ fifo_rchannel[14]*firCoef[14]); rdataTem<=1; end else if(~ready_right) begin rdataTem<=0; right_dataTem<=0; end end always @(posedge reloj) Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 50 //CANAL LCHANNEL begin if(ready_left & ~ldataTem) begin left_dataTem<=(fifo_lchannel[0]*firCoef[0]+ fifo_lchannel[1]*firCoef[1]+ fifo_lchannel[2]*firCoef[2]+ fifo_lchannel[3]*firCoef[3]+ fifo_lchannel[4]*firCoef[4]+ fifo_lchannel[5]*firCoef[5]+ fifo_lchannel[6]*firCoef[6]+ fifo_lchannel[7]*firCoef[7]+ fifo_lchannel[8]*firCoef[8]+ fifo_lchannel[9]*firCoef[9]+ fifo_lchannel[10]*firCoef[10]+ fifo_lchannel[11]*firCoef[11]+ fifo_lchannel[12]*firCoef[12]+ fifo_lchannel[13]*firCoef[13]+ fifo_lchannel[14]*firCoef[14]); ldataTem<=1; end else if(~ready_left) begin ldataTem<=0; left_dataTem<=0; end end always @(posedge reloj) //TRANSFERENCIA DE RESULTADO A LA SALIDA begin if(rdataTem & ~tx_right) begin rdac_in <= right_dataTem[19:0]; tx_right<=1; end else if(~rdataTem) tx_right<=0; if(ldataTem & ~tx_left) begin ldac_in <= left_dataTem[19:0]; tx_left<=1; end else if(~ldataTem) tx_left<=0; end endmodule ////////////**************** MODULO CLOCKGENERATOR *******************/////////// //*** SE ENCARGA DE SINCRONIZAR LA TRANSFERENCIA DE DATOS ENTRE LOS MODULOS ***// `define yes 1 Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 51 `define no 0 `define left 0 `define right 1 `define channel_duration 128 module clockGenerator(clk, reset, mclk, sclk, lrck, bit_cntr, subcycle_cntr); input clk, //Entrada de Reloj reset; //Reset sincronico activo en alto output mclk, //Salida Master Clock al codec sclk, //Reloj del serial data al codec lrck; //Selector de canal left/right output [5:0]bit_cntr; //Estas salidas indican el bit que esta siendo transmitido y recibido output [1:0]subcycle_cntr; //La duracion de cada bit del dato serial es dividido en 4 fases reg lrck_int; wire lrck, sclk, mclk; reg [7:0]seq; wire [5:0]bit_cntr; wire [1:0]subcycle_cntr; assign lrck = lrck_int; assign mclk = clk; assign sclk = seq[1]; //El serial shift clock es 1/4 del Master Clock assign bit_cntr = seq[7:2]; assign subcycle_cntr = seq[1:0]; always @(posedge clk) begin if(reset == `yes) begin seq <= 0; lrck_int <= `left; end else if(seq == `channel_duration-1) begin seq <= 0; //Se resetea la secuencia cada periodo de canal lrck_int <= !lrck_int; //Cambia la seleccion del canal cada periodo end else begin seq <= seq+1; //Se incrementa el secuenciador normalmente lrck_int <= lrck_int; //No se cambia el selector de canal end end endmodule //////////************ MODULO CHANNEL ************/////////// ////////******* MANEJA LOS REGISTROS DE DESPLAZAMIENTO ********//// ///**** PARA CAPTURAR LOS DATOS SERIALES Y PASARLOS A PARALELO****/////// `define dac_width 20 Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 52 `define adc_width 20 `define yes 1 `define no 0 `define left 0 `define right 1 `define channel_duration 128 module channel(clk, reset, chan_on, bit_cntr, subcycle_cntr, chan_sel, rd, wr, adc_out, dac_in, adc_out_rdy, adc_overrun, dac_in_rdy, dac_underrun, sdin, sdout); input clk, //Entrada de reloj Master reset; //Reset activo en alto para sincronizacion input chan_on; //Selector de canal left/right input [5:0]bit_cntr; input [1:0]subcycle_cntr; input chan_sel; //Selecciona left/rigth codec channel para rd/wr input rd, //Leer desde el codec ADC wr; //Escribir al codec DAC output [`adc_width-1:0]adc_out; //Desde el codec ADC input [`dac_width-1:0]dac_in; //Hacia codec DAC output adc_out_rdy; //Salida ADC lista para ser leida output adc_overrun; //Salida del canal ADC overwritten output dac_in_rdy; //Entrada DAC lista para ser escrita output dac_underrun; //Entrada DAC no lista a tiempo output sdin; //Salida serial al codec DAC input sdout; //Entrada serial desde el codec ADC wire [`adc_width-1:0]adc_out; wire adc_out_rdy; reg adc_overrun; wire dac_in_rdy; reg dac_underrun, sdin; reg [`dac_width-1:0]dac_shfreg; //Registro de desplazamiento DAC reg dac_empty; //Registro DAC esta vacio reg dac_wr; //Canal DAC ha sido escrito reg dac_wr_nxt; //Canal DAC ha sido escrito reg dac_in_rdy_int; //DAC esta listo para una entrada reg [`adc_width-1:0]adc_shfreg; reg adc_full; //Registro ADC esta lleno reg adc_rd; //Canal ADC ha sido leido reg adc_rd_nxt; //Canal ADC ha sido leido reg adc_out_rdy_int; //ADC listo para salida //Recibe dato del codec ADC assign adc_out = adc_shfreg; always @(posedge clk) begin if(reset == `yes) begin Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 53 adc_shfreg <= 0; adc_full <= `no; end else if((chan_on==`yes) & (subcycle_cntr==1)) begin if((bit_cntr>=1) & (bit_cntr<`adc_width)) begin adc_full <= `no; adc_shfreg <= {adc_shfreg[`adc_width-2:0],sdout}; end else if(bit_cntr==`adc_width) begin adc_full <= `yes; adc_shfreg <= {adc_shfreg[`adc_width-2:0],sdout}; end end if((adc_full == `yes & chan_sel == `yes & rd == `yes) || (adc_full == `yes & adc_rd == `yes)) adc_rd_nxt <= `yes; else adc_rd_nxt <= `no; end //Lectura del ADC assign adc_out_rdy = adc_out_rdy_int; always @(posedge clk) begin if(reset == `yes) adc_rd <= `no; else adc_rd <= adc_rd_nxt; if(adc_full == `yes & adc_rd == `no) adc_out_rdy_int <= `yes; else adc_out_rdy_int <= `no; end //Detecta señal sobre escrita en dato del canal ADC always @(posedge clk) begin if(reset == `yes) adc_overrun <= `no; else if(bit_cntr == 1 & chan_on == `yes & adc_out_rdy_int == `yes) adc_overrun <= `yes; end //Transmision de dato al codec DAC always @(posedge clk) begin Noviembre 2004 IE-0502 54 Filtro Digital Impl ementado en un PLD if(reset == `yes) begin dac_shfreg <= 0; dac_empty <= `yes; end else if(chan_sel == `yes & wr == `yes) dac_shfreg <= dac_in; else if(chan_on == `yes & subcycle_cntr == 1) begin if(bit_cntr == 0) dac_empty <= `no; else if(bit_cntr < `dac_width) dac_shfreg <= {dac_shfreg[`dac_width-2:0],1'b0}; else if(bit_cntr == `dac_width) begin dac_empty <= `yes; dac_shfreg <= {dac_shfreg[`dac_width-2:0],1'b0}; end end if(chan_on == `yes) sdin <= dac_shfreg[`dac_width-1]; else sdin <= 0; if((dac_empty == `yes & chan_sel == `yes & wr == `yes) || (dac_empty == `yes & dac_wr == `yes)) dac_wr_nxt <= `yes; else dac_wr_nxt <= `no; end //Lectura DAC always @(posedge clk) begin if(reset == `yes) dac_wr <= `no; else dac_wr <= dac_wr_nxt; if(dac_empty == `yes & dac_wr == `no) dac_in_rdy_int <= `yes; else dac_in_rdy_int <= `no; end assign dac_in_rdy = dac_in_rdy_int; //Detectar señal underflow always @(posedge clk) begin if(reset == `yes) dac_underrun <= `no; Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 55 else if(bit_cntr == 1 & chan_on == `yes & dac_in_rdy_int == `yes) dac_underrun <= `yes; end endmodule ///////////********* MODULO CODEC TOP **********///////// ///**** CONTIENE LOS MODULOS CHANNEL Y CLOCKGENERATOR ****///// `define dac_width 20 `define adc_width 20 `define channel_duration 128 `define yes 1 `define no 0 `define left 0 `define right 1 module codecTop(clk, reset, lrsel, rd, wr, ladc_out, radc_out, ldac_in, rdac_in, ladc_out_rdy, radc_out_rdy, adc_overrun, ldac_in_rdy, rdac_in_rdy, dac_underrun, mclk, sclk, lrck, sdin, sdout); input clk, reset, lrsel, //Selecciona el canal left/rigth para rd/wr rd, //lectura del codec ADC wr; //escribe al codec DAC output [`adc_width-1:0]ladc_out, // ADC left radc_out; // ADC rigth input [`dac_width-1:0]ldac_in, // DAC left rdac_in; // DAC rigth output ladc_out_rdy, // ADC left listo para ser leido radc_out_rdy, // ADC rigth listo para ser leido adc_overrun, // Datos del ADC reescritos antes de leerse ldac_in_rdy, // Entrada DAC left lista para ser escrita rdac_in_rdy, // Entrada DAC rigth lista para ser escrita dac_underrun, // DAC no escrita a tiempo mclk, // Reloj Master, salida al codec sclk, // Reloj de los datos seriales al codec lrck, // selector de canal del codec left/rigth sdin; // salida serial al codec DAC input sdout; // entrada serial desde el codec wire [`adc_width-1:0]ladc_out, // ADC left radc_out; // ADC rigth wire ladc_out_rdy, // ADC left listo para ser leido radc_out_rdy; // ADC rigth listo para ser leido reg adc_overrun; // Datos del ADC reescritos antes de leerse wire ldac_in_rdy, // Entrada DAC left lista para ser escrita rdac_in_rdy; // Entrada DAC rigth lista para ser escrita wire ldac_underrun, rdac_underrun; reg dac_underrun; // DAC no escrita a tiempo wire mclk, // Reloj Master, salida al codec sclk, // Reloj de los datos seriales al codec lrck; // selector de canal del codec left/right reg sdin; // salida serial al codec DAC Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 56 // Registros de senales wire lrck_int; //selector interno de canal del codec left/right wire [5:0]bit_cntr; wire [1:0]subcycle_cntr; wire lsdin, rsdin; wire ladc_overrun, radc_overrun; reg lchan_sel, rchan_sel, lchan_on, rchan_on; //arquitectura del codec assign lrck = lrck_int; clockGenerator u0(clk, reset, mclk, sclk, lrck_int, bit_cntr, subcycle_cntr); // LEFT CHANNEL always @(posedge clk) begin if(lrsel == `left) lchan_sel <= `yes; else lchan_sel <= `no; if(lrck_int == `left) lchan_on <= `yes; else lchan_on <= `no; end channel u_left(clk, reset, lchan_on, bit_cntr, subcycle_cntr, lchan_sel, rd, wr, ladc_out, ldac_in, ladc_out_rdy, ladc_overrun, ldac_in_rdy, ldac_underrun, lsdin, sdout); // RIGHT CHANNEL always @(posedge clk) begin if(lrsel == `right) rchan_sel <= `yes; else rchan_sel <= `no; if(lrck_int == `right) rchan_on <= `yes; else rchan_on <= `no; end channel u_rigth(clk, reset, rchan_on, bit_cntr, subcycle_cntr, rchan_sel, rd, wr, radc_out, rdac_in, radc_out_rdy, radc_overrun, rdac_in_rdy, rdac_underrun, rsdin, sdout); Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 57 // REBASE always @(posedge clk) begin if(ldac_underrun == `yes || rdac_underrun == `yes) dac_underrun <= `yes; else dac_underrun <= `no; if(ladc_overrun == `yes || radc_overrun == `yes) adc_overrun <= `yes; else adc_overrun <= `no; if(lrck_int == `left) sdin <= lsdin; else sdin <= rsdin; end endmodule ///////////////********* MODULO TOP LEVEL **********/////////////// ////***** CONTIENE TODOS LOS DEMAS MODULOS Y LOS CONECTA ENTRE SI *****//// //*** ADEMAS MANEJA UNA UNIDAD DE CONTROL PARA LA TX Y RX ENTRE CODEC Y CHANNEL ***// `define dac_width 20 `define adc_width 20 `define channel_duration 128 `define yes 1 `define no 0 `define left 0 `define right 1 module top_level(reloj_in, reloj_out, rst, mclk, lrck, sclk, sdout, sdin, s); input reloj_in, rst, sdout; output mclk, lrck, sclk; reloj_out; output sdin; output [1:0]s; reg lrsel, rd, wr; wire [`dac_width-1:0]left_channel_out, right_channel_out; wire [`adc_width-1:0]left_channel_in, right_channel_in; wire ldac_in_rdy, rdac_in_rdy; Noviembre 2004 IE-0502 Filtro Digital Impl ementado en un PLD 58 wire ladc_out_rdy, radc_out_rdy; wire clk; wire tx_left, tx_right; assign reloj_out=reloj_in; reloj uno(reloj_in, clk); codecTop codec(clk, rst, lrsel, rd, wr, left_channel_out, right_channel_out, left_channel_in, right_channel_in, ladc_out_rdy, radc_out_rdy, s[1], ldac_in_rdy, rdac_in_rdy, s[0], mclk, sclk, lrck, sdin, sdout); filtro digital(reloj_in, lrck, left_channel_out, right_channel_out, left_channel_in, right_channel_in, ladc_out_rdy, radc_out_rdy, tx_left, tx_right); always @(posedge clk) begin if(ladc_out_rdy == `yes & ldac_in_rdy == `yes & tx_left) begin lrsel <= `left; rd <= `yes; wr <= `yes; end else if(radc_out_rdy == `yes & rdac_in_rdy == `yes & tx_right) begin lrsel <= `right; rd <= `yes; wr <= `yes; end else begin lrsel <= `left; rd <= `no; wr <= `no; end end endmodule Noviembre 2004