Full text
Proyecto Fin de Carrera Ingeniería de Telecomunicación Formato de Publicación de la Escuela Técnica Superior de Ingeniería Autor: F. Javier Payán Somet Tutor: Juan José Murillo Fuentes Dep. Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2013 Trabajo Fin de Grado Ingeniería Aeroespacial Realización de un convertidor Digital/Analógico con 12 bits de resolución y 20kHz de ancho de banda basado en un modulador Sigma/Delta de segundo orden y un bit de salida Autor: Rosalía Otero Naranjo Tutor: Francisco Colodro Ruiz Dpto. Ingeniería Electrónica Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2021
Trabajo Fin de Grado Ingeniería Aeroespacial Realización de un convertidor Digital/Analógico con 12 bits de resolución y 20kHz de ancho de banda basado en un modulador Sigma/Delta de segundo orden y un bit de salida Autor: Rosalía Otero Naranjo Tutor: Francisco Colodro Ruiz Profesor Titular Dpto. Ingeniería Electrónica Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2021
Trabajo Fin de Grado: Realización de un convertidor Digital/Analógico con 12 bits de resolución y 20kHz de ancho de banda basado en un modulador Sigma/Delta de segundo orden y un bit de salida Autor: Rosalía Otero Naranjo Tutor: Francisco Colodro Ruiz El tribunal nombrado para juzgar el trabajo arriba indicado, compuesto por los siguientes profesores: Presidente: Vocal/es: Secretario: acuerdan otorgarle la calificación de: El Secretario del Tribunal Fecha:
Agradecimientos Me gustaría agradecer a mis padres y familiares por todo lo que me han apoyado siempre, así como a todos mis profesores, desde el colegio hasta la universidad, por lo que me han enseñado. Y en especial, agradezco a mi tutor, Francisco Colodro Ruiz, por su paciencia y por ayudarme de principio a fin durante la realización de este proyecto. Rosalía Otero Naranjo Sevilla, 2021 I
Resumen El propósito de este trabajo es el análisis y desarrollo de un convertidor Digital/Analógico con 12 bits de resolución y 20 kHz de ancho de banda basado en modulador Sigma Delta de segundo orden así como su posterior implementación en una FPGA. Para ello, se han realizado simulaciones mediante MAT LAB y Simulink con objeto de estudiar el comportamiento del circuito modulador ante distintos valores de los parámetros que lo definen para así determinar las variables de diseño adecuadas que garanticen su correcto funcionamiento. Tras ello, se codifica el circuito a estudiar en VHDL empleando la herramienta Vivado Design Suite - HLx Editions - versión 2019.2 mediante la cuál se llevan a cabo diversas simulaciones para cada componente y para el circuito completo. Todas estas simulaciones previas a la implementación del circuito en la FPGA han tenido como objetivo corregir errores y simplificar los códigos para facilitar una correcta implementación. Cabe mencionar la parametrización empleada en todos los códigos para permitir la realización de distintos análisis empleando distintos parámetros de diseño. La última etapa de este proyecto consiste en implementar dicho modulador en una FPGA para así tomar medidas experimentales usando el osciloscopio digital PicoScope 6y comparar las prestaciones obtenidas de estas mediciones con las del caso ideal para concluir si se ha logrado alcanzar los valores objetivos. III
XÍndice 4.3.1 Pulso EN 24 4.3.2 Pulso PRZ 25 Definición 25 Motivación del uso del Retorno a cero 25 Generación pulso PRZ 26 4.3.3 Divisor de frecuencia 26 4.4 Generación de la señal de entrada 27 4.4.1 Lookup Table 27 4.4.2 DSube 28 4.4.3 DSigno 28 4.4.4 Contador y Din 29 4.5 Lógica combinacional 30 4.5.1 Sumador: Sum 30 4.5.2 Restador 30 Restador1:Res 30 Restador2:Res2 31 4.5.3 Saturación: Sat 31 4.5.4 QuantizerSB: QSB 32 4.5.5 Ganancia: G 33 4.6 Lógica secuencial 34 4.6.1 Componente D_ff 34 D1 35 D2 35 4.6.2 Componente D_out 35 Simulación componente Dout 36 4.7 Design Sources 36 4.7.1 Archivo top 36 4.8 Simulation Sources 36 4.8.1 Archivo sim_top 37 4.8.2 TB_top_SDM 38 4.9 Extracción de datos de Vivado 39 4.9.1 Análisis salNRZ 39 4.9.2 Análisis entSD 40 4.9.3 Conclusiones 42 4.10 Programación de la FPG 42 4.10.1 Modelo FPGA 42 4.11 Elección pines I/O. Archivo de constraints 42 4.12 Pasos a seguir 43 5 Resultados Experimentales 45 5.1 Diseño del filtro 45 5.2 PicoScope 46 5.2.1 Configuración de captura y opciones de canal 46 5.3 Valoración de las prestaciones del circuito implementado en VHDL 46 5.4 Análisis de las señales a la salida del SDM para distintas amplitudes de entrada 47 5.4.1 Señal de entrada a 5 dB por debajo de la amplitud máxima 47 Señales salNRZ y salRZ. Sin filtrar 47 Señal salNRZ.Filtrada 48 Señal salRZ. Filtrada 50 5.4.2 Señal de entrada a 6 dB por debajo de la amplitud máxima 52 Señales salNRZ y salRZ. Sin filtrar 52 Señal salNRZ. Filtrada 52 Señal salRZ. Filtrada 54 5.5 Conclusiones 56
Índice XI 5.6 Justificación del uso del osciloscopio de resolución 16 bits frente al de 12 bits 56 6 Conclusiones y mejoras 59 7 Apéndice I. Códigos Matlab 61 7.1 Análisis fichero de puntos Vivado 61 Señal salNRZ 61 Señal de entrada al SDM 62 7.2 Análisis fichero de puntos PicoScope 64 Señal temporal 64 Espectro 65 8 Apéndice II. Códigos VHDL 67 8.1 Divisor de frecuencias 67 8.2 Contador 68 8.2.1 Biestable con señal sube como salida: Dsube 73 8.2.2 Biestable con señal signo como salida: Dsigno 73 8.2.3 Registro Din 74 8.3 Sumador 75 8.4 Restador 75 8.5 Saturación 76 8.6 Single Bit Quantizer 77 8.7 Ganancia 78 8.8 Registros D1 y D2 78 8.9 Biestable con señales salNRZ y salRZ como salida: D_out 79 8.10 Fichero top 80 8.11 Fichero de estímulos 82 8.12 Fichero para la extracción de datos 84 8.13 Fichero para la definición de constraints 89 Índice de Figuras 91 Índice de Tablas 95 Índice de Códigos 97 Bibliografía 99
Notación AD Analógico Digital DA Digital Analógico SB Single Bit SDM Modulador Sigma Delta Modulador Σ∆ Modulador Sigma Delta FPGA Field Programmable Gate Arrays CA2 Complemento a 2 DSP Digital Signal Processing ∆Paso de cuantización SNR Relación señal ruido SW Software RZ Retorno a cero OSR Factor de sobremuestreo, Oversampling Ratio B Ancho de banda de la señal LPF Filtro paso bajo LUT Lookup Table XIII
1 Introducción En la actualidad, predomina el procesamiento digital de señales debido a las ventajas que este presenta como la disminución del peso de los componentes, un aumento en la robustez de los sistemas y la posibilidad de combinar distintos circuitos hasta llegar a una elevada complejidad. Además, la velocidad a la que estos circuitos trabajan también va en aumento. De este modo, resulta necesario la existencia de convertidores AD/DA debido a las ventajas que trabajar en el dominio digital presenta, de esta manera se requiere que dichos convertidores funcionen a altas velocidades. Todo lo anterior sirve de motivación para realizar este proyecto donde se lleva a cabo un convertidor Digital/Analógico cuyas principales características son: •Se basa en un modulador Sigma/Delta de segundo orden, single-bit. •La salida del convertidor es una señal binaria de 1 bit. •Número de bits efectivos : Ne f f =12 bits •Ancho de banda de la señal : BW =20kHz • Reloj maestro ( Tclk =10 ns, fclk =100 MHz) que rige los dispositivos con lógica secuencial del circuito. •Se emplea un cuantizador single-bit (SB) simétrico Dicho modulador emplea aritmética entera a lo largo de todo el circuito con números binarios expresados en complemento a dos. La realización de este modulador consta de varias etapas muy diferenciadas y dependientes las unas de las otras debido a que los resultados de una etapa serán fundamentales para llevar a cabo la siguiente tal y como se muestra en la Figura 1.1. De este modo, se comienza realizando un análisis ideal mediante simulaciones funcionales en MAT LAB&Simulink a partir del cuál se define la arquitectura más adecuada para implementar el SDM así como sus parámetros (número de bits de la señal en cada bus de datos del circuito, componentes del circuito ...) y sus prestaciones (SNR y HD2) con las que se compararán los resultados experimentales obtenidos tras la implementación a modo de verificar que el SDM se ha realizado correctamente. A continuación, se implementa la arquitectura elegida en VHDL empleando el Software Vivado , codificando cada componente que forma el circuito completo para finalmente interconectarlos y realizar nuevamente simulaciones funcionales para comprobar el funcionamiento de la arquitectura completa. Además, a las simulaciones funcionales se les añade como comprobación adicional el estudio de los ficheros de datos asociados a la señal de entrada y de salida del SDM en MATLAB. Una vez realizado lo anterior, se procede a efectuar la síntesis e implementación del SDM en VHDL y posteriormente se llevan a cabo análisis tipo timing post-síntesis y post-implementación con el fin de analizar el efecto de los retrasos temporales en la señal a la salida del circuito. El siguiente paso es la conexión y programación del dispositivo programable (en nuestro caso se emplea una FPGA) lo cual resulta sencillo en el Software previamente mencionado. Finalmente, se conecta la salida 1
2Capítulo 1. Introducción de la FPGA con un osciloscopio digital para analizar los resultados experimentales y extraer ficheros de datos asociados a las señales de salida del SDM que serán por último estudiados en MAT LAB para determinar sus prestaciones y si estas cumplen con los valores obtenidos en el primer análisis del caso ideal. Además, para facilitar la correcta comprensión de lo explicado durante este documento, se comienza la memoria con un análisis teórico en el que se exponen los conceptos fundamentales empleados. Figura 1.1 Diagrama de flujo de los pasos a seguir durante la realización del convertidor Digital/Analógico .
3 Un esquema sencillo que permite visualizar el circuito completo así como la interacción entre los distintos componentes, la forma de onda y número de bits de las señales principales es el mostrado en la Figura 1.2 dónde se indica el paso de mundo digital a analógico mediante el convertidor Digital/Analógico (DAC, del inglés digital to analogue converter). Figura 1.2 Esquema genérico de la obtención de resultados experimentales a partir de una señal de entrada de 14 bits al SDM . En la Figura 1.2 se muestra la interrelación entre señales analógicas y digitales así como se destacan los principales elementos necesarios para la obtención de la señal analógica a la salida. • Señal X(n) : señal digital de 14 bits cuyo valor corresponde a la toma de muestras de una señal senoidal ideal. • Señal y(n) : señal de salida del SDM, binaria, de 1 bit, correspondiente a una señal senoidal con ruido. La disminución de 14 bits a 1 bit se obtiene gracias al uso de un cuantizador dentro de la arquitectura del Modulador Σ∆. •DAC: Convertidor digital analógico, en nuestro caso lo realiza la FPGA. •LPF: Filtro paso bajo que elimina el ruido a altas frecuencias a la salida del SDM.
2 Marco teórico Ac ontinuación, se detallan los conceptos necesarios para la realización de este proyecto como base teórica para la comprensión de los resultados y conclusiones obtenidos. 2.1 Muestreo de una señal El muestreo es una operación fundamental en la conversión de una señal analógica en digital y su posterior procesamiento digital o DSP. Se define como la toma de muestras de amplitud de la señal de entrada analógica. Dichos datos se capturan en intervalos de tiempo de valor constante y fijo, lo que resulta en muestras equiespaciadas de la señal de entrada al circuito muestreador. De este modo, se pasa de una señal continua en el tiempo a una señal que toma un conjunto finito de valores como se refleja en la Figura 2.1. El intervalo de tiempo entre cada muestra recibe el nombre de período de muestreo, Ts(s) , tal que su inversa se denomina tasa o frecuencia de muestreo, fs y representa el número de muestras capturadas en un segundo. Figura 2.1 Señal sinusoidal muestreada. Para un análisis más profundo, se expresa matemáticamente este proceso, siendo x(t) la señal de entrada continua e y(t)la señal muestreada. 5
12 Capítulo 2. Marco teórico El orden del modulador va de la mano del número de bloques integradores que este posea. Además, a mayor orden, mayor resolución del SDM. Extrapolando la relación obtenida para el caso de primer orden a uno de segundo orden y sabiendo que (1−z−1)2 en el dominio z equivale a una conformación proporcional a j2πf Ts , luego la conformación del ruido varía con el orden del modulador como se muestra a continuación (Figura 2.10). [5] Figura 2.10 Evolución del error de cuantización según el orden del SDM. Así pues, se observa como a mayor orden del SDM más ruido es trasladado a altas frecuencias y podrá ser eliminado posteriormente mediante un filtro. En este proyecto se trabaja con un modulador Σ∆ de segundo orden. Figura 2.11 Espectro característico del SDM. El espectro característico del SDM de segundo orden es el mostrado en Figura 2.11 y se comparará con los resultados obtenidos cuando implementemos el circuito en los distintos Software (SW) para verificar si el SDM diseñado funciona correctamente. En este proyecto se obtendrá a la salida del modulador un pulso cuadrado el cual tras ser filtrado dará lugar a una señal senoidal que deberá ser igual a la de la entrada. La transformación a señal senoidal se debe al uso del filtro que elimina ruido a altas frecuencias como se ejemplifica en la Figura 2.12 y resulta en la suma de los valores en un intervalo N (se promedia), lo cuál se manifiesta como una señal sinusoidal a la salida del
2.12 FPGA 13 modulador con poco ruido. Figura 2.12 Espectro característico del SDM con filtro paso bajo. 2.12 FPGA FPGA es el acrónimo en inglés de matriz de puertas lógicas programables en campo, Field Programmable Gate Arrays, y está formada por dispositivos semiconductores colocados alrededor de una matriz de bloques programables y conectados mediante interruptores también programables. Las FPGA pueden ser reprogramadas por el usuario tras su fabricación. De hecho, en este proyecto se va a programar para 2 casos distintos variando la señal de entrada tal y como se verá en la última sección relacionada con la toma de medidas experimentales. Se caracterizan por su rapidez, complejidad no muy elevada, capacidad de realizar diseños de gran volumen y por ser reprogramables. Por ello, se emplean en multitud de aplicaciones y en sectores tales como la industria aeroespacial, automovilística, defensa, medicina entre otros.
3 Simulación MATLAB&SIMULINK Esta sección tiene por objeto describir el estudio y simulaciones previas a la implementación del circuito SDM en la FPGA y a partir de los cuales quedan determinados los parámetros a usar. Se parte de un análisis funcional realizado en un SW con lenguaje de alto nivel, en este caso se usa MAT LAB&Simulink para determinar la arquitectura que cumpla con las prestaciones deseadas. Dichas prestaciones se determinan a partir del análisis de la arquitectura asociada al caso ideal del SDM y a partir de ella se desarrollan distintas versiones de las cuáles se selecciona la más adecuada a partir un estudio exhaustivo de la señal obtenida a la salida de cada uno. Así pues, aquella arquitectura que obtenga los mismos valores de SNR y HD2 que el circuito ideal, será la elegida para su posterior implementación en VHDL. En resumen, el objetivo de esta sección es determinar los módulos que conforman el circuito a implementar (sumadores, restadores, saturadores, registros...) y el número de bits de las señales y las entradas y salidas del modulador Digital/Analógico. Esta primera etapa del proceso de realización del modulador es fundamental ya que una buena determinación de los parámetros y de los componentes deriva en un circuito implementado correctamente, sin errores y que cumple las características deseadas. 3.1 Modelo Simulink del Modulador Sigma Delta El esquema utilizado en Simulink consta de cuatro variantes de la arquitectura del SDM (Figura 3.1). A destacar, una de las alternativas corresponde al circuito SDM ideal (y1) de tal modo que las prestaciones obtenidas a partir de él serán las buscadas en el resto de versiones del circuito SDM. El resto (y2,y3,y4), son distintas configuraciones posibles que resultan de poner uno o más saturadores con distinta saturación. La señal de entrada es una onda senoidal con una amplitud determinada según si el estudio se realiza para el caso de 5 dB o 6 dB por debajo del máximo de la señal. Dicha onda se amplifica y posteriormente se redondea a un valor entero en el bloque cuantizador debido a que en el modulador Digital/Analógico que se desarrolla en este proyecto se trabaja con aritmética entera. Descripción general del circuito Mediante un enfoque general del modelo de Simulink a emplear, se destacan los siguientes elementos: • La fuente utilizada genera una señal senoidal con la amplitud definida, la cuál será a continuación amplificada. • Mediante un cuantizador, se transforma la señal analógica a digital. Dicho cuantizador tiene como parámetro un intervalo de cuantización de 1, tal que la salida corresponde con la señal de entrada redondeada. De modo que tras la cuantización se pasa a trabajar con aritmética entera. • Se emplean diversos scopes para representar las señales a la salida de los distintos bloques SDM tras ser filtrados mediante un filtro de Butterworth frente a las señales a la entrada del convertidor de tal manera que si ambas coinciden significa que la señal se recupera correctamente a la salida. 15
16 Capítulo 3. Simulación MATLAB&SIMULINK Figura 3.1 Modelo Simulink del SDM. 3.1.1 Descripción particular En esta etapa inicial del proyecto se saca provecho de las ventajas que ofrece el uso de Simulink a la hora de poder realizar varias simulaciones distintas gracias a la sencillez asociada a que los bloques funcionales ya estén determinados, cosa que no ocurrirá en el SW Vivado . De este modo, se pueden probar distintas arquitecturas y parámetros para seleccionar en vista a las prestaciones que ofrecen, la arquitectura a implementar. Arquitectura 1 La primera arquitectura corresponde al esquema del modulador ideal. Trabajando con transformada z, se obtiene: Y(z) = X(z)+(1−2z−1+z−2)Q(z) = X(z)+(1−z−1)2Q(z)(3.1) A partir de la expresión 3.1 se observa como efectivamente se trata de un modulador Σ∆ de segundo orden. Además, la arquitectura de la Figura 3.2 implementa la expresión 3.1. A partir de un análisis funcional de la arquitectura ideal (Figura 3.2) se determina el valor de OSR : OSR =64 . A partir de dicho parámetro, se obtiene la frecuencia de muestreo tal que fSDM =2.56MHz la cuál se puede obtener usando un valor de Ndiv=40 en el divisor de frecuencias, tal y como se demuestra en (3.2). Si Ndiv =40,entonces :fSDM =Tclk Ndiv =100MHz 40 =2.5MHz (3.2)
3.1 Modelo Simulink del Modulador Sigma Delta 17 De este modo, el modulador Sigma Delta tendrá asociado un período 40 veces mayor que el de la señal asociada al reloj maestro : TSDM =400ns. Finalmente, aplicando la ecuación (2.13) se obtiene el siguiente valor para el ancho de banda: BW = 19.53kHz, quedando así definidas las especificaciones del modulador Sigma Delta. Figura 3.2 Modelo Simulink de la arquitectura ideal del modulador Digital/Analógico. El uso de 14 bits a la entrada frente a los 12 bits efectivos definidos en la introducción de este proyecto se justifica en base a los resultados obtenidos tras aplicar la ecuación (2.10) para la resolución dada (3.3). SNRoversampling =Ne f f ·6.02 +1.761 =74dB (3.3) Combinando las ecuaciones (2.14) y (3.3) para un valor de 14 bits a la entrada se obtiene en (3.4) que la SNR asociada a la señal de entrada de 14 bits es igual a 104 dB. SNRentrada = (Nbit ·6.02 +1.761)+10log10OSR =86 +18 =104dB (3.4) Así pues, aunque el valor de SNR para el número de bits a la entrada es mucho mayor que el asociado al número de bits efectivo (3.3) que se desea obtener en el SDM a realizar, se elige trabajar con dicho valor (3.4) sobremuestreado para que los armónicos producidos por la cuantización a la entrada del circuito se encuentren muy por debajo de los posibles armónicos que pueda generar el modulador Sigma Delta que se desea probar y testar. Arquitectura 2 A continuación, se replica la arquitectura 1 (Figura 3.2) con una serie de modificaciones. Entre estas modificaciones se destaca el empleo de saturadores para controlar el buen funcionamiento del SDM en el caso no ideal. Además, cada bloque de saturación lleva asociado un componente Scope que representa la resta de la señal de entrada y salida del saturador. De este modo se verifica que se ha seleccionado de forma adecuada el número de bits al que se realiza la saturación comprobando que la señal en el Scope tiene un valor constante e igual a 0 ya que esto significa que no se produce ninguna variación de la señal tras pasar por dicho bloque y consecuentemente ninguna pérdida de información. Por otro lado, tanto en esta como en el resto de arquitecturas siguientes se ha modificado el bloque marcado en color celeste de la Figura 3.2 por los bloques celestes de la Figura 3.3 viendo como ambos son equivalentes. Además, la señal de entrada, común a todas las arquitecturas, se ha recuadrado en rojo. Con todo lo anterior, se obtiene una de las posibles estructuras funcionales que se describiría en VHDL quedando definidos sus parámetros, componentes electrónicos (sumadores, restadores, saturadores...) y el número de bits asociado a las señales de cada bus del circuito, habiéndose determinado esto último a partir del uso de saturadores.
18 Capítulo 3. Simulación MATLAB&SIMULINK Finalmente, la saturación que se ha considerado necesaria para cada uno de los bloques saturadores es de 17 bits para todos, excepto para el bloque Sat3 al que le corresponden 18 bits de saturación. De este modo, las señales de la arquitectura 2 son señales binarias de 17 bits salvo la señal de salida del componenente Sat3. Figura 3.3 Modelo Simulink de la arquitectura 2 del modulador Digital/Analógico empleando 4 saturadores. Arquitectura 3 Tras realizar un análisis funcional de la Figura 3.4, se concluye que solo es necesario el uso de un saturador, simplificando así considerablemente el circuito y su implementación en VHDL al reducir el número de componentes necesarios. Por tanto, la arquitectura número 3 (Figura 3.4), es idéntica a la anterior (Figura 3.3) solo que se eliminan todos los bloques saturadores excepto el denominado Sat1. Dicho bloque satura a 17 bits al igual que hacia en la configuración 2. Figura 3.4 Modelo Simulink de la arquitectura 3 del modulador Digital/Analógico empleando 1 saturador de 17 bits.
3.2 Resultados simulación 19 Arquitectura 4 Tras comprobar que para la arquitectura 3 (Figura 3.4) los resultados obtenidos cumplen los criterios deseados (en base al valor de SNR de la señal de salida), se prueba a reducir el valor de la saturación a 16 bits proponiendo una última variante respecto de la arquitectura original. Sin embargo, la Tabla 3.1 muestra como esta modificiación resulta en peores prestaciones y por lo tanto una mala solución a la implementación en VHDL del circuito. Figura 3.5 Modelo Simulink de la arquitectura 3 del modulador Digital/Analógico empleando 1 saturador de 16 bits. 3.2 Resultados simulación La simulación funcional asociada al esquema Simulink de la Figura 3.1 se realiza para dos casos distintos según el valor de caída de la amplitud a la entrada con respecto a su valor máximo. Dicha amplitud máxima se define teniendo en cuenta que la señal a la entrada senoidal tiene como valores máximos 1 y -1 y posteriormente se amplifica con una ganancia igual a 214−1=213 siendo ese el valor máximo de la señal. De este modo se obtiene la relación entre el valor de la amplitud de la entrada al modulador Sigma/Delta y el valor del fondo de escala (fs, del inglés full scale) como se ejemplifica en (3.5) −5dB(f s) = 10log10 A Amax =10log10 A 213 ⇒A=21310 −5 20 (3.5) La ecuación (3.5) es aplicable a cualquier valor. En nuestro caso se realiza un análisis para una señal de entrada con amplitud -5dB y -6dB menos que la amplitud máxima cuyos resultados analíticos se exponen en Tabla 3.1 y los resultados gráficos se muestran en Figura 3.6 y Figura 3.7 respectivamente.
20 Capítulo 3. Simulación MATLAB&SIMULINK (a) (b) Figura 3.6 Representación espectral de las salidas yk con k=1,2,3 y 4, correspondientes con las PSD de las señales yken la Figura 3.1 para una caída de 5 dB en la amplitud de la señal seno a la entrada. (a) (b) Figura 3.7 Representación espectral de las salidas yk con k=1,2,3 y 4, correspondientes con las PSD de las señales yken la Figura 3.1 para una caída de 6 dB en la amplitud de la señal de entrada. Tabla 3.1 Valor de SNR de las 4 arquitecturas para distintas caídas de amplitud. SNR (dB) Arquitectura 1 (caso ideal) Arquitectura 2 Arquitectura 3 Arquitectura 4 -5 dB 69.858287 69.858287 69.858287 52.828955 -6 dB 69.928790 69.928790 69.928790 67.017321 3.3 Conclusión En vista a los resultados expuestos en la Tabla 3.1, se decide trabajar desde ahora con la configuración asociada a la 3 a arquitectura (Figura 3.4) ya que, aunque tanto esta como la segunda variante del SDM, ofrecen unas prestaciones equivalentes al caso ideal (Arquitectura 1), el tercer circuito lo realiza de un modo más sencillo ya que reduce el número de saturadores a usar a uno frente a los cuatro empleados en el circuito
3.3 Conclusión 21 2 (Figura 3.3). Por otro lado, queda descartado emplear la última arquitectura (Figura 3.5) ya que ofrece una calidad inferior al caso ideal.
28 Capítulo 4. Simulación VIVADO señal address empleada por el contador. En nuestro proyecto se trabajan con 2 amplitudes distintas de la señal senoidal luego se usarán dos LUT diferentes asociadas a cada caso. Aún así el proceso es idéntico para ambas. Además, la señal address tiene como función indicar la posición en la LUT del valor que debe entrar al SDM. 4.4.2 DSube A partir de este registro se genera la señal sube. Esta señal afecta a la señal address, y por lo tanto, determina la dinámica de lectura de la LookUp Table. De este modo, cuando la señal sube=’1’, se leerán los valores de la LUT de manera ascendente y descendente en el caso contrario como se observa en la Figura 4.8 y Figura 4.9. Figura 4.8 Simulación del componente DSube. Además, la Figura 4.10 muestra la variación de la señal sube en función de los valores de la señal senoidal. Así, cuando el seno tiene pendiente positiva la señal sube toma un valor alto y bajo en caso de pendiente negativa. Figura 4.9 Representación de la señal sube. Figura 4.10 Esquema de la variación del pulso sube según el signo de la pendiente de la señal senoidal. 4.4.3 DSigno El objetivo es generar una señal que provoque un cambio de signo en la muestra leída de la LUT cuando nos encontremos en el semieje negativo de la señal seno a generar. De este modo, se hace el valor de la LUT negativo siempre que signo=’0’. En la Figura 4.11 se muestra como la señal signo cambia su valor cuando el seno toma el valor asociado a la primera muestra (address=’0’), lo que se traduce en que la señal signo cambia cuando el seno pasa por 0 como se aprecia en la Figura 4.12.
4.4 Generación de la señal de entrada 29 Figura 4.11 Simulación del componente DSigno. Figura 4.12 Esquema de la variación del pulso signo según el semiperíodo de la señal senoidal. 4.4.4 Contador y Din El contador está definido dentro del código 8.2 basándose en un registro tipo D que cuenta hasta un número igual al número de muestras de la señal seno en la LUT de manera ascendente o descendente según si la señal crece o decrece. De este modo el contador aumenta en uno su valor a la salida cuando la señal EN y la señal sube están a nivel alto, mientras que si ocurre la situación anterior pero cuando sube toma un nivel bajo, la señal a la salida decrece en una unidad. El valor del contador se identifica con la señal address y para cada posible valor de ella se asocia una muestra como se ha explicado anteriormente. Esta señal address entra en un registro, también tipo delay, denominado Din cuya finalidad es romper con la lógica combinacional y evitar que se propaguen errores por retraso temporal en la señal. Finalmente, se cambia de signo o no a la salida del componente Din según el valor que tome la señal signo, teniendo en cuenta la conversión asociada a la configuración en CA2 como se muestra en las últimas líneas del código 8.2. Figura 4.13 Simulación de las señales asociadas al contador y al registro Din. En la simulación expuesta en la Figura 4.13, se observa como cuando la señal sube está a ’1’, efectivamente el valor de salLUT crece mientras que en el caso contrario decrece. También se aprecia la simetría de la señal seno. Por otro lado, dicha señal salLUT es la entrada al registro Din y su valor se cambia de signo siempre que la señal signo sea ’0’tal y como queda demostrado en la Figura 4.13. Finalmente, también se aprecia como
30 Capítulo 4. Simulación VIVADO añadir un registro hace que la señal que entra a nuestro circuito SDM sea la correspondiente a salLUT un período de EN después, pero este retraso no genera ningún error en nuestro circuito. 4.5 Lógica combinacional A continuación, se van a comentar los dispositivos que forman el sistema combinacional de nuestro circuito analizando sus entradas y salidas, el código que lo implementa y por último las simulaciones mediante las cuáles se verifica el buen funcionamiento de los componentes. 4.5.1 Sumador: Sum Este componente se implementa mediante el código 8.6, donde se trabaja con señales CA2 y sin desbordamiento lo que conlleva que se añada 1 bit adicional a la salida tras analizar la suma de los valores máximos a y b. Figura 4.14 Representación esquemática del componente Sumador. Tabla 4.1 Identificación señales circuito SDM con las entradas y salidas del componente Sumador. Componente Circuito SDM a entSD b salida2 y salidasum Identificando a que señales de nuestro circuito corresponden las entradas y la salida del componente sumador y realizando una simulación a partir de su código, se obtiene lo mostrado en la Figura 4.15. Figura 4.15 Resultado de simular el componente Sumador. 4.5.2 Restador El componente es el mismo para el caso del Restador1 y Restador2 salvo que difiere el número de bits a las entradas y por tanto también a la salida, de este modo se utilizan dos códigos distintos para su implementación: 8.7 y 8.8. De nuevo se trabaja en CA2 y en este caso, la señal b asociada al puerto ’-’ debe ser el negado de su valor inicial, estando dicho número negativo en configuración CA2. A continuación, se identifican las entradas y salida del componente restador con las señales de nuestro circuito SDM así como se representa su simulación para cada restador que forma el circuito. Restador1:Res El primer restador tiene asociado las señales de la Tabla 4.2, cuya evolución temporal se muestra en la simulación de la Figura Figura 4.17.
4.5 Lógica combinacional 31 Figura 4.16 Representación esquemática del componente Restador. Tabla 4.2 Identificación señales circuito SDM con las entradas y salidas del componente Restador1. Componente Circuito SDM a salidasum b salidag y salidares Figura 4.17 Representación esquemática del componente Restador1. Restador2:Res2 Tabla 4.3 Identificación señales circuito SDM con las entradas y salidas del componente Restador2. Componente Circuito SDM a salidaq b salidasat y salidares2 Figura 4.18 Representación esquemática del componente Restador 2. En la Figura 4.18 se observa como la señal salidaq varía entre dos valores: -8192 y 8191. Esto se debe a su configuración Single Bit que se explicarán con más detalle en el apartado relacionado con el componente cuantizador. 4.5.3 Saturación: Sat El valor del parámetro Nsat se ha determinado a partir del análisis del circuito en Simulink y de cómo varía la SNR según el valor de saturación, eligiendo aquel tal que la SNR este entorno a los 70 dB obtenidos inicialmente.
32 Capítulo 4. Simulación VIVADO Además, al trabajar en CA2, con la saturación se gestiona o evita que el valor de la señal de la vuelta, es decir, al realizar la suma de dos números positivos/negativos podría darse el caso en el que la suma se haga negativa/positiva debido a un cambio en el bit de signo. A modo de ejemplo, se realiza la suma de dos números binarios de 4 bits, sabiendo que con dicho número de bits y de nuevo trabajando en complemento a dos, se puede obtener números decimales dentro del intervalo [-8, +7]. En él se observa cómo el número más positivo en decimal se vuelve el más negativo en CA2 ya que supera el valor máximo positivo posible para dicho número de bits. Figura 4.19 Representación esquemática del componente Saturación. Por último, el código 8.9 es el asociado a este componente (Figura 4.23). Se observa como se satura a 17 bits tal que cuando los valores de entrada superen los valores límites del intervalo en CA2 de números para esta configuración de bits, se satura con el valor más positivo o negativo según si el valor de la entrada sea mayor o menor que cero. Tabla 4.4 Identificación señales circuito SDM con las entradas y salidas del componente Saturacion. Componente Circuito SDM a salidares b salidasat Figura 4.20 Simulación componente Saturacion. 4.5.4 QuantizerSB: QSB El cuantizador que se implementa en nuestra arquitectura del SDM es tipo Single Bit que se comporta de tal manera que cuando la señal de entrada tome un valor positivo, a la salida se obtendrá el número más positivo posible según un número de bits dado. En caso de entrar una señal negativa, la salida será el número más negativo posible para la configuración de bits que acontezca. Además, no es simétrico y por lo tanto los valores a la salida son +8191 y -8192. Esta dinámica que se acaba de explicar se plasma en el código 8.10 mediante el cuál se obtienen los resultados de simulación mostrados en la Figura 4.22. Además, dicho código se asocia a un esquema (Figura 4.21) tal que el componente cuenta con una señal de entrada y dos señales de salida, una con 14 bits y otra de 1 bit. Esta última se denomina ySD y toma valores ’1’ y ’0’cuando la señal a la entrada sea positiva o negativa
4.5 Lógica combinacional 33 respectivamente. Por otro lado, también cabe destacar como la señal de salida del circuito sufre una modificación intermedia antes de entrar en el cuantizador tal que la señal con la que trabajaremos será de 1 bit el cuál corresponde al bit más significativo de la señal de salida del saturador, que al trabajar en CA2, representa el signo de la señal. De este modo se optimiza el código al trabajar con un valor inferior de bits a la entrada ya que al fin y al cabo sólo nos interesa dicho bit para determinar el valor a la salida. Esta transformación de la señal de entrada se muestra enmarcada en una línea de puntos en la Figura 4.21. Figura 4.21 Representación esquemática del componente Quantizer SB. Tabla 4.5 Identificación señales circuito SDM con las entradas y salidas del componente QSB. Componente Circuito SDM salidasat salidasat a salisat(Nsat-1) b salidaq ySD ySD Figura 4.22 Simulación componente Quantizer SB. Todo lo explicado anteriormente queda reflejado en la Figura 4.22. 4.5.5 Ganancia: G Este componenente forma parte de la arquitectura de SDM y con él se duplica el valor de la señal binaria a la entrada de este como se muestra en el código 8.11. Al igual que en los apartados anteriores, a continuación, se muestra el esquemático asociado a este componente (Figura 4.23), se identifican las señales de nuestro circuito SDM en dicho esquema (Tabla 4.6) y se ilustra parte del resultado obtenido tras su simulación Figura 4.24. Figura 4.23 Representación esquemática del componente Ganancia.
34 Capítulo 4. Simulación VIVADO Tabla 4.6 Identificación señales circuito SDM con las entradas y salidas del componente Ganancia. Componente Circuito SDM a salida1 b salidag Figura 4.24 Simulación del componente Ganancia. 4.6 Lógica secuencial Se consideran dentro de esta clasificación a aquellos componentes del circuito cuyas salidas son función de sus entradas actuales y de su estado anterior. En nuestro caso serán síncronos, y sus valores se actualizan en los instantes de tiempo en los que la señal clock tiene un flanco de subida. De este modo los cambios de estado se darán sincronizados con la señal reloj. Además de lo anterior, el circuito tendrá como entrada un reset asíncrono (rasin), tal que todas las variables se harán cero cuando rasin=’1’. Los componentes que cumplen estas características son los registros y biestables, en nuestro caso tipo D. 4.6.1 Componente D_ff Para los bloques z−1 se trabaja con biestables tipo D (delay). Esta relación se debe a que, trabajando con transformada z, dividir entre z equivale a retrasar un intervalo de muestreo, lo cual llevan a cabo este tipo de registros que permiten sincronizar la entrada con el reloj imponiendo un retraso. Dicho retraso se observará en las simulaciones mostradas posteriormente. Figura 4.25 Representación esquemática del componente Flip-flop tipo D. Se parte del componente genérico mostrado en la Figura 4.25 el cuál consta de una entrada D y la entrada asociada al reloj, y una salida. Además, mediante un multiplexor, se impone que la entrada al registro se actualice con la señal de entrada siempre que EN tenga un valor alto. Dicha representación de bloques se plasma en el código 8.12. A partir de dicho esquema general, se especifican los dos registros que conforman el circuito a estudio según las señales que entran a cada uno de los dos.
4.6 Lógica secuencial 35 D1 El primero de los dos registros empleados en el circuito tiene asociado las señales de la Tabla 4.7 y su simulación da los resultados mostrados en la Figura 4.26 donde se aprecia el retraso que este registro presenta. Tabla 4.7 Identificación señales circuito SDM con las entradas y salidas del componente D1. Componente Circuito SDM entrada salidares2 salida salida1 Figura 4.26 Simulación del componente D1. D2 Para poder observar mejor el retraso que se produce en las señales una vez estas entran en los registros se ha realizado la simulación asociada al componente D2 para el mismo intervalo de tiempo que el mostrado en la Figura 4.27. Tabla 4.8 Identificación señales circuito SDM con las entradas y salidas del componente D2. Componente Circuito SDM entrada salida1 salida salida2 Figura 4.27 Simulación del componente D2. 4.6.2 Componente D_out El objetivo de este biestable es almacenar las señales de salida del SDM para su posterior extracción y análisis bien mediante Matlab o midiendo dichas señales con un osciloscopio digital. En este caso, sería erróneo incluir como entrada a señal EN dado que la señal ySD que sale del cuantizador y entra en Dout ya está sincronizada con la señal Enable. El componente mostrado en Figura 4.28 se implementa a través del código 8.13. Consiste en un biestable que consta de cuatro entradas y dos salidas las cuales son a su vez salidas del bloque circuital completo.
36 Capítulo 4. Simulación VIVADO Figura 4.28 Representación esquemática del componente Dout. Simulación componente Dout Figura 4.29 Representación esquemática del componente Dout. A partir de la Figura 4.29 se observa como las señales salNRZ y salRZ son idénticas salvo que las segunda sufre un retorno al valor cero. 4.7 Design Sources 4.7.1 Archivo top En este archivo se conforma el circuito completo a partir de los componentes descritos anteriormente. El código 8.14 constituye lo que se denomina Design Source y en él se realiza la conexión de los distintos elementos, asociado las entradas y salidas de cada uno al igual que se definen las constantes y señales internas. De este modo, se describe todo nuestro diseño dentro de la entidad (entity) top3 que actúa como una caja negra, la cual solo consta de dos señales de entrada y tres señales de salida como se observa en la Figura 4.30. La selección de dichas entradas y salidas no ha sido arbitraria, sino que se han elegido tal que solo apareciesen las imprescindibles para poder realizar el análisis final. Las señales intermedias restantes no serán ni extraídas en MAT LAB ni representadas mediante un osciloscopio digital ya que no son de interés en el estudio final, pero si han sido debidamente analizadas en los pasos anteriores para comprobar que todo funciona correctamente y así minimizar la posibilidad de error en la etapa final de este proyecto. Todo lo descrito aquí se ejemplifica en la Figura 4.30 Además, cabe mencionar que este código primario se alimenta de una serie de códigos secundarios que son los relativos a los distintos componentes que conforman el circuito completo mostrado en la Figura 4.1 y que se han ido explicando con detalle en las Sección 4.5 y Sección 4.6 de la memoria. 4.8 Simulation Sources A continuación se comentan los ficheros VHDL empleados para simular el componente Top gracias a que estos incluyen la definición de los distintos estímulos que describen las señales clk y rasin, las cuales provocarán cambios en las señales que intervienen en nuestro circuito global.
4.8 Simulation Sources 37 Figura 4.30 Representación esquemática del componente Dout. Este tipo de código recibe el nombre de banco de pruebas o testbench en inglés debido a su función de verificar si las señales, tanto de salida como de entrada, son las esperadas en un primer análisis teórico comprobando así el correcto funcionamiento del top. En nuestro proyecto se han definido dos archivos de esta clase abordados en las siguientes subsecciones, teniendo cada uno asociado una misión concreta. 4.8.1 Archivo sim_top El código 8.15 hace referencia a un fichero VHDL del tipo Simulation Source que tiene por finalidad simular el componente top a partir de la definición de los estímulos asociados a la señal clk con un período de 10 ns y la señal rasin, activa el primer cuarto de período e inactiva durante el tiempo restante de simulación. Figura 4.31 Simulacion corta del componente top. Figura 4.32 Simulación del componente top. En la Figura 4.31 se ha realizado una simulación corta del archivo VHDL con objeto de mostrar como se cumple la definición de los estímulos explicada anteriormente. Al pricipio, la señal rasin toma un valor alto y por lo tanto las señales de salida salNRZ y salRZ están a cero. Una vez que rasin toma un nivel bajo, las señales comienzan a evolucionar. También se destaca de dicha representación como la señal rasin está a ’1’ durante un tiempo igual a Tclk 4=2.5ns tal y como se expone en la simulación. Por otro lado, la señal PRZ no se ve, aparentemente, afectada por la variación de la señal rasin. Esto no
44 Capítulo 4. Simulación VIVADO I. RTL Analysis Se elabora el diseño ejecutando el apartado RTL Analysis. Una vez finalizado este, el SW generará un esquemático del circuito implementado. II. Synthesis Se realiza la síntesis del circuito y posteriormente dos simulaciones asociadas a esta: Post − Synthesis Functional Simulation y Post −Synthesis Timing Simulation debiendo comprobar que ambas dan resultados adecuados, sin producirse ninguna saturación en las señales u otros errores. III. Implementation Este tercer paso se ejecuta de manera análoga al anterior, habiendo que comprobar también las simulaciones funcional y timing correspondientes a este. IV. Program and debug Lo primero a realizar en este último paso es generar el Bitstream que es un archivo que contiene la información de programación para una FPGA. A continuación, se conecta la FPGA empleada al ordenador para poder proceder a su conexión, seleccionando la opción de Open Target −→ Auto connect y finalmente se programa la FPGA ejecutando la opción de Program device. Tras realizar todo lo anterior, ya se pueden tomar medidas experimentales midiendo las tensiones en los pines de salidas de la FPGA que se hayan asociado con las señales a estudio. Esta toma de medidas se realiza en nuestro caso mediante el osciloscopio digital Picoscope y se analizan mediante códigos de Matlab.
5 Resultados Experimentales Ac ontinuación, se muestran los resultados experimentales obtenidos tras realizar todos los pasos anteriores y una vez generado el Bitstream en el Software Vivado tras la exitosa conexión y programación de la FPGA con el ordenador. Estos resultados experimentales se analizan mediante el sistema de medición PicoScope . Concretamente, usando el Software PicoScope 6. Además, para medir correctamente los resultados a la salida del SDM se ha diseñado un filtro paso bajo que elimine el ruido a altas frecuencias. Se va a proceder a analizar estos resultados experimentales tanto mediante el propio osciloscopio digital, realizando un análisis de la señal gráficamente (observando si su período y amplitud es el adecuado para el caso temporal así como la frecuencia del armónico fundamental y el fondo de ruido para el caso espectral) y mediante MAT LAB analizando los ficheros de datos asociados a la señal temporal y su FFT. 5.1 Diseño del filtro En primer lugar, se analiza el filtro paso bajo diseñado para eliminar el ruido a altas frecuencias tal como se ejemplificó en la Figura 2.12. Como SW de apoyo se emplea PSpice , donde se dibuja el esquema del filtro a estudiar (Figura 5.1) y se realiza un análisis tipo AC de este (Figura 5.2). Figura 5.1 Filtro paso bajo para eliminar ruido a altas frecuencias de la señal de salida del SDM. En la Figura 5.2 se ha representado el valor en dB del voltaje Vout. Además, se han añadido varios cursores en los valores relevantes a destacar: • Frecuencia fs=fclk Ndiv =2.5MHz : frecuencia de muestreo de la señal. Es la frecuencia en la que se haya la imagen del espectro de bajas frecuencias, recordando los valores de los parámetros Ndiv =40 yfclk =10ns • Frecuencia fs/2=1.25MHz : frecuencia tal que cualquier componente espectral que se encuentre por encima de ella crea aliasing. •Ancho de banda de la señal: BW =fclk/Ndiv 2·OSR =19.5KHz, donde OSR =64. 45
46 Capítulo 5. Resultados Experimentales Figura 5.2 Simulación AC en PSpice del filtro. 5.2 PicoScope La observación y análisis de las señales a la salida del SDM se realizan mediante el osciloscopio digital PicoScope tal y como se ha mencionado previamente. Dicho análisis será tanto de la señal temporal (Modo de osciloscopio) como la correpondiente FFT (Modo de espectro). Además, se trabaja con dos modelos de PicoScope: de 12 bits y de 16 bits. El primer elemento de medición se emplea para capturar las señales de salida del SDM previas a ser filtradas gracias a la mayor rapidez de este instrumento frente al de 16 bits que será empleado para capturar y generar ficheros de puntos de las señales anteriores una vez filtradas que se analizarán empleando los Códigos 7.3 y 7.4 5.2.1 Configuración de captura y opciones de canal A continuación se muestra sucintamente los valores empleados para configurar la representación temporal y espectral de la señal y a partir de los cuales se han extraído los ficheros de datos posteriormente empleados en MAT LAB (Tabla 5.1). 5.3 Valoración de las prestaciones del circuito implementado en VHDL Para evaluar el buen funcionamiento del diseño del circuito realizado en VHDL se realiza un estudio espectral de las señales representadas en el osciloscopio digital. Dicho estudio se basará en los valores de dos parámetros: SNR y HD2. Estos parámetros se calculan empleando un código de Matlab, el cuál carga un fichero de datos generado a partir de las medidas obtenidas en PicoScope.De este modo, un valor de SNR próximo a 70-71 dB demuestra que se ha realizado una correcta implementación del circuito a estudio.
5.4 Análisis de las señales a la salida del SDM para distintas amplitudes de entrada 47 Tabla 5.1 Valores asignados a las distintas configuraciones y opciones de canal de PicoScope. Modo de Osciloscopio Control de base de tiempo 5 ms/div Control de muestras 1 MS Modo de Espectro Control del rango de frecuencia 2 MHz Colectores de espectro 32768 Función de ventada Hann Eje y. Escala Logarítmica Unidad logarítima dBu Eje x. Escala Lineal Opciones de canal Sonda x10 Modo de acoplamiento CA Resolución de hardware 16 bits 12 bits Filtro paso bajo 20 kHz Límite de ancho de banda 200 kHz 5.4 Análisis de las señales a la salida del SDM para distintas amplitudes de entrada Como se ha mencionado previamente, se realizan análisis de los resultados experimentales asociados a la señal de salida para el caso en que la señal de entrada tenga una amplitud 5 dB por debajo de la amplitud máxima (A=-5dBfs) y para una amplitud 6 dB por debajo de la máxima (A=-6dBfs), concepto explicado en la expresión (3.5) del Capítulo 3. Además, los valores asociados a las prestaciones de las señales de salida se comparan con los del caso ideal Tabla 3.1 como ya se ha mencionado previamente. 5.4.1 Señal de entrada a 5 dB por debajo de la amplitud máxima Señales salNRZ y salRZ. Sin filtrar Figura 5.3 Representación temporal de salNRZ (azul) y salRZ (rojo) sin filtros medidas con PicoScope 12 bits para una amplitud Amp=-5dBfs.
48 Capítulo 5. Resultados Experimentales Los resultados (Figura 5.3) muestran lo esperado. Ambas señales son pulsos que al ser superpuestos se identifica la señal salRZ como una copia de salNRZ con retorno a cero. Cabe destacar que estas medidas se han tomado con el medidor PicoScope con resolución hardware de 12 bits debido a que al ser este más rápido, permite realizar una mejor captura de estas señales. El resto de medidas se realizarán con el de 16 bits, justificándose esta decisión en el apartado 5.6. Señal salNRZ.Filtrada Empleando el filtro paso bajo (LPF) diseñado en PSpice (Figura 5.2) se obtienen las señal temporal (Figura 5.4) y espectral (Figura 5.5) para la salida del modulador con configuración sin retorno a cero. En el caso de la representación temporal se observa como se ha obtenido una señal senoidal a la salida, luego se ha recuperado la forma de onda correctamente. Figura 5.4 Representación mediante PicoScope en modo osciloscopio de la señal salNRZ, 100 µ s/div y amplitud -5dBfs. Figura 5.5 Representación mediante PicoScope en modo de espectro de la señal salNRZ con Amp=-5dBfs. Además, los resultados tras realizar el estudio analítico en MAT LAB se recoge en la Tabla 5.2 donde se
5.4 Análisis de las señales a la salida del SDM para distintas amplitudes de entrada 49 presentan los valores de los parámetros SNR y HD2 para las representaciones obtenidas tanto con el Modo de Osciloscopio como con el de Espectro (Tabla 5.2). Para ello se extraen ficheros de puntos para cada modo de PicoScope y se cargan en la rutina de MAT LAB correspondiente. Dichos valores se pueden representar en MAT LAB tal que se puedan comparar estas gráficas con las obtenidas usando PicoScope (Figura 5.6, Figura 5.7). Figura 5.6 Representación mediante Matlab del fichero de puntos en PicoScope de la señal temporal salNRZ con Amp=-5dBfs. Figura 5.7 Representación mediante Matlab del fichero de puntos en PicoScope de la señal espectral salNRZ con Amp=-5dBfs. En vista a los resultados plasmados en la Tabla 5.2 se aprecia como las prestaciones para la señal analizado son adecuadas en comparación con las del caso ideal inicial.
50 Capítulo 5. Resultados Experimentales Tabla 5.2 Resultados obtenidos mediante Matlab de las prestaciones del circuito para la señal salRZ para el caso temporal y espectral con una amplitud 5 dB por debajo del valor máximo. SNR (dB) HD2 (dB) Señal Temporal 70.106705 57.795655 Espectro 70.037737 57.664973 Señal salRZ. Filtrada Ahora, se exponen los resultados para la señal de salida del SDM con retorno a cero, salRZ. Al igual que se hizo para la señal salNRZ se representan las gráficas obtenidas mediante el PicoScope, así como los parámetros y gráficas resultantes de analizar los ficheros de puntos generados en PicoScope mediante MAT LAB . Cabe mencionar que el análisis de la señal anterior con configuración RZ se realiza para poder comparar ambos casos y ver que configuración es la adecuada. Figura 5.8 Representación mediante PicoScope en modo osciloscopio de la señal salRZ, 100 µ s/div, con amplitud -5dBfs. Figura 5.9 Representación mediante PicoScope en modo de espectro de la señal salRZ con Amp=-5dBfs.
5.4 Análisis de las señales a la salida del SDM para distintas amplitudes de entrada 51 Figura 5.10 Representación mediante Matlab del fichero de puntos de la señal salRZ, Amp=-5dB, temporal en PicoScope. Figura 5.11 Representación mediante Matlab del fichero de puntos en PicoScope de la señal temporal salRZ con Amp=-5dB. Tabla 5.3 Resultados obtenidos mediante Matlab de las prestaciones del circuito para la señal salRZ para el caso temporal y espectral con una amplitud 5 dB por debajo del valor máximo. SNR (dB) HD2 (dB) Señal Temporal 69.484629 62.589063 Espectro 70.168416 62.521225
52 Capítulo 5. Resultados Experimentales 5.4.2 Señal de entrada a 6 dB por debajo de la amplitud máxima Por otro lado, se realiza el mismo análisis anterior pero ahora trabajando con una amplitud 6 dB por debajo del valor máximo ya que también se estudió dicho caso en el análisis preliminar en MAT LAB&Simulink. Señales salNRZ y salRZ. Sin filtrar En la Figura 5.12 se observa un comportamiento similar al obtenido en el caso de -5dBfs y de nuevo queda reflejado el comportamiento de la configuración con retorno a cero. Figura 5.12 Representación temporal de salNRZ (azul) y salRZ (rojo) sin filtros medidas con PicoScope 12 bits para una Amplitud de -6dBfs. Señal salNRZ. Filtrada Figura 5.13 Representación mediante PicoScope en modo osciloscopio de la señal salNRZ, 100 µ s/div y amplitud -6dBfs.
5.4 Análisis de las señales a la salida del SDM para distintas amplitudes de entrada 53 Figura 5.14 Representación mediante PicoScope en modo espectro de la señal salNRZ con Amp=-6dBfs. Figura 5.15 Representación mediante Matlab del fichero de puntos en PicoScope de la señal temporal salNRZ con Amp=-6dB. Tabla 5.4 Resultados obtenidos mediante Matlab de las prestaciones del circuito para la señal salNRZ para el caso temporal y espectral con una amplitud 6 dB por debajo del valor máximo. SNR (dB) HD2 (dB) Señal Temporal 68.972134 58.784917 Espectro 68.749557 58.493055
60 Capítulo 6. Conclusiones y mejoras señales de audio. En segundo lugar, se plantea añadir un single-bit DAC para mejorar los valores obtenidos para el HD2 como el de la Figura 6.1 Figura 6.1 Esquema de la propuesta de mejora del HD2 usando un single-bit DAC.
7 Apéndice I. Códigos Matlab 7.1 Análisis fichero de puntos Vivado Señal salNRZ El siguiente código tiene por objetivo analizar la señal de salida del SDM sin retorno a cero que toma valores binarios entre ’1’ y ’0’. Dicho análisis se traduce en el cálculo de la SNR de la señal y la representación de la señal y su correspondiente espectro. Es imprescindible explicar la necesidad de la transformación realizada en el bucle f or donde se convierten los datos de entrada tal que varían entre ’0’ y ’+1’, en ’-1’ y ’+1’. Además, el índice asociado a la señal se obtiene mediante la localización del máximo de la representación en frecuencia. Por último, para dar valor a HD2, se estima gráficamente, a partir de la representación espectral, los índices dentro de los que se contiene el segundo armónico. Dicho paso queda indicado en el código. Para una mejor comprensión se muestra un ejemplo en la figura Figura 7.1 en cuyo caso se incluirían los valores siguientes en el código: Nh2_1=62; Nh2_2=66; Figura 7.1 Representación de la PSD de la señal de salida del SDM a modo de ejemplo para determinar los índices del segundo armónico.. 61
62 Capítulo 7. Apéndice I. Códigos Matlab Código 7.1 analizaNRZ.m. clear all; %% PARÁMETROS nBits=14; R= 2^(nBits-1); R2=2^nBits; FD=64; Narm=6; Np1p=2*FD*Narm; % Número de valores de la Lookup Table fs=1024; % Frecuencia de sobremuestreo ts=1/fs; %% load(’salida_RON.txt’) %salida_RON: fichero de puntos extraído de Vivado datos=salida_RON(:,1); y0=datos; Nvhdl=length(y0); % Número de valores de VHDL Nptos=Np1p*floor(Nvhdl/Np1p); % redondea a la baja for ind=1:1:Nvhdl, if y0(ind)==0, y0(ind)=-1; end end %% Calulo PSD, SNR y HD2 ventana=window(@hann,Nptos); % empleo una ventana temporal hann psd=pwelch(y0,ventana,Nptos-1,Nptos); [Pmax,Nfs]=max(psd); % Índice asociado a la señal- Nbw=round(Nptos/2/FD); Lpsd=length(psd); freq=[0:1:Lpsd-1]*fs/2; semilogx(freq,10*log10(psd)) senal=sum(psd(Nfs-2:Nfs+4)); ruido=sum(psd(3:Nbw))-senal; %Segundo armónico Nh2_1=; % Límite inferior Nh2_2=; % Límite superior harm2=sum(psd(Nh2_1:Nh2_2)); snr=10*log10(senal/ruido); HD2=10*log10(senal/harm2); %% fprintf(1,’SNR (dB): %f HD2: %f (dB)\n’,snr,HD2); plot(y0) Señal de entrada al SDM También resulta de interés analizar cómo es la señal que se introduce al SDM y que se genera mediante el componente contador.
7.1 Análisis fichero de puntos Vivado 63 La finalidad de este código es representar dicha señal y su espectro junto con analizar su SNR para verificar que, en efecto, la señal de entrada corresponde a una señal sinuosidal. Todo ello se realiza de manera análoga al código asociado al estudio de la señal salNRZ con algunos cambios sustanciales. Además cabe mencionar que en el código VHDL 8.17 se convierte los valores binarios asociados a la señal entSD en números enteros, y es por ello que en el bucle for ahora se realiza la transformación de dichos valores enteros en CA2 a su valor decimal con signo. Otra modificación respecto al código 7.1 radica en que una vez cargado el fichero de puntos, se asocia la segunda columna de valores a la variable x. Código 7.2 analizaentrada.m. clear all; %%PARÁMETROS nBits=14; FD=64; Narm=6; Np1p=2*FD*Narm; %número de valores de la Lookup Table fs=1024; % Frecuencia de sobremuestreo ts=1/fs; %% load(’salida_RON.txt’); x=salida_RON(:,2); %entrada al SDM Nvhdl=length(x); %Número de valores de VHDL Nptos=Np1p*floor(Nvhdl/Np1p); %redondea a la baja for i=1:Nvhdl if x(i)>=2^(nBits-1) x(i)=x(i)-2^nBits; end end %% Calulo de la PSD, SNR y HD2 ventana=window(@hann,Nptos); % empleo una ventana temporal hann psd=pwelch(x,ventana,Nptos-1,Nptos); [Pmax,Nfs]=max(psd); % índice asociado a la señal Nbw=round(Nptos/2/FD); Lpsd=length(psd); freq=[0:1:Lpsd-1]*fs/2; semilogx(10*log10(psd)) senal=sum(psd(Nfs-2:Nfs+4)); ruido=sum(psd(3:Nbw))-senal; %Segundo armónico Nh2_1=; Nh2_2=; harm2=sum(psd(Nh2_1:Nh2_2); snr=10*log10(senal/ruido); HD2=10*log10(senal/harm2); %% fprintf(1,’SNR (dB): %f HD2: %f (dB)\n’,snr,HD2);
64 Capítulo 7. Apéndice I. Códigos Matlab plot(x) % Representación señal senoidal a la entrada del SDM 7.2 Análisis fichero de puntos PicoScope Señal temporal Código 7.3 analizaPScope_temp.m. load(’prb.txt’); %prb: fichero de puntos extraído de PicoScope y=prb(:,2); t=prb(:,1); plot(t,y); title(’Antes de recortar’); %%%%%%%%%PARÁMETROS%%%%%%%%% Nsample=length(y); OSR=64; Narm=6; Ndiv=40; ts=(t(2)-t(1))*1e-3; fs=1/ts; fp=1e8/Ndiv/2/OSR/Narm; Tp=1/fp; Np1Tp=fs/fp; Nptos=round(Np1Tp*floor(Nsample/Np1Tp)); %%%%%%%%%%%%%%%%%%%%%%%%%%%% figure plot(t(Nsample-Nptos+1:Nsample),y(Nsample-Nptos+1:Nsample),’k’); xlabel(’Tiempo (ms)’); ylabel(’Canal A (V)’) title(’Recortada’); % Se recorta la señal un número entero de períodos %%%%%%%%%%%%%%%%%%%%%%%CALCULO PSD Y SNR%%%%%%%%%%%%%%%%%%%%%%% ventana=window(@hann,Nptos); psd=pwelch(y(Nsample-Nptos+1:Nsample),ventana,Nptos-1,Nptos); [Py_max,ind_fpp]=max(psd); fpp=ind_fpp*fs/Nptos; fprintf(1,’Frecuencia señal; medida: % f y teorica: %f (KHz)\n’,fpp*1e-3,fp*1e -3); Lpsd=length(psd); figure freq=[0:1:Lpsd-1]*fs/2; semilogx(10*log10(psd)); % PARÁMETROS A DAR VALOR Nfs=163; %frecuencia 1er armónico Nbw=6*Nfs; senal=sum(psd(159:168)); %intervalo 1er armónico harm2=sum(psd(323:328)); %intervalo 2o armónico ruido=sum(psd(6:Nbw))-senal-harm2; %%%%%
7.2 Análisis fichero de puntos PicoScope 65 snr=10*log10(senal/ruido); HD2=10*log10(senal/harm2); fprintf(1,’SNR (dB): %f HD2: %f (dB)\n’,snr,HD2); Espectro Código 7.4 analizaPScope_FFTlin.m. load(’prb.txt’); %prb: fichero de puntos extraído de PicoScope (en escala logar ítmica) y=(prb(:,2)); freq=prb(:,1); plot((y)) yn=10.^(y/20); %se trabaja en escala natural %% PARAMETROS A DAR VALOR Nfs=65; Nbw=6*Nfs; senal=(sum(yn(62:70).^2)); harm2=(sum(yn(126:133).^2)); ruido=(sum(yn(5:Nbw).^2))-senal-harm2; %%%%% snr=10*log10(senal/ruido); HD2=10*log10(senal/harm2); fprintf(1,’SNR (dB): %f HD2: %f (dB)\n’,snr,HD2); plot(freq,y, ’k’) xlabel(’Frecuencia (Mhz)’) ylabel (’Canal A (dBu)’)
8 Apéndice II. Códigos VHDL En este apéndice se exponen todos los códigos VHDL empleados durante el proyecto así como una explicación de ellos cuando se considere necesaria. Design Sources 8.1 Divisor de frecuencias Código 8.1 divisor_frecuencia.vhd. library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity divisor_frecuencia is generic ( Ncont: integer := 6; Ndiv: integer := 40; Nduty: integer := 21); Port ( clk : in STD_LOGIC; rasin: in STD_LOGIC; EN : out STD_LOGIC; PRZ : inout STD_LOGIC); end divisor_frecuencia; architecture Behavioral of divisor_frecuencia is ------------------------------------------------------------------------------- signal uno : std_logic_vector(Ncont-1 downto 0) := (0=>’1’, others=>’0’); signal qo, qi : std_logic_vector(Ncont-1 downto 0); signal iguales : std_logic := ’0’; signal igualesPRZ: std_logic := ’0’; ------------------------------------------------------------------------------- begin process(rasin,clk,qi) begin if (rasin=’1’) then qo <= (0 => ’0’,others => ’0’); elsif (clk’event and clk=’1’) then qo <= qi; end if; end process; 67
68 Capítulo 8. Apéndice II. Códigos VHDL EN <= iguales; PRZ <= igualesPRZ; iguales <= ’1’ when (Ndiv-1) = qo else ’0’; igualesPRZ <= ’1’ when Nduty > qo else ’0’; qi <= (qo+uno) when (iguales=’0’) else (others => ’0’); end Behavioral; 8.2 Contador Código 8.2 contador.vhd. library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity contador is generic ( Nmuestras: integer := 192; Nb: integer := 14); Port ( clk : in STD_LOGIC; rasin : in STD_LOGIC; EN : in STD_LOGIC; address : inout std_logic_vector (Nb-1 downto 0); entSD : out std_logic_vector (Nb-1 downto 0)); end contador; architecture Behavioral of contador is ----------------------------------------------------------------------------- signal salLUT : std_logic_vector(Nb-1 downto 0); signal uno : std_logic_vector(Nb-1 downto 0) := (0=>’1’, others=>’0’); signal qoc, qic : std_logic_vector(Nb-1 downto 0); signal iguales : std_logic := ’0’; signal sele : std_logic_vector(1 downto 0) := (others => ’1’); signal sube,signo : std_logic; signal salreg : std_logic_vector(Nb-1 downto 0); ----------------------------------------------------------------------------- component D_sube generic ( Nmuestras: integer := 192; Nb: integer := 14); Port ( address : in STD_LOGIC_vector(Nb-1 downto 0); salida : out STD_LOGIC; clk,rasin,EN : in STD_LOGIC); end component; component D_signo generic ( Nb: integer := 14); Port ( address : in STD_LOGIC_vector(Nb-1 downto 0); salida : out STD_LOGIC;
8.2 Contador 69 clk,rasin,EN : in STD_LOGIC); end component; component D_entr generic ( Nb: integer :=Nb); Port ( entrada : in STD_LOGIC_VECTOR (Nb-1 downto 0); salida : out STD_LOGIC_VECTOR (Nb-1 downto 0); clk,rasin,EN : in STD_LOGIC); end component; ----------------------------------------------------------------------------- begin process(clk,qic,rasin) begin if (rasin=’1’) then qoc <= (0 => ’0’,others => ’0’); elsif (clk’event and clk=’1’) then qoc <= qic; end if; end process; address <= qoc; sele <= sube & EN; with sele select qic <= qoc+uno when "11", qoc-uno when "01", qoc when others; -----------------------LOOKUP TABLE------------------------ salLUT<="00000000000000" when address="00000000000000" else "00000000100110" when address="00000000000001" else "00000001001011" when address="00000000000010" else "00000001110001" when address="00000000000011" else "00000010010111" when address="00000000000100" else "00000010111100" when address="00000000000101" else "00000011100010" when address="00000000000110" else "00000100001000" when address="00000000000111" else "00000100101101" when address="00000000001000" else "00000101010011" when address="00000000001001" else "00000101111000" when address="00000000001010" else "00000110011110" when address="00000000001011" else "00000111000100" when address="00000000001100" else "00000111101001" when address="00000000001101" else "00001000001110" when address="00000000001110" else "00001000110100" when address="00000000001111" else "00001001011001" when address="00000000010000" else "00001001111111" when address="00000000010001" else "00001010100100" when address="00000000010010" else "00001011001001" when address="00000000010011" else "00001011101110" when address="00000000010100" else "00001100010100" when address="00000000010101" else "00001100111001" when address="00000000010110" else "00001101011110" when address="00000000010111" else "00001110000011" when address="00000000011000" else "00001110101000" when address="00000000011001" else "00001111001101" when address="00000000011010" else "00001111110001" when address="00000000011011" else
76 Capítulo 8. Apéndice II. Códigos VHDL entity restador1 is generic (Nb: integer := 14); Port ( a : in STD_LOGIC_VECTOR (Nb-1+5 downto 0); b : in STD_LOGIC_VECTOR (Nb-1+5 downto 0); y : out STD_LOGIC_VECTOR (Nb-1+6 downto 0)); end restador1; architecture Behavioral of restador1 is -------------------------------------------------- signal s1, ns2: std_logic_vector(Nb-1+6 downto 0); -------------------------------------------------- begin s1 <= "0"&a when a(Nb-1+5)=’0’ else "1"&a; ns2 <= ’1’& not(b(Nb-1+5 downto 0))+’1’ when b(Nb-1+5)=’0’ else ’0’¬(b(Nb-1+5 downto 0))+’1’; y<= s1+ns2; end Behavioral; Código 8.8 restador2.vhd. library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity restador2 is generic (Nb: integer := 14; Nsat: integer :=17); Port ( a : in STD_LOGIC_VECTOR (Nb-1 downto 0); b : in STD_LOGIC_VECTOR (Nsat-1 downto 0); y : out STD_LOGIC_VECTOR (Nb-1+4 downto 0)); end restador2; architecture Behavioral of restador2 is --------------------------------------------------- signal s1, ns2: std_logic_vector(Nb-1+4 downto 0); --------------------------------------------------- begin s1 <= "0000"&a when a(Nb-1)=’0’ else "1111"&a; ns2 <= ’1’& not(b(Nsat-1 downto 0))+’1’ when b(Nsat-1)=’0’ else ’0’& not(b(Nsat-1 downto 0))+’1’; y<= s1+ns2; end Behavioral; 8.5 Saturación
8.6 Single Bit Quantizer 77 Código 8.9 saturacion.vhd. library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity saturacion is generic (Nb: integer := 14; Nsat: integer := 17); Port ( a : in STD_LOGIC_VECTOR (Nb-1+6 downto 0); b : out STD_LOGIC_VECTOR (Nsat-1 downto 0)); end saturacion; architecture Behavioral of saturacion is ------------------------------------------------------------------------------- signal satpos: std_logic_vector(Nsat-1 downto 0) := (Nsat-1=>’0’, OTHERS=>’1’); signal satneg: std_logic_vector(Nsat-1 downto 0) := (Nsat-1=>’1’, OTHERS=>’0’); ------------------------------------------------------------------------------- begin b<= satpos when (a(Nb-1+6)=’0’) AND (a>65535) else satneg when (a(Nb-1+6)=’1’) AND (a<65536) else a(Nsat-1 downto 0); end Behavioral; 8.6 Single Bit Quantizer Código 8.10 quantizerSB.vhd. library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity quantizerSB is generic (Nb: integer := 14); Port ( a : in STD_LOGIC; b : inout STD_LOGIC_VECTOR (Nb-1 downto 0); ySD : out STD_LOGIC); end quantizerSB; architecture Behavioral of quantizerSB is ------------------------------------------------------------------------ signal pos: std_logic_vector(Nb-1 downto 0) := (Nb-1=>’0’, OTHERS=>’1’); signal neg: std_logic_vector(Nb-1 downto 0) := (Nb-1=>’1’, OTHERS=>’0’); ------------------------------------------------------------------------ begin b <= pos when a=’0’ else neg; ySD <= ’1’ when a=’0’ else ’0’;
78 Capítulo 8. Apéndice II. Códigos VHDL end Behavioral; 8.7 Ganancia Código 8.11 ganancia.vhd. library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity ganancia is generic (Nb: integer := 14); Port ( a : in std_logic_vector (Nb-1+4 downto 0); b : out std_logic_vector (Nb-1+5 downto 0)); end ganancia; architecture Behavioral of ganancia is begin b<= a(Nb-1+4 downto 0) & ’0’; end Behavioral; 8.8 Registros D1 y D2 Código 8.12 D_ff.vhd. library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity D_ff is generic (Nb: integer := 14); Port ( clk,rasin,EN : in STD_LOGIC; entrada : in STD_LOGIC_VECTOR (Nb-1+4 downto 0); salida : out STD_LOGIC_VECTOR (Nb-1+4 downto 0)); end D_ff; architecture Behavioral of D_ff is ---------------------------------------------- signal D,Q: std_logic_vector(Nb-1+4 downto 0); ---------------------------------------------- begin salida <=Q; process(rasin,clk) begin if (rasin=’1’) then Q <= (0 => ’0’,others => ’0’);
8.9 Biestable con señales salNRZ y salRZ como salida: D_out 79 elsif (clk’event and clk=’1’) then Q <= D; end if; end process; D<= entrada when EN=’1’ else Q; end Behavioral; 8.9 Biestable con señales salNRZ y salRZ como salida: D_out Código 8.13 D_out.vhd. library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity D_out is generic (Nb: integer := 14); Port ( clk,rasin : in STD_LOGIC; ySD : in STD_LOGIC; PRZ : in STD_LOGIC; salNRZ : out STD_LOGIC; salRZ : out STD_LOGIC ); end D_out; architecture Behavioral of D_out is ------------------------ signal Q1,Q2: std_logic; signal yRZ : std_logic; ------------------------ begin yRZ <= PRZ AND ySD; salNRZ <=Q1; salRZ <=Q2; process(rasin,clk) begin if (rasin=’1’) then Q1 <= ’0’; Q2 <= ’0’; elsif (clk’event and clk=’1’) then Q1 <= ySD; Q2 <= yRZ; end if; end process; end Behavioral;
80 Capítulo 8. Apéndice II. Códigos VHDL 8.10 Fichero top Para poder simular nuestro circuito es necesario generar una entidad que contenga la información que requiera el entorno de trabajo para poder llevar a cabo la simulación. En nuestro caso, dicha entidad recibe el nombre de top3. Código 8.14 top3.vhd. library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity top3 is Port (clk,rasin : in STD_LOGIC; PRZ : out std_logic; salNRZ : out std_logic; salRZ : out std_logic); end top3; architecture arch_top of top3 is --------------------------------- constant Nb : integer :=14; constant Nsat: integer := 17; constant Ncont: integer:= 6; constant Ndiv: integer := 40; constant Nduty: integer := 21; constant Nmuestras: integer:=192; --------------------------------- component divisor_frecuencia generic ( Ncont: integer := Ncont; Ndiv: integer := Ndiv; Nduty: integer:=Nduty ); Port ( clk : in STD_LOGIC; rasin: in STD_LOGIC; EN : out STD_LOGIC; PRZ : inout STD_LOGIC); end component; component contador generic ( Nmuestras: integer := Nmuestras; Nb: integer := Nb); Port ( clk : in STD_LOGIC; rasin : in STD_LOGIC; EN : in STD_LOGIC; address : inout std_logic_vector (Nb-1 downto 0); entSD : out std_logic_vector (Nb-1 downto 0)); end component; component sumador generic (Nb: integer := Nb); Port ( a : in STD_LOGIC_VECTOR (Nb-1 downto 0); b : in STD_LOGIC_VECTOR (Nb-1+4 downto 0); y : out STD_LOGIC_VECTOR (Nb-1+5 downto 0)); end component; component restador1 generic (Nb: integer := Nb);
8.10 Fichero top 81 Port ( a : in STD_LOGIC_VECTOR (Nb-1+5 downto 0); b : in STD_LOGIC_VECTOR (Nb-1+5 downto 0); y : out STD_LOGIC_VECTOR (Nb-1+6 downto 0)); end component; component restador2 generic (Nb: integer := Nb); Port ( a : in STD_LOGIC_VECTOR (Nb-1 downto 0); b : in STD_LOGIC_VECTOR (Nsat-1 downto 0); y : out STD_LOGIC_VECTOR (Nb-1+4 downto 0)); end component; component saturacion is generic (Nb: integer := Nb; Nsat: integer := Nsat); Port ( a : in STD_LOGIC_VECTOR (Nb-1+6 downto 0); b : out STD_LOGIC_VECTOR (Nsat-1 downto 0)); end component; component quantizerSB is generic (Nb: integer := Nb); Port ( a : in STD_LOGIC; b : inout STD_LOGIC_VECTOR (Nb-1 downto 0); ySD : out STD_LOGIC); end component; component ganancia generic (Nb: integer := Nb); Port ( a : in STD_LOGIC_VECTOR (Nb-1+4 downto 0); b : out STD_LOGIC_VECTOR (Nb-1+5 downto 0)); end component; component D_ff generic (Nb: integer :=Nb); Port ( clk,rasin,EN : in STD_LOGIC; entrada : in STD_LOGIC_VECTOR (Nb-1+4 downto 0); salida : out STD_LOGIC_VECTOR (Nb-1+4 downto 0)); end component; component D_out is generic (Nb: integer := Nb); Port ( clk,rasin : in STD_LOGIC; ySD : in STD_LOGIC; PRZ : in STD_LOGIC; salNRZ : out STD_LOGIC; salRZ : out STD_LOGIC ); end component; ---------------------------------------------------------------------- -- Test bench internal signals ---------------------------------------------------------------------- constant clock_period : time := 1000 ns; signal EN : std_logic; signal entSD: std_logic_vector(Nb-1 downto 0); signal address : std_logic_vector (Nb-1 downto 0); signal PRZinterno: std_logic; signal salidag: std_logic_vector (Nb-1+5 downto 0); signal salidasum: std_logic_vector (Nb-1+5 downto 0);
82 Capítulo 8. Apéndice II. Códigos VHDL signal salidares: std_logic_vector (Nb-1+6 downto 0); signal salidasat: std_logic_vector (Nsat-1 downto 0); signal salidaq: std_logic_vector (Nb-1 downto 0); signal ySD : std_logic; signal salidares2: STD_LOGIC_VECTOR (Nb-1+4 downto 0); signal salida1,salida2: std_logic_vector (Nb-1+4 downto 0); signal sal1, sal2: std_logic_vector (Nb-1+4 downto 0); ---------------------------------------------------------------------- begin CONT : contador generic map (Nmuestras=>Nmuestras, Nb=>Nb) PORT MAP (clk=>clk, rasin=>rasin, EN=>EN, address=>address, entSD=>entSD); DIV : divisor_frecuencia generic map (Ncont=>Ncont, Ndiv=>Ndiv, Nduty=>Nduty) PORT MAP (clk=>clk, rasin=>rasin, EN=>EN, PRZ=>PRZinterno); G : ganancia generic map (Nb=>Nb) PORT MAP (a=>salida1, b=>salidag); Sum: sumador generic map (Nb=>Nb) PORT MAP (a=>entSD, b=>salida2, y=>salidasum); Res: restador1 generic map (Nb=>Nb) PORT MAP (a=>salidasum, b=>salidag, y=>salidares); Sat: saturacion generic map (Nb=>Nb, Nsat=>Nsat) PORT MAP (a=>salidares, b=>salidasat); QSB: quantizerSB generic map (Nb=>Nb) PORT MAP (a=>salidasat(Nsat-1), b=>salidaq, ySD=>ySD); Res2: restador2 generic map (Nb=>Nb) PORT MAP (a=>salidaq, b=>salidasat, y=>salidares2); D1: D_ff generic map (Nb=> Nb) PORT MAP (clk=>clk, rasin=>rasin, EN=>EN, entrada=>salidares2, salida=>salida1) ; sal1<=salida1; sal2<= salida2; D2: D_ff generic map (Nb=> Nb) PORT MAP (clk=>clk, rasin=>rasin, EN=>EN, entrada=>salida1, salida=>salida2); PRZ<=PRZinterno; Dout: D_out generic map (Nb=> Nb) PORT MAP (clk=>clk, rasin=>rasin, ySD=>ySD, PRZ=>PRZinterno, salNRZ=>salNRZ, salRZ=>salRZ); end arch_top; Simulation Sources 8.11 Fichero de estímulos Tras llevar a cabo la codificación necesaria para diseñar el circuito en VHDL se realiza una simulación de dicho circuito. Para ello, el programa requiere de un fichero adicional dónde se incluyan todos los estímulos conocido como banco de pruebas o test bench en inglés. En nuestro caso, dicho fichero recibirá el nombre de sim_top3 y mediante su simulación se puede verificar si el circuito se comporta como se esperaba según el estudio ideal realizado en Matlab.
8.11 Fichero de estímulos 83 Código 8.15 sim_top3.vhd. library ieee; USE ieee.std_logic_1164.ALL; use ieee.numeric_std.all; use STD.textio.all; use ieee.std_logic_textio.all; use ieee.std_logic_unsigned.all; entity sim_top3 is end sim_top3; architecture tfg of sim_top3 is ---------Parámetros a modificar--------- constant Nb : integer := 14; constant Nsat : integer := 17; constant Ncont: integer := 6; constant Ndiv: integer := 40; constant Nduty: integer := 21; constant Nmuestras: integer :=192; ---------------------------------------- COMPONENT top3 Port (clk,rasin : in STD_LOGIC; PRZ : out std_logic; salNRZ : out std_logic; salRZ : out std_logic); END COMPONENT; --------------------------------------- constant clock_period : time := 10 ns; signal rasin : std_logic :=’1’; signal clk : std_logic := ’0’; signal PRZ : std_logic; signal salNRZ, salRZ: std_logic; --------------------------------------- begin u_top: top3 PORT MAP (clk=>clk, rasin=>rasin, PRZ=>PRZ, salNRZ=>salNRZ, salRZ=>salRZ); reloj: process begin clk <= ’0’; wait for clock_period/2; clk <= ’1’; wait for clock_period/2; end process; stim_proc: process begin wait for clock_period/4; rasin <=’0’; end process; end;
84 Capítulo 8. Apéndice II. Códigos VHDL 8.12 Fichero para la extracción de datos Con el fin de extraer los datos de la señal de entrada (entSD) y salida del SDM (salNRZ o salRZ) se ha de realizar una pequeña aunque significativa modificación al código 8.14 siendo ahora la señal entSD una señal inout del componente top en lugar de una señal interna. A continuación se expone el código modificado: Código 8.16 top3_v2.vhd. library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity top3_v2 is generic (Nb: integer := 14); Port (clk,rasin : in STD_LOGIC; PRZ : out std_logic; entSD : inout std_logic_vector(Nb-1 downto 0); salNRZ : out std_logic; salRZ : out std_logic); end top3_v2; architecture arch_top of top3_v2 is --------------------------------- constant Nsat: integer := 17; constant Ncont: integer:= 6; constant Ndiv: integer := 40; constant Nduty: integer := 21; constant Nmuestras: integer:=192; --------------------------------- component divisor_frecuencia generic ( Ncont: integer := Ncont; Ndiv: integer := Ndiv; Nduty: integer:=Nduty ); Port ( clk : in STD_LOGIC; rasin: in STD_LOGIC; EN : out STD_LOGIC; PRZ : inout STD_LOGIC); end component; component contador generic ( Nmuestras: integer := Nmuestras; Nb: integer := Nb); Port ( clk : in STD_LOGIC; rasin : in STD_LOGIC; EN : in STD_LOGIC; address : inout std_logic_vector (Nb-1 downto 0); entSD : out std_logic_vector (Nb-1 downto 0)); end component; component sumador generic (Nb: integer := Nb); Port ( a : in STD_LOGIC_VECTOR (Nb-1 downto 0); b : in STD_LOGIC_VECTOR (Nb-1+4 downto 0); y : out STD_LOGIC_VECTOR (Nb-1+5 downto 0));
8.12 Fichero para la extracción de datos 85 end component; component restador1 generic (Nb: integer := Nb); Port ( a : in STD_LOGIC_VECTOR (Nb-1+5 downto 0); b : in STD_LOGIC_VECTOR (Nb-1+5 downto 0); y : out STD_LOGIC_VECTOR (Nb-1+6 downto 0)); end component; component restador2 generic (Nb: integer := Nb); Port ( a : in STD_LOGIC_VECTOR (Nb-1 downto 0); b : in STD_LOGIC_VECTOR (Nsat-1 downto 0); y : out STD_LOGIC_VECTOR (Nb-1+4 downto 0)); end component; component saturacion is generic (Nb: integer := Nb; Nsat: integer := Nsat); Port ( a : in STD_LOGIC_VECTOR (Nb-1+6 downto 0); b : out STD_LOGIC_VECTOR (Nsat-1 downto 0)); end component; component quantizerSB is generic (Nb: integer := Nb); Port ( a : in STD_LOGIC; b : inout STD_LOGIC_VECTOR (Nb-1 downto 0); ySD : out STD_LOGIC); end component; component ganancia generic (Nb: integer := Nb); Port ( a : in STD_LOGIC_VECTOR (Nb-1+4 downto 0); b : out STD_LOGIC_VECTOR (Nb-1+5 downto 0)); end component; component D_ff generic (Nb: integer :=Nb); Port ( clk,rasin,EN : in STD_LOGIC; entrada : in STD_LOGIC_VECTOR (Nb-1+4 downto 0); salida : out STD_LOGIC_VECTOR (Nb-1+4 downto 0)); end component; component D_out is generic (Nb: integer := Nb); Port ( clk,rasin : in STD_LOGIC; ySD : in STD_LOGIC; PRZ : in STD_LOGIC; salNRZ : out STD_LOGIC; salRZ : out STD_LOGIC ); end component; ---------------------------------------------------------------------- -- Test bench internal signals ---------------------------------------------------------------------- constant clock_period : time := 1000 ns; signal EN : std_logic;
92 Índice de Figuras 4.6 Simulación componente divisor de frecuencia donde Tclk es el período de la señal reloj (10ns) y TSDM el período del SDM (400ns) 27 4.7 Representación esquemática del componente CONT de la arquitectura mostrada en la Figura 4.1 27 4.8 Simulación del componente DSube 28 4.9 Representación de la señal sube 28 4.10 Esquema de la variación del pulso sube según el signo de la pendiente de la señal senoidal 28 4.11 Simulación del componente DSigno 29 4.12 Esquema de la variación del pulso signo según el semiperíodo de la señal senoidal 29 4.13 Simulación de las señales asociadas al contador y al registro Din 29 4.14 Representación esquemática del componente Sumador 30 4.15 Resultado de simular el componente Sumador 30 4.16 Representación esquemática del componente Restador 31 4.17 Representación esquemática del componente Restador1 31 4.18 Representación esquemática del componente Restador 2 31 4.19 Representación esquemática del componente Saturación 32 4.20 Simulación componente Saturacion 32 4.21 Representación esquemática del componente Quantizer SB 33 4.22 Simulación componente Quantizer SB 33 4.23 Representación esquemática del componente Ganancia 33 4.24 Simulación del componente Ganancia 34 4.25 Representación esquemática del componente Flip-flop tipo D 34 4.26 Simulación del componente D1 35 4.27 Simulación del componente D2 35 4.28 Representación esquemática del componente Dout 36 4.29 Representación esquemática del componente Dout 36 4.30 Representación esquemática del componente Dout 37 4.31 Simulacion corta del componente top 37 4.32 Simulación del componente top 37 4.33 Simulación del archivo TB_top_SDM 38 4.34 Señal temporal de 1 bit a la salida del SDM para la configuración sin retorno a cero (salNRZ) 39 4.35 Espectro asociado a la señal salNRZ 39 4.36 Señal a la entrada del SDM con valores decimales sin signo 40 4.37 Señal senoidal a la entrada del SDM 41 4.38 Espectro asociado a la señal senoidal 41 4.39 Conexiones Pmod. Fuente [1] 43 4.40 Esquemas de los pines empleados para cada Pmod 43 5.1 Filtro paso bajo para eliminar ruido a altas frecuencias de la señal de salida del SDM 45 5.2 Simulación AC en PSpice del filtro 46 5.3 Representación temporal de salNRZ (azul) y salRZ (rojo) sin filtros medidas con PicoScope 12 bits para una amplitud Amp=-5dBfs 47 5.4 Representación mediante PicoScope en modo osciloscopio de la señal salNRZ, 100µs/div y amplitud -5dBfs 48 5.5 Representación mediante PicoScope en modo de espectro de la señal salNRZ con Amp=-5dBfs 48 5.6 Representación mediante Matlab del fichero de puntos en PicoScope de la señal temporal salNRZ con Amp=-5dBfs 49 5.7 Representación mediante Matlab del fichero de puntos en PicoScope de la señal espectral salNRZ con Amp=-5dBfs 49 5.8 Representación mediante PicoScope en modo osciloscopio de la señal salRZ, 100µs/div, con amplitud -5dBfs 50 5.9 Representación mediante PicoScope en modo de espectro de la señal salRZ con Amp=-5dBfs 50
Índice de Figuras 93 5.10 Representación mediante Matlab del fichero de puntos de la señal salRZ, Amp=- 5dB, temporal en PicoScope 51 5.11 Representación mediante Matlab del fichero de puntos en PicoScope de la señal temporal salRZ con Amp=-5dB 51 5.12 Representación temporal de salNRZ (azul) y salRZ (rojo) sin filtros medidas con PicoScope 12 bits para una Amplitud de -6dBfs 52 5.13 Representación mediante PicoScope en modo osciloscopio de la señal salNRZ, 100µs/div y amplitud -6dBfs 52 5.14 Representación mediante PicoScope en modo espectro de la señal salNRZ con Amp=-6dBfs 53 5.15 Representación mediante Matlab del fichero de puntos en PicoScope de la señal temporal salNRZ con Amp=-6dB 53 5.16 Representación mediante Matlab del fichero de puntos en PicoScope de la señal espectral salRZ con Amp=-6dBfs 54 5.17 Representación mediante PicoScope en modo osciloscopio de la señal salRZ a 100µs/div y amplitud -6dBfs 54 5.18 Representación mediante PicoScope en modo espectro de la señal salRZ con Amp=-6dBfs 55 5.19 Representación mediante Matlab del fichero de puntos en PicoScope de la señal temporal salRZ con Amp=-6dBfs 55 5.20 Representación mediante Matlab del fichero de puntos del en PicoScope de la señal espectral salRZ con Amp=-6dBfs 56 6.1 Esquema de la propuesta de mejora del HD2 usando un single-bit DAC 60 7.1 Representación de la PSD de la señal de salida del SDM a modo de ejemplo para determinar los índices del segundo armónico. 61
Índice de Tablas 2.1 Ejemplo CA2 para un número binario de 3 bits 7 3.1 Valor de SNR de las 4 arquitecturas para distintas caídas de amplitud 20 4.1 Identificación señales circuito SDM con las entradas y salidas del componente Sumador 30 4.2 Identificación señales circuito SDM con las entradas y salidas del componente Restador1 31 4.3 Identificación señales circuito SDM con las entradas y salidas del componente Restador2 31 4.4 Identificación señales circuito SDM con las entradas y salidas del componente Saturacion 32 4.5 Identificación señales circuito SDM con las entradas y salidas del componente QSB 33 4.6 Identificación señales circuito SDM con las entradas y salidas del componente Ganancia 34 4.7 Identificación señales circuito SDM con las entradas y salidas del componente D1 35 4.8 Identificación señales circuito SDM con las entradas y salidas del componente D2 35 4.9 Prestaciones de la señal de salida del SDM sin retorno a cero medidas a partir del fichero de datos extraído de Vivado 40 4.10 Prestaciones de la señal de entrada al SDM a partir del fichero de datos extraído de Vivado 42 4.11 Asociación de señales de salida con pines I/O de la FPGA. 43 5.1 Valores asignados a las distintas configuraciones y opciones de canal de PicoScope 47 5.2 Resultados obtenidos mediante Matlab de las prestaciones del circuito para la señal salRZ para el caso temporal y espectral con una amplitud 5 dB por debajo del valor máximo 50 5.3 Resultados obtenidos mediante Matlab de las prestaciones del circuito para la señal salRZ para el caso temporal y espectral con una amplitud 5 dB por debajo del valor máximo 51 5.4 Resultados obtenidos mediante Matlab de las prestaciones del circuito para la señal salNRZ para el caso temporal y espectral con una amplitud 6 dB por debajo del valor máximo 53 5.5 Resultados obtenidos mediante Matlab de las prestaciones del circuito para la señal salRZ para el caso temporal y espectral con una amplitud 6 dB por debajo del valor máximo 55 5.6 Resultados obtenidos mediante Matlab de las prestaciones del circuito para la señal salNRZ para el caso temporal y espectral 57 6.1 Comparativa de las prestaciones del circuito obtenidas antes y después de su implentación en la FPGA 59 95
Índice de Códigos 4.1 Fragmento del código VHDL 24 7.1 analizaNRZ.m 62 7.2 analizaentrada.m 63 7.3 analizaPScope_temp.m 64 7.4 analizaPScope_FFTlin.m 65 8.1 divisor_frecuencia.vhd 67 8.2 contador.vhd 68 8.3 D_sube.vhd 73 8.4 D_signo.vhd 73 8.5 D_entr.vhd 74 8.6 sumador.vhd 75 8.7 restador.vhd 75 8.8 restador2.vhd 76 8.9 saturacion.vhd 77 8.10 quantizerSB.vhd 77 8.11 ganancia.vhd 78 8.12 D_ff.vhd 78 8.13 D_out.vhd 79 8.14 top3.vhd 80 8.15 sim_top3.vhd 82 8.16 top3_v2.vhd 84 8.17 TB_top_SDM.vhd 87 8.18 pines.xdc 89 97
Bibliografía [1] AVNET, Zedboard. (zynq evaluation and development) hardware user’s guide, 2.2 ed., Enero 2014. [2] María José Madero Ayora, Señales y sitemas de radiofrecuencia, Universidad de Sevilla, 2018. [3] Miguel Angel Freire Rubio, Introducción al lenguaje vhdl, Universidad Politécnica de Madrid Departamento de Sistemas Electrónicos y de Control, 2010. [4] Francisco Colodro Ruiz, Fundamentos de la conversión A/D y D/A, Universidad de Sevilla. [5] Richard Schreier and Gabor C.Temes, Understanding delta-sigma data converters, IEEE press, 2005. [6] Marcos Sánchez-Élez, Introducción a la programación en vhdl, Facultad de Informática Universidad Complutense de Madrid, 2014. 99