Full text
Equation Chapter 1 Section 1 Proyecto Fin de Carrera Ingeniería de Telecomunicación Implementación de un transmisor/receptor Li-Fi en una FPGA Autor: Álvaro Fernández Suárez Tutor: Vicente Baena Lecuyer Dpto. Ingeniería Electrónica Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2019
Proyecto Fin de Carrera Ingeniería de Telecomunicación Implementación de un transmisor/receptor Li-Fi en una FPGA Autor: Álvaro Fernández Suárez Tutor: Vicente Baena Lecuyer Profesor titular Dpto. de Ingeniería Electrónica Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2019
Proyecto Fin de Carrera: Implementación de un transmisor/receptor Li-Fi en una FPGA
Autor: Álvaro Fernández Suárez Tutor: Vicente Baena Lecuyer El tribunal nombrado para juzgar el Proyecto arriba indicado, compuesto por los siguientes miembros: Presidente: Vocales: Secretario: Acuerdan otorgarle la calificación de: Sevilla, 2019 El Secretario del Tribunal
A mi familia A mis amigos A mis maestros
Agradecimientos Aunque el viaje sea accidentado, aunque el barro y el polvo del camino percuda la piel, si has elegido bien a tus acompañantes nada te detendrá. Y es que me gustaría agradecer a mis compañeros de batalla durante todos estos años, especialmente a Antonio con el que he compartido tantas buenas experiencias durante la carrera, a los profesores que me lo han enseñado todo y a los buenos amigos que me tendieron una mano antes incluso de caer, pero quiero hacer una mención distinguida a mi familia, a mis padres y mi hermana, que me han aguantado cuando no debían y han sido la roca sobre la que me he mantenido desde el comienzo de mi vida. A todos, os doy las gracias. Álvaro Fernández Suárez Sevilla, 2019
Resumen En un mundo en el que las comunicaciones digitales invaden cada ámbito de la vida cotidiana, con una creciente demanda de banda ancha y de mejores prestaciones para un mayor número de dispositivos (demanda asociada con el surgir de nuevas formas de entretenimiento, tanto en redes sociales como mediante el streaming), encontramos a un espectro radioeléctrico cada vez más saturado, con cientos o miles de dispositivos compitiendo por ancho de banda en lugares concurridos. Sin embargo, el desarrollo de la tecnología VLC parece ser un paso adelante para la solución de este problema, pues no sólo permite tasas de transferencia más altas y tiene mayor espectro, sino que es más barato de producir que la tecnología empleada actualmente. En este proyecto se explora las ventajas y desventajas de la tecnología VLC y su implementación en una placa FPGA en VHDL, empleando una modulación OFDM y comparando los resultados con los obtenidos en su modelo análogo en un lenguaje de más alto nivel: Matlab.
ÍNDICE DE FIGURAS Figura 2-1 Prestaciones del sistema PRIME 3 Figura 2-2 Modelo de capas de PRIME 3 Figura 2-3 Trama física 4 Figura 2-4 Bloques para la generación de la trama física de PRIME 5 Figura 3-1 Esquema general de una FPGA Spartan 7 Figura 3-2 Funcionamiento de FPGAs antifusible 8 Figura 3-3 Matriz de conexiones FPGA 9 Figura 3-4 Spartan-3E 10 Figura 3-5 Recursos de los distintos modelos de la familia Spartan-3E 11 Figura 3-6 Arquitectura Spartan-3E 11 Figura 3-7 Bloque RAM 12 Figura 3-8 Bloque multiplicador 12 Figura 3-9 Pines puerto RS-232 13 Figura 3-10 Conversor USB-TTL 13 Figura 4-1 Propagación multitrayecto 16 Figura 4-2 Subportadoras ortogonales en OFDM 17 Figura 5-1 Gráfica CSK 19 Figura 5-2 Transceptor Li-Fi 23 Figura 5-3 Comparación de rendimiento de DCO-OFDM 24 Figura 5-4 Comparación de rendimiento de DCO-OFDM (cont.) 25 Figura 6-1 Estructura de bloques en Matlab del sistema 26 Figura 6-2 Protocolo RS-232 27 Figura 6-3 Algoritmo scrambler 27 Figura 6-4 Símbolos de Q-PSK 28 Figura 6-5 Diagrama de flujo del mapper 28 Figura 6-6 Diagrama de flujo de la IFFT 29 Figura 6-7 Correspondencia entre bits y fase de la demodulación 30 Figura 7-1 Diagrama de bolas del conversor UART a bit 33 Figura 7-2 Portadoras en DCO-OFDM 35 Figura 7-3 Diagrama de bolas del mapper 35 Figura 7-4 Arquitectura Radix-2 36 Figura 7-5 Protocolo de lectura de datos del bloque FFT 37
Figura 7-6 Protocolo de lectura de datos del bloque FFT (cont.) 37 Figura 7-7 Bloque xfft_ds260 37 Figura 7-8 Bloque Complex Multiplier 39 Figura 7-9 Pines de entrada y salida del multiplicador 39 Figura 7-10 Interruptor L13 41 Figura 7-11 Resumen de empleo de recursos 43 Figura 8-1 Datos de entrada Matlab y VHDL 44 Figura 8-2 a)Salida del scrambler b)Salida de la IFFT sin scrambler 45 Figura 8-3 Componentes reales e imaginarias de la salida del mapper 45 Figura 8-4 a)Salida IFFT Matlab b)Salida IFFT VHDL 46 Figura 8-5 Resultados de la consola de Matlab 47 Figura 8-6 Consola 48
1 1 INTRODUCCIÓN 1.1 Objetivo del proyecto El pricipal objetivo del proyecto consiste en diseñar en VHDL un emisor y un receptor que module una señal de entrada desde un puerto serie siguiendo el estándar PRIME incluyendo algunas excepciones que serán descritas en los apartados subsecuentes. Este diseño se integraría en una FPGA, un dispositivo programable que destaca por sus procesos concurrentes al emplear exclusivamente puertas lógicas. Anteriormente al diseño se realiza una simulación de los resultados empleando el lenguaje de programación Matlab, para poder cotejarlos con los obtenidos en el programa sintetizado en VHDL. En la solución final, empleando una consola de puerto serie, como Termite o Putty, se mostrará la funcionalidad del proyecto enviando un mensaje por esta y recibiendo un eco de este mismo mensaje. 1.2 Estructura de la memoria Con el objetivo de dar un transfondo del proyecto antes de comenzar a explicar el proceso de diseño, se proporcionan varios apartados en el que se muestran la base teórica sobre la que se soporta. Por tanto se da unas nociones sobre el soporte físico en el que se ha desarrollado el proyecto, qué es VLC, OFDM y su importancia en el mundo moderno. En apartados posteriores se detalla la implementación de los programas desarrollados en Matlab y VHDL, cerrando con un análisis de los resultados y mostrando posibles líneas de trabajos futuros. En total la memoria se compone de 8 capítulos con los contenidos mostrados a continuación: 1. Introducción: Se describe brevemente el proyecto. También se presentan los objetivos de éste, así como la estructuración de la memoria. 2. PRIME: Este capítulo se centra en la descripción del protocolo PRIME, la base en la que se cimienta el proyecto. 3. FPGAs: El objetivo de este apartado es dar una descripción de las FPGA, su importancia en la actualidad y sus ventajas frente a los microcontroladores clásicos más establecidos en el mercado. Se finaliza analizando los recursos, bloques importantes y demás características de la FPGA empleada en el trabajo: una Spartan 3E Starter Kit. 4. OFDM: Se muestran las características de la modulación OFDM y se describe los componentes imprescindibles que conforman el sistema. Toda la gloria proviene de atreverse a comenzar. - Eugene F. Ware-
Introducción 2 5. VLC: Se proporciona un transfondo sobre las light communications, sus ventajas y una descripción de la modulación DC-OFDM, la empleada en el proyecto. 6. Matlab: Empleando los conceptos de apartados anteriores se desarrolla un sistema en el lenguaje de programación Matlab, describiendo cada bloque funcional del que se compone el sistema, dividos en dos categorías: bloques del emisor y bloques del receptor. 7. VHDL: Este capítulo se compone del desarrollo del mismo sistema descrito en el apartado anterior en VHDL, estructurado también de manera similar. Es la parte más fundamental de la memoria, pues detalla el sistema sobre del que se extraen los resultados. Al final del capítulo se analizan los warnings y el rendimiento del diseño. 8. Resultados: Cimentándose en los apartados anteriores se muestran los resultados del sistema para demostrar su funcionamiento. Gran parte de las soluciones se obtienen empleando la simulación de Matlab por su sencillez a la hora de imprimirlas, aunque la prueba final se realiza sobre el modelo completo de VHDL. 9. Conclusiones: Se concluye haciendo una discusión final sobre el rendimiento del sistema, el futuro de las VLC y futuras líneas de trabajo.
3 Implementación de un transmisor/receptor Li-Fi en una FPGA 2 PRIME RIME es el acrónimo de “PoweRline Intelligent Metering Evolution”. Fue creado en el 2007, siendo publicado en el 2008 por PRIME Alliance. Este protocolo abierto, no sujeto a copyright, se encuentra enfocado para la medición de consumo energético, de agua y gas así como para ofrecer soporte a redes inteligentes. Figura 2-1 Prestaciones del sistema PRIME La estructura del protocolo engloba 3 capas: física, mac y de red. En la capa de red permite la utilización de IPv4 e IPv6. Este trabajo se centra sobre la capa física, descrita exhaustivamente en la norma. Figura 2-2 Modelo de capas de PRIME La capa física transmite y recibe MPDUs entre nodos vecinos usando OFDM (multiplexación por división de frecuencias ortogonales). Las razones provistas en las especificaciones para el uso de esta es modulación son la robustez del sistema ante el ruido y las grandes eficiencias espectrales que se puedan obtener, incluso con montajes de transceptores relativamente simples. Además la capa física, así como su tasa de transferencia, se puede adaptar para conseguir el mejor rechazo posible al ruido y la mayor fiabilidad. La modulación OFDM emplea la banda comprendida entre los 3 y los 95 kHz, descrita con mayor profundidad en la norma “EN 50065-1:2001+A1:2010 Sección 4.1”. Esta banda se encuentra reservada para P Todas las desgracias de los hombres provienen de no hablar claro. - Albert Camus -
PRIME 4 distribuidoras eléctricas. Sin embargo, este rango presenta problemas en líneas eléctricas de bajo voltaje en frecuencias inferiores a 40 kHz, como tener un mayor nivel de ruido o consumo de la línea. Para solucionarlo se plantea la utilización de la banda de frecuencias que va desde los 41.992 kHz hasta los 88.867 kHZ. Esto se consigue mediante la modulación OFDM de 97 portadoras equidistantes en el espectro (una de las portadoras es la referencia), transmitiendo cada símbolo cada 2260 microsegundos, por lo cual si se emplea una FFT de 140 puntos, contando con el prefijo cíclico de 12 muestras, nos da un espacio temporal de 16 microsegundos entre datos enviados por el canal. 2.1 Características del proyecto En este proyecto se han realizado algunas modificaciones con respecto a las especificaciones detalladas en PRIME, en lugar de transmitir 97 portadoras, de ellas 96 de datos, se mandarán 96, y sólo 48 contendrán información. El motivo de esta modificación se encuentra en que se está empleando un solo led modulado en intensidad para el sistema, por lo que no se puede transmitir una señal compleja. De otra manera deberíamos utilizar tres leds RGB, siendo cada grupo de colores un símbolo distinto. En una modulación OFDM típica trabajamos con símbolos complejos, que cuentan con una parte real y otra imaginaria que deben ser enviadas simultáneamente por el canal. Sin embargo si creamos una función hermítica con el espectro de las 97 subportadoras, es decir si en la parte negativa del espectro colocamos las portadoras conjugadas de la parte positiva, una vez que se pase del dominio de la frecuencia al del tiempo, la parte imaginaria es nula, no teniendo pues que transmitirla. El maper compatible con PRIME es diferencial y permite tres tipos de constelaciones: de dos (DBPSK), cuatro (DQPSK) y ocho puntos (D8PSK), lo que permite tasas máximas teóricas de 47kbps, 94kbps y 141kbps, respectivamente, sin tener en cuenta el prefijo cíclico. En el proyecto se emplea la constelación de DQPSK, lo que no daría una tasa de 94kbps, pero como solo la mitad de las portadoras se emplea para transmitir datos, la nueva tasa es de 47kbps. En el lado del transmisor, la capa física recibe una trama MAC y genera una trama física que consta de un preámbulo, una cabecera y datos, con los tiempos detallados en la figura. Figura 2-3 Trama física El preámbulo se emplea por motivos de sincronización. Para proveer de la energía máxima, se emplea una envelope signal en lugar de símbolos OFDM, ya que se necesita una señal que sea consistente incluso en presencia de atenuación de frecuencias, como un filtro paso banda. Para esto se emplea una señal de una frecuencia modulada pulsada (chirp signal), definida en la siguiente fórmula: 𝑆(𝑡)=𝐴 ∙ 𝑟𝑒𝑐𝑡(𝑡/𝑇)∙ cos [2𝜋(𝑓𝑡+1/2𝜇𝑡)] Para generar la trama física a partir de la obtenida por la capa superior en el protocolo PRIME se describe, mediante un diagrama de bloques para mayor claridad, una serie de procesos. El primer paso es CRC, la comprobación de redundancia cíclica, tras ello se realiza una codificación convolucional, un sistema de corrección que se realiza en el receptor. Luego, la cadena de bits es aleatorizada para evitar consecuciones largas de unos y ceros y el interleaver mezcla los bits con el fin de repartir los errores uniformemente. El siguiente proceso es mapear la cadena de bits, seguido de una modulación en OFDM mediante la IFFT y en el
5 Implementación de un transmisor/receptor Li-Fi en una FPGA receptor se realiza el proceso inverso para obtener el raw data. En el proyecto se prescinde de la utilización tanto del CRC como del FEC (la codificación convolucional). Los bloques empleados son descritos en mayor profundidad en apartados posteriores. Figura 2-4 Bloques para la generación de la trama física de PRIME
FPGAs 12 almacenar grandes cantidades de datos, mientras que la RAM distribuida se emplea para guardar pequeñas cantidades de datos entre las pistas de señales. Cada bloque RAM es parametrizable. Se pueden definir: sus valores iniciales, los valores de salida predeterminados de los registros, el tamaño de los puertos, tanto de entrada como de salida, la cantidad de registros que contiene la memoria, así como los modos de escritura. Además se puede configurar como memoria mono puerto o de puerto doble. Los puertos se denominan A y B, y permiten acceso independiente al mismo bloque de RAM. Cada puerto tiene su conjunto de señales dedicadas para los controles de escritura y lectura y entradas de reloj para la lectura síncrona. En caso de que los tamaños en bits de los puertos no concuerden, la memoria hace automáticamente la conversión para el usuario, sacando palabras pequeñas cuando los datos han sido grabados por un puerto mayor, y viceversa, uniendo palabras pequeñas para adaptarlas al puerto mayor. Figura 3-7 Bloque RAM 3.3.2 Multiplicadores dedicados Los multiplicadores se sitúan junto a los bloques de memoria RAM, por lo tanto, su disposición y numeración son los mismos. Su función principal es la de realizar multiplicaciones en complemento a dos pero también se les puede emplear para almacenamiento de datos y “barrel shifting” que consiste en desplazar una palabra en memoria un número indicado de bits. Las celdas lógicas también pueden crear pequeños multiplicadores eficientes, que pueden emplearse en caso de que sobren recursos o falten multiplicadores dedicados. Figura 3-8 Bloque multiplicador En la FPGA Spartan-3E los multiplicadores se pueden emplear también para la realización de operaciones con números complejos, característica imprescindible durante el trabajo. Cada multiplicador hace una operación entre dos palabras de hasta 18 bits, configurables a la hora de instanciar el bloque, con una salida con una precisión de hasta 36 bits, todas estas señales también en complementos a dos. La forma en la que se
13 Implementación de un transmisor/receptor Li-Fi en una FPGA implementa entradas de un menor número de bits es mediante una extensión del signo, mientras que operaciones con entradas mayores se logran combinando varios multiplicadores o retroalimentando las entradas con la salida. Otra opción consiste en restringir las entradas a valores positivos para extender el rango numérico de la salida. Además cada multiplicador tiene distintas señales de control, como el reseteo o la sincronía pero no son empleadas durante el desarrollo del trabajo. Las síntesis de ciertos proyectos pueden emplear, sin el conocimiento del diseñador, bloques multiplicadores, por lo que hay que tenerlo en cuenta durante el desarrollo. 3.3.3 Otras características Otras características de vital importancia que se han implementado y se analizará posteriormente son las siguientes: Programación NOR Flash paralela. 2 puertos RS-232, uno macho y otro hembra. Mediante adaptadores RS-232/USB se conecta el transmisor y el receptor con un PC y estableciendo un nivel de aplicación en ambos extremos de la comunicación. Más adelante esto permitirá comprobar con mayor facilidad si los datos mandados son los correctos. Figura 3-9 Pines puerto RS-232 Reloj de 50 MHz (oscilador). Se emplea como referencia fundamental a la hora de sincronizar las tasas de datos a la entrada y salida y el control de cuellos de botella, estableciendo sobre este reloj los ciclos de espera en los bloques más rápidos de la implementación. 232 pines de usuario. De estos pines se utilizarán uno para el reloj, otro para el reset, y finalmente otros dos para el protocolo RS-232. 64 MB de DDR SDRAM. Figura 3-10 Conversor USB-TTL A pesar de contar con dos puertos RS-232 en la placa, se ha optado por emplear un complemento externo por la sencillez que ofrece a la hora de realizar las pruebas. Se ha usado un conversor USB To TTL con el siguiente pinout:
FPGAs 14 TXD: Es el pin transmisor del lado del PC, va conectado al pin que se utiliza para recibir los datos en la FPGA. RXD: Pin de recepción del lado del PC. GND: Pin de tierra. Es necesario que se encuentre conectado a la tierra de la FPGA, para suministrar los voltajes adecuados. 3V3 y 5V: Estos pines suministran voltaje a los circuitos a los que está conectado. Como la FPGA cuenta ya con una fuente de alimentación externa estos pines permanecen desconectados.
15 4 OFDM 4.1 Definición a Multiplexación por División de Frecuencias Ortogonales u OFDM (Orthogonal Frequency Division Multiplexing) es una técnica de transmisión que consiste en el envío de la información mediante la modulación de un conjunto de portadoras en diferentes frecuencias, mapeándolas usando técnicas como QAM o PSK. El espectro es dividido en sub-bandas ortogonales entre sí, haciendo coincidir los puntos de mayor amplitud de una sub-banda con puntos nulos de las otras. A pesar de que otras técnicas como la Frequency Division Multiplexing (FDM) emplean un sistema de varias portadoras a distintas frecuencias, éstas se encuentran equidistantes en el espectro y no entrelazadas como en el caso de OFDM, provocando que estas técnicas posean una menor eficiencia espectral. Por ésta y otras ventajas, el sistema OFDM es empleado en numerosas aplicaciones en la actualidad, como en redes inalámbricas Wi-Fi para móviles conocido como MBWA, empleado en el estándar IEEE 802.20, en DVB-T, el estándar europeo de televisión terrestre que fue ratificado en marzo de 1997 por la ETSI. La variante más empleada de OFDM es su versión codificada (Coded-OFDM), que emplea distintos bloques encargados de corregir los posibles fallos generados en el mensaje por las distorsiones que induce el medio en el que se transmite la señal. Distinguimos cuatro bloques funcionales: el FEC (forward error correction), que, como codificador convolucional, introduce bits de paridad, el scarmbler, que aleatoriza la trama, el entrelazador, que distribuye el error uniformemente al segmentar la información en caso de que se produzca un fallo, el mapeador o mapper, que realiza una modulación sobre la entrada, diferencial en el caso de este trabajo, y la FFT, que permite pasar del espacio de la frecuencia a la del tiempo. 4.2 Historia La Multiplexación por División de Frecuencia Ortogonal surge para compensar las trabas que introducen los medios dispersivos procurando evitar el aumento de la complejidad del sistema en el aspecto hardware. El origen de OFDM proviene de aplicaciones de uso militar que trabajaban dividiendo el espectro disponible en múltiples subportadoras. En transmisiones en la que no existe “visión directa”, que sucede cuando entre el receptor y el transmisor existen reflexiones o absorciones de la señal que implica una degradación de la señal recibida, se manifiestan efectos indeseados como pueden ser la atenuación plana, la atenuación selectiva en frecuencia o la interferencia intersimbólica. Estos efectos se mantienen bajo control con el W-OFDM que es una tecnología propiedad de Wi-LAN, que recibió, en 1994, la patente para comunicaciones inalámbricas de dos vías y banda ancha (OFDM/WOFDM). Esta patente es la base para los estándares 802.11a, 802.11g, 802.11. Los sistemas W-OFDM incorporan además estimación de canal, prefijos cíclicos y códigos Reed-Solomon de corrección de errores. La primera constancia que se tiene sobre OFDM data de mediados de los años 60, cuando R.W. Chang L Uno no puede discutir con un teorema matemático. - Stephen Hawking-
OFDM 16 publicó un artículo sobre la síntesis de señales limitadas en banda para transmisiones multicanal. Chang presentó una serie de principios para la transmisión simultánea de mensajes a través de un canal lineal limitado en banda, evitando los perjudiciales efectos derivados de la Interferencia entre Símbolos (ISI) y entre canales (ICI). Poco después de que Chang publicara sus estudios, Saltzberg realizó un análisis del comportamiento de estos sistemas, concluyendo que: “La estrategia de diseño de un sistema eficiente debe centrarse más en reducir la diafonía entre canales adyacentes que en el perfeccionamiento individual de los mismos, dado que la distorsión por diafonía tiende a ser dominante”. Una mayor contribución a OFDM fue la realizada en 1971 por Weinstein y Ebert, quienes usaron la Transformada Discreta de Fourier (DFT) para desarrollar la modulación y demodulación en banda base. Este trabajo no se orientó hacia el “perfeccionamiento individual” de los canales sino hacia un procesamiento eficiente, eliminando los bancos de osciladores correspondientes a las distintas subportadoras. Para combatir la ISI e ICI usaron tanto un espacio de guarda entre símbolos, como un enventanado por coseno alzado en el dominio temporal. Su sistema no consiguió alcanzar una perfecta ortogonalidad entre subcanales, pero es todavía a día de hoy la mayor contribución aportada a OFDM. Otro importante adelanto fue llevado a cabo por Peled y Ruiz en 1980, quienes introdujeron el uso del prefijo cíclico (CP) o extensión cíclica, resolviendo el problema de la ortogonalidad. En lugar de usar un espacio de guarda vacio, lo rellenaron con una extensión cíclica del símbolo OFDM. Así se puede simular el desarrollo de la convolución cíclica del canal, lo cual implica la ortogonalidad sobre los canales dispersivos cuando la longitud del prefijo cíclico sea mayor que la respuesta impulsiva del canal. Actualmente OFDM no sólo se usa en las redes inalámbricas LAN 802.11a, sino en las 802.11g, en comunicaciones de alta velocidad por vía telefónica como las ADSL y en difusión de señales de televisión digital terrestre en Europa, Japón y Australia. Durante los últimos años, la aceptación del OFDM como tecnología de base para el 802.16ª, que es un estándar de IEEE para redes de área metropolitana inalámbrica que puede proveer extensión inalámbrica para acceso de “última milla” de banda ancha en instalaciones de cable y DSL. El mismo cubre un rango de frecuencias de 2 a 11 GHz y alcanza hasta 50 kilómetros lineales, brindando conectividad de banda ancha inalámbrica sin necesidad de que exista una línea directa de visión a la estación de base. La velocidad de transmisión de datos puede llegar a 70 Mbps. Una estación de base típica puede albergar hasta seis sectores. La calidad de servicio está integrada dentro del MAC, permitiendo la diferenciación de los niveles de servicio. 4.3 Características de OFDM En cualquier comunicación inalámbrica que tome lugar, la señal se deberá mover por un medio con obstáculos en los que se difractará y reflejará antes de llegar a su objetivo, pues las señales no consisten en un rayo dirigido de emisor a receptor sino que se componen de una onda que se propaga en todas direcciones. Es decir, la propagación es multitrayecto. Figura 4-1 Propagación multitrayecto
17 Implementación de un transmisor/receptor Li-Fi en una FPGA Podemos distinguir dos tipos de medio en una propagación multitrayecto. Por una parte el medio podría comportarse como un canal Ricean, si existe visión directa entre emisor y receptor. En este caso, al haber camino directo, la potencia de la primera señal recibida será mucho mayor que la del resto. Sin embargo en caso de no haberla , nos encontramos ante un canal Raylegh, en el que cualquier reflexión puede tener mayor potencia que el primer mensaje recibido. En otras palabras, al receptor llegan varios ecos de la misma señal, portando los primeros un valor significativo de energía y siendo el resto de ellos despreciable. Partiendo del retardo que haya entre las réplicas, encontramos dos posible escenarios: El retardo diferencial supera el tiempo de símbolo. En este escenario se nos presenta una serie de pulsos independientes que no interfieren entre ellos. Para reconstruir la señal lo que se emplea es un receptor conocido como de tipo Rake, que alinea en el tiempo las diferentes réplicas y las suma en fase. El retardo diferencial es inferior al tiempo de símbolo. En este caso la interferencia entre los símbolos (ISI) se acentúa, encontrándose el receptor con una señal fuertemente distorsionada. Se necesita emplear un ecualizador para demodular este mensaje, cuya complejidad dependerá completamente del medio. A medida que se aumenta el ancho de banda de transmisión el periodo de símbolo disminuye, y llega un momento en que la complejidad del receptor Rake se vuelve excesiva, siendo más ventajoso desde un punto de vista de implementación utilizar otro sistema de modulación: OFDM. . Figura 4-2 Subportadoras ortogonales en OFDM Como se ha descrito anteriormente, la información no se manda sobre una única portadora sino sobre múltiples sub-portadoras, que se encuentren lo suficientemente alejadas en frecuencia, repartiendo la información en cada una de ellas. De esta forma nos aseguramos que la velocidad de transmisión sea la mayor posible, y la de cada sub-portadora más lenta, simplificando el problema de propagación multitrayecto. Lo que diferencia a OFDM de otros procedimientos de multiplexación en frecuencia es la ortogonalidad, pues el espaciamiento empleado entre portadoras es óptimo. Este espaciamiento consiste en que la separación espectral entre portadoras consecutivas es siempre la misma e igual al inverso del periodo de símbolo. La ortogonalidad proporciona una ventaja añadida: un mecanismo para eliminar, o reducir tanto como se quiera, el problema de la interferencia por propagación multitrayecto. Este mecanismo consiste en ampliar la duración correspondiente al periodo de símbolo mediante un tiempo de guarda superior al máximo retardo diferencial entre los trayectos significativos, conocido como prefijo cíclico.
OFDM 18 4.4 Ventajas y desventajas del uso de OFDM Partiendo de las características descritas en el apartado anterior podemos sintetizarlas de en una lista de ventajas: Realizan un uso eficiente del espectro. Al dividir el canal en subcanales de banda estrecha, el sistema se hace más robusto ante caídas selectivas en frecuencia. Eliminan el efecto del ISI gracias a la inserción del CP. Usando una determinada codificación de canal y entrelazado el sistema puede responder ante pérdidas de datos durante la transmisión. La ecualización es más sencilla que en los sistemas de portadora única Es computacionalmente eficiente debido al uso de la FFT. Sistema más robusto ante propagación multitrayecto. Utilizando OFDM junto a técnicas de modulación diferencial, desaparece la necesidad de realizar una estimación de canal. Pues a pesar de que se atenúe la señal, las subportadoras conservan la diferencia de fase. Y desventajas: La alta potencia de pico respecto a la potencia media o PAPR: Cuanta más subportadoras contiene la transmisión OFDM, más posibilidades hay que el pico de potencia sea muy alto. Si esto sucede y los preamplificadores no están preparados para ello, producirán distorsión en la señal, al poder actuar estos amplificadores como limitadores. La sensibilidad ante la falta de sincronización frecuencial es pésima para el sistema, puesto que un desplazamiento en frecuencia entre subportadoras acaba con la ortogonalidad, empeorando el SNR. 4.5 Modelo de un transceptor OFDM Al comienzo del capitulo se han mencionado los bloques más frecuentes que componen un sistema OFDM. Sin embargo, a continuación se listan y detallan los imprescindibles para su funcionamiento. 4.5.1 Mapper El mapper es el bloque encargado de convertir el bitstream que recibe por la entrada en una concatenación de símbolos a su salida. Normalmente se suele representar la codificación de estos símbolos en el plano complejo y en un diagrama llamado constelación. El número de elementos en la constelación depende del número de bits (k) de acuerdo a la siguiente fórmula: 𝑀=2 4.5.2 IFFT Viendo una señal OFDM en el tiempo se aprecia que en el periodo de la portadora más baja caben varios periodos de las otras portadoras, alineadas todas en fase, mientras que en la representación espectral el máximo de cada portadora coincide con un nulo de las demás. En principio, podría parecer que modular y demodular una señal OFDM requeriría tantas cadenas transmisoras y receptoras como portadoras tuviese el múltiplex. Si esto fuese así, el sistema sería inviable, pues un múltiplex de decenas o centenares de portadoras implicaría
19 Implementación de un transmisor/receptor Li-Fi en una FPGA equipos terminales con decenas o centenares de cadenas transceptoras. Afortunadamente, sólo se requiere una cadena en cada sentido de transmisión, que modula o demodula todas las portadoras a la vez. 𝑠(𝑡)=𝐶𝜑(𝑡) 𝜑(𝑡)= 𝑒(∆)𝑟𝑒𝑐𝑡(𝑡) 𝑠(𝑡)=𝐶𝑒/ Si se examina las ecuaciones anteriores, se comprueba que una señal OFDM es la transformada inversa de Fourier de los coeficientes Cl, y, en consecuencia, los coeficientes son la transformada directa de s(t). Por consiguiente, la acción de modular y demodular todas las portadoras a la vez de una señal OFDM consiste básicamente en aplicar los algoritmos de la transformada rápida de Fourier, muy conocidos y fáciles de implementar en los procesadores digitales. En lo que se refiere a la modulación de las portadoras, el símbolo phi(k), en un múltiplex OFDM cada portadora se modula con una información diferente empleando una modulación común, como QPSK, que es la que se utiliza en el proyecto. Al final de este bloque se cogen un determinado número de muestras finales, dependiendo del medio y del número de subportadoras y se añaden al comienzo de la transmisión. Es lo conocido como prefijo cíclico. En el receptor la extensión cíclica es extraída y la señal resultante se demodula mediante la aplicación de un bloque DFT. La inserción del prefijo cíclico es comúnmente aceptada como la forma de evitar la ISI y preservar la ortogonalidad entre los tonos. La motivación para añadir un prefijo al símbolo OFDM es la siguiente: como forma de eliminar la interferencia que se produce entre símbolos, por lo que hemos de desplazarlo lejos de la zona donde se encuentra el retraso de la señal precedente. Como solución se dejará un pequeño espacio de guarda entre los símbolos para evitar este fenómeno.
19 5 VLC 5.1 Definición LC también conocido como Comunicación mediante Luz Visible es un subgrupo en las comunicaciones ópticas inalámbricas que emplea la luz visible en una banda de frecuencias ente 400 y 800 Thz. Otro término con el que se le denomina comunmente es Li-Fi, ya que, al igual que el Wi-fi, permite crear una red inalámbrica de alta velocidad. El ejemplo más simple de un sistema VLC sería el empleo de una bombilla que parpadee a altas frecuencias, por lo que, al ojo humano, la luz da sensación de continuidad, pero simultaneamente está emitiendo un mensaje con su cadencia de parpadeo. De esta manera el sistema VLC cumple un doble propósito: ilumina y transmite información. Una de las principales formas de codificación empleada es la Color Shift Keying(CSK), una modulación en intensidad. Es la más inmediata, ya que la señal generada toma un color instantáneo igual a la suma de las tres intensidades de los LED. Las señales moduladas se mueven por una variada gama de colores, cada uno correspondiente a un símbolo distinto. Sin embargo, la variación instantánea transmitida en él no es perceptible por los seres humanos, dada la baja sensibilidad de nuestra vista, con un tiempo de refresco de tan solo unos 0.01 segundos. Por lo cual, a simple vista, el LED parece tomar un color constante. Figura 5-1 Gráfica CSK Esta tecnología puede emplear fluorescentes, pero sus velocidades de descargas son varios órdenes de magnitud inferiores a las conseguida empleando una bombilla LED (10 Kb/s frente a 500 Mb/s) a distancias cortas, aunque con esta misma tecnología, a distancias de 1 a 2 kilómetros, sólo se consiguen unos 10 Mb/s. El auge de las bombillas LED, en parte debido a que la fabricación de halógenos fue interrumpida indefinidamente en Europa en el 1 de septiembre de 2018, ha permitido que se desarrolle esta forma de V Una sonrisa es la luz en tu ventana que le dice a otros que hay una persona generosa y que se preocupa en tu interior. - Denis Waitley-
MATLAB 26 26 6 MATLAB 6.1 Introducción l sistema a implementar es el procesamiento de una comunicación LiFi. Para ello el sistema debe contar con un receptor y transmisor OFDM simples, que servirán para alimentar a un driver óptico. Este transmisor recibe su bit stream de un conversor UART-bit y el receptor realiza el proceso inverso. El sistema final se debe desarrollar sobre una FPGA Spartan 3E, pero antes de implementar el sistema final en VHDL se deben realizar las simulaciones en un lenguaje en el que el desarrollo del sistema sea más sencillo e intuitivo con el objeto de comprobar si el planteamiento de la solución pensada es la correcta. Una vez comprobado que la solución producida en Matlab es la correcta, dicho de otra forma, que los bits recibidos son los mismos que los enviados, se pueden emplear los diversos resultados intermedios producidos en cada bloque como referencia para el modelo en VHDL, que por la mayor complicación del lenguaje -al ser de más bajo nivelse dificulta en ocasiones su depuración. El modelo VHDL se encuentra limitado en ciertos bloques por el número de bits de registros y de operandos, especialmente en ciertos bloques, como en la IFFT y FFT, teniéndolos en cuenta durante el diseño para que el sistema sea implementable en la placa acorde con los recursos que ésta posee. Por tanto cuando se comparen los resultados intermedios de ambas simulaciones en los bloques citados, las soluciones encontradas en VHDL serán una aproximación de las obtenidas en Matlab. Lo que debe ser igual, sin ninguna clase de cambio, es el bit-stream final en ambos sistemas. 6.2 Descripción del sistema El sistema final a implementa en la FPGA se encuentra dividido en un receptor y un transmisor que cuentan con la siguiente estructura de bloques: E Haz las cosas lo más simple que puedas, pero no te limites a lo simple. - Albert Einstein- UART to Bit Scrambler Interleaver Mapper IFFT DAC Bit to UART Descrambler De-interleaver De-mapper FFT ADC Figura 6-1 Estructura de bloques en Matlab del sistema
27 Implementación de un transmisor/receptor Li-Fi en una FPGA Estructura de bloques de emisor y receptor Los bloques que componen al transmisor y receptor son instanciados en el archivo principal main.m. En este primer fichero se genera una secuencia, siguiendo el formato UART. Este fichero también se encarga de realizar cierto procesamiento a los datos de salida de ciertos bloques, así como de iterar entre símbolos OFDM completos, mandándolos uno por uno. 6.2.1 Conversor UART a bit En el formato UART, si el bit de entrada permanece en 1, ésta permanece en reposo. Cuando cambia a 0, este bit recibe el nombre bit start e indica el comienzo de la secuencia. Dependiendo de la trama que pretendemos emplear, a este bit start le suceden de 8 a 10 bits que contienen el mensaje, clausurados por un bit stop, a ‘1’, devolviendo a la línea al estado de reposo. Figura 6-2 Protocolo RS-232 La forma más sencilla de implementarlo en matlab es ir descartando los 1s durante el estado de reposo hasta llegar al bit start, instante en el que se cogen los siguientes 8 elementos de la matriz, ya que los mensajes transmitidos en la trama serán del tamaño de un byte. Este proceso se repite cíclicamente hasta llegar al final de la matriz. 6.2.2 Scrambler El objetivo de este bloque es el de aleatorizar la señal de entrada, simulando el ruido blanco. De esta manera se evita grandes picos de salida en la IFFT cuando se concatenan un gran número de cero o unos. Existen muchos métodos para lograrlo, sin embargo mientras que haya consistencia en la forma empleada tanto en el emisor como en el receptor todos son válidos. El proceso que se utiliza en el proyecto proviene del estándar PRIME, que define el scrambler como una operación XOR entre la cadena de entrada y otra predeterminada por el algoritmo. Figura 6-3 Algoritmo scrambler La cadena generada por el algoritmo puede cambiarse sencillamente si se comienza con un registro inicial distinto. 6.2.3 Interleaver Debido al desvanecimiento de ciertas frecuencias (fading), las subportadoras de OFDM se presentan en el receptor a distintas amplitudes. Estos desvanecimientos en el espectro causan que ciertos grupos de subportadoras sean menos fiables. Por lo tanto, el error en lugar de ser repartido aleatoriamente a lo largo de la
MATLAB 28 28 señal se concentra en grupos de portadoras. Una permutación en el emisor distribuye los errores uniformemente a lo largo de la cadena, pues con el interleaver se asegura de separar los bits adyacentes. En matlab se implementa el algoritmo detallado en PRIME, consistente en realizar una transposición de la matriz de datos, aunque también se puede lograr adjudicando un nuevo índice a cada elemento según la siguiente fórmula: 𝑣(𝑘)=𝑤 (𝑁)(𝑘 𝑚𝑜𝑑 𝑠)+𝑓𝑙𝑜𝑜𝑟𝑘 𝑠 𝑘=0,1,…,𝑁− 1 Donde v es el vector con las muestras originales, w el vector de salida, k un iterador, s el tamaño del subgrupo y Ncbps el número de muestras. 6.2.4 Mapper El mapper traduce el bit stream recibido a la entrada en los símbolos que les corresponde de su constelación. Los bits necesarios por símbolo, dependen de la constelación y se calculan mediante la fórmula log2(M), siendo M el número de símbolos en la constelación. La modulación elegida en este proyecto es Q-PSK (4 símbolos), por lo que los bits se agrupan en parejas. Los distintos símbolos de la constelación se encuentran en el eje, para mayor simplicidad, como mostrado en la figura: Figura 6-4 Símbolos de Q-PSK La modulación en OFDM es diferencial, por lo tanto cada pareja de bits indican la diferencia de fase con respecto a la pareja anterior y no el símbolo en sí mismo. La codificación de los bits se encuentra en gray, formato que permite una disminución del porcentaje de errores, al cambiar de valor sólo un bit entre dos símbolos contiguos. Al pasar de 01 a 10 en binario cambian ambos bits de valor, por lo que si se produce un error en el símbolo transmitido, duplicas la tasa de error. Además ciertos algoritmos que incluyen un solo bit de paridad, que consiste en una operación XOR de los bits de la trama, al contar con el mismo número de 1s o 0s en la trama, al modificarse dos bits en lugar de 1, no puede detectar el error. La implementación del bloque pasa por realizar una conversión de gray a binario, otorgando a cada símbolo un número natural entero, de 0 a 3. Contando con la función cumsum() (suma acumulativa) y la operación módulo de 4, se logra que la fase entre dos símbolos contiguos en la salida sea la deseada. El proceso es el mostrado en el diagrama de flujo: Una última consideración a tener en cuenta es que la portadora inicial posee el valor “-1”, por lo que la gray a binario suma acumulativa a módulo de 4 bit stream tx Figura 6-5 Diagrama de flujo del mapper
29 Implementación de un transmisor/receptor Li-Fi en una FPGA primera pareja de bits debe ser modulada en fase con una portadora a 180º. Así que si por ejemplo la primera portadora a transmitir tiene una fase de 90º, es decir, toma el valor “+i”, la portadora modulada debe tener una fase 90º+180º=270º, tomando el valor de “-i” en el plano complejo. 6.2.5 IFFT La ifft es la parte del sistema que transforma los símbolos desde el dominio de la frecuencia a dominio del tiempo. Matemáticamente, la solución de una transformada de Fourier sobre un conjunto de puntos, es la misma solución que la discretización de la multiplicación de las amplitudes de los símbolos por cosenos y senos de distinta frecuencia, al ser inviable el implementar tantos osciladores, la transformada de Fourier es el camino alternativo que se toma. La IFFT empleada en este proyecto es de 128 puntos, por lo que se necesitan a la entrada 128 portadoras. Todas aquellas portadoras que se encuentren vacías, se deben inicializar a 0. Para que matlab interprete correctamente el orden de las portadoras, se debe pasar como variable a la función ifftshift() la matriz que contiene los 128 puntos. La función ifftshift simplemente reordena los elementos de la matriz, poniendo la frecuencia central como portadora cero. El espectro que se transmite es hermítico, lo que quiere decir que las portadoras negativas son conjugadas de su simétrica positiva, tomando como referencia la portadora central, que toma siempre el valor cero. Al pasar un espectro hermítico por la IFFT, la salida solo consta de parte real, lo que simplifica mucho el proceso de transmisión al aire, pues sólo hay que multiplicar esta amplitud por un coseno que se encargue de desplazar al espectro en frecuencia. Antes de ser transmitido, se envía un prefijo cíclico al comienzo de la transmisión, compuesto de las últimas 12 muestras OFDM que se presentan a la salida de laIFFT. Como se explicó en el apartado de OFDM, el prefijo cíclico es fundamental para reducir drásticamente la interferencia entre símbolos (ISI). 6.2.6 FFT Tras atravesar el medio que separa el emisor y el receptor, la FFT finalmente acaba recibiendo la señal. Debido a que el bloque anterior unió las doce últimas muestras al comienzo como prefijo cíclico, es su primera labor eliminarlo, simplemente descartando las primeras muestras que corresponden a dicho prefijo. Una vez eliminado, partiendo de la suposición de que el driver del receptor se ha encargado de haber preamplificado las muestras y por lo tanto no teniendo en cuenta la posible atenuación o distorsión que ha podido causar el medio, se introducen las portadoras OFDM en la FFT. Una de las principales características de la transformada de Fourier y su inversa, es que al realizar la transformación inversa a continuación de la directa se obtienen las variables de entrada de la inversa. En este momento ya se ha conseguido el espectro desplazado con la portadora central como la primera subportadora, pues en el bloque de IFFTse realizó el cambio inverso. Para devolver el espectro a la situación original de la que partimos, es decir, la salida que encontrábamos en el mapper, se debe llamar a la función fftshift, que se encarga de realizar el desplazamiento inverso, luego de eliminar las portadoras a cero que se encargaban de rellenar los 128 puntos con los que contaba la IFFT en los que no se transmitía información. Lo que queda es un espectro en el que la parte negativa del mismo es el conjugado de la parte positiva, por lo que de ambas partes se puede deducir la misma información, aunque en caso de la parte negativa hay que conjugarla. Lo mejor es quedarse con la parte negativa porque, aparte de que los signos de la parte imaginaria son útiles para procesos posteriores, ya se encuentran ordenadas las distintas portadoras. ifft_shift ifft prefijo cíclico símbolo complejo tx Figura 6-6 Diagrama de flujo de la IFFT
MATLAB 30 30 6.2.7 Demapper En el demapper se realiza la demodulación diferencial de las portadoras que han pasado por la salida del bloque anterior. Debido a que en el mapper se incluía una portadora de valor -1 al comienzo, en el demapper la diferencia de fase se calcula a partir de esta portadora inicial. La forma más directa de lograrlo es calculando el ángulo de cada portadora, realizar restas sucesivas, y luego dependiendo del ángulo, pertenecería a un símbolo o a otro. Pero primero hay que calcular el ángulo de las rectas, porque dependiendo de éste, se debe incluir en uno de los cuatro cuadrantes creados por las rectas diagonales. La forma más sencilla de calcular el ángulo es mediante la fórmula tan(𝑥−𝑥 𝑦−𝑦) Aunque en Matlab es factible implementarlo de este modo, en VHDL requeriría el uso de un Cordic para calcular el ángulo de cada vector. Este es un proceso costoso, pues debe iterar varias veces para ofrecer un resultado fiable, y su exactitud, por tanto, depende del número de ciclos que se ejecuta el Cordic. El funcionamiento del mismo es explicado con mayor detenimiento en el apartado de VHDL. La forma más viable es entonces mediante la multiplicación de las portadoras de entrada con la conjugada de la anterior. Se parte de la siguiente fórmula: 𝐶=(𝑎−𝑗𝑏)(𝑎+𝑗𝑏)(1+𝑗) Siguiendo la deducción anterior se puede obtener la fase de cada demodulación, por lo que se puede clasificar dependiendo de la fase obtenida. La discriminación de los símbolos es mucho más sencilla con una traslación en fase de 45º, que se consigue al mutiplicarlos por 1+j. Solamente se debe tener en cuenta el signo de la parte real e imaginaria del símbolo para saber a qué cuadrante corresponde y por tanto a qué pareja de bits equivale. Sin embargo, esta fase modifica el módulo del símbolo. Anteriormente el módulo era unitario, pero al multiplicar por el complejo 1+j, obtiene el módulo de éste, sqrt(2), aproximadamente 1.41, aunque esto no interfiere en el funcionamieto del módulo. Figura 6-7 Correspondencia entre bits y fase de la demodulación 6.2.8 Deinterleaver El bloque debe devolver los índices iniciales a cada elemento que permutó el interleaver recuperando así el orden original. La única peculiaridad de este deinterleaver es que el proceso no consiste tan solo en una
31 Implementación de un transmisor/receptor Li-Fi en una FPGA transposición, pues la matriz es de 94 elementos y la única disposición rectangular que permite este número es de 2x47, insuficientes para crear un interleaver funcional, por lo que en el emisor se rellenó la cadena con dos ceros con el fin de llegar a los 96 datos, que permiten una distribución de 8x12 o 12x8. Este padding hay que tenerlo en cuenta al calcular los índices de los últimos bits de la matriz. 6.2.9 Descrambler Dos de las propiedades de la operación XOR son que al realizar esta operación entre una cadena de ceros y una cadena cualquiera, se obtiene esta última como resultado y la segunda propiedad es que si se tiene como ambos operando a la misma cadena el resultado será un string de ceros. Debido a estas características el descrambler es exactamente igual al scrambler. 6.2.10 Conversor bit a UART En esta parte del receptor, se debe realizar la operación opuesta a su análogo en el emisor. Sin embargo, la forma de implementarse es muy distinta. Primeramente se debe dividir el bit stream de entrada por grupos de 8 elementos, es decir, en bytes, y se añade un bit start y un bit stop al comienzo y al final de la división, la cual a su vez se añade al vector de salida. Es recomendable añadir algún bit de reposo entre paquete y paquete, es decir, mantener la línea a ‘1’, para asegurarnos de que el sistema que vaya a procesar la salida no confunda un bit stop y un bit start que aparezcan contiguos. La forma más sencilla de representarlo en matlab es realizando un reshape a la matriz de entrada, dividiéndolo en 12 paquetes de 8 elementos. Se añaden 4 vectores columnas al comienzo y al final de la matriz, y por último se convierte a un vector fila, en el que se concatenan todas las filas de la matriz anterior.
VHDL 32 32 7 VHDL na vez realizada una primera simulación en matlab y obteniendo los resultados deseados, se procede a implementar el diseño en el lenguaje descriptivo vhdl. Como se explicó en el apartado anterior, el diseño pensado en matlab debe ser lo más fidedigno posible al que se desarrollará para la fpga, diseño en el cual ha de tenerse muy en cuenta los recursos empleados, pues son muy limitados si los comparamos con un pc moderno, así como las restricciones de tiempo para poder cumplir los requisitos del sistema. Al igual que en el modelo en matlab, dividimos el proyecto en un transmisor y un receptor. Sin embargo las interfaces son muy distintas. El reset del sistema es asíncrono y el reloj es único para todo el sistema, aunque para ciertos puntos del sistema necesita un reloj algo más lento que el máximo del sistema. Varios resultados intermedios son guardados en memorias ram bipuerta para poder ser escritas por un bloque y leídas por otro. En ningún caso se permite la multiescritura en un bloque de memoria. Todo el sistema cuenta con un control de flujo hacia delante, que se logra mediante un bit data_valid a la salida de cada bloque, indicando cuando el dato presentado a la salida es el correcto. Ciertos bloques completados se encuentran ya preprogramados que se encargan de realizar aquellos procesos de gran complejidad como transformadas de Fourier o multiplicadores de números complejos. 7.1 Módulos de la parte del emisor 7.1.1 Conversor UART a bit U Somos lo que hacemos de forma repetida. - Aristóteles- UART2bit clk rst data out data in dv out Figura 7-1 Bloque UART2bit
33 Implementación de un transmisor/receptor Li-Fi en una FPGA Tras apretar el botón de reset el bloque comienza en Reposo, estado en el que espera que la línea de entrada esté a ‘1’, indicando de esta manera que hay un puerto serie conectado a la placa, pasando al siguiente estado. El estado idle tiene dos funciones, por una parte espera a que la línea de entrada se vuelva a cero, indicando que se está transmitiendo una trama, avanzando a B_start, y por otro lado, en caso de que ya tenga almacenado un bloque de bits tras esperar un cierto número de ciclos de reloj procede a enviar los datos guardados. Los estados B_start, Bits y B_stop guardan hasta 47 bytes leídos de la trama de entrada en un vector o registro interno al conversor, captándola a un baud rate de 230400. En Envío se transmite el registro rellenado en estados anteriores al scrambler en bloques de 94 bits, cantidad necesaria para formar un símbolo OFDM empleando la modualción DCO. En total se repite este proceso 4 veces pues se envía en total 376 bits o 47 bytes. 7.1.2 Scrambler Su implementación en VHDL es la explicada en la parte de Matlab. Cuenta con un registro que mediante operaciones con él mismo aleatoriza la salida proporcionada por el bloque. El scrambler cuenta con una máquina de estados muy simple, en el primero de los estados espera por una nueva entrada válida y en el segundo se procesa el bit de entrada. Reposo Idle Bits B_start B_stop Envío Figura 7 - 2 Diagrama de bolas del conversor UART a bit scrambler clk rst data out data in dv out dv in Figura 7-3 Bloque scrambler
VHDL 34 34 7.1.3 Interleaver El interleaver permanece leyendo los bits enviandos por el scrambler guardándolos en una memoria adyacente, en un vector columna, leído luego ordenadamente por el mapper. Al contrario de lo visto en Matlab, como se ha mencionado anteriormente, no recibe todos los datos seguidos debido a la naturaleza concurrente de las FPGA, de ahí la necesidad del uso de una RAM a la salida. Tras procesar los datos el interleaver proporciona los bits al mapper respetando los ciclos que tarda el mapper en generar una salida, por lo que se debe incluir un estado de espera en la máquina de estados. En el protocolo PRIME el interleaver genera una matriz rectangular con los datos de entrada que luego transpone, con el objetivo de repartir los bits consecutivos por la matriz de salida. Sin embargo, al tener 94 bits, no se puede crear una matriz rectangular con los divisores de dicho número que los reparta lo suficiente . La solución es crear una matriz de [12x8] (de 96 bits) quedando los dos últimos elementos a 0 y transponer la matriz, leyendo la matriz por columnas de izquierda a derecha e ignorando el último elemento de las dos columnas finales. Otro método posible para el interleaver puede ser el crear una secuencia aleatoria que contuviera los números del 1 al 94, una sola vez cada uno, y emplearla como índice para colocar los elementos de entrada en la matriz de salida, pero se eligió el primer método por ser más fidedigno a PRIME. 7.1.4 Mapper Memoria mapper Es una memoria de bloque de doble acceso. Las direcciones y buses de datos A pertenecen al mapper, que es el único bloque encargado de la escritura. Para asegurarnos de este hecho, sólo este bloque tiene acceso al pin interleaver clk rst data mem data in dv out dv in addr Figura 7-4 Bloque interleaver interleaver clk rst fin data in dv out dv in addr data mem Figura 7-5 Bloque mapper
35 Implementación de un transmisor/receptor Li-Fi en una FPGA de WE de la memoria, activo a ‘1’. Los buses de datos y direcciones B de la memoria son empleados por la IFFT. En esta memoria, a la salida del mapper, se guardan las modulaciones de las portadoras. Los datos tan sólo tienen un tamaño de 3 bits, pues los posibles valores de la portadora están guardados como 0(0+0j), 1(1+0j), 2(0+1j), 3(-1+0j) y 4(0-1j). De esta forma los datos ocupan muchos menos recursos que si conectáramos directamente a la IFFT una memoria con un bus del tamaño de los datos de entrada de ésta, que son de 10 bits. La memoria contiene 128 palabras de 3 bits. Esto es debido al número de puntos de la IFFT, también de 128. En dichas palabras viene representada la forma del espectro que se pasa a la IFFT. Las 15 portadoras iniciales y las 16 últimas, así como la central, son portadoras vacías, por tanto de valor 0+0j. Las portadoras a la izquierda de la frecuencia central, que ocupa la posición 64 en la memoria, son el conjugado de las portadoras de la derecha, donde se encuentran las modulaciones realizadas por el mapper. Figura 7-6 Portadoras en DCO-OFDM Mapper El mapper está diseñado a partir de una máquina de estados. El primero de ello es simplemente una inicialización de memoria, con el objetivo de que la primera portadora, tanto de la parte positiva del espectro como su conjugada se encuentre siempre en el símbolo inicial de -1+0j. Esta parte del proceso se ejecuta tras bajar el reset en dos ciclos y no se vuelve a ejecutar durante el resto del tiempo de programa. El siguiente estado es de lectura, que consiste en guardar en un registro auxiliar la trama de bits proveniente del bloque anterior. Para que el mapper acepte la entrada el input data_valid (dato válido) debe de estar a ‘1’. Una vez que se han recogido una pareja de bits en el registro auxiliar, se procede a su modulación. Como en el modelo de matlab, dos bits corresponden a un símbolo en concreto, y para ser modulado debe pasar por los siguientes procesos: conversión de gray a binario, suma de fase al símbolo anterior, mapeo del nuevo símbolo, cálculo de su conjugado y guardado en memoria. El decodificador de gray a binario, debido a lo trivial que resulta resolverlo para dos bits, simplemente se implementa un bloque de condicionales anidados. La modulación diferencial se realiza mediante una suma acumulativa de las fases, sumando la nueva fase a la guardada en otro registro. Sirviéndose de que el número de símbolos es una potencia de dos, se puede emplear el desbordamiento del registro de fase para moverse por los símbolos cíclicamente. Una vez obtenido el símbolo en la constelación, es guardado en memoria, a partir de la posición 66 en orden ascendente, a la derecha de la frecuencia central. A su vez se calcula su conjugado y se guarda a partir de la posición 62 en orden descendente. Debido a que la constelación empleada es la Q-PSK, el cálculo de la conjugada consiste en intercambiar el segundo símbolo de la constelación por el cuarto y viceversa (1j por -1j). Lectura Gray a bin Parte pos Modulación Parte neg Figura 7-7 Diagrama de bolas del mapper
VHDL 42 42 Xst:790 - "C:/Users/W-10/Desktop/repositorio/Recovered data 07-29 21_08_06/Archivos borrados/LIBROS/#2/tfg_ofdm_final/UART_bit_stream.vhd" line 108: Index value(s) does not match array range, simulation mismatch. Este aviso hace referencia a una señal que se emplea como índice de una matriz, ya que el valor de la señal puede llegar a exceder el máximo número de los elementos. Sin embargo está controlado dentro del diseño para que se mantenga dentro de unos valores permitidos. Xst:753 - "C:/Users/W-10/Desktop/repositorio/Recovered data 07-29 21_08_06/Archivos borrados/LIBROS/#2/tfg_ofdm/bloque_ifft.vhd" line 77: Unconnected output port 'rfd' of component 'ifft'. NgdBuild:440 - FF primitive 'bloq_ifft/ifft_comp/blk000001b4/blk00000294' has unconnected output pin NgdBuild:443 - SFF primitive 'bloq_ifft/ifft_comp/blk0000054f' has unconnected output pin NgdBuild:452 - logical net 'bloq_fft/fft_comp/blk00000189/sig000005fa' has no driver En la página de Xilinx detallan que no todos los pines de salida necesitan ser conectados, y que se puede ignorar este aviso si los pines que se muestran no se necesitan en el diseño. Todos los pines mostrados pertenecen a salidas y entradas de los bloques ifft y fft que no interfieren en el funcionamiento del diseño pues no están incluidos en este. PhysDesignRules:812 – Dangling pin <DOA1> on block: <deinter_mem/U0/xst_blk_mem_ generator/gnativebmg.native_blk_mem_gen/valid.cstr/ramloop[0].ram.r/s3_init.ram/spram.ram.A>:< RAMB16_RAMB16A>. Al igual que en el aviso anterior en la propia página de Xilinx se dice que cuando se emplea una memoria de bloque y la implementación emplea una o más BRAM16/32 puede que algunos pines queden flotando. Esto depende del tamaño de la ram y es controlado por el sintetizador y no afecta a la funcionalidad, por lo que el warning se puede obviar.
43 Implementación de un transmisor/receptor Li-Fi en una FPGA Figura 7-21 Resumen de empleo de recursos En la figura 6-11 aparece un resumen de los recursos empleados por la FPGA para poder enrutar el programa. Como se explicó en el capítulo 2 la Spartan 3E está formada por un gran número de CLBs compuestas a su vez por LUTs (look-up tables), que funcionan como tablas de verdad y flip-flops que funcionan como registros de los estados anteriores. Los flip-flops y LUTs empleados no tienen por qué estar en el mismo slice, de ahí a que el porcentaje de slices ocupados sea mayor de 31% o 44%. Cuando se ha utilizado gran parte de los recursos de la FPGA, el sintetizador se encuentra obligado a empaquetar la mayor cantidad de lógica, mostrándose el porcentaje de la línea “Number of Slices containing unrelated logic” mayor que cero, indicando que la placa no es capaz de seguir las restricciones de tiempo indicadas siendo la labor del diseñador el asegurarse de que se cumplan. En este caso, al ser el porcentaje del 0%, no supone un problema. El número de memorias empleadas son en total 7 por debajo del límite total, aunque se debe tener en cuenta que cada una de ellas emplea un multiplicador, y en este proyecto suponen la mitad de los multiplicadores usados. En cualquier caso, como ninguno de los recursos se acerca al 100% de la capacidad de la placa, el programa se puede enrutar en la FPGA sin ninguna anomalía que haya que depurar.
Resultados 44 44 8 RESULTADOS n este apartado se realiza una discusión sobre los resultados obtenidos en Matlab y en VHDL. En el capítulo se comparan los resultados obtenidos en ambos sistemas empleando pequeños scripts de Matlab, los más complejos se expondrán con mayor detenimiento, pero el procedimiento básico, en la mayor parte de las pruebas, consiste en extraer los vectores de resultados del modelo de VHDL en un archivo que luego es transformado a una matriz en Matlab con la que luego se puede operar. VHDL permite la posibilad en sus test_bench el poder leer y registrar señales en archivos, lo cual es muy útil a la hora de hacer comprobaciones del funcionamiento del sistema, a pesar de que ya cuenta con una interfaz gráfica bastante eficaz. En el Anexo C vienen recopilados los scripts tanto en Matlab como en VHDL empleados en este capítulo. 8.1 Bloque de conversión del formato UART a bit En este primera fase la limitación de la precisión numérica de las FPGAs, causadas por escasez de recursos, no afecta a los resultados, que son iguales , pues son operaciones de pocos bits. Extrayendo los resultados obtenidos en la simulación, y copiándolas en una matriz en Matlab, se puede demostrar tanto matemática como gráficamente, recursos que se emplearán durante el resto de este apartado. Como se distingue en la figura, los bits extraídos de este bloque son dos bytes de información y el resto del paquete se rellena de ceros con el objetivo de simplificar el estudio de los resultados que se van obteniendo y no tener largos periodos de simulación. Figura 8-1 Datos de entrada Matlab y VHDL E Locura es hacer la misma cosa una y otra vez esperando obtener diferentes resultados. - Albert Einstein-
45 Implementación de un transmisor/receptor Li-Fi en una FPGA La representación elegida es un gráfico de barras. Los únicos valores que puede tomar la salida son unos o ceros, ya que se está trabajando con bits individuales en este primer bloque. 8.2 Scrambler Como se ha explicado repetidamente en aparados anteriores, la función del scrambler es la de aleatorizar la señal. Al ser procesado el resultado mediante operaciones lógicas, no existe ninguna diferencia entre el stream de salida del sistema en Matlab y en VHDL. En los resultados de la IFFT se puede observar la influencia de este bloque sobre las señales que van a ser emitidas por el aire. En caso de que este bloque no existiera, si tenemos una señal que no varía lo suficiente, al aplicarle la transformada inversa de Fourier, nos dará como resultado un gran pico en las bajas frecuencias como muestra la figura: Figura 8-2 a)Salida del scrambler b)Salida de la IFFT sin scrambler 8.3 Mapper En la descripción del sistema en VHDL se hizo mención de que en el mapper los datos liberados no son símbolos, sino que a cada símbolo de la constelación Q-PSK le corresponde dos bits, por ello la salida son números entre 1 y 4. Como la mayor parte de los datos son ceros, la modulación diferencial provoca que todos los símbolos al final sean el mismo. Sin embargo la comparación ahora con los resultados no es tan trivial como en el bloque anterior. Para realizarla de forma fidedigna se debe realizar una conversión de los datos, de los números a los símbolos. Creando una matriz con todos los símbolos ordenados, se emplean los resultados del sistema VHDL como índices de dicha matriz, obteniendo el siguiente resultado, idéntico al suplido por Matlab: Figura 8-3 Componentes reales e imaginarias de la salida del mapper
Resultados 46 46 Aquí vienen representadas las 49 portadoras. La gráfica superior es la parte real del símbolo y la inferior es la imaginaria. Una de los requisitos para que la modulación diferencial funcione es tener una primera portadora que sirva de referencia. En este mapper la primera portadora tiene el valor de -1, con una fase 180º. 8.4 IFFT En este bloque se requiere una cuidadosa elección de la configuración de la IFFT instanciada, pues un mal ajuste del módulo causa una severa distorsión en los resultados obtenidos. La IFFT está escalada con la recomendación que hace la documentación para una transformada de 128 puntos, y se ha elegido una resolución en la entrada de 10 bits. En principio se intentó realizar con unos ocho bits, pero la respuesta quedaba demasiado distante de la obtenida en Matlab. Uno de los motivos principales por lo que se transmite una función hermítica es porque el resultado de la transformada sólo consta de parte real, y aunque incluso empleando 10 bits existe parte imaginaria en la salida en VHDL, es despreciable, varios órdenes de magnitud inferior a la mayor parte de las portadoras y al fin y al cabo es lo que se busca en esta transformada, el evitar enviar la parte imaginaria. A nivel de representación los números emitidos por y uno y otro modelo son muy dispares entre sí, aunque comparten ciertas propiedades entre ellos que hace llegar a la conclusión de que son casi los mismos datos pero interpretados de manera distinta. Si tomamos la primera muestra y la normalizamos, es decir, le otorgamos el valor unidad, y dividimos el módulo del resto de las muestras con respecto a esta primera, encontramos que la respuesta de ambos sistemas son inditinguibles a primera vista como muestra la figura: Figura 8-4 a)Salida IFFT Matlab b)Salida IFFT VHDL c)Comparación entre salidas Sin embargo, como se ha señalado en el diagrama, sí que existe diferencias entre dos muestras cualesquiera por mínimo que sea. En algunas suponen errores absolutos de tan solo centésimas.
47 Implementación de un transmisor/receptor Li-Fi en una FPGA Hay diferentes formas de calcular el error o dar una medida de cuanta diferencia entre ambos vectores. En este apartado se ha optado por medir el módulo del vector de los errores, o dicho de otra manera, obtener la raíz de la suma de los errores al cuadrado. Además se ha hecho una segunda medición de la similitud de ambos vectores, calculando tanto el coseno, como el ángulo que existe entre ellos. Normalizando ambos vectores con el primer elemento de cada uno para que puedan ser comparables, calculando la media cuadrada del error de ambos, así como del vector de Matlab y dividiendo ambos, obtenemos el error relativo del sistema que es del 5,44%, como se muestra en el código al final del subapartado. Como prueba adicional, si realizamos una multiplicación escalar de ambos vectores y dividimos entre el módulo de ambos obtenemos un indicador con valores entre -1 y 1 que muestra lo parecido que son. Si aplicamos la fórmula a la salida de Matlab y de VHDL encontramos que los vectores tienen una similitud de 0.9985, lo que quiere decir que forman un ángulo de 0.054 radianes. La conclusión a la que se llega es que la configuración de la IFFT es la correcta, debido a la similitud en respuestas a la IFFT de Matlab. %%Se calculan los vectores normalizados con respecto al primer elemento %%de cada vector sal_ifft_matlab_norm=sal_ifft_matlab(13:end)/sal_ifft_matlab(13) sal_ifft_vhdl_norm=salida_ifft_vhdl/salida_ifft_vhdl(1) %%Cálculo de la media cuadrada del error error_rms=rms(sal_ifft_matlab_norm-sal_ifft_vhdl_norm) %%Cálculo de la media cuadrada del vector de matlab matlab_rms=rms(sal_ifft_matlab_norm) %%Error porcentual error_relativo=error_rms/matlab_rms %%Coseno del ángulo entre los dos vectores indice=sal_ifft_matlab_norm*(sal_ifft_vhdl_norm')/(norm(sal_ifft_matlab_norm) * norm(sal_ifft_vhdl_norm)) Figura 8-5 Resultados de la consola de Matlab 8.5 Demapper Debido a las pequeñas diferencias que hay en el sistema VHDL, al tener recursos bastante limitados, tanto a nivel de lógica programable como de tiempo, el algoritmo empleado en tanto la simulación como en la sintetización pasa por desplazar la señal en el plano imaginario -45º. Gracias a este cambio en la señal de entrada no solo se puede anular el error provocado por el sistema sino que también al debido al ruido ambiental, dando resultados consistentes e idénticos en ambos sistemas.
Resultados 48 48 8.6 Consola de Puerto Serie Una vez comprobada la solución bloque a bloque para observar las coincidencias entre ambos modelos, se realiza una prueba final para comprobar la funcionalidad de l programa sintetizado y enrutado en la FPGA. El objetivo principal del proyecto era el crear un emisor y receptor que permitiera el envío de mensajes de hasta 47 bytes proporcionado por un puerto serie para luego, tras atravesar el sistema ser expulsado de nuevo al puerto serie pero en esta ocasión como entrada en lugar de salida. Para ello se ha empleado Termite, un programa que capta tramas por un puerto serie y las transforma en caracteres ASCII. La ventaja que proporciona este programa ante otras consolas es que Termite permite enviar y recibir desde la misma consola simplificando la exposición gráfica de los resultados. Figura 8-6 Consola En la Figura 7-5 las cadenas de color azul son los escritos desde la consola, el mensaje que se pasa desde el PC al emisor del sistema, mientras que los caracteres de color verde son las recibidas desde la FPGA. Como se puede observar el sistema envía al receptor 47 bytes que pueden o no estar vacíos. En caso de estarlos se denota mediante el símbolo [00].
49 Implementación de un transmisor/receptor Li-Fi en una FPGA 9 CONCLUSIONES ras evaluar los distintos apartados de la memoria se llega a la conclusión que la tecnología VLC todavía se encuentra en las primeras fases de su desarrollo por lo que todavía no es completamente viable. En especial si tenemos en cuenta la dificultad de los últimos años en crear un transceptor de tamaño reducido que haga un uso eficiente de la energía, aunque una vez vencida esta dificultad, la técnica avanzará a pasos agigantados pues gran parte de las instalaciones de VLC consistirían en añadir leves modificaciones a la iluminaria LED que ya existe y es cada vez más prominente en los hogares y en ámbitos industriales y comerciales. Se puede esperar que enun futuro cercano se haga un uso cada vez más extendido de estas redes en grandes negocios, como centros comerciales en el que deben proporcionar una conexión fiable y rápida a una gran cantidad de usuarios, aunque nuevamente encontramos el escollo de las dimensiones del transceptor, pues gran número de los dispositivos empleados que demandan comuniciones digitales comprenden dispositivos móviles, por lo que es mi impresión que veremos una gran apuesta en esta tecnología por parte de la industria móvil. En cuanto al proyecto explicado en esta memoria, mis conclusiones finales es que se ha obtenido un emisor y receptor empleando la modulación OFDM siguiendo el protocolo PRIME, creando una señal en la que se prioriza la fiabilidad de esta, motivo por el que se le ha incluido los bloque de scrambler e interleaver. El resultado es que se puede enviar un número exacto de bytes a pesar de que cada paquete OFDM está compuesto por 94 subportadoras, creando un buffer que espera varios símbolos OFDM. 9.1 Líneas de trabajos futuros Una de las principales modificiones que se pueden realizar a este proyecto es la inclusión de un módulo ADC y un DAC que permita transportar las señales entre distintos dispositivos. Otro futuro trabajo a nivel de hardware consistiría en diseñar dos circuitos: un transmisor y un receptor Li-Fi, que permita a la señal viajar por el aire. Las bases del circuito sería un fotodiodo y un amplificador que distorsione la señal lo menos posible, permitiendo el mayor bitrate posible. A nivel software, una vez ya implementada una capa física fiable, al haber convertido la señal al estándar RS- 232 (puerto serie), se ha conseguido traducir la capa física a una norma ampliamente utilizada por lo que desarrollar aplicaciones alrededor del sistema se simplifica mucho. Se podría crear una plataforma que permitiera la transmisión de distintos archivos, multimedia específicamente, porque a mi parecer el futuro de esta tecnología debería confiar en el servicio de streaming debido a las altas tasas de transferencia que permite. T Sólo cabe progresar cuando se piensa en grande, sólo es posible avanzar cuando se mira lejos. - José Ortega y Gasset-
Bibliografía 50 50 BIBLIOGRAFÍA Chun Ghiu Lee. (2011). Virtual Light Communications. Xilinx. (2018). DS312 Spartan-3E FPGA Family Data Sheet. Prime Alliance Technical Group. Draft Specification for PowerLine Intelligent Metering Evolution. Xilinx. (2011). Spartan-3E FPGA Starter Kit Board User Guide. Xilinx. (2010). DS260 LogiCORE IP Fast Fourier Transform v7.1 . Sanjana C Saju. (2015). Comparison of ACO-OFDM and DCO-OFDM in IM/DD Systems. Ivica Stevanović. (2017). OFCOM-Report. Xilinx. (2011). DS291 LogiCORE IP Complex Multiplier v3.1. Latif Ullah Khan. (2017) Visible light communication: applications, architecture, standardization and research challenges. Jie Lian, Yan Gao, Peng Wu, Dianbin Lian. (2019). Orthogonal Frequency Division Multiplexing Techniques Comparison for Underwater Optical Wireless Communication Systems. ISI vs ICI | difference between ISI and ICI. https://www.rfwireless-world.com/Terminology/ISI-vs-ICI.html. What is OFDM: Orthogonal Frequency Division Multiplexing. https://www.electronic notes.com /articles /radio/multicarrier-modulation/ofdm-orthogonal-frequency-division-multiplexing-what-is-tutorial- basics.php. Difference between FDM and OFDM | FDM vs OFDM. https://www.rfwireless-world.com/Articles/difference -between-FDM-and-OFDM.html. RS-232 vs. TTL Serial Communication. https://www.sparkfun.com/tutorials/215.
51 Implementación de un transmisor/receptor Li-Fi en una FPGA
Anexo B: Código VHDL 58 58
59 Implementación de un transmisor/receptor Li-Fi en una FPGA
Anexo B: Código VHDL 60 60 Scrambler.vhd
61 Implementación de un transmisor/receptor Li-Fi en una FPGA
Anexo B: Código VHDL 62 62 Interleaver.vhd
63 Implementación de un transmisor/receptor Li-Fi en una FPGA
Anexo B: Código VHDL 64 64
65 Implementación de un transmisor/receptor Li-Fi en una FPGA Mapper.vhd
Anexo B: Código VHDL 66 66
67 Implementación de un transmisor/receptor Li-Fi en una FPGA
Anexo B: Código VHDL 74 74 Multiplicador_bloque.vhd
75 Implementación de un transmisor/receptor Li-Fi en una FPGA
Anexo B: Código VHDL 76 76
77 Implementación de un transmisor/receptor Li-Fi en una FPGA
Anexo B: Código VHDL 78 78 Deinteleaver.vhd
79 Implementación de un transmisor/receptor Li-Fi en una FPGA
Anexo B: Código VHDL 80 80
81 Implementación de un transmisor/receptor Li-Fi en una FPGA Bit2UART.vhd
Anexo B: Código VHDL 82 82
83 Implementación de un transmisor/receptor Li-Fi en una FPGA
Anexo B: Código VHDL 90 90
91 Implementación de un transmisor/receptor Li-Fi en una FPGA
Anexo C: Código de las pruebas 92 92 ANEXO C: CÓDIGO DE LAS PRUEBAS Pruebas.m %%llamada al MAIN main; %%El script procede a hacer las pruebas %%Análisis de las salidas UART2bit output_uart2bit_vhdl=table2array(fichsalidauart2bitvhdl)'; figure('Name','Entrada Matlab','NumberTitle','off'); bar(input_scrambler,1,'b'); xlim([0 95]) xlabel("Muestras") ylabel("Valor del bit") set(gcf,'color','white') set(gca,'YLim',[0 1.75]) set(gca,'YTick',(0:1:2)) figure('Name','Entrada VHDL','NumberTitle','off'); bar(output_uart2bit_vhdl,1,'b'); xlim([0 95]) xlabel("Muestras") ylabel("Valor del bit") set(gcf,'color','white') set(gca,'YLim',[0 1.75]) set(gca,'YTick',(0:1:2)) uart2bit_comp= isequal(input_scrambler,output_uart2bit_vhdl); %%Análisis de las salidas Scrambler figure('Name','Salida scrambler Matlab','NumberTitle','off'); bar(input_interleaver,1,'b'); xlim([0 95]); xlabel("Muestras") ylabel("Valor del bit") set(gcf,'color','white') set(gca,'YLim',[0 1.75]) set(gca,'YTick',(0:1:2)) output_scrambler_vhdl=table2array(fichsalidascramblervhdl)'; figure('Name','Salida scrambler VHDL','NumberTitle','off'); bar(output_scrambler_vhdl,1,'b'); xlim([0 95]); xlabel("Muestras")
93 Implementación de un transmisor/receptor Li-Fi en una FPGA ylabel("Valor del bit") set(gcf,'color','white') set(gca,'YLim',[0 1.75]) set(gca,'YTick',(0:1:2)) scrambler_comp= isequal(output_scrambler_vhdl,input_interleaver); %%Análisis de las salidas Interleaver figure('Name','Salida interleaver Matlab','NumberTitle','off'); bar(input_mapper,1,'b'); xlabel("Muestras") ylabel("Valor del bit") xlim([0 95]) set(gcf,'color','white') set(gca,'YLim',[0 1.75]) set(gca,'YTick',(0:1:2)) set(gcf,'color','white') output_interleaver_vhdl=table2array(fichsalidainterleavervhdl)'; figure('Name','Salida interleaver VHDL','NumberTitle','off'); bar(output_interleaver_vhdl,1,'b'); xlabel("Muestras") ylabel("Valor del bit") xlim([0 95]) set(gcf,'color','white') set(gca,'YLim',[0 1.75]) set(gca,'YTick',(0:1:2)) set(gcf,'color','white') interleaver_comp= isequal(input_mapper,output_interleaver_vhdl); %%Análisis salidas Mapper figure('Name','Salida mapper Matlab','NumberTitle','off'); ax1 = subplot(2,1,1); bar(ax1,real(output_mapper),1,'b'); set(gcf,'color','white') ylim([-1.9 1.9]) xlabel("Muestras") ylabel("Valor del bit") ax2 = subplot(2,1,2); bar(ax2,imag(output_mapper),1,'b'); ylim([-1.9 1.9]) xlabel("Muestras") ylabel("Valor del bit") set(gcf,'color','white') aux_output_mapper_vhdl=table2array(fichsalidamappervhdl)'; reg = [1 1i -1 -1i]; output_mapper_vhdl(1:101)=reg(aux_output_mapper_vhdl); output_mapper_vhdl=[output_mapper_vhdl(7) output_mapper_vhdl(8:2:end)];
Anexo C: Código de las pruebas 94 94 figure('Name','Salida mapper VHDL','NumberTitle','off'); ax1 = subplot(2,1,1); bar(ax1,real(output_mapper_vhdl),1,'b'); set(gcf,'color','white') ylim([-1.9 1.9]) xlabel("Muestras") ylabel("Valor del bit") ax2 = subplot(2,1,2); bar(ax2,imag(output_mapper_vhdl),1,'b'); ylim([-1.9 1.9]) xlabel("Muestras") ylabel("Valor del bit") set(gcf,'color','white') mapper_comp= isequal(output_mapper, output_mapper_vhdl); %%Análisis salidas IFFT figure('Name','Salida IFFT Matlab(normalizada)','NumberTitle','off'); bar(input_fft(13:end)/input_fft(13),1,'b'); set(gcf,'color','white') xlabel("Muestras") ylabel("Salida normalizada") xlim([0 128]) %%Se calculan los vectores normalizados con respecto al primer elemento %%de cada vector salida_ifft_vhdl=table2array(fichsalidaifftvhdl)'; sal_ifft_matlab_norm=input_fft(13:end)/input_fft(13); sal_ifft_vhdl_norm=salida_ifft_vhdl/salida_ifft_vhdl(1); figure('Name','Salida IFFT VHDL(normalizada)','NumberTitle','off'); bar(salida_ifft_vhdl/salida_ifft_vhdl(1),1,'b'); set(gcf,'color','white'); xlabel("Muestras"); ylabel("Salida normalizada"); xlim([0 128]); %%Cálculo de la media cuadrada del error error_rms_ifft=rms(sal_ifft_matlab_norm-sal_ifft_vhdl_norm); %%Cálculo de la media cuadrada del vector de matlab matlab_rms_ifft=rms(sal_ifft_matlab_norm); %%Error porcentual error_relativo_ifft=error_rms_ifft/matlab_rms_ifft; %%Coseno del ángulo entre los dos vectores indice_ifft=sal_ifft_matlab_norm*(sal_ifft_vhdl_norm')/(norm(sal_ifft_matlab_ norm)* norm(sal_ifft_vhdl_norm)); %%Análisis salidas FFT figure('Name','Salida FFT Matlab(normalizada)','NumberTitle','off'); ax1 = subplot(2,1,1); bar(ax1,real_part/real_part(1),1,'b');
95 Implementación de un transmisor/receptor Li-Fi en una FPGA xlabel("Muestras"); ylabel("Salida normalizada"); ylim([-2 2]); ax1 = subplot(2,1,2); bar(ax1,imag_part/imag_part(2),1,'b'); xlabel("Muestras"); ylabel("Salida normalizada"); ylim([-2 2]); set(gcf,'color','white'); salida_fft_real_vhdl=table2array(fichsalidafftvhdl(2:end,1))'; salida_fft_imag_vhdl=table2array(fichsalidafftvhdl(2:end,2))'; figure('Name','Salida FFT VHDL(normalizada)','NumberTitle','off'); ax1 = subplot(2,1,1); bar(ax1,salida_fft_real_vhdl/salida_fft_real_vhdl(1),1,'b'); xlabel("Muestras"); ylabel("Salida normalizada"); ylim([-2 2]); ax1 = subplot(2,1,2); bar(ax1,salida_fft_imag_vhdl/salida_fft_imag_vhdl(2),1,'b'); xlabel("Muestras"); ylabel("Salida normalizada"); ylim([-2 2]); set(gcf,'color','white'); sal_fft_matlab_norm_real=real_part/real_part(1); sal_fft_matlab_norm_imag=imag_part/imag_part(2); sal_fft_vhdl_norm_real=salida_fft_real_vhdl/salida_fft_real_vhdl(1); sal_fft_vhdl_norm_imag=salida_fft_imag_vhdl/salida_fft_imag_vhdl(2); %%Cálculo de la media cuadrada del error error_rms_fft_real=rms(sal_fft_matlab_norm_real-sal_fft_vhdl_norm_real); error_rms_fft_imag=rms(sal_fft_matlab_norm_imag-sal_fft_vhdl_norm_imag); %%Cálculo de la media cuadrada del vector de matlab matlab_rms_fft_real=rms(sal_fft_matlab_norm_real); matlab_rms_fft_imag=rms(sal_fft_matlab_norm_imag); %%Error porcentual error_relativo_fft_real=error_rms_fft_real/matlab_rms_fft_real; error_relativo_fft_imag=error_rms_fft_imag/matlab_rms_fft_imag; %%Coseno del ángulo entre los dos vectores indice_fft_real=sal_fft_matlab_norm_real*(sal_fft_vhdl_norm_real')/(norm(sal_ fft_matlab_norm_real)* norm(sal_fft_vhdl_norm_real)); indice_fft_imag=sal_fft_matlab_norm_imag*(sal_fft_vhdl_norm_imag')/(norm(sal_ fft_matlab_norm_imag)* norm(sal_fft_vhdl_norm_imag)); %%Análisis salidas Demapper figure('Name','Salida demapper Matlab','NumberTitle','off');
Anexo C: Código de las pruebas 96 96 bar(input_deinterleaver,1,'b'); set(gcf,'color','white'); ylim([0 1.9]); xlim([0 95]); xlabel("Muestras"); ylabel("Valor del bit"); aux_output_demapper_vhdl=table2array(fichsalidademappervhdl); reg = [0 0; 0 1; 1 0; 1 1]; output_demapper_vhdl=reshape( reg(aux_output_demapper_vhdl'+1,:)', [1 94]); figure('Name','Salida demapper VHDL','NumberTitle','off'); bar(output_demapper_vhdl,1,'b'); set(gcf,'color','white') ylim([0 1.9]); xlim([0 95]); xlabel("Muestras"); ylabel("Valor del bit"); demapper_comp=isequal(output_demapper_vhdl, input_deinterleaver); %%Análisis salidas Deinterleaver figure('Name','Salida deinterleaver Matlab','NumberTitle','off'); bar(input_descrambler,1,'b'); set(gcf,'color','white') ylim([0 1.9]); xlim([0 95]); xlabel("Muestras"); ylabel("Valor del bit"); output_deinterleaver_vhdl=table2array(fichsalidadeinterleavervhdl)'; figure('Name','Salida deinterleaver VHDL','NumberTitle','off'); bar(output_deinterleaver_vhdl,1,'b'); set(gcf,'color','white') ylim([0 1.9]); xlim([0 95]); xlabel("Muestras"); ylabel("Valor del bit"); isequal(output_deinterleaver_vhdl, input_descrambler); %%Análisis salidas Descrambler figure('Name','Salida descrambler Matlab','NumberTitle','off'); bar(output_descrambler,1,'b'); set(gcf,'color','white') ylim([0 1.9]); xlim([0 95]); xlabel("Muestras"); ylabel("Valor del bit"); output_descrambler_vhdl=table2array(fichsalidadescramblervhdl)'; figure('Name','Salida descrambler VHDL','NumberTitle','off'); bar(output_descrambler_vhdl,1,'b'); set(gcf,'color','white')
97 Implementación de un transmisor/receptor Li-Fi en una FPGA ylim([0 1.9]); xlim([0 95]); xlabel("Muestras"); ylabel("Valor del bit"); descrambler_comp=isequal(output_descrambler_vhdl, output_descrambler); Top_module_test_bench.vhd
Anexo C: Código de las pruebas 98 98
99 Implementación de un transmisor/receptor Li-Fi en una FPGA