Demodulador IQ para FPGA - v1.21

37
Demodulador IQ para FPGA Ing. Nicolás Dassieu Blanchet Tutor Esp. Ing. Pedro Ignacio Martos Jurado del Trabajo Dr. Leonardo Rey Vega Mg. Ing. Diego Brengi Dr. Ing. Mariano Llamedo Soria Presentado para obtener el título de Especialista en Sistemas Embebidos. Universidad de Buenos Aires, Diciembre de 2015.

Transcript of Demodulador IQ para FPGA - v1.21

Page 1: Demodulador IQ para FPGA - v1.21

Demodulador IQ para FPGA

Ing. Nicolás Dassieu Blanchet

Tutor

Esp. Ing. Pedro Ignacio Martos

Jurado del Trabajo

Dr. Leonardo Rey Vega

Mg. Ing. Diego Brengi

Dr. Ing. Mariano Llamedo Soria

Presentado para obtener el título de Especialista en Sistemas Embebidos.

Universidad de Buenos Aires,

Diciembre de 2015.

Page 2: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 2 de 37

Resumen El objetivo de este trabajo consiste en implementar en una FPGA un demodulador IQ. El diseño realizado deberá validarse mediante la utilización de un vector estimulo conocido.

Este proyecto surge a raíz de un equipo existente que llamáramos sistema actual. Dicho sistema consta de una computadora que corre un software de procesamiento que se comunica por USB 2.0 con un hardware que posee una FPGA. El hardware requiere una FPGA dado el alto troughput de datos en tiempo real que debe procesar.

Un nuevo requerimiento para el sistema actual generó la necesidad de migrar una funcionalidad que actualmente se encontraba en el software al firmware de la FPGA. En el capítulo 1. Introducción General explicaremos porque migraremos el demodulador IQ a la FGPA y cuáles son los requerimientos que tendrá el demodulador a implementar.

En la sección siguiente, 2. Marco Teórico, explicaremos más en detalle en qué consisten el software y el firmware del sistema actual y como será a grandes rasgos el demodulador que se quiere implementar.

Los detalles de la implementación elegida para el demodulador y para el simulador serán discutidos en la sección 3. Implementación.

En la sección 4. Resultados se mostrarán los resultados obtenidos en lo que respecta a la validación de los módulos desarrollados y a la utilización de recursos de la FPGA de dichos bloques.

Por último en la sección 5. Conclusiones discutiremos acerca de estos resultados, las lecciones aprendidas y que es lo que sigue para poder completar este trabajo e incorporarlo al sistema actual.

Un poco al margen la sección Apéndice profundizará ciertos detalles de implementación que no hacen a la esencia esta memoria pero puede serle útiles a aquellos lectores que quieren profundizar un poco más en el tema.

Este proyecto fue realizado para una empresa y por razones de confidencialidad solo se mostrará en esta memoria aquellos bloques que fueron desarrollados para la misma. De igual manera entre los archivos entregados solo estará el código fuente de los bloques desarrollados y del testBench de matlab, quedando excluidos los demás bloques de la FPGA y el sistema de adquisición de datos existente en java que es llamado desde el testBench de Matlab.

Page 3: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 3 de 37

Índice

1. Introducción General ........................................................................................ 4

1.1. Justificación del proyecto ....................................................................................... 4

1.2. Objetivos ............................................................................................................... 6

1.3. Requerimientos ..................................................................................................... 7

2. Marco Teórico .................................................................................................. 8

2.1. El demodulador IQ ................................................................................................. 8

2.2. Demodulador actual en Software ......................................................................... 10

2.3. Firmware FPGA actual .......................................................................................... 12

2.4 Firmware FPGA con demodulador IQ más simulador .............................................. 13

2.5. Demodulador en FPGA ......................................................................................... 14

3. Implementación ............................................................................................. 15

3.1. Metodología de trabajo ....................................................................................... 15

3.2. Protocolo de datos no demodulados .................................................................... 17

3.3. Protocolo de datos demodulados ......................................................................... 18

3.4. Mixer ................................................................................................................... 18

3.5. Filter .................................................................................................................... 20

3.6. Downsampler ...................................................................................................... 24

3.7. Sistema de simulación con señales ....................................................................... 24

4. Resultados ..................................................................................................... 25

4.1. Resultado del test de validación ........................................................................... 25

4.2. Footprint en la FPGA ............................................................................................ 26

5. Conclusiones .................................................................................................. 29

Bibliografía ........................................................................................................ 31

Apéndice ............................................................................................................ 32

A. Archivos y carpetas................................................................................................. 32

B. Código fuente TestBench Matlab ............................................................................ 33

C. Diagrama en bloques real del demodulador IQ (archivo iqDemod.bdf) ..................... 36

D. Diagrama en bloques real del ecoSim (archivo ecoSim.bdf) ..................................... 37

Page 4: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 4 de 37

1. Introducción General

1.1. Justificación del proyecto

El propósito de este proyecto es fundamentalmente agregar una nueva funcionalidad a un producto, que llamaremos sistema actual, para aumentar el segmento de mercado del mismo. Dicha funcionalidad consiste en aumentar la frecuencia de muestro del sistema actual de 20 Msps a 40 Msps.

La figura 1.1.1 ilustra un diagrama en bloques del sistema actual. Como podemos ver en la misma, incrementar la frecuencia de muestro está limitado por la velocidad de la comunicación USB 2.0 existente entre la FPGA y la PC. En esta misma figura podemos ver que el ancho de banda máximo de la salida del demodulador IQ puede ser transferido por la comunicación USB 2.0 actual.

Figura 1.1.1 – Diagrama en bloques del sistema actual

Existen entonces dos opciones claras para poder aumentar la frecuencia de muestreo del ADC. La primera consistiría en modificar el protocolo de comunicación FPGA-PC, utilizando por ejemplo USB 3.0 u otro protocolo capaz de alcanzar una tasa de transferencia mayor a 640Mbps. La segunda posibilidad es migrar el demodulador IQ dentro de la FPGA.

Si consideramos seguir adelante con la opción 1 esto implicaría los siguientes pasos:

1) Modificar el hardware actual para soportar el nuevo protocolo de comunicación (el hardware actual solo soporta USB 2.0).

2) Realizar modificaciones de firmware para soportar el nuevo protocolo de comunicación.

3) Optimizar fuertemente el software. Si miramos la figura 1.1.2, podemos ver que el proceso encargado de la demodulación IQ tiene menos de un 20% de tiempo libre. Duplicar la frecuencia de muestro duplicaría el tiempo del proceso no cumpliendo entonces con el tiempo que dispone para procesar cada bloque.

Page 5: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 5 de 37

Habría entonces que disminuir aproximadamente a la mitad el tiempo de procesamiento del demodulador actual.

Figura 1.1.2

Si consideramos seguir adelante con la opción 2 esto implicaría los siguientes pasos:

1) Implementar el demodulador IQ en la FPGA.

2) Cambio menor de software. Se modifica únicamente el lugar de origen de los datos que ingresan bloque de procesamiento de señal (figura 1.1.3 vs figura 1.1.1).

Figura 1.1.3 – Diagrama en bloques con demodulador en FPGA

La opción 1 es más costosa dado que requiere rediseño de hardware lo que extremadamente caro en este proyecto. Además requiere rediseño del bloque de comunicación que ya ha sido testeado y validado y cuya versión de firmware es estable. Por último requiere importantes optimizaciones de software.

En contrapartida la opción 2 puede reducir el costo del equipo dado que el demodulador IQ ocupa más del 50% del tiempo de procesamiento (ver figura 1.1.4) y por ende quitándolo del software se puede disminuir fuertemente los requerimientos de la computadora del sistema.

Page 6: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 6 de 37

En conclusión se elige la opción 2, es decir migrar el demodulador IQ a la FPGA, por ser la más económica y poseer mayores potencialidades futuras dado que permite imaginarnos el reemplazo de la computadora por un sistema embebido.

Figura 1.1.4

1.2. Objetivos

El trabajo descripto en la justificación del proyecto puede dividirse en dos etapas. La primera de ellas consiste en mover el demodulador IQ actual dentro de la FPGA. La segunda consiste en subir la frecuencia de adquisición del sistema a 40MHz.

Para este proyecto el objetivo es realizar la primer etapa, es decir la implementación del demodulador IQ para una frecuencia de muestreo de 20MHZ y quedará para más adelante el aumento de la frecuencia de muestro a 40MHz.

Page 7: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 7 de 37

1.3. Requerimientos

1) El demodulador IQ deberá contar con las siguientes etapas:

a. Demodulador IQ propiamente (mixer).

b. Filtro pasabajos en ambas señales I y Q.

c. Downsampler entero (1/3).

2) La señal de entrada a ser demodulada tendrá una frecuencia de 20 mega muestras por segundo y dichas muestras serán de 16 bits.

3) Las señales de salida I y Q tendrán una frecuencia máxima de salida 6.66 mega muestras por segundo y dichas muestras serán de 16 bits.

4) Para su validación el sistema debe poder ser estimulado con una señal conocida programada desde la PC. Comparando la respuesta obtenida con la respuesta esperada se podrá validar que el resultado es el correcto.

5) Mantener compatibilidad con el sistema de comunicación actual entre la FPGA y la computadora. Se asignará un valor de encabezado para los paquetes que sean procesados por el demodulador IQ que será distinto de los encabezados de paquete ya utilizados por el sistema actual.

Page 8: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 8 de 37

fo -fo 2fo -2fo 0

fo -fo 2fo -2fo 0

fo -fo 2fo -2fo 0

2. Marco Teórico

2.1. El demodulador IQ

El objetivo de todo este trabajo es poder disminuir la frecuencia de muestreo de la señal adquirida por el ADC. Para ello se utiliza un muestreo en cuadratura que puede verse en [1]. En resumen lo que se plantea es que si tenemos una señal acotada en a un cierto ancho de banda se pueden realizar los siguientes pasos.

Las señales IQ se definen mediante las formulas 2.1.1 y 2.1.2

����� = �����. �� ������ ( Formula 2.1.1 )

���� = �������� = � ������. �� ������� ���� = ��������� = �� ������. �� �������

( Formula 2.1.2 )

Es decir la señal IQ es el resultado de multiplicar por una exponencial compleja a la señal x(t) y luego aplicar un pasabajos. Las señales I y Q resultan de tomar la parte real e imaginaria de IQ respectivamente.

Recordando un poco las transformadas de Fourier [4], sabemos que

���� = ����. �� �� ⇔ ���� = ��� + � � ( Formula 2.1.3 )

Es decir multiplicar una señal por �� �� equivale a mover su espectro � Hz hacia la izquierda. Siendo ���� una señal con un ancho de banda !" centrado en � (ver figura 2.1.1), si la multiplicamos por la exponencial compleja el espectro de la nueva señal se obtiene centrado en 0 Hz (ver Figura 2.1.2). Si a esta señal le aplicamos un filtro pasabajos con frecuencia de paso mayor a !" 2⁄ y frecuencia de corte menor a 2. � − !" 2⁄ eliminamos la parte alta del espectro y nos queda únicamente la señal en banda base (ver figura 2.1.3).

Figura 2.1.1

Figura 2.1.2

Figura 2.1.3

La frecuencia mínima de muestreo requerida para muestrear la señal ���� original sería según el criterio de Nyquist de 2. �� + !" 2�⁄ . Para el caso de las señales IQ en cambio sería de tan solo 2. �!" 2⁄ �. Dado que las señales IQ son dos, se obtiene realmente una mejora en el ancho de banda de comunicación si:

Page 9: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 9 de 37

2.2. &!"2 ' < 2. &� + !"2 ' ⇒ � > !"2

Esto se cumple para toda señal de ancho de banda acotado y por ende siempre podremos disminuir el ancho de banda requerido para la comunicación. Otra ventaja importante es que el ancho de banda requerido para las señales IQ solo depende del ancho de banda de la señal y no de la frecuencia central � .

En particular para este trabajo, las señales que recibirá el demodulador a implementar pueden ser representadas por la formula 2.1.4.

���� = +��� cos�� � + /���� ( Formula 2.1.4 )

Aplicando la formula de Euler [5] y varias identidades trigonométricas [6] a la formula 2.1.2 podemos obtener las señales IQ para este tipo de entrada

���� = � ������. �� ������� �������. [cos�� �� − 1 sen�� ��]|���� �+���. cos�� � + /���� . cos�� ��|���

�+���. [cos�� � + /��� − � �� + cos�� � + /��� + � ��]|���

�+���. [cos6/���7 + cos62� � + /���7]����

+���. cos6/���7 ( Formula 2.1.5 )

���� = �� ������. �� ������� ��������. [cos�� �� − 1 sen�� ��]|���� �−+���. cos�� � + /���� . sen�� ��|���

�−+���. [sen�� � + /��� + � �� − sen�� � + /��� − � ��]|���

�−+���. [sen62� � + /���7 − sen6/���7]����

+���. sen6/���7 ( Formula 2.1.6 )

Por último de las señales I y Q se pueden obtener las señales a(t) y φ(t)

8����9 + ����9 = 8+���9:;<9�φ���� + +���9<>9�φ���� 8+���9[:;<9�φ���� + <>9�φ����] 8+���9 +��� ( Formula 2.1.7 )

tan�A B��������C = tan�A B+���<>�φ����+���:;<�φ����C

tan�A B<>�φ����:;<�φ����C

φ��� ( Formula 2.1.8 )

Page 10: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 10 de 37

2.2. Demodulador actual en Software

En la figura 2.2.1 puede verse el diagrama en bloques del demodulador IQ actual del sistema. El mismo se encuentra implementado en software y trabaja con datos en punto flotante.

Figura 2.2.1: Diagrama en del demodulador actual en la PC

A continuación resumiremos la funcionalidad cada uno de estos bloques

El Filtro Pasabanda realiza un primer filtrado de la señal dejando pasar únicamente el ancho de banda de la señal esperada. La figura 2.2.2 muestra la respuesta en frecuencia del filtro pasabanda. Este filtro debe cambiarse si se cambia el rango de la portadora.

Figura 2.2.2: Respuesta en frecuencia del filtro pasabanda

Rango Frecuencias [0:10MHz]

El Mixer es el encargado de realizar la demodulación propiamente dicha. El algoritmo en la PC es sencillo, simplemente tiene una tabla con el seno y coseno de la misma frecuencia que la portadora y se multiplica la enésima muestra recibida con

Page 11: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 11 de 37

la enésima muestra el coseno y del seno para obtener las señales I y Q respectivamente. Se utiliza una tabla porque es mucho más rápido que ir calculando cada seno y coseno para cada muestra.

El Filtro Pasabajos es el encargado de remover la portadora y dejar en las señales de IQ únicamente la señal de banda base. Su respuesta en frecuencia puede observarse en la figura 2.2.3. A diferencia del filtro pasabanda, este filtro no depende de la portadora dado que la señal ya se encuentra en banda base y depende únicamente del ancho de banda de las señales que deseamos procesar.

Figura 2.2.3: Respuesta en frecuencia del filtro pasabajos

Rango Frecuencias [0:10MHz]

El Decimador es el encargado de eliminar dos de cada tres muestras, simplemente dejando las muestras 0, 3, 6, 9, etc. Se puede ver en el filtro pasabajos que las frecuencias altas (superiores a 2 MHz) fueron removidas, la frecuencia de muestreo puede entonces disminuirse a 4 MHz sin afectar la señal. Este bloque realiza una división por tres de la frecuencia de muestreo llevándola de 20 mega muestras por segundo a 6,66 mega muestras por segundo.

Page 12: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 12 de 37

2.3. Firmware FPGA actual

El diagrama en bloques del firmware del sistema actual puede observarse en la figura 2.3.1.

Figura 2.3.1: Diagrama en bloques firmware del sistema actual

Como se puede ver en la imagen el firmware consta de cinco bloques básicos:

El controlador USB es el encargado de arbitrar el uso del USB. Este árbitro prioriza el envío y recepción de datos desde y hacia los periféricos sobre los datos cargados en la FIFO por el ADC. Esto se debe a que uno de los periféricos es el encargado de detener la adquisición y si la prioridad fuera de la FIFO, una vez comenzada la adquisición no podría detenerse la misma.

La TX FIFO es una cola capaz de almacenar 16 kilo muestras de 16 bits generadas desde el ADC. Esta FIFO hace de buffer temporal durante las pausas que pueda tener la carga de datos en el USB para transmitirlos a la PC.

El ADC, mientras esté activado, adquiere y guarda en la TX FIFO la muestras adquiridas a razón de 20 Mega muestras de 16 bits por segundo utilizando tres señales clk, data y wrReq que serán explicadas en la sección protocolo de datos.

El Controlador de periféricos es el encargado de conectar cada periférico con la PC mediante una dirección de periférico específica para cada uno.

Los periféricos son los bloques encargados de configurar el sistema y por ende no requieren ni buena latencia ni alta velocidad. Sin embargo son los encargados entre otras cosas de detener y arrancar el ADC y por eso debe tener mayor prioridad que la FIFO para comunicarse con la PC.

Page 13: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 13 de 37

2.4 Firmware FPGA con demodulador IQ más simulador

El diagrama en bloques del firmware con demodulador IQ y simulador de señales obtenido puede observarse en la figura 2.4.1.

Figura 2.4.1: Diagrama en bloques firmware con demodulador IQ más EcoSIM

Como puede verse en la figura lo que se agrega al diagrama son los siguientes dos bloques

El iqDemod es el bloque encargado de realizar la demodulación IQ dentro de la FPGA. Este bloque puede o no estar activo. Si está activo realiza la demodulación de las muestras recibidas, en caso contrario deja pasar las muestras sin afectarlas en lo absoluto. Por defecto el demodulador estará desactivado, esto permite que sistemas que no tienen el software preparado para recibir señales demoduladas puedan usarse con equipos que tengan el nuevo firmware (compatibilidad hacia atrás).

El EcoSim es un bloque que permite inyectar señal conocida dentro del bloque iqDemod. Este bloque posee una memoria RAM que puede ser escrita desde la PC y cuando se lo activa envía estos datos al demodulador IQ para que los procese y los envíe a la PC. Este bloque es el que nos permite validar la implementación del bloque iqDemod.

Page 14: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 14 de 37

2.5. Demodulador en FPGA

El diagrama en bloques del demodulador IQ para FPGA puede observarse en la figura 2.5.1.

Figura 2.5.1: Diagrama en bloques firmware con demodulador IQ más EcoSIM

Como puede verse en la figura existen dos grandes diferencias con el demodulador en PC. La primera de ellas es el formato de los datos, en la PC los datos de entrada salida y la tabla de seno y coseno están en punto flotante de 32 bits, para poder implementar el demodulador en la PFGA con un footprint razonable se modificó el tipo de datos a punto fijo signado de 16 bits con 15 bits de parte fraccionaria que es el tipo de datos generado por el ADC. La segunda diferencia tiene que ver con la unificación del filtro pasabanda y el filtro pasabajos en un único filtro pasabajos. Esto se realizó porque el filtro pasabanda es dependiente de la portadora y por ende, como el objetivo final es poder mover el rango de la portadora, dejar este filtro hubiera significado tener un banco de filtros o un filtro programable. Ambos requieren un footprint muy importante en la FPGA, y poco sentido tienen si el mismo puede unificarse sin generar alteraciones de la señal con el filtro pasabajos posterior. En la sección de implementación podrá observarse la respuesta en frecuencia del filtro unificado.

Page 15: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 15 de 37

3. Implementación

3.1. Metodología de trabajo

El objetivo de esta sección es explicar brevemente la metodología de trabajo utilizada.

En primer lugar, y tal vez lo más importante, se utilizó para este desarrollo el sistema de control de versión GIT. No es necesario explicar aquí todas las ventajas que posee trabajar con un sistema de control de versión. Pero es importante destacar que el uso de GIT en particular facilita el trabajo con ramas y su posterior fusión con otras ramas. Formando este trabajo parte de un proyecto existente, GIT nos permitió crear una rama para esta nueva funcionalidad, que será fácilmente incorporada al sistema actual cuando se terminen los ítems faltantes que se mencionan en la sección de conclusiones.

En segundo lugar se implementó el sistema en forma modular definiendo interfaces que permitirán a futuro la modificación de los módulos sin tener que modificar otros módulos. Se puede ver en la sub-sección C. Diagrama en bloques real del demodulador IQ de la sección Apéndice un típico ejemplo del diseño en bloques del sistema.

En tercer lugar, se utilizaron archivos esquemáticos de Quartus (BDF) para interconectar los módulos desarrollados, esto es un gran aporte a la documentación del sistema desarrollado dado que, como puede verse nuevamente en la sub-sección C. Diagrama en bloques real del demodulador IQ de la sección Apéndice, estos archivos muestran claramente los distintos bloques del sistema y su interconexión.

Por último, se implementaron varios mecanismos para testeo que permitieron encontrar rápidamente donde podrían estar los problemas si el sistema no funciona. Los mecanismos provistos serán enumerados a continuación:

• Frecuencia de generación de muestras configurable en el ecoSIM: esto nos permite disminuir la frecuencia de generación de la muestras permitiendo así discriminar problemas de tiempos de establecimiento de señales de problemas de lógica.

• Posibilidad de puentear el Mixer: esto nos permite testear en caso de recibir muestras inválidas si lo que está fallando es el mixer.

• Posibilidad de puentear el Filter: esto nos permite testear en caso de recibir muestras inválidas si lo que está fallando es el filter.

• Posibilidad de puentear el demodulador: esto nos permite testear únicamente el ecoSIM. Esto era un requerimiento.

Todos estos mecanismos nos permitieron ir probando los bloques implementados de a uno y así encontrar rápidamente el bloque que estaba fallando. El procedimiento de prueba consistió en primer lugar en testear el ecoSIM puenteando el demodulador completo. Luego se activo el demodulador puenteando el Mixer y el Filter. Esto nos permitió probar el downsampler. Luego se activo en primer lugar el Mixer y por último el Filter. Los test se realizaron en primer lugar a baja frecuencia de generación de muestras y luego se la fue subiendo hasta llegar a la frecuencia requerida.

El TestBench de Matlab, cuyo detalle se encuentra en la sección Apéndice, realiza el siguiente procedimiento: en primer lugar genera un vector de estimulación conocido; a continuación lo procesa en la PC aplicándole algoritmos equivalentes a los que

Page 16: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 16 de 37

aplica la FPGA obteniendo así el valor de salida esperado; luego procesa el vector de estimulación con la FPGA obteniendo así la salida computada; por ultimo compara que los resultados sean equivalentes.

Dicho testBench posee tres constantes de configuración que sirven para aplicar los tres primeros mecanismos de testeo mencionados arriba. Para puentear el mixer y el filter hay dos constantes booleanas al comienzo del testBench (firBypass y mixerBypass) que de ser “true” se puenteara la etapa correspondiente tanto en la FPGA como en el cómputo de la respuesta esperada. Para cambiar la configuración la frecuencia de generación de las muestras, se puede modificar el tercer parámetro de la línea siguiente que es el divisor del clock.

% leemos el resultado

iqLine = iqGetter.getRFIQLine(usapi, 1000, 1);

Para probar el ecoSim únicamente, es decir puenteando todo el demodulador se utilizó un testBench aparte.

Page 17: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 17 de 37

3.2. Protocolo de datos no demodulados

Como vimos en la figura 2.3.1 el sistema utiliza una FIFO con tres señales para comunicarse con la FPGA, la tabla 3.2.1 explica la función de cada una de estas señales.

Señal Descripción Clk Clock del sistema

WrReq Señal que indica con ‘1’ que hay una nueva muestra a guardar en la FIFO

Data[15..0] Muestra a guardar en la fifo. Contiene datos validos si WrReq está en ‘1’

Tabla 3.2.1: Señales de escritura en la FIFO

A su vez, los datos son enviados utilizando el formato de paquetes que se muestra en la tabla 3.2.2.

Palabra 0 1 2 3 4 … L+1 Descripción L Flags Pword D0 D1 … DL-2

Tabla 3.2.2: Paquete de transmisión de datos de la FIFO

L : Largo del paquete

Flags: Flags con información sobre el paquete

Flags[bits 15…13]: Utilizados actualmente por el sistema

Flags[bits 12…0]: Reservados para usos futuros siempre en ‘0’

Pword: Información sobre el programa que está ejecutando el ADC.

D0 a DL-2: Muestras 0 a L-2 adquiridas por el ADC.

La figura 3.2.1 muestra una simulación de escritura en la FIFO para un paquete de 3 muestras.

Figura 3.2.1: Simulación señales de escritura en la FIFO

L Flags Pword D0 D1 D2

Page 18: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 18 de 37

3.3. Protocolo de datos demodulados

Las señales de escritura en la FIFO son exactamente las mismas que las de la tabla 3.2.1.

El nuevo protocolo de datos cuando se están computando las muestras IQ se muestra en la tabla 3.3.1. Cuando el demodulador IQ se encuentre desactivado se enviara el mismo paquete que la tabla 3.2.2.

Palabra 0 1 2 3 4 5 6 … L L+1 Descripción L Flags Pword Q0 I0 Q1 Q1 … QM IM

Tabla 3.3.1: Paquete de transmisión de datos de la FIFO con IQ activado

L : Largo del paquete

Flags: Flags con información sobre el paquete

Flags[bits 15…13]: Utilizados actualmente por el sistema

Flags[bits 12]: Se pone en ‘1’ si la señal proviene del demodulador IQ

Flags[bits 11…0]: Reservados para usos futuros

Pword: Información sobre el programa que está ejecutando el ADC.

I 0 a IM: Muestras 0 a M de la señal I.

Q0 a QM: Muestras 0 a M de la señal Q.

M+1: cantidad de muestras IQ generadas, el valor de M es igual a ((L+1)-2)/2-1.

Como se puede ver el decodificador de paquetes es el mismo y la única diferencia es el chequeo del bit 12 de los flags para determinar si la señal está demodulada o no. Por ende si el Firmware no tiene incorporado el demodulador el bit 12 de los flags estará en ‘0’ y los datos serán demodulados. Esto permite compatibilidad de la nueva versión del software con todos aquellos sistemas instalados que no hayan sufrido todavía el Firmware Update.

3.4. Mixer

Para implementar el Mixer se utilizó el diagrama en bloques que se observa la figura 3.4.1. Para la generación de los senos y cosenos de 16 bits se utiliza una memoria RAM que hace de lookup table para los valores del seno y coseno requeridos para la enésima muestra que se está procesando.

Figura 3.4.1: Diagrama en bloques Mixer

Page 19: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 19 de 37

Para evitar discontinuidades al agotarse la memoria RAM es necesario que la misma contenga un número entero de periodos del seno y del coseno a multiplicar. Por ende para obtener la memoria máxima requerida utilizamos las siguientes formulas:

FMIXER = FgeneradorPortadora/M = Fs*K/M ( Formula 3.4.1 )

cos(2π *t*F MIXER) = cos(2π*N/Fs*FgeneradorPortadora/M)

= cos(2π*N/Fs*K*Fs/M) = cos(2π*K*N/M) ( Formula 3.4.2 )

Siendo:

Fs es la frecuencia de muestro

K es multiplicador de Fs para obtener la frecuencia del generador de portadora. En el sistema actual K=8 dando una FgeneradorPortadora = 160Mhz.

M es el divisor de FgeneradorPortadora que sirve para generar la frecuencia de la portadora y por ende la frecuencia del mixer FMIXER.

FMIXER es entonces la frecuencia de los seno y el coseno que queremos aplicar a los datos de entrada para obtener las señales I y Q.

Como se puede ver en la formula 3.4.2 si elegimos N=M muestras del seno y coseno obtendremos siempre una cantidad entera de periodos del seno y del coseno. El valor máximo de M para el sistema actual es de 160 dando frecuencias de portadores de 1Mhz. Por ende la cantidad máxima de muestras posibles requeridas es de 160.

Para la implementación lo se utilizó 256 muestras dado que la cantidad de muestras tiene que ser potencia de 2.

Por otro lado el sistema tiene que ser capaz de demodular 4 frecuencias distintas sin ser reprogramado. Es decir un paquete de información puede tener una frecuencia de portadora 1, el paquete siguiente una portadora 2, el siguiente 3 y el ultimo 4. Por ende la memoria debe ser 4 veces más grande de forma de utilizar el número de portadora como offset de la memoria.

Por ende se obtiene mapa de la tabla 3.4.1 para la memoria del mixer. Dirección Bits[31..15] Bits[15..0] Frecuencia

0x000 Coseno Muestra 0 Seno Muestra 0

0 0x001 Coseno Muestra 1 Seno Muestra 1

…. … … 0x0FF Coseno Muestra 255 Seno Muestra 255 0x100 Coseno Muestra 0 Seno Muestra 0

1 … … … 0x1FF Coseno Muestra 255 Seno Muestra 255 0x200 Coseno Muestra 0 Seno Muestra 0

2 … … … 0x2FF Coseno Muestra 255 Seno Muestra 255 0x300 Coseno Muestra 0 Seno Muestra 0

3 … … … 0x3FF Coseno Muestra 255 Seno Muestra 255

Tabla 3.4.1: Mapa de la memoria del mixer

Page 20: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 20 de 37

En la tabla 3.4.1 se pueden observar las señales del bloque mixer y su descripción. Señales Dirección Descripción

Procesamiento Clk Input Clock de los datos a procesar

clkEn Input Clock Enable de los datos a procesar rfDataIn[15..0] Input Datos de entrada a procesar validos mientras

rfPacketIn sea igual a ‘1’. rfPacketIn Input Se pone en ‘1’ al comienzo de cada paquete de

datos de entrada y se pone en ‘0’ al final de cada paquete de datos de entrada.

mixerBypass Input Si está en ‘1’ desactiva el mixer y las muestras de rfDataIn son copiadas en IDataOut y en QDataOut. (Para debug)

FreqSel[1..0] Input Selector de frecuencia de la portadora del paquete Rst Input Señal de reset

IDataOut[15..0] Output Datos I de salida validos mientras IQPacketOut sea igual a ‘1’

QDataOut[15..0] Output Datos Q de salida validos mientras IQPacketOut sea igual a ‘1’

IQPacketOut Output Se pone en ‘1’ al comienzo de cada paquete de datos de salida y se pone en ‘0’ al final de cada paquete de datos de salida.

Configuración Seg0Size[7..0] Input Cantidad de muestras del vector de seno y coseno

guardado en la RAM para las 4 frecuencias de portadora posibles 0, 1, 2 y 3 según corresponda.

Seg1Size[7..0] Input Seg2Size[7..0] Input Seg3Size[7..0] Input

ramClk Input

Señales de control para la lecto escritura de la RAM del mixer desde la PC.

ramClkEn Input ramWe Input

ramAddr[11..0] Input ramDataIn[7..0] Input

ramDataOut[7..0] Output Tabla 3.4.1: Señales del mixer

3.5. Filter

Para diseñar el filtro se tuvo en cuenta dos factores fundamentales, el primero es el footprint del mismo en la FPGA y el segundo es que pueda atenuar suficientemente las señales que puedan hacer alias cuando se decime la señal.

Realizando distintas pruebas de footprint en la FPGA para distintos filtros, obtuvimos que un orden razonable se encontraría en los alrededores de 40. De aquí sale el primer requerimiento que es que el orden del filtro no debe superar 40.

En lo que respecta a las bandas de paso y rechazo del filtro se busco generalizar un poco más los filtros que se encuentran hoy en la PC. En el momento de su diseño los filtros de la PC fueron pensados para una señal con portadoras desde 2.5Mhz hasta 3.5Mhz y ancho de banda de 1Mhz. De ahí se obtienen el ancho de banda del filtro pasa banda que se puede ver en la figura 2.2.2 y la frecuencia de corte del pasabajos de la figura 2.2.3. Para el diseño de este filtro se pensó en un filtro que deje pasar el mayor de todos los anchos de banda posible y luego en todo caso en la PC se puede

Page 21: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 21 de 37

colocar un filtro programable que filtre en función del ancho de banda de la señal particular que se está adquiriendo.

En cuanto a la banda de rechazo se tomó como frecuencia de comienzo de la banda de rechazo 0.33 normalizado dado que el decimador es de 1/3 y queremos con este filtro evitar alias. A su vez le pedimos por diseño una atenuación de 90dB para poder enviar a la portadora por debajo de la relación señal a ruido del sistema que es actualmente de 82dB.

Para la implementación del filtro fue necesario transformarlo a punto fijo. Para ello se realizó el siguiente procedimiento.

En primer lugar fue necesario determinar la cantidad de bits requeridos para los coeficientes. La señal de entrada tiene una relación señal a ruido medida de 82dB, es decir que, si bien está representada en 16 bits la misma podría representarse con 82/6.02 = 13,6 bits [7]. Si aproximamos el filtro como de atenuación 0dB en la banda de paso más la mitad de la banda de transición y atenuación infinita fuera de esta zona podemos calcular la nueva relación señal a ruido como

DE���� = DE� − 20. G;H B��� + ��I − ���� 2⁄�J 2⁄ C

DE���� = 82L! − 20. G;H B�0.166 + �0.33 − 0.166�� 2⁄2 2⁄ C

DE���� = 82L! − 20. G;H�0.248� = 94L!

Es decir que podemos representar la salida del filtro mediante 94/6.02 = 15.6 bits. Elegimos entonces 16 bits como la cantidad de bits de salida que utilizará el filtro.

Una vez definida la plantilla del filtro debemos definir el tipo de filtro a utilizar. Por su estabilidad pero sobre todo por el hecho de que tienen fase lineal se eligió realizar el filtro mediante un FIR. Esto se debe a que la aplicación donde se utilizará este filtro es sensible a los retardos y es necesario que todas las frecuencias de la banda de paso se retrasen lo mismo. Las ecuaciones que gobiernan un filtro FIR pueden apreciarse en las formulas 3.5.1 y 3.5.2.

R�>� = ∑ ℎ�>�. ��> − U�VWXY ( Formula 3.5.1 ) ℎ�>� = ℎ�D − >� ( Formula 3.5.2 )

De la formula 3.5.1 se obtiene la implementación directa de FIR que se ilustra en la figura 3.5.1.

Figura 3.5.1: Implementación FIR forma directa

Page 22: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 22 de 37

La única optimización que se realizó en la implementación del filtro fue la utilización de la simetría de los coeficientes (formula 3.5.2) para reducir la cantidad de coeficientes de filtro. La implementación obtenida puede verse en la figura 3.5.2. Y el resultado es un filtro que tiene la mitad de los coeficientes y la mitad de los multiplicadores.

Figura 3.5.2: Implementación FIR con reducción por simetría

Existen en la bibliografía otras optimizaciones para filtros FIR tales como Codificación CSD, Algorithmo de RAG y muchos otros [10]. Por razones de tiempo no se realizaron ninguna de estas optimizaciones que podrían disminuir en gran medida el consumo de recursos de los filtros implementados.

Por otro lado es necesario determinar la cantidad de bits que se deben utilizar para los coeficientes del filtro. Una forma para determinar esto puede verse en [8] y consiste básicamente en ir aumentando la cantidad de bits de los coeficientes y ver cuánto difiere el filtro obtenido de las especificaciones. Para nuestro caso los coeficientes requirieron un mínimo de 19 bits para que el filtro obtenido cumpliera con las especificaciones. En la figura 3.5.3 puede verse en línea punteada azul el filtro obtenido para coeficientes de 19 bits, en línea continua azul el filtro en punto flotante y las líneas punteadas rojas muestran las especificaciones del filtro. Es importante utilizar los coeficientes del mínimo orden que cumpla con las especificaciones dado que los recursos de la FPGA que utilizará el filtro también es proporcional a este valor. Es decir un filtro con coeficientes de 19 bits utiliza la mitad de los recursos que uno con coeficientes de 38 bits.

El diseño del filtro se realizó el Matlab utilizando los comandos siguientes:

d = fdesign.lowpass('Fp,Fst,Ap,Ast',0.33/2,0.33,3,90);

Hd = design(d,'equiripple');

Hdsym = convert(Hd, 'dfsymfir');

Hf = Hdsym;

Hf.Arithmetic = 'fixed';

set(Hf, 'CoeffWordLength', 19);

set(Hf,'FilterInternals', 'SpecifyPrecision');

set(Hf,'InputFracLength', 15);

set(Hf,'InputWordLength', 16);

set(Hf,'OutputFracLength', 15);

set(Hf,'OutputWordLength', 16);

set(Hf,'OverflowMode', 'Saturate');

La implementación en VHDL se realizó mediante la función de Matlab fdhdltool(Hf) [9] que permite generar el código VHDL de un filtro generado en matlab.

Utilizando la función de Matlab fvtool(Hf) se obtiene la respuesta en frecuencia del filtro que puede visualizarse en la figura 3.5.3.

Page 23: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 23 de 37

Figura 3.5.3: Respuesta en frecuencia del filtro pasabajos en FPGA

En la tabla 3.5.1 se pueden observar las señales del bloque filter y su descripción.

Señales Dirección Descripción Procesamiento

Clk Input Clock de los datos a procesar clkEn Input Clock Enable de los datos a procesar

IDataIn[15..0] Input Datos de la señal I de entrada a procesar validos mientras IQPacketIn sea igual a ‘1’.

QDataIn[15..0] Input Datos de la señal Q de entrada a procesar validos mientras IQPacketIn sea igual a ‘1’.

IQPacketIn Input Se pone en ‘1’ al comienzo de cada paquete de datos de entrada y se pone en ‘0’ al final de cada paquete de datos de entrada.

firBypass Input Si está en ‘1’ desactiva el filter y las muestras de IDataIn y QDataIn son copiadas en IDataOut y en QDataOut respectivamente. (Para debug)

Rst Input Señal de reset IDataOut[15..0] Output Datos I de salida validos mientras IQPacketOut

sea igual a ‘1’ QDataOut[15..0] Output Datos Q de salida validos mientras IQPacketOut

sea igual a ‘1’ IQPacketOut Output Se pone en ‘1’ al comienzo de cada paquete de

datos de salida y se pone en ‘0’ al final de cada paquete de datos de salida.

Tabla 3.5.1: Señales del filter

Page 24: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 24 de 37

3.6. Downsampler

El objetivo del downsampler es obtener una de cada tres muestras de la señal adquirida. La tabla 3.6.1 ilustra el trabajo que realiza el downsampler para las señales de entrada IQ.

Muestras 0 1 2 3 4 5 6 6 L L+1 Datos RF D0 D1 D2 D3 D4 D5 D6 D7 D8 …

Datos I I0 I1 I2 I3 I4 I5 I6 I7 I8 … Datos Q Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 I8 …

Downsampler I0 Q0 I3 Q3 I6 Q6 … Tabla 3.6.1: Paquete de transmisión de datos de la FIFO con IQ activado

En la tabla 3.6.2 se pueden observar las señales del bloque downsampler y su descripción.

Señales Dirección Descripción Clk Input Clock de los datos a procesar

clkEn Input Clock Enable de los datos a procesar IDataIn[15..0] Input Datos de la señal I de entrada a procesar validos

mientras IQNewPacket sea igual a ‘1’. QDataIn[15..0] Input Datos de la señal Q de entrada a procesar validos

mientras IQNewPacket sea igual a ‘1’. IQNewPacket Input Se pone en ‘1’ al comienzo de cada paquete de

datos de entrada y se pone en ‘0’ al final de cada paquete de datos de entrada.

Rst Input Señal de reset ddtData[15..0] Output Datos I y Q de salida validos mientras wrReq y

IQdata sean igual a ‘1’ wrReq Output Indica con ‘1’ que hay que escribir un dato en la

FIFO de comunicación con la PC IQdata Output Se pone en ‘1’ al comienzo de cada paquete de

datos de salida y se pone en ‘0’ al final de cada paquete de datos de salida.

Tabla 3.6.2: Señales del downsampler

3.7. Sistema de simulación con señales

Para poder simular con señales conocidas se agrega un bloque que permite estimular el demodulador implementado con señales conocidas. Este bloque posee una RAM interna que puede escribirse desde la PC y cuando se activa una señal el bloque genera un paquete con el formato descripto en la tabla 3.2.1 cuyas muestras D0 a DL-2 corresponden a las posiciones 0 a L-2 de la RAM interna de este bloque.

Page 25: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 25 de 37

4. Resultados

4.1. Resultado del test de validación

Para poder validar el sistema se generó un código en Matlab que puede verse en la sección código fuente Matlab del apéndice. Este código genera un vector de estimulación cuya forma de onda puede verse en la figura 4.1.1. Se elige esta forma de onda porque, salvando las diferencias, es representativa del tipo de señales (AM sobre una portadora) que puede llegar a tener que procesar el demodulador en el sistema actual. Este vector de estimulación es bajado a la RAM del ecoSim y se utiliza como entrada del demodulador IQ implementado en la FPGA.

Figura 4.1.1: Señal estimulo del sistema

El resultado recibido del cómputo realizado en la FPGA es comparado muestra a muestra con el resultado esperado computado en matlab. La salida del test de matlab puede verse en la figura 4.1.2 y no es más que un texto que indica si las señales I y Q son iguales a las señales I y Q esperadas.

Figura 4.1.2: Resultado Test de Validación

Si bien las señales son comparadas muestra a muestra y su resultado es equivalente el testBench de Matlab imprime también un gráfico (figura 4.1.3) con las señales I esperada vs I computada en la FPGA. Como puede verse en la figura las señales se superponen completamente. Esto es de esperarse dado que el cómputo en Matlab se realiza con la misma precisión que el realizado en la FPGA. Distinto será el caso cuando se compare, en un futuro, con el demodulador implementado en la PC. Dado que este ultimo utiliza punto flotante los resultados no serán idénticos bit a bit y deberá estimarse un error cuadrático medio para realizar la comparación entre ambos demoduladores.

Page 26: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 26 de 37

Figura 4.1.3: Comparación señal I esperada vs computada en FPGA

4.2. Footprint en la FPGA

En esta sección mostraremos en primer la utilización de recursos de la FPGA del sistema actual, esto es importante porque uno de los objetivos era que la modificación implementada pudiera ser implementada en con los recursos sobrantes del sistema actual. En segundo lugar mostraremos la utilización de recursos de la FPGA obtenida para los bloques implementados. Por último compararemos la utilización de recursos de todo el sistema con los bloques agregados con los recursos utilizados por el sistema actual.

FootPrint sistema actual (sin iqDemod ni Ecosim)

En la figura 4.2.1 puede verse la utilización de recursos del sistema actual. Vemos en la misma que disponemos de 18% de elementos lógicos y de 1578203 bits de memoria RAM para implementar el demodulador.

Figura 4.2.1: Recursos FPGA utilizados por el sistema actual

Page 27: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 27 de 37

FootPrint iqDemod

En la figura 4.2.2 puede verse el footprint que tiene todo el demodulador IQ en la FPGA.

Figura 4.2.2: Recursos FPGA utilizados por el iqDemod

Figura 4.2.3: Detalle recursos utilizados por el iqDemod

La figura 4.2.3 ilustra el detalle de cada bloque del demodulador. Como puede verse, los filtros representan el 90% del los recursos necesarios para implementar el demodulador IQ.

Page 28: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 28 de 37

FootPrint EcoSim

La figura 4.2.4 muestra los recursos utilizados por el bloque ecoSim que es el encargado de suministrar señal simulada al demodulador. Como podemos ver este bloque es extremadamente liviano.

Figura 4.2.4: Recursos FPGA utilizados por el EcoSIM

FootPrint sistema modificado (con iqDemod y Ecosim)

La figura 4.2.5 muestra la cantidad de recursos utilizados por el sistema completo incluyendo el demodular y el ecosim. Como podemos ver fue posible incorporar los módulos desarrollados y queda aún disponible un 10% del total de los elementos lógicos de la FPGA.

Figura 4.2.5 – Recursos FPGA utilizados sistema completo con iqDemod y EcoSim

Figura 4.2.6 – Detalle recursos utilizados por bloque

Page 29: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 29 de 37

5. Conclusiones Habiendo finalizado este trabajo final de la carrera de especialización en sistemas embebidos se pueden sacar varias conclusiones y lecciones aprendidas. Mencionaremos en particular aquellos ítems del plan original que fueron modificados, por qué y qué consecuencias pueden tener. Por último pero no menos importante explicaremos qué es lo que resta por hacer.

La primera conclusión evidente de este trabajo es que es posible implementar el demodulador IQ en la FPGA. Y que el mismo puede implementarse en un área aceptable de la FPGA.

La segunda conclusión es que debe tenerse especial cuidado en el diseño del filtro pasabajos dado que su footprint en FPGA representa el 90% del footprint de todo el demodulador IQ. Este footprint es proporcional al orden del filtro y por ende no se puede realizar un filtro de orden muy alto.

Originalmente la idea era que el filtro pasabajos fuera de coeficientes programables. Gracias al aporte del tutor del trabajo, el Esp.Ing. Pedro Ignacio Martos, quien remarcó que esto era muy difícil de lograr y que el footprint que tendría tal filtro sería muy grande, se modificó esta idea por un banco de filtros programable. Luego, al calcularse el primer filtro a utilizar y ver el footprint obtenido, se concluyo que un banco de filtros tampoco era viable. Como resultado final se obtuvo que lo que debíamos realizar entonces era un filtro pasabajos que cumpliera únicamente con la función de eliminar los aliases que podría generar el Decimador. Y en todo caso se podría colocar en la PC un filtro programable que se encargue de realizar ese filtrado dependiente de la señal de entrada.

El trabajo realizado debía tener un alcance limitado, es por eso que le faltan ciertos ítems necesarios para que pueda ser utilizado en el sistema actual. Estos ítems se enumeran a continuación.

1) El software del sistema actual tiene una etapa previa al demodulador encargada de promediar el paquete actual con el paquete anterior. Por ende para poder incorporar este desarrollo en el sistema actual es necesario incorporar este bloque. Sin duda este bloque no es más que una memoria del tamaño del paquete máximo y un sumador, siendo el paquete máximo 8192 muestras de 16 bits y teniendo una memoria disponible de 1414363 bits = 44198*32bits, sin duda puede implementarse.

2) Queda también pendiente procesar señales reales adquiridas por el ADC y comparar el error cuadrático medio vs el demodulador en software. En el testBench de matlab se compararon los datos recibidos del demodulador con los calculados en matlab realizando el mismo tipo de calculó en ambos sistemas (punto fijo de 16 bits signado con 15 bits de fracción). Sin embargo el demodulador IQ de la PC trabaja en punto flotante y es por eso que, para validar completamente el demodulador de la FPGA, deberíamos compararlo con el del software del sistema actual.

3) En el desarrollo realizado las muestras que ingresan al demodulador IQ provienen únicamente del ecoSim, para poder incorporar el demodulador al sistema será necesario poder routear la entrada del demodulador a las muestras que salen del ADC y validar su funcionamiento con estas muestras.

Por otro parte el objetivo final es poder subir la frecuencia del ADC a 40MHz, para poder realizar esto quedan pendientes las siguientes tareas

Page 30: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 30 de 37

1) Dado que el filtro no es programable cuando queramos aumentar la frecuencia de muestreo del sistema a 40MHz será necesario diseñar un nuevo filtro para esta frecuencia y reemplazarlo por el que se encuentra ahora. Dado el diseño modular del desarrollo realizado esta modificación puede hacerse muy fácilmente.

2) Se deberá cambiar el Decimador para que ahora decime por un factor de 4. Esto se realiza con suma facilidad dado que el Decimador tiene un GENERIC de VHDL con el factor de decimación. Solo es necesario cambiar este valor y recompilar.

3) Deberá validarse que todo el sistema puede funcionar a 40MHz. La versión actual fue validada hasta 30MHz.

Page 31: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 31 de 37

Bibliografía

[1] Richard Lyons, “Quadrature Signals: Complex, But Not Complicated”, 2008, http://www.ieee.li/pdf/essay/quadrature_signals.pdf

[2] w2aew, “Basics of IQ Signals and IQ modulation & demodulation - A tutorial”,

2014, https://www.youtube.com/watch?v=h_7d-m1ehoY&feature=youtu.be [3] Mikael Q Kuisma, “I/Q Data for Dummies”, 2015,

http://whiteboard.ping.se/SDR/IQ [4] “Table of Fourier Transform Pairs”, 2015,

http://uspas.fnal.gov/materials/11ODU/FourierTransformPairs.pdf [5] Wikipedia, “Euler's formula”, 2015,

https://en.wikipedia.org/wiki/Euler's_formula [6] Analyzemath.com , “Trigonometric Identities and Formulas”, 2013,

http://www.analyzemath.com/trigonometry/trigonometric_formulas.html [7] Wikipedia, “Signal to noise ratio”, 2015,

https://en.wikipedia.org/wiki/Signal-to-noise_ratio [8] MathWorks, “Fixed point filter Design” ”, Documentation 2015,

http://www.mathworks.com/help/dsp/ug/fixed-point-filter-design-1.html [9] MathWorks, “fdhdltool”, Documentation 2015,

http://www.mathworks.com/help/hdlfilter/fdhdltool.html [10] Marcos Cervetto; Edgardo Marchi , “Introducción a filtros digitales y Filtros

FIR en FPGAs”, CESE, 2015.

Page 32: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 32 de 37

Apéndice

A. Archivos y carpetas

Esta sección muestra las principales carpetas y archivos entregados. Ruta Descripción

..\ ecoSim\ Proyecto con únicamente el ecoSim ecosim.qpf Archivo para abrir el proyecto de quartus del ecoSim source\ Carpeta con los códigos fuentes del ecoSim ecosim.bdf Diagrama esquemático con el top level del ecoSim ecosim.vhd Conversión a VHDL del esquemático del top level del ecoSim ecosimCtrl.vhd Controladora del ecoSim que es la encargada de habilitar/deshabilitar el ecosim

y de cargar las configuraciones del mismo. ecosimRam.vhd RAM del ecoSim, contiene las muestras que se colocarán en el paquete estimulo bfsim.vhd Este es el bloque encargado de generar el paquete estimulo leyendo en forma

incremental la RAM y colocando los datos de la misma a la salida con el formato del paquetes del sistema.

simulation\modelsim\ Contiene los archivos de simulación de Modelsim Altera. ecosim.do Corre la simulación del ecosim en modelsim. Para correrlo tipiar “do

ecosim.do” en la línea de comandos del modelSim Altera. ecosim.vht TestBench del ecosim. Este archivo tiene el código fuente en VHDL del

testBench para debug que se corrió al ecosim antes de integrarlo en el sistema actual.

ecoSimRam.mif Contenido de la RAM del ecosim para la simulación. ..\ iqDemod\ Proyecto con únicamente el ecoSim iqDemod.qpf Archivo para abrir el proyecto de quartus del iqDemod source\ Carpeta con los códigos fuentes del iqDemod iqDemod.bdf Diagrama esquemático con el top level del iqDemod iqDemod.vhd Conversión a VHDL del esquemático del top level del iqDemod iqDemodCtrl.vhd Controladora del iqDemod que es la encargada de habilitar/deshabilitar los

bloques siguientes y procesa el encabezado del paquete computando la cantidad de muestras que saldrán del bloque luego del decimador.

iqDemodMux.vhd Mux de salida que elije si hay sirve para poder puentear este bloque cuando no se lo está utilizando.

Mixer_lnk\ Carpeta con los códigos fuentes asociados al mixer mixer.bdf Diagrama esquemático con el top level del mixer mixer.vhd Conversión a VHDL del esquemático del top level del mixer mixerCtrl.vhd Es el encargado de multiplicar la señal de entrada con la muestra

correspondiente de la RAM para generar las señales IQ. mixerRam.vhd RAM con las muestras del seno y del coseno. Filter_lnk\ Carpeta con los códigos fuentes asociados al filtro filter.bdf Diagrama esquemático con el top level del filter filter.vhd Conversión a VHDL del esquemático del top level del filter delay.vhd Indica el delay del filtro que pueda ser leído desde la PC y se usa también para

poder puentear este bloque en modo debug. mixerRam.vhd RAM con las muestras del seno y del coseno. lowPass1N3_lnk\ Carpeta con el código fuente del filtro pasa bajos lowPass1N3.vhd Código fuente del filtro pasa bajos Downsampler_lnk\ Carpeta con los códigos fuentes asociados al downsampler downsampler.vhd Código fuente del downsampler simulation\modelsim\ Contiene los archivos de simulación de Modelsim Altera. iqDemod.do Corre la simulación del iqDemod en modelsim. Para correrlo tipiar “do

iqDemod.do” en la línea de comandos del modelSim Altera. iqDemod.vht TestBench del iqDemdo. Este archivo tiene el código fuente en VHDL del

testBench para debug que se corrió al ecosim antes de integrarlo en el sistema actual.

mixerRam.mif Contenido de la RAM del mixer para la simulación. ..\ matlab\ Archivos de Matlab para validación testIQ.m Código fuente del TestBench de Matlab para validar el demodulador iqfilter.m Función que genera el código Matlab del filtro implementado en FPGA.

Page 33: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 33 de 37

B. Código fuente TestBench Matlab

El código fuente del testBench de matlab será explicado en esta sección.

El código fuente se divide en 5 grandes secciones. La primera define constantes simbólicas e importa las librerías y variables de la librería de procesamiento del sistema actual. La segunda genera el vector de estimulo y la señal a colocar en el demodulador IQ. La tercera genera el vector de respuesta esperado. La cuarta baja a la FGPA el estimulo, computa la respuesta y recibe el resultado. La quinta compara respuesta computada en FPGA con la respuesta espera.

El siguiente fragmente corresponde con la primera etapa %**** Constantes simbolicas

% deshabilita el filtro FIR del IQDEMOD (true for debug Only)

firBypass = false;

% deshabilita el mixer del IQDEMOD (true for debug Only)

mixerBypass = false;

% constante simbolica de simulación tamaño vector de estimulación

ecoSimSamples = 4999;

%***** imports y globales de java

global usapi;

global iqGetter;

import com.jt.scanner.*;

import com.jt.util.matlab.*;

El siguiente fragmento muestra la segunda etapa donde se genera del vector de estimulo y la señal a colocar en el demodulador IQ utilizando la formula 3.4.2. %***** formulas

% FtxGen = K*Fs

% Fs: Frecuencia de Muestreo

% K: natural

% FtxGen: Frecuencia del generador de portadora

% Ftx = Fmixer = FtxGen/M con M>K;

Fs = 20e6; %20Mhz

K = 8;

M = 64;

Fmixer = Fs*K/M;

% Ftx: Frecuencia de los pulsos emitidos

% Fmixer: Frecuencia del seno y coseno del mixer

% Datos Mixer:

% cos(2*pi*t*Fmixer) = cos(2*pi*N/Fs*FtxGen/M)

% = cos(2*pi*N/Fs*K*Fs/M)

% = cos(2*pi*K*N/M)

% Si elegimos N = M, obtenemos siempre números enteros de periodos

% del seno y del coseno evitando alinealidad en la memoria del mixer

%coseno = int16(32767*cos(2*pi*K*[0:M-1]/M));

coseno = fi(32767*cos(2*pi*K*[0:M-1]/M)/32768,1,16,15);

cosFull = fi(32767*cos(2*pi*K*[0:ecoSimSamples-1]/M)/32768,1,16,15);

% seno de los mismos valores que el coseno

seno = fi(-32767*sin(2*pi*K*[0:M-1]/M)/32768,1,16,15);

senFull = fi(-32767*sin(2*pi*K*[0:ecoSimSamples-1]/M)/32768,1,16,15);

Page 34: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 34 de 37

El siguiente fragmento muestra la tercera sección donde se computa el vector esperado. %**** generamos el vector de estimulación

% estimulamos con una AM sobre la portadora

Fam = 20000;

% Portadora

portadora = cos(2*pi*K*[0:ecoSimSamples-1]/M);

% Moduladora muestreada a Fs

moduladora = cos(2*pi*[0:ecoSimSamples-1]*Fam/Fs);

% Estimulo

estimulo = fi(32767*portadora.*moduladora/32768,1,16,15);

%**** computamos la salida esperada

% obtenemos el filtro

% mezclamos la señal

if (mixerBypass == true)

mixerIExpected = estimulo;

mixerQExpected = estimulo;

else

mixerIExpected = fi(estimulo.*cosFull,1,16,15, ...

'RoundingMethod','Floor');

mixerQExpected = fi(estimulo.*senFull,1,16,15, ...

'RoundingMethod','Floor');

end

% corremos el pasabajos

if (firBypass == true)

filterIExpected = mixerIExpected;

filterQExpected = mixerQExpected;

else

Hf1 = iqfilter();

Hf2 = iqfilter();

filterIExpectedTemp = filter(Hf1, mixerIExpected);

filterQExpectedTemp = filter(Hf2, mixerQExpected);

filterIExpected = fi(filterIExpectedTemp,1,16,15, ...

'ProductMode','FullPrecision', ...

'SumMode','FullPrecision');

filterQExpected = fi(filterQExpectedTemp,1,16,15, ...

'ProductMode','FullPrecision', ...

'SumMode','FullPrecision');

end

% downsampleamos

IExpected = filterIExpected(1:3:end);

QExpected = filterQExpected(1:3:end);

Page 35: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 35 de 37

En la sección número 4 configuramos el demodulador y el ecoSim y recibimos las muestras computadas. %**** computamos la salida con la FPGA

% activamos el demodulador IQ

iqGetter.enableIQ(usapi, true, firBypass, mixerBypass);

% escribimos el seno y el coseno en la memoria del mixer

iqGetter.writeIQmixerData(usapi, int16(storedInteger(seno)),

int16(storedInteger(coseno)));

% escribimos el vector de estimulación

iqGetter.setEcoSimData(usapi, int16(storedInteger(estimulo)));

% leemos el resultado

iqLine = iqGetter.getRFIQLine(usapi, 1000, 1);

if (isempty(iqLine))

disp('no llegó información del equipo');

return;

end

iData = iqLine.getIData();

qData = iqLine.getQData();

Por último compara las muestras recibidas con las esperadas idataFi = fi(iData,1,16,0);

qdataFi = fi(qData,1,16,0);

IexpectedFi = fi(IExpected*2^15,1,16,0,'RoundingMethod', 'Floor')';

QexpectedFi = fi(QExpected*2^15,1,16,0,'RoundingMethod', 'Floor')';

% el comienzo difiere porque no se esta reiniciando el filtro entre

% cada linea adquirida por eso se quitan las primeras 50 samples

if (isequal(idataFi(50:end),IexpectedFi(50:end)))

disp('Vector esperado I igual al vector recibido I');

else

disp('Vector esperado I diferente al vector recibido I');

return;

end

if (isequal(qdataFi(50:end),QexpectedFi(50:end)))

disp('Vector esperado Q igual al vector recibido Q');

else

disp('Vector esperado Q diferente al vector recibido Q');

return;

end

Page 36: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 36 de 37

C. Diagrama en bloques real del demodulador IQ (archivo iqDemod.bdf)

Page 37: Demodulador IQ para FPGA - v1.21

Memoria de la Tesis Demodulador IQ para FPGA

Página 37 de 37

D. Diagrama en bloques real del ecoSim (archivo ecoSim.bdf)