Академический Документы
Профессиональный Документы
Культура Документы
Facultad: Ingeniería
Tabla de Contenido
Listado de Figuras
Figura 1. Tarjeta de Desarrollo DE2-70. ................................................................ 14
Figura 2. Estructura directa tipo I para filtros FIR. ................................................. 15
Figura 3. Estructura de un filtro CIC diezmador. ................................................... 15
Figura 4. Estructura de un filtro CIC interpolador. ................................................. 16
Figura 5. Modulador de fase diferencial. ............................................................... 17
Figura 6. DeModulador de fase diferencial. ........................................................... 17
Figura 7 Codificador diferencial ............................................................................. 17
Figura 8. Proceso de mapeo en constelación QPSK. ........................................... 19
Figura 9. Diagrama de Bloques del Modulador FM. .............................................. 20
Figura 10. Diagrama de Bloques del demodulador FM. ........................................ 21
Figura 11. Diagrama de bloques del modulador I/Q. ............................................. 22
Figura 12. Diagrama de Bloque Sincronizador M&M. .............................................. 23
Figura 13. Diagrama de Bloque Sincronizador M&M modificado. ............................ 24
Figura 14. Sincronizador de Trama. ...................................................................... 25
Figura 15. Codificador Convolucional.................................................................... 26
Figura 16. Diagrama de bloques general del decodificador Viterbi. ...................... 28
Figura 17. Codificador Reed-Solomon. ................................................................. 29
Figura 18. Decodificador Reed-Solomon .............................................................. 30
Figura 19. Esquema general Canal AWGN. .......................................................... 31
Figura 20. Diagrama del generador WGN. ............................................................ 32
Figura 21. Reflexión, difracción y dispersión generando varias réplicas de la señal
original enviada por el transmisor. ......................................................................... 33
Figura 22. Diagrama en bloques de un canal multitrayectoria con desvanecimiento
de Rayleigh ........................................................................................................... 33
Figura 23. Formas de onda Coseno Alzado .......................................................... 34
Figura 24. Conformador de pulso coseno alzado .................................................. 35
Figura 25. Estructura transpuesta para filtros FIR. ................................................ 36
Figura 26. Forma de onda Gaussiana. .................................................................. 37
Figura 27. Sistema transmisor/receptor QAM. ...................................................... 38
Figura 28. Sistema transmisor/receptor M-PSK. ................................................... 38
Figura 29. Sistema transmisor/receptor M-FSK. ................................................... 39
Figura 30. Sistema transmisor/receptor GMSK. .................................................... 39
Figura 31. Sistema de codificación/decodificación convolucional. ........................ 40
Figura 32. Sistema de codificación/decodificación Reed-Solomon. ...................... 40
Figura 98. Diagrama de bloques de guardado y corrección del mensaje ............ 122
Figura 99. Esquema elevador-acumulador para el cálculo de los síndromes ..... 123
Figura 100. Diagrama de entradas y salidas del cálculo de síndromes .............. 124
Figura 101. Diagrama de datos del algoritmo de Berlekamp-Massey sin inversión.
............................................................................................................................ 125
Figura 102. Circuito controlador de los multiplexores del diagrama de bloques del
algoritmo de Berlekamp-Massey. Los comparadores generan señal alta cuando
hay comparación 2𝑙 ≤ 𝑘 y 𝛿 ≠ 0.......................................................................... 125
Figura 103. Diagrama de entradas y salidas del bloque que calcula el polinomio
localizador del error. ............................................................................................ 126
Figura 104. Hardware que permite calcular las raíces del polinomio localizador
(Chien Search) .................................................................................................... 127
Figura 105. Implementación hardware para el cálculo del polinomio Ω(𝑥).......... 128
Figura 106. a) Derivada del polinomio localizador del error cuando 𝑡 es impar, b)
Derivada del polinomio localizador del error cuando 𝑡 es par. ............................ 129
Figura 107. Implementación hardware que evalúa el polinomio evaluador del error
y la derivada del polinomio localizador para luego dividirlos y obtener el polinomio
del valor del error. ............................................................................................... 130
Figura 108. Esquema general Canal AWGN. ..................................................... 131
Figura 109. Diagrama WGN. .............................................................................. 132
Figura 110. Diagrama WGN. ............................................................................... 132
Figura 111. Diagrama de pines polinomio semilla. ............................................ 133
Figura 112. Diagrama en Bloques de un Modelo Multitrayectoria. ...................... 133
Figura 113. Celda base ....................................................................................... 134
Figura 114. Sistema de Implementación Completo ............................................. 135
Figura 115. Configuración de Pines .................................................................... 136
Figura 116. Pines del bloque filtro gaussiano. ..................................................... 137
Figura 117. Diagrama de bloques filtro gaussiano con estructura polifase. ........ 138
Figura 118. Estructura interna filtros de respuesta finita al impulso. ................... 139
FICHA RESUMEN
Título: Laboratorio Modular de Comunicaciones Digitales
Código: 467
Programa de Investigación:
Facultad: Ingeniería
Entidad Cofinanciadora:
Dedicación (en
Tipo de vinculación al proyecto Nombre (s)
horas semanales)
Asesor
Código: 467
Modalidad:
Descriptores / Palabras Claves: Modulación, reconfigurable, ASK, FSK, PSK, QAM, GMSK, VHDL, FPGA
Como resultado del proyecto se tienen un conjunto de módulos hardware, los cuales pueden ser
mesclados en diferentes configuraciones para lograr múltiples esquemas de transmisión de datos
digitales, con condiciones muy similares a la de los sistemas de comunicación comercial al incluir
esquemas de detección y corrección de errores, sincronización de tiempo de símbolo,
sincronización de fase de portadora y conformación del pulso, lo que mejorar las características
espectrales, la robustez de la comunicación y los parámetros de desempeño de los sistemas
transmisión/receptor.
Con este proyecto el Programa de Ingeniería Electrónica de la universidad del Quindío y el grupo
de investigación GDSPROG, aportan al estado de arte al implementar bloques de propiedad
intelectual de algoritmos de procesamiento en comunicaciones digitales de alto desempeño, de
alto uso en sistemas de comunicación modernos. Estos módulos pueden ser usados en dispositivos
INFORME CIENTÍFICO
RESUMEN
ABSTRACT
This research project implements IP modules for the construction of educational digital
communications equipment, involving support for base band modulation schemes, channel
coding, and the emulation of communication channels on reconfigurable hardware platforms.
Blocks implemented allow configuring complete digital communication schemes that involve,
digital modulation, channel coding, channel emulation and time and phase synchronization, by
INTRODUCCIÓN
Con el ánimo de exponer de manera clara y breve el proceso de investigación y los resultados
obtenidos, el presente informe consta de tan sólo 3 secciones además de los anexos.
Por último se incluyen las conclusiones producto del proyecto de investigación, encontradas a lo
largo de la solución de los problemas de diseño de cada uno de los componentes desarrollados.
Es importante mencionar que con el ánimo de desarrollar un informe sintético, el detalle del
diseño de cada uno de los bloques hardware desarrollados se puede encontrar en los anexos.
Objetivos
General
Específicos
Desarrollar librerías sobre VHDL que implementen los esquemas de modulación digital
ASK, M-FSK, M-PSK, QAM, GFSK y GMSK.
Mediante una exploración del estado del arte, tomando principalmente estándares,
recomendaciones de la ITU y proyectos de Radio Software [1], se encontró que la alternativa que
brindaba la mejor especificidad de los algoritmos y sistemas de procesamiento de señal era la
dada en el proyecto de Radio Software libre GNURadio [1]. El principal reto con esta elección es la
dificultad que implica la implementación en hardware de algoritmos que originalmente fueron
codificados como software y su ajuste a las condiciones de las plataformas hardware utilizadas.
Del proceso de revisión de los bloques provistos por GNURadio, se encontró que no es necesario la
construcción de sistemas diferentes para cada esquema modulación, sino que basta con la
selección de bloques comunes entre ellos, con lo cual es posible crear un conjunto más amplio de
modulaciones con sólo cambiar la configuración interna de los sistemas.
Del conjunto inicial de modulaciones, se seleccionaron para su implementación total: BPSK, QPSK y
GMSK adicionalmente los códigos convolucionales y Reed-Solomon, así como la emulación de
canales Gaussiano y Rayleigh. Esto debido a que esquemas como QAM, ASK, M-FSK y GFSK se
construyen a partir de simplificaciones de los sistemas implementados.
Con el fin de comprender los algoritmos, depurar su funcionamiento de forma rápida y tener un
patrón de comparación frente a las implementaciones hardware; se procedió a la construcción de
un conjunto de funciones y scripts para MATLAB con los algoritmos y sistemas seleccionados. Estas
funciones y scritps de MATLAB permitieron durante todo el desarrollo del proyecto validar los
avances hechos a medida que se construía cada bloque, así como la calibración de parámetros
propios de cada algoritmo implementado.
Resultado de esto y partiendo de la experiencia del grupo GDSPROC con tarjetas de desarrollo de
diferentes fabricantes, y teniendo presente la compatibilidad con herramientas de medición y
desarrollo disponibles; se eligió como plataforma hardware dos tarjetas de desarrollo DE2-70 [2]
de Terasic Technologies basadas en FPGA Cyclone II de Altera. Una de las tarjetas de desarrollo
DE2-70 es mostrada en la Figura 1.
Esta elección implica, de acuerdo a las especificaciones técnicas de la tarjeta, que la interfaz
análoga que se debe usar es la dada por las entradas y salidas de audio. Esto impone restricciones
en la de tasa bit, duración de símbolo, ancho de banda y características del canal de comunicación
[19][28][10]. En este caso todos los sistemas operan a una frecuencia de muestreo igual a
72304.6875 Hz. Este valor es obtenido a partir de un PLL disponible en el FPGA el cual genera una
señal de reloj con frecuencia de 18.51 MHz, esta señal es posteriormente preescalada 256 veces
por el CODEC de audio WM8731 [12] disponible en la tarjeta DE2-70.
Teniendo en cuenta que gran parte de los algoritmos seleccionados implican operaciones de
filtrado FIR [6], es necesario adoptar una estructura de implementación de filtros FIR común, lo
que permite la utilización de la misma estructura en diferentes sistemas. En este caso se adoptó la
estructura tipo I para filtros FIR [6] dada la corta longitud de las respuestas al impulso
involucradas. La Figura 2 muestra un diagrama de bloques de la estructura directa tipo I para
filtros FIR.
Al igual que en los filtros, hay otros bloques comunes a diferentes esquemas de modulación, por lo
cual es conveniente definir una estructura común para su implementación. Estos bloques son los
encargados de realizar cambios en las tasas de muestreo y aquellos encargados de evaluar
funciones trigonométricas. Para el caso de los sistemas de incremento y decremento de las tasas
de muestreo se eligió los filtros Cascaded Integrator Comb (CIC) Hogenauer[6][7] . La Figura 3 y la
Figura 4 muestran la estructura básica para un filtro CIC diezmador e interpolador
respectivamente.
Para el caso de la evaluación de las funciones trigonométricas se construyó un módulo CORDIC [8]
que permite la evaluación de las funciones SIN, COS y ATAN a través de una reconfiguración
sencilla (ver ANEXO A:).
Para finalizar, se debe resaltar que desde la propuesta de investigación se definieron para su
emulación los canales Gaussiano y Rayleigh. Para la codificación se definieron los códigos
convolucionales y de bloques, de estos últimos se eligieron los códigos Reed-Solomon debido a su
amplio uso en estándares vigentes de comunicación.
Para la modulación en fase se consideró su forma diferencial debido a que este esquema es
robusto ante ambigüedades en la fase [19], adicionalmente la modulación en fase básica se puede
implementar fácilmente a partir de la eliminación de codificador diferencial del bloque de
modulación en fase diferencial. Los bloques para modulación y demodulación en fase son
mostrados en la Figura 5 y en la Figura 6 respectivamente.
Se puede observar que la salida del codificador diferencial solo cambia de estado (de 0 a 1 o de 1 a
0) si el bit de entrada es 1, en otro caso la salida permanece en su estado anterior.
Donde 𝑥𝑘 y 𝑦𝑘 representa los símbolos de entrada y los símbolos de salida del decodificador
diferencial respectivamente.
Las modulaciones digitales en los sistemas modernos se implementan en dos etapas principales, el
proceso de mapeo en banda base y su posterior desplazamiento a frecuencia de portadora
respectiva, esta última etapa se realiza de forma analógica, sobretodo en bandas superiores a VHF.
El mapeo en banda base consiste en asignar a un bit o conjunto de bits un único símbolo
representado por un número complejo. La magnitud y la fase del número mapeado determinan el
tipo de modulación. La Figura 8 muestra el proceso de mapeo para una constelación QPSK.
Cada número complejo representa una señal senoidal de salida cuya y amplitud dependen de la
posición del símbolo dentro del plano complejo.
En los sistemas digitales; el mapeo en banda base es realizado de forma sencilla con el uso de
tablas de búsqueda dinámica (LUTS)[6][30] .
Para el caso del de-mapeador BPSK la estimación del bit recibido se hace a partir de la información
del signo del símbolo recibido, en este caso un símbolo positivo equivale al bit “1” y un símbolo
negativo equivale al bit “0”. La implementación de este proceso en una plataforma hardware se
hace a partir de la extracción del bit de signo y su posterior complemento a 1.
Para el caso del de-mapeador QPSK la estimación de la pareja de bits recibida se hace a partir de la
información del signo de las partes real e imaginaria del símbolo recibido, a partir de esto es
posible construir una LUT que identifique la posición del símbolo recibido en los cuatro cuadrantes
de la constelación QPSK. Cada cuadrante dentro de la constelación representa una pareja de bits.
Al igual que los bloques de modulación en fase, el bloque de modulación en frecuencia (FM)
realiza su operación en banda base, posteriormente la señal a su salida es llevada a frecuencia de
portadora.
Sal_Real
EN + x CORDIC
Sal_Imag
-1 RDY
ND Z Sens
Donde 𝑑𝑔𝑎𝑖𝑛 es una constante, para compensar la ganancia del modulador FM, 𝑖𝑛(𝑘) es la
entrada actual al demodulador y 𝑜𝑢𝑡(𝑘) es la salida del mismo. La Figura 10 muestra un
diagrama de bloques del demodulador FM implementado.
En este caso, 𝑥(𝑡) representa la señal moduladora y 𝑦(𝑡) la señal I/Q. La señal 𝑧(𝑡)
representa la señal demodulada, que en caso de sincronización perfecta corresponderá
exactamente a 𝑥(𝑡).
CORDIC Algorithm
In_Real x Xn Out_Real
In_Imag y z RDY RDY
módulo 2 pi
Contador
En los sistemas de comunicación tanto el transmisor como el receptor deben tener una base de
tiempo en función de la cual se determina aspectos como el inicio de los símbolos, las tramas de
datos y las fases de señales como la portadora. La dificultad radica en que el receptor sincronice su
base de tiempo de manera que pueda decodificar las señales recibidas correctamente, más aún
cuando aspectos como la posición del receptor y su velocidad afectan las diferencias de las bases
de tiempo del transmisor y del receptor. La solución a este problema consiste en que el receptor
ajuste las características de su base de tiempo (tiempo de muestreo y fase de portadora) de
manera que se corrijan las diferencias con el fin de sincronizar. Para el caso de este proyecto se
consideraron la sincronización de tiempo de símbolo, fase de portadora e inicio de trama. Para el
caso de la sincronización de tiempo de símbolo se eligió el algoritmo de Mueller & Müller, para el
caso de la detección del inicio de trama se usó un algoritmo basado en correlación cruzada,
finalmente para la corrección de fase se usó un lazo de Costas.
y (t) Bloque
ak
Muestreador de
Decisión
Detector
de Error
M&M
x (e)
Filtro
Lazo
Cerrado
Reloj
Ajustable
La principal diferencia entre los dos algoritmos, es que en el M&M modificado se incluye un nuevo
bloque de detección de error el cual es promediado con el detector de error del algoritmo clásico
para reducir el auto-ruido inducido por el proceso de sincronización [13].
estime el inicio de la trama a partir del cálculo de la correlación cruzada entre la señal
recibida y el preámbulo.
Para esto se utiliza una estructura similar a la de un filtro FIR, con la diferencia de que no
se realiza una multiplicación sino una operación XOR con cada uno de los bits del
preámbulo, conocido tanto por el receptor como por el transmisor. La Figura 14 muestra
un diagrama de bloques del sincronizador de trama basado en correlación cruzada.
64 Muestras
IN Z
-1
Z
-1 ... Z
-1
+ OUT
El inicio de la trama de carga útil se estima a partir del valor máximo de la correlación cruzada. El
umbral de decisión es determinado de acuerdo al tipo de modulación y longitud de la secuencia de
preámbulo.
redundancia a los datos de carga útil de la información, de tal forma que el receptor pueda hacer
una recuperación de la información originalmente transmitida ante condiciones hostiles del canal
de comunicación mediante la corrección de errores.
Desde el punto de vista algorítmico, el codificador se comporta como una máquina de estados
finitos (FSM).
Las operaciones hechas por los operadores en forma de círculo corresponden a adiciones módulo-
2 de 1 bit. Nótese que por cada bit en el puerto de entrada se entregan dos bits en los puertos de
salida. La cantidad de registros y la forma en qué se conectan sus salidas a los sumadores módulo-
2 definen la característica del codificador convolucional con r=1/2. La cantidad de registros es
denotada mediante la cantidad K, que para el ejemplo es K=7.
Los códigos Reed-Solomon son códigos de bloques lineales cíclicos no binarios [19]. El uso de
códigos Reed-Solomon se ha dado principalmente en sistemas de comunicación espacial [19] y en
otros sistemas donde se requiera una alta capacidad de corrección de errores.
último se halla el polinomio del valor del error con el algoritmo de Forney [20][21].La estructura
básica del decodificador Reed-Solomon se muestra en la Figura 18.
Con el fin de poder realizar de forma práctica pruebas del efecto del canal de comunicaciones en
diferentes escenarios, es necesario crear un emulador de canal que posea la capacidad de generar
condiciones específicas de diferentes parámetros del canal como potencia de ruido y respuesta al
impulso.
Esto permite ajustar los sistemas de comunicación en un ambiente de laboratorio de forma que se
pueda inferir su comportamiento en un ambiente real.
Canal Gaussiano
El canal de ruido blanco Gaussiano aditivo (AWGN), es un modelo de canal utilizado para analizar
sistemas de comunicación [19]. Su función es adicionar ruido blanco Gaussiano a la señal que pasa
a través de él.
Donde 𝑠(𝑡) es la señal de entrada al canal y 𝑛(𝑡) es el ruido adicionado por el canal.
Canal Rayleigh
Cuando la señal que es transmitida a través de un canal sufre una serie de cambios debido a la
recepción de más de una señal, la distribución de probabilidad de este tipo de fenómenos se
denomina “Rayleigh”, siendo este un factor que reduce la eficiencia de uso del espectro cuando
en una segunda o tercera trayectoria, es atenuada o amplificada la señal [XX].
La Figura 21 muestra cómo la difracción, reflexión y dispersión pueden producir más de una señal
en el receptor.
Figura 21. Reflexión, difracción y dispersión generando varias réplicas de la señal original enviada por el
transmisor.
Este fenómeno puede ser representado a través del modelo de la Figura 22.
Dadas las limitaciones de ancho de banda de los canales de comunicación, los efectos nocivos de
la interferencia intersimbólica [10] y los requerimientos de forma del pulso de los algoritmos de
sincronización de tiempo de símbolo; los transmisores deben representar los símbolos digitales
mediante formas de onda apropiadas.
La forma de onda para un pulso coseno alzado se describe mediante la siguiente expresión,
1 𝜋𝑡
(1 + cos ( )) , |𝑡| < 𝑇
𝑔(𝑡) = {2 𝑇
0 , 𝑂𝑡𝑟𝑜𝑠
De acuerdo a la estructura polifase, por cada símbolo digital de entrada, el conformador de pulso
entrega 𝑁𝑠𝑝𝑠 muestras de la forma de onda coseno alzado.
Todos los filtro FIR fueron implementados usando la estructura transpuesta [6]. Esta estructura de
implementación es mostrada en la Figura 25.
−𝑡2
( 2)
𝑒 2𝛿
𝑔(𝑡) =
√2𝜋.𝛿
Donde
√ln(2)
𝛿=
2𝜋𝐵𝑇
Esta forma de onda presenta las mismas características del pulso coseno alzado en cuanto a
minimización de la interferencia intersímbolo y simetría par.
Posibles Configuraciones
Con los bloques básicos construidos es posible implementar muchos de los sistemas de
comunicación digital existentes, y plantear diferentes configuraciones, variar sus parámetros y
analizar en general el desempeño de estos sistemas para diferentes escenarios. Las
configuraciones básicas de sistemas de comunicación que se pueden implementar en su totalidad
con los bloques construidos se muestran a continuación.
Sistema M-QAM
La Figura 27 muestra la configuración para un sistema de comunicación QAM usando los bloques
construidos.
bits de
entrada Mapeador Conformador Interpolador Modulador Señal
de Pulso CIC I/Q
QAM
bits de
Sincronización Diezmador demodulador
salida demapeador Señal
de Tiempo de CIC I/Q QAM
símbolo y fase
Sistema M-PSK
La Figura 28 muestra la configuración para un sistema de comunicación M-PSK usando los bloques
construidos.
bits de
entrada Mapeador Conformador Interpolador Modulador Señal M-
de Pulso CIC I/Q
PSK
bits de
Sincronización Diezmador demodulador
salida demapeador Señal M-
de Tiempo de CIC I/Q PSK
símbolo y fase
Sistema M-FSK
La Figura 29 muestra la configuración para un sistema de comunicación M-FSK usando los bloques
construidos.
Mapeador
Conformador Modulador Interpolador Modulador Señal M-FSK
bits de
de Pulso FM CIC I/Q
entrada
bits de Señal
salida Sincronización demodulador Diezmador demodulador M-FSK
demapeador
de tiempo de FM CIC I/Q
símbolo
Sistema GMSK
La Figura 28 muestra la configuración para un sistema de comunicación GMSK usando los bloques
construidos.
bits de Señal
salida Sincronización demodulador Diezmador demodulador GMSK
demapeador
de tiempo de FM CIC I/Q
bit
Codificadores de Canal
bits de bits de
entrada Codificador Emulador de Decodificador salida
Convolucional Canal Viterbi
Símbolos de Símbolos
entrada Codificador Emulador de Decodificador de salida
RS Canal RS
RESULTADOS Y DISCUSIÓN
Todos los bloques desarrollados fueron probados así como también algunas de las
configuraciones posibles que se propusieron en el capítulo anterior. Estas pruebas fueron
realizadas sobre el FPGA de Altera EP2C70F896C6 que hacer parte de la tarjeta de
desarrollo DE2-70 de Terasic Technologies [2].
Las señales de prueba fueron capturadas usando el analizador lógico Signal Tap II de
Altera [14] y el simulador Modelsim-Altera de Mentor Graphics [31].
Modulador Fm
La señal data_in toma valores entre 0 y 1, y las señales d_out_imag y d_out_real son las
salidas del bloque correspondientes a la señal envolvente compleja.
varía de acuerdo con el símbolo de entrada y que la fase de las señales es continua
d_out_imag
d_out_real
data_in
Demodulador FM
El resultado obtenido para el demodulador FM del bloque receptor con el Signal Tap de
Quartus es mostrado a continuación.
Para efectos de prueba, se utilizó un bloque de memoria ROM, en el cual se guardaron dos
señales de envolvente compleja Out_rom_I y Out_rom_Q, las cuales corresponden a la
entrada de este bloque. En la salida de éste (Data_out) se puede observar la señal
demodulada.
Modulador I/Q
Esta figura fue obtenida exportando los datos generados por Signal Tap a Matlab, y
calculando posteriormente el espectro de esta señal.
Nótese que el espectro de la señal de salida está desplazada en la frecuencia hasta 10 KHz,
frecuencia de la señal portadora.
Demodulador I/Q
(a)
(b)
Figura 36. Resultados experimentales demodulador IQ. (a) espectro señal de entrada. (b) espectro
señal de salida.
El sincronizador de tiempo fue probado utilizando una trama aleatoria de bits, con un
preámbulo utilizado para estimar el comienzo de la trama. En la figura 49, donde se
muestran los resultados obtenidos en el FPGA y exportados a Matlab, se puede notar que
el error temporal mostrado en la Figura 37(a) toma valores altos mientras es procesado el
preámbulo y posteriormente los datos son sincronizados con el reloj de forma apropiada y
que la corrección temporal mostrada en la Figura 37(b) tiende a cero al mismo tiempo.
a)
b)
Detección de Preámbulo
Al tener el hardware ya generado, se procede a realizar una simulación temporal del codificador
Convolucional con las señales de entrada y salida que se muestran en la Figura 39.
𝑑𝑎𝑡𝑎_𝑖𝑛:101101110111101111101111110111111101111111000000
Al comparar la salida 𝑎 y 𝑏 con las salidas arrojadas mediante la función 𝑐𝑜𝑛𝑣𝑒𝑛𝑐 de Matlab, se
verifica que los símbolos de salida son iguales, confirmando el buen funcionamiento de este
bloque, teniendo en cuenta también que la señal de (ready) se activa en el tiempo preciso en que
es realizada la codificación.Nótese que los últimos 6 datos son cero (0) para asegurar que el
codificador termine en el estado cero, con el fin de reducir un poco la complejidad de operación
del decodificador.
Figura 40. Respuesta del codificador Convolucional utilizando el analizador lógico SignalTap II.
Con esta prueba se corrobora el buen funcionamiento del codificador Convolucional sintetizado en
el dispositivo real.
Los recursos del FPGA utilizados por el codificador Convolucional se muestran en la Tabla 1.
Recursos Utilización
Se puede notar que el uso de recursos del codificador Convolucional es demasiado bajo en
comparación a los recursos que ofrece el FPGA utilizado, permitiendo así una velocidad de
operación a una frecuencia máxima de 420.17MHz.
La simulación temporal del decodificador Viterbi se realizó de dos formas, la primera es la que se
observa en la Figura 39 en la cual los símbolos de entrada al decodificador son los mismos
arrojados por el codificador Convolucional como se ven en la Figura 41.
Figura 41. Simulación temporal del decodificador Viterbi con mensaje sin errores.
Figura 42. Simulación temporal del decodificador Viterbi con algunos errores en los símbolos de entrada.
Al mensaje codificado se le cambiaron 6 bits a propósito como se muestra en las posiciones que
indican las flechas rojas, al ingresar este nuevo mensaje modificado al decodificador Viterbi, se
observa que la trama de bits decodificados son iguales al mensaje original.
Para esta forma de simulación se realizaron diferentes pruebas aplicando varias combinaciones de
errores, obteniendo siempre una respuesta positiva de corrección en la cual siempre se mostró el
mensaje original.
Posteriormente al igual que para el codificador, se realizó la prueba en el FPGA con el SignalTap II
observándose en la Figura 43 la respuesta entregada por el decodificador.
Figura 43. Respuesta del decodificador de Viterbi utilizando el analizador lógico SignalTap II.
Como se puede observar, la respuesta tanto en la simulación temporal como en el SignalTap IIes la
misma, ya que en la ROM requerida para realizar la prueba en el FPGA se ingresaron los mismos
símbolos codificados, esto con el fin de tener un mensaje de referencia en ambas pruebas y poder
comparar los resultados de manera más eficaz.
Los recursos del FPGA utilizados por el decodificador de Viterbi se muestran en la Tabla 2.
Recursos Utilización
Capacidad de corrección: 𝑡 = 16
En las pruebas experimentales, las señales de entrada necesarias son: reloj, reset, datos y señales
de activación. El reloj y el reset se genera con los pines AD15 y T29, respectivamente, el primero es
un reloj de 50 𝑀𝐻𝑧 y el segundo un pulsor normalmente cerrado. Con respecto a las señales de
activación y los datos, se crea una memoria ROM, la cual va conectada a estas entradas,
permitiendo así el funcionamiento de los bloques.
Para corroborar que los símbolos generados por el codificador son los correctos se utilizó la
función rsenc de Matlab.
Recursos Utilización
En la figura se observa que el mensaje cuenta con 14 errores encerrados en rectángulos negros.
Recursos Utilización
Una simulación temporal del canal AWGN es llevada a cabo para verificar el correcto
funcionamiento del sistema. La Figura 48a muestra los resultados de simulación y la Figura 48b los
resultados experimentales obtenidos mediante el FPGA con el esquema de generación expuesto
en la Figura 19.
En la Figura 48a la señal (𝑐𝑙𝑒𝑎𝑟) es la encargada de activar y cargar los valores iniciales para cada
uno de los registros que conforman los LFSR, y la señal WGN, es la salida del generador de ruido
blanco que está compuesta por muestras aleatorias. La Figura 48b corresponde a los datos
experimentales que fueron adquiridos por medio del FPGA que se utilizó para el proyecto, donde
se puede observar nuevamente que la salida del generador de ruido si es aleatoria. Además puede
observarse la aleatoriedad de los datos tanto en los resultados de simulación como en los datos
experimentales. Cada una de las señales anteriormente descritas conforma una serie de números
con una distribución normal compuesta por datos de 8 bits, obteniendo así datos entre 0 y 255
para la variable aleatoria.
Para el buen entendimiento del funcionamiento del sistema se presenta a continuación los
resultados de simulación y experimentales del sistema completo.
La Figura 51 muestra los resultados del sistema para un ejemplo numérico básico, como también
el diagrama de bloques utilizado para la simulación de resultados.
Este ejemplo cuenta con una señal de reloj a una frecuencia de 6 𝑀𝐻𝑧, un último retardo a 2 𝑢𝑠 y
una señal de (clear) en un momento dado. La señal de entrada para este ejemplo es una simple
secuencia de números consecutivos (sign) que está siendo desplazada y a su vez sumada con estas
replicas, siendo así la señal (𝑜𝑢𝑡_𝑟𝑒𝑔) el último retardo de la señal de entrada. Esta señal es
solamente un indicador del último retraso del sistema, pero no es utilizado en este como tal.
La señal (𝑜𝑢𝑡_𝑔𝑒𝑛) permite encontrar la suma de todas las réplicas de la señal que se deseen ver,
como se ha dicho anteriormente estos valores son parametrizables. La Tabla 5 presenta el flujo de
este ejemplo con el fin de aclarar aún más el proceso del sistema.
En la Figura 52 se presenta una prueba de simulación y resultados experimentales del canal por
completo, adicionando como entrada al canal una señal sinusoidal previamente cargada en una
memoria ROM.
data_out
data_in
Los resultados al poner a prueba el filtro CIC interpolador en el bloque transmisor son
mostrados en la Figura 54.
Allí se puede ver como la señal de entrada (Out_rom) que son datos guardados en un
bloque de memoria ROM para efectos de prueba, están muestreados pobremente.
Sistema GMSK
Para el sistema GMSK general se hizo un análisis de desempeño tomando en cuenta dos
factores principales: la exactitud de los datos y el costo computacional. En la exactitud de
los datos se observa que los datos transmitidos correspondan a los recibidos y en la parte
del costo computacional se analiza que cantidad del FPGA es usado en todo el proyecto.
Resultados Experimentales
Utilización de Recursos
La Tabla 6 y la Tabla 7 muestran los recursos de la FPGA consumidos por el transmisor y
receptor del sistema de comunicaciones respectivamente.
Este sistema fue puesto a prueba utilizando el FPGA EP2C70F896C6 de Altera. Sin
embargo es posible utilizar una FPGA de gama baja, ya que el consumo de recursos no es
elevado.
CONCLUSIONES
EL presente proyecto es un aporte significativo a los recursos de laboratorio con que cuenta el
programa de ingeniería electrónica, el cual permitirá mejorar sustancialmente la formación de los
estudiantes en el campo de las comunicaciones digitales, los sistemas digitales y el procesamiento
de señales.
Los aspectos teóricos afrontados para la implementación de los diferentes bloques hardware
fueron estudiados a fondo y llevados al contexto de la implementación real, culminado en un
producto funcional y probado.
El proyecto fue una oportunidad para adquirir experiencia en el desarrollo de productos con
capacidad de competir con desarrollos comerciales, desde el ambiente académico, que
adicionalmente hace una contribución a la producción científica mediante la implementación
algoritmos en hardware de manera concurrente a partir de algoritmos que tradicionalmente son
implementados en software de forma secuencial.
Un aspecto importante que mostro la exploración de alternativas para el desarrollo del proyecto;
es que modelos de desarrollo tecnológico como el software libre y el hardware libre poseen la
excelente característica de permitir a los investigadores del área tecnológica, acceder a un
conocimiento detallado, practico y funcional en condiciones reales. Tradicionalmente
conocimiento con estas características era manejado en secreto por la industria lo cual hacia
bastante difícil su acceso desde el mundo académico, lo que generaba que principalmente las
universidades con condiciones para realizar alianzas con las empresas líderes en tecnología,
lograran realizar desarrollos tecnológicos competitivos con productos comerciales en el área de las
comunicaciones digitales.
El uso de habilitadores de reloj de entrada y salida permitió que la interconexión entre bloques se
hiciera de manera sencilla y confiable, esto redunda en una buena capacidad de modularidad y la
posibilidad de la construcción de múltiples configuraciones de diferentes sistemas así como el
desarrollo de nuevos módulos.
Consideramos los resultados de este proyecto muy superiores a los inicialmente esperados, pues
se logro la implementación de algoritmos de comunicaciones digitales actuales, del más alto
desempeño, en condiciones muy reales de funcionamiento. Lo que permitió a los participantes del
proyecto y al Programa un excelente acceso al estado del arte.
REFERENCIAS
[3] Modulación GMSK (20 marzo 2011), What is GMSK Modulation - Gaussian
Minimum Shift Keying, Radio Electronics, http://www.radio-
electronics.com/info/rf-technology-design/pm-phase-modulation/what-is-gmsk-
gaussian-minimum-shift-keying-tutorial.php.
[4] Modulación GMSK (20 marzo 2011), Appendix D – Digital Modulation and
GMSK, University of Hull, http://www.emc.york.ac.uk/reports/linkpcp/appD.pdf.
[5] Estructura polifase, (19 marzo 2011), Efficient Multirate Filter Structures, Douglas
L. Jones, http://cnx.org/content/m12800/latest/.
[6] U. Meyer-Baese., Digital signal processing with fiel programmable gate array, 3rd
ed., Springer-Verlag Berlin Heidelberg, 2007, p. 256.
[8] R. Andraka, ‘‘A survey of CORDIC algorithms for FPGA based computers’’,
Andraka consulting group,inc, North Kingston, 1998.
[9] Modulación I/Q (16 marzo 2011), Need for I-Q modulator and demodulator,
Krishna Sankar, http://www.dsplog.com/2008/04/05/need-for-i-q-modulator-and-
demodulator/.
[10] S. Haykin, CommunicationSystems, 4th ed., John Wiley & Sons, Inc106-129
[15] C.K.P, Clarke. Reed-Solomon error correction- En: BBC R&D White paper
WHP 031(Jul. 2002).
[18] GLAVAC, Vladimir. A VHDL Code Generator for Reed Solomon Encoders
and Decoders.Montreal, 2003, 221 h. Trabajo de grado (Maestría en Ciencia
Aplicada). Concordia University. Facultad de Ingeniería. Disponible en el catalogo
en línea del repositorio de investigación de la universidad de Concordia:
http://spectrum.library.concordia.ca/
[24] MASSEY, James L. Shift-Register Synthesis and BCH Decoding. New En:
IEEE Transactions on Information Theory. Vol. 15 (Ene, 1969). pp. 122-127. ISSN:
0018-9448.
[30] CHU, Pong. RTL Hardware Design Using VHDL: Coding for Efficiency,
Portability, and Scalability, New Yersey: John Wiley & Sons, 2005.
RESULTADOS DIRECTOS
Objetivos y Resultados Indicador de resultado
Resultados obtenidos en el
esperados planteados en el (número de publicaciones y
proyecto
proyecto ponencias)
PRODUCTOS
RESULTADOS INDIRECTOS
Resultados indirectos
Resultados indirectos
esperados planteados en el Indicador de resultado
obtenidos en el proyecto
proyecto
Problemas de gestión
Problemas técnicos
OTRAS DIFICULTADES ENCONTRADAS: La principal dificultad que limitó la finalización a tiempo del
proyecto fue la desvinculación con la Universidad de uno de los co-investigadores y el inicio de la
comisión de estudios del investigador principal inicial. El proyecto anterior de GDSPROC (383) tuvo
similares dificultades que solaparon en el tiempo con la ejecución del presente proyecto.
Proponer una asignatura electiva para el programa de ingeniería electrónica a partir de los
resultados obtenidos.
Crear un producto comercial que pueda ser distribuido como herramienta para prácticas de
laboratorio en la formación de ingenieros electrónicos y de telecomunicaciones.
ANEXOS
ANEXO A:
Tanto en el caso del interpolador como en el caso del diezmador se tienen algunos parámetros
genéricos que pueden ser modificados de acuerdo con los requerimientos del caso. Estos
parámetros son:
N: Número de etapas.
Este bloque no tiene una parte fraccional definida, ya que no tiene multiplicadores, puede trabajar
con el Q que se requiera.
control de la
Segmentación Segmentación
ND Segmentación RDY
de los Combs de los Integs
de los integs
-1
Z
ext. de -1 Inserción
DATOS EN Combs Integradores DATOS SAL
signo Z de ceros
Control del RFD RFD
La implementación del filtro CIC tiene varios aspectos importantes que vale la pena destacar
además de los componentes básicos que se vieron en el modelo teórico.
El primero de ellos es que al principio del bloque se tiene una extensión de signo; en esta parte del
sistema se agregan los bits necesarios del bit growth para las especificaciones escogidas por el
usuario. Además de eso la entrada está registrada para que no haya conflictos con los registros de
segmentación.
También se puede observar que hay un control para los registros de segmentación de los
integradores. Este sistema genera un pulso que dura R ciclos de reloj para que los integradores
procesen tanto la muestra que viene de los combinadores como los R-1 ceros agregados por el
módulo que cambia la tasa de muestreo.
Finalmente se cuenta con el control del pin RFD, éste se compone por un contador y un
comparador, el comparador se pone en alto cuando el valor del contador llega R-1 habilitando así
el pin RFD. Cuando el comparador se pone en alto no reinicia el valor del contador si no que
detiene su incremento, manteniendo así el valor R-1 hasta que el pin ND se ponga en alto, lo cual,
junto con la señal del comparador, reinicia el contador.
Segmentación Segmentación
ND Reductor RDY
de los Integs de los Combs
ext. de -1
DATOS ENT Integradores Combs DATOS SAL
signo Z
El filtro CIC diezmador cuenta con una estructura parecida al interpolador. Las principales
diferencias son que se invierte la posición de los integradores y los combinadores, y que el bloque
entre los integradores y los combinadores es un contador y un comparador que sólo deja pasar
una de cada R muestras.
Al ser segmentado y recibir los datos a la frecuencia alta de muestreo, el filtro CIC diezmador
puede recibir una muestra cada ciclo de reloj.
Una función muy importante que desempeña el filtro CIC en el sistema es que elimina la imagen
espectral presente en 20kHz después de que el espectro es trasladado otra vez a banda base; al
eliminar este espectro se evita una gran cantidad de errores producidos por el contenido
frecuencial no deseado.
Módulo CORDIC
En este módulo el Q es de 13 bits debido a que se utiliza 1 bit para el signo y 2 bits para la
parte entera, por lo tanto el valor de 𝜋 es 𝑟𝑜𝑢𝑛𝑑(𝜋 ∙ 2𝑄 ) = 25736. Para facilitar la
implementación del hardware, cada sistema que utiliza el módulo CORDIC utiliza un Q=13.
Modo Rotación
Esta implementación del CORDIC funciona en los cuatro cuadrantes. Para poder lograr
eso, se hicieron algunas consideraciones de signo en las entradas.
𝑋𝑛 = 𝑋0 𝑐𝑜𝑠𝑍0 − 𝑌0 𝑠𝑒𝑛𝑍0
𝑌𝑛 = 𝑌0 𝑐𝑜𝑠𝑍0 + 𝑋0 𝑠𝑒𝑛𝑍0
𝑍𝑛 = 0
𝑋𝑛 = 𝑋0 𝑐𝑜𝑠𝑍0
𝑌𝑛 = 𝑋0 𝑠𝑒𝑛𝑍0
Primero se estudiará la situación en que 𝑍0 > 𝜋⁄2, o en otras palabras, que el ángulo de
entrada al CORDIC se encuentra en el segundo cuadrante. En este caso el ángulo es
desfasado hasta el primer cuadrante, este corrimiento causa una inversión de signo en el
coseno del ángulo como se puede observar en la Figura 60, para compensar esto se le
cambia el signo a la salida 𝑋𝑛 , asi:
𝑍0 𝑍′0
x
𝑋𝑛 = −[𝑋0 𝑐𝑜𝑠𝑍0 ]
El caso que falta es cuando 𝑍0 < − 𝜋⁄2, o el ángulo de entrada se encuentra en el cuarto
cuadrante. En esta situación, también se desplaza el ángulo de entrada hasta el primer
cuadrante, sólo que en este caso se invierte tanto el seno como el coseno del ángulo; para
compensar estas inversiones, se cambia el signo de las salidas 𝑋𝑛 y 𝑌𝑛 .
𝑍′0
𝑍0 x
𝜋
𝑍0 > 2 ⇒ 𝑍′0 = 𝑍0 + 𝜋
𝑋𝑛 = −[𝑋0 𝑐𝑜𝑠 𝑍0 ]
𝑌𝑛 = −[𝑋0 𝑠𝑒𝑛 𝑍0 ]
Nótese que ésta solución para los otros dos cuadrantes sólo funciona cuando la entrada 𝑌0
vale 0 y el CORDIC sólo es utilizado para obtener senos y cosenos.
Cuando se necesita la ecuación completa del CORDIC (como en el caso del modulador
I/Q), las consideraciones de signo son diferentes, ya que no se puede simplemente negar
la salida completa al final del sistema como se podrá ver más adelante.
Cuando 𝑍0 > 𝜋⁄2, se hace el traspaso al primer cuadrante y se obtiene una inversión de
signo en el coseno, pero si se niega toda la salida se tiene:
En el caso de 𝑍0 < − 𝜋⁄2, al hacer el traslado del ángulo al primer cuadrante, se tiene una
negación tanto en el seno como en el coseno, por lo que sí se puede negar la salida
completa.
Como se puede observar, el problema sólo se presenta para los ángulos comprendidos en
el segundo cuadrante, y con la parte del seno de la ecuación. Para solucionar este
problema se implementó un circuito que cambia el signo de la entrada 𝑌0 para ángulos
tales que 𝜋⁄2 < 𝑍0 < 𝜋.
Este problema puede ser solucionado haciendo 𝜋 = 32768 y −𝜋 = −32768, pero estas
asignaciones no son válidas en la aritmética de punto fijo, por lo cual fue descartada esta
solución.
Cuando se asignan los valores en punto fijo se obtiene el siguiente plano polar.
y
𝜋
=12868
2
𝜋 =25736
0
x
−𝜋 =39800
2𝜋 =51471
3𝜋 𝜋
= 38603 - =52668
2 2
En este plano se presenta una gran cantidad de discontinuidades. Para evitar estas
discontinuidades se optó por un estándar de sólo ingresarle ángulos al CORDIC entre 0 y
2𝜋 en punto fijo, es decir, entre 0 y 51471 y se diseñó un circuito que identifique cuando
el valor del ángulo es mayor a 𝜋 y le sume un desplazamiento de valor (−𝜋) − (𝜋) =
39800 − 25736 = 14064, de esta forma, se eliminan todas las discontinuidades,
obteniendo un plano así:
y
𝜋
=12868
2
𝜋 =25736
x
−𝜋 =39801 2𝜋 =65535
𝜋
- =52668
2
Finalmente se obtiene una estructura robusta del algoritmo CORDIC, funcionando en los 4
cuadrantes y en aritmética de punto fijo.
-1
Z0 Z
=
Pi
evaluador evaluador Xn
Registros de segmentación
de entrada de salida
Yn
+
Offset
Modo Vectorial
Genqammod: Componente con comportamiento asíncrono que tiene como labor mapear la señal
de acuerdo a la Modulación DBPSK/DQPSK, este dispositivo entrega los valores en aritmética de
punto fijo con un Q13.
GR_DIFF_ENCODER
0 0 1 0 0 0
0 1 0 0 1 1
1 0 0 1 0 1
1 1 1 1 1 0
En la modulación QPSK sucede algo similar solo que la entrada en si es una pareja de bits que al
ser mezclado con la entrada anterior da como resultado palabras de 4 bits. El modulo (%) en esta
ocasión se obtiene como sigue: 4BITS%4. De esta manera entonces en el bloque se toma los dos
bits menos significativos de la palabra de cuatro bits para realizar esta operación modulo (%). Esto
se muestra en la Tabla 10.
Salida DQPSK
IN ANTERIOR SALIDA
00 00
01 01
00
10 10
11 11
00 01
01 01 10
10 11
11 00
00 10
01 11
10
10 00
11 01
00 11
01 00
11
10 01
11 10
Para el mapeo de los bits entregados por el bloque de modulación DPSK GR_DIFF_ENCODER_BB se
debe tener en cuenta que los datos llegan invertidos, por lo tanto simplemente se asigna el valor
de 1 en aritmética de punto fijo con un Q=13 el cual es equivalente a 8192, al bit cuyo valor sea
cero (0) y -1 (-8192 en aritmética de punto fijo con un Q=13) al bit cuyo valor sea uno (1). De esta
manera se mapea en la constelación correspondiente a la modulación BPSK y además diferencial
obteniendo entonces una modulación DBPSK. El diagrama de poines para el mapeador en
constelación BPSK se muestra en la Figura 68.
00 8192 0
01 0 8192
10 -8192 0
11 0 -8192
Tabla 11: Mapeo en constelación QPSK dada por GENQAMMOD para DQPSK
El bloque está descrito como un decodificador el cual al recibir determinado dato entrega un valor
correspondiente en aritmética de punto fijo. Este valor complejo dado por el bloque es entregado
en los pines genqamood_r y genqamood_j como se puede apreciar en la Figura 69 y en la Figura
70.
Modulador FM
Después de ser integrada, la señal es multiplicada por la sensibilidad del modulador, que para el
caso de la modulación GMSK es de 𝜋⁄2 ∙ 𝑛𝑠𝑝𝑠 donde 𝑛𝑠𝑝𝑠 es el número de muestras por símbolo
del filtro gaussiano, que en este caso particular es 8, por lo tanto la sensibilidad es de 𝜋⁄16. Este
valor garantiza que no existan discontinuidades entre un valor y otro en el modulador, reduciendo
así el ancho de banda de la señal modulada.
Finalmente se tiene un módulo CORDIC que obtiene una señal compleja en la que sus partes real e
imaginaria tienen un desfase de 𝜋⁄2 entre ellas. Esta es la manera más eficiente de lograr el índice
de modulación 0.5 necesario en la modulación binaria.
Sal_Real
EN + x CORDIC
Sal_Imag
-1 RDY
ND Z Sens
Demodulador FM
El demodulador FM es el encargado de tomar la señal compleja que sale del filtro CIC
diezmador y convertirla a una señal real que cambia su amplitud de acuerdo a los cambios
en frecuencia y fase de la señal de entrada. Para el dato de entrada se trabajó este bloque
con aritmética de punto fijo con 3 bits para la parte entera y 13 bits para la parte
fraccionaria, para la salida se usaron 5 bits para la parte entera y la misma cantidad de bits
para la parte fraccionaria para evitar desbordes en el bloque siguiente. Este aumento en la
cantidad de bits se explicará más adelante en el bloque de sincronización. La Figura 72
muestra el diagrama de bloques del demodulador FM.
Donde 𝑑𝑔𝑎𝑖𝑛 = 16/𝜋, para compensar la ganancia del modulador FM, 𝑖𝑛(𝑘) es la entrada
actual al demodulador y 𝑜𝑢𝑡(𝑘) es la salida del mismo .
El uso del módulo CORDIC genera una latencia de 16 ciclos de reloj debido a la cantidad de
iteraciones que debe realizar para obtener una salida válida.
Modulador I/Q
CORDIC Algorithm
In_Real x Xn Out_Real
In_Imag y z RDY RDY
módulo 2 pi
Contador
El modulador I/Q recibe una entrada compleja con un desfase de 𝜋/2 y la multiplica por una
portadora compleja.
En este sistema, el algoritmo CORDIC fue muy útil, porque la ecuación en su salida 𝑋𝑛 es
exactamente la operación que se debe realizar en la modulación I/Q.
Para generar la portadora de 10kHz, el sistema cuenta con un contador que incrementa en pasos
de
2𝜋∗𝑓𝑐
𝑖𝑛𝑐𝑟𝑒𝑚𝑒𝑛𝑡𝑜 = 𝑟𝑜𝑢𝑛𝑑 ( ∗ 2𝑄 )
𝑓𝑠
Para los parámetros utilizados en este sistema, el incremento del contador tiene un valor de
10541.
Además del contador, el sistema cuenta con un circuito que hace módulo 2𝜋; este circuito tiene un
comparador que selecciona la salida de un multiplexor. El sistema es mostrado en la figura 30.
Datos del
contador =
2 pi
Datos
CORDIC
-
2 pi
Demodulador I/Q
El demodulador I/Q realiza la operación inversa del modulador I/Q, por lo que a este llega una
señal de entrada, la cual es dividida y multiplicada por la parte real e imaginaria de la portadora, lo
que permite distinguir entre las componentes I y Q de la señal.
El bloque demodulador está compuesto por un contador utilizado para el funcionamiento del
bloque CORDIC, el cual es el que efectúa todas las operaciones del sistema.
El bloque CORDIC cuenta con dos salidas Xn y Yn que son la señal I y Q respectivamente, las cuales
corresponden a las salidas del demodulador.
Algoritmo CORDIC
Contador
Zo RDY
0 Xo (Imag) Xn
Data_in
Yo Nd (real) Yn
Nd
𝑍 −1
Los pines de este bloque son: data_in, que es la entrada de dato del bloque, a la cual se le realizan
las operaciones de multiplicación, Nd, la cual indica que hay un dato válido en la entrada, una
salida Rdy que, después de ser procesado el dato, se pone en alto para indicar al bloque siguiente
que hay un dato valido en la salida, y dos señales desfasadas 𝜋/2, Xn y Yn, que resultan de la
multiplicación mediante en algoritmo CORDIC; estas son las salidas del sistema.
Sistemas de sincronización de tiempo símbolo y trama: Muller Müeller Clásico y Muller Müeller
modificado.
y (t) Bloque
ak
Muestreador de
Decisión
Detector
de Error
M&M
x (e)
Filtro
Lazo
Cerrado
Reloj
Ajustable
𝑡𝑘 = 𝑘𝑇 + 𝜀̂𝑇 + 𝜏̅
Se analiza el sincronizador M&M en lazo abierto: desconectando la salida del filtro de lazo
cerrado y las propiedades de la salida del detector de error de tiempo son determinadas
en los instantes de muestreo 𝑡𝑘 correspondiendo a un valor fijo de la estimación del error
de sincronización temporal 𝜀̂.
𝑛𝑚 = 𝑛(𝑚𝑇 + 𝜏̅ + 𝜀̂ T)
Se debe aclarar que la diferencia de tiempo que se debe ajustar, se produce por dos
causas: por la diferencia de tiempo entre los relojes de los sistemas y por la deformación
asimétrica de los pulsos banda base.
𝑥𝑘 = 0.5(𝑥𝑘1 +𝑥𝑘2 )
Este promedio miniza el auto ruido total debido a que el ruido generardo en 𝑥𝑘1 está en
contra fase con el ruido generado en 𝑥𝑘2 .
El sincronizador está descrito usando aritmética de punto fijo, usando 13 bits para la parte
fraccionaria y 5 bits para la parte entera, esta cantidad de bits es escogida debido a la aritmética
del sincronizador, la cual implica acumular valores para los cuales 16 bits no serían suficientes,
además de no tener una buena precisión en los cálculos. Posee una entrada de new_data que
indica cuándo existe un nuevo dato en la entrada y una señal de ready que indica el momento en
el que una muestra válida debe ser tomada por el siguiente bloque. La Figura 76 muestra el
esquema general del sistema, en esta figura se muestran 5 bloques principales: Muestreador,
Bloque de Decisión, Detector de Error Temporal M&, Filtro de Lazo Cerrado y Reloj Ajustable.
Muestreador
El muestreador fue implementado usando un filtro FIR de orden 8 usando la estructura directa;
sin embargo, este es un filtro FIR que cambia sus coeficientes entre 129 grupos dependiendo del
error de tiempo estimado (d_mu); el diagrama de bloques de este filtro FIR es mostrado en la
figura 35.
IN Z
-1
Z
-1 ... Z
-1
+ OUT
Como se puede ver en la Figura 80, el pico de la respuesta al impulso se mueve de izquierda a
derecha. Cuando la señal es procesada, es filtrada por un conjunto de coeficientes y retrasada
dependiendo de la posición del pico del impulso de la figura.
El uso de este filtro es la razón por la cual se trabaja con 18 bits en vez de 16 como se acostumbró
en los bloques anteriores, el uso de un sumador implica que la salida será mucho más grande de la
entrada, razón por la cual no se generan desbordes.
Debido a que el sincronizador M&M depende de las decisiones tomadas, es necesario expresar
estos dos bloques como uno sólo. El Bloque de decisión toma los valores de 𝑎𝑘 , los cuales sólo
asumen valores de 1 y -1 dependiendo del signo de los valores de salida. Estos valores son usados
en este caso en particular porque el sistema de comunicación usado es binario, pero es posible
trabajarlos para distintos valores de símbolo dependiendo de la modulación. En la Figura 81 se
puede observar la implementación de este bloque en conjunto con el detector de error, el bloque
de signo (sign) es la representación del bloque de decisión.
El Detector de Error Temporal es la implementación propuesta por Mueller & Müller en su trabajo
[13]. Este bloque realiza la estimación del error temporal 𝑥(𝑒), el cual se encuentra expresado
como.
Donde 𝑎𝑘 denota la decisión tomada y 𝑦(𝑘𝑇 + 𝑒𝑇) es la señal de entrada. Cuando la señal de
salida 𝑥(𝑒) toma valores alrededor de 0, el sistema se encuentra sincronizado.
El Filtro de Lazo Cerrado procesa el error temporal y lo convierte en un valor que contiene la
estimación de la corrección que se debe hacer, el diagrama de bloques está explicado en la Figura
82.
IN X + - +
-1
Z
d_gain_mu
X +
OUT
El registro guarda la estimación de la esperanza del error temporal y el saturador previene que el
sistema se desestabilice, manteniéndolo entre valores mínimos; por su parte, la constante
d_omega_mid se encarga de mantener el valor de la esperanza alrededor de Nsps=8 que
representa el factor de diezmado que será explicado más adelante y el producto con d_gain_mu
mantiene el valor de la salida alrededor de 8.5, es decir, la salida se encuentra 8 y 9, al estar
alrededor de 8.5 cuando la esperanza del error se vuelva casi nula garantiza que se elija la
corrección temporal media, que es nula.
Reloj Ajustable
Este bloque posee un decrementador que acumula su valor con el valor proveniente del filtro de
lazo cerrado. El diagrama de bloques esta mostrado en la Figura 83.
- 1
+
0
-1
OUT
IN + 1 Z
<1
La primera vez que llega un dato a este bloque, es guardado en el registro; debido a que este valor
se encuentra entre 8 y 9, el comparador indicara que se le debe hacer un decremento cada vez
que una nueva señal de ready llegue al sincronizador, así sucesivamente hasta que el valor
registrado sea menor que 1; en ese momento una señal de habilitación (salida del comparador con
1) es enviada hacia el filtro FIR, el cual almacenará este valor y lo usará para elegir cuál de las
respuestas al impulso deben ser usadas, al mismo tiempo, un nuevo dato es almacenado y
decrementado por 8 ciclos nuevamente, este es el principio básico de la operación de diezmado.
Cada paquete de datos está encabezado por un preámbulo de 40 bits, que permite un
sincronización entre transmisor y receptor.
Para esta labor se utilizó una estructura parecida a la del filtro FIR del bloque de sincronización,
con la diferencia de que no se realiza una multiplicación sino una operación XOR con cada uno de
los valores del preámbulo previamente guardados en memoria ROM, el diagrama de este detector
es mostrado en la Figura 84.
64 Muestras
IN Z
-1
Z
-1 ... Z
-1
+ OUT
La compuerta XOR sólo tiene como salida 1 si los dos valores de entrada son iguales, razón por la
cual se realiza esta operación con los últimos 64 valores adquiridos en los registros; cuando la
suma de las salidas de estas compuertas supere un valor de umbral (55 para este caso), se indica
que el preámbulo fue procesado y que los datos de carga útil serán procesados. El valor del umbral
fue escogido de tal forma que no fuera demasiado sensible ni demasiado riguroso para nunca
activarse.
Para el codificador Convolucional se implementó una descripción en VHDL con las características
del codificador utilizado en el estándar IEEE 802.11a de la Figura 15, así como las demás señales de
sincronización como lo son, una señal de reloj (clk) y una señal de salida (ready), que señala
cuando se codificó un bit de entrada, esto con el objetivo de indicarle a otro bloque vecino cuando
hay un símbolo válido en la salida y lograr una sincronización entre ambos; también una señal de
entrada (enable) encargada de poner en funcionamiento el codificador y otra (reset) con el fin de
poner los registros en cero de manera asincrona, como se puede ver en el diagrama de la Figura
85, en la entrada (data_in) se ingresa la secuencia de bits que se quieren codificar y el símbolo
codificado sale por (𝑎 y 𝑏).
La señal de (ready) está retrasada por los registros como se muestra la Figura 86 con el fin de
compensar la latencia producida por el circuito y así sincronizar esta salida con la de los bits
decodificados.
En general se puede ver el sistema diseñado como el bloque de la Figura 87 con sus respectivos
pines de entrada y salida.
Se realizó una descripción en VHDL de cada uno de los bloques mostrados en la Figura 16, con los
demás componentes para su conexión y control de los datos, en este caso se implementó la
técnica de doble buffer [16] ya que la decodificación empieza a partir del último bit, por lo tanto se
necesita de una memoria en la salida que permita retornar los bits en el orden correcto.
Para este diseño se asumió que los 6 últimos de los 48 símbolos que entran al decodificador son
cero, lo que asegura que el codificador finaliza siempre en el estado cero [16] reduciendo un poco
la complejidad de operación del decodificador.
Al igual que el codificador, este posee las señales correspondientes para la sincronización con los
bloques vecinos, como lo es la señal de reloj (clk), la señal para iniciar la decodificación (enable), el
reset asíncrono (reset) y la señal de salida indicando cuando se inicia la decodificación del paquete
de datos (ready), dos entradas (bit_codificado_0 y bit_codificado_1) correspondientes a cada bit
del símbolo que sale del codificador y la salida para la secuencia de bits decodificada
(bit_decodificado).
Todos los pines del sistema descrito se pueden observar en el diagrama simbólico del
decodificador Viterbi de la Figura 88.
El circuito para calcular las métricas de rama queda como se aprecia en la Figura 89.
Con este circuito se calculan las métricas de acuerdo a la distancia Hamming entre los símbolos
que ingresan al decodificador y los símbolos esperados, es decir, de los bits tal como salen del
codificador, siendo 2 el máximo valor que puede tomar la distancia Hamming.
Tanto en la parte superior (1) como en la inferior (2), las ramas a tomar para pasar de un nivel a
otro dependen del bit de entrada, para este caso según las características dadas, al ir desde (1-3 o
2-3) es porque ingresó un cero y para ir de (1-4 o 2-4) ingresó un uno, esto hace que la 𝑑𝐻entre el
símbolo recibido y el esperado entre los estados sea como se ve en cada rama.
Las métricas acumuladas para cada estado se almacenan en 64 registros de 8 bits, obteniendo en
la salida las métricas acumuladas para ir al estado de destino y las rutas sobrevivientes para llegar
a cada uno de ellos [16].
La conexión entre los registros y las unidades ACS se pueden observar en la Figura 92.
Como se puede ver cada registro tiene una numeración referente a la cantidad de registros que en
este caso son 64, así también las unidades ACS tienen un cambio en sus entradas y salidas al
modificar los subíndices (𝑖 y 𝑗) de acuerdo a las características de la Figura 91; las etiquetas 𝐴, 𝐵,
𝐶y 𝐷definen un patrón de conexión en el diagrama de Trellisentre las salidas de las unidades ACS y
la entrada a los registros, notándose así que las etiquetas 𝐴 y 𝐶que pertenecen a la salida superior
de las unidades ACS van conectadas a la entrada de los registros de menor numeración, es decir, a
𝑟𝑒𝑔 0 y 𝑟𝑒𝑔 1y las salidas inferiores etiquetadas con 𝐵 y 𝐷hacen conexión con las entradas de los
registros de mayor numeración haciendo coincidir el subíndice (𝑗) con el subíndice de los registros.
El bloque de las unidades ACS presenta una salida general de las rutas sobrevivientes, las cuales
van conectadas a dos memorias que poseen 48 posiciones de 64x6, equivalentes a 384 bits [2]
como se observa en la Figura 93.
Al tener las rutas sobrevivientes se procede a almacenar los datos en las memorias de bits
decodificados, las cuales tienen 48 posiciones de 1 bit, entre estos dos bloques de memorias se
encuentra un registro que se encarga de almacenar el estado actual del codificador con el fin de
realizar el proceso de decodificación hacia atrás, a través de las rutas sobrevivientes comenzando
por el estado cero [16], el control de estas direcciones es realizado por la técnica de doble buffer
mencionada anteriormente, por lo tanto en la Figura 94 se puede contemplar la conexión entre
estos módulos.
La Figura 95 muestra la conexión completa de los bloques que conforman el decodificador Viterbi
diseñado.
El multiplexor 1 está en la posición 1 durante los 𝑘 primeros ciclos de reloj permitiendo pasar el
mensaje a los (𝑛 − 𝑘)registros de paridad para realizar la división.
El multiplexor 2 está en la posición 1 durante los 𝑘 primeros ciclos de reloj para dejar pasar
primero el mensaje.
En los restantes (𝑛 − 𝑘)ciclos de reloj el contenido de los registros de paridad va a la salida del
codificador y se obtiene el mensaje codificado.
En general el codificador tiene los puertos de entrada y salida mostrados en la Figura 97.
Como se mostró, todas las operaciones sobre el mensaje se hacen en campos de Galois, es por
eso que se deben implementar las operaciones necesarias para realizar la codificación y
decodificación. A continuación se explican las operaciones requeridas: suma, multiplicación y
división.
Es la operación más sencilla para entender e implementar en campos de Galois. La suma de dos
elementos en Galois corresponde a realizar una suma módulo 2 bit a bit de cada elemento, es
decir, realizar una XOR entre los dos elementos. En varios algoritmos usados es necesario realizar
restas, pero en Galois la resta es igual a la suma, así que esta operación incluye las dos. El código
que describe el sumador en VHDL se muestra a continuación, suponiendo que se estuviera
trabajando en 𝐺𝐹(24 ):
architecturertl of gal_sum_m4 is
begin
endrtl;
La generación del hardware necesario para la multiplicación de dos elementos del campo finito de
Galois se logra formando el producto de la representación polinomial de dos elementos generales
[4], es decir, si 𝑎y 𝑏 son dos elementos cualquiera del campo, su representación sería:
𝑎 = 𝑎𝑛−1 𝑥 𝑛−1 + ⋯ + 𝑎1 𝑥 + 𝑎0
𝑏 = 𝑏𝑛−1 𝑥 𝑛−1 + ⋯ + 𝑏1 𝑥 + 𝑏0
Para entender bien lo dicho anteriormente se mostrará un ejemplo con el campo finito 𝐺𝐹(24 )
formado por el polinomio primitivo: 𝑝(𝑥) = 𝑥 4 + 𝑥 + 1.
La generación del campo que se tomará como ejemplo se muestra en la tabla 1-2.
Sean 𝑎y𝑏dos elementos cualquiera del campo 𝐺𝐹(24 ), los cuales se representan:
𝑎 = 𝑎3 𝑥 3 + 𝑎2 𝑥 2 + 𝑎1 𝑥 + 𝑎0 ,
𝑏 = 𝑏3 𝑥 3 + 𝑏2 𝑥 2 + 𝑏1 𝑥 + 𝑏0
𝑥4 = 𝑥 + 1
𝑥 5 = 𝑥. 𝑥 4 = 𝑥 2 + 𝑥
𝑥 6 = 𝑥. 𝑥 5 = 𝑥 3 + 𝑥 2
De la ecuación anterior se puede observar que si se realiza cada operación entre cada uno los
coeficientes del polinomio 𝑎 y 𝑏, se puede obtener la multiplicación. Como cada uno de los
coeficientes corresponden a bits, las multiplicaciones se realizan con AND y las sumas con XOR.
De este modo, la descripción en hardware del multiplicador en Galois sería de la siguiente manera:
architecturertl of gal_mul_m4 is
begin
c(3)<= (a(3) AND b(3)) XOR (a(3) AND b(0)) XOR (a(2) AND b(1)) XOR (a(1) AND b(2)) XOR (a(0) AND b(3));
c(2)<= (a(3) AND b(3)) XOR (a(3) AND b(2)) XOR (a(2) AND b(3)) XOR (a(2) AND b(0)) XOR (a(1) AND b(1)) XOR
(a(0) AND b(2));
c(1)<= (a(3) AND b(2)) XOR (a(3) AND b(1)) XOR (a(2) AND b(3)) XOR (a(2) AND b(2)) XOR (a(1) AND b(3)) XOR
(a(1) AND b(0)) XOR (a(0) AND b(1));
c(0)<= (a(0) AND b(0)) XOR (a(3) AND b(1)) XOR (a(2) AND b(2)) XOR (a(1) AND b(3));
endrtl;
architecturertl of gal_div_m4 is
component gal_mul_m4 is
port(
);
end component;
signalinver: inversion:=(
"0001",
"1011",
"0101",
"1010",
"0111",
"1110",
"1111",
"1101",
"1001",
"0010",
"0100",
"1000",
"0011",
"0110",
"1100"
);
begin
mul1:
gal_mul_m4
portmap(
a=>numerador,
b=>inv,
c=>resultado
);
endrtl;
Este bloque es necesario para almacenar el mensaje cuando llega al decodificador, para que
funcione la segmentación y además poder corregir al final los errores del mensaje. Por ahorro de
hardware sólo se almacena y se corrige los primeros 2𝑚 − 1 − 2𝑡 símbolos, es decir, la
información. El sistema es mostrado en la Figura 98 y se compone de 3 bancos de registros, los
cuales tienen como función: almacenar el mensaje, posibilitar el paralelismo del sistema y permitir
la corrección. El primer banco tiene conectado a la entrada el mensaje a cada uno de los registros,
este logra almacenar el mensaje habilitando cada registro a la vez, lo cual se realiza por medio de
un decodificador, este último, se implementa como una memoria ROM conectada a un contador.
El segundo banco está conectado directamente a las salidas de los registros del banco
anterior,posibilitando así que se pueda recibir otro mensaje y que se pueda realizar la corrección
al mismo tiempo. El tercer banco tiene a su entrada un multiplexor el cual permite que el mensaje
pase del banco anterior, que se pueda corregir y que los símbolos ya corregidos salgan de forma
serial.
Como se puede observar, cuando se le envía "𝟏𝟎" a los multiplexores, el mensaje que se
encuentra en el segundo banco, puede pasar a la parte de corrección. De otro modo, si se le envía
"𝟎𝟏", el mensaje guardado en el último banco será actualizado con el mismo polinomio más el
error generado por el algoritmo de Forney. Y por último, si se le envía "𝟏𝟏", los registros estarán
en cascada y el mensaje saldrá en forma serial.
El sistema cuenta con dos máquinas de estados. La primer máquina se encarga exclusivamente de
almacenar el mensaje en el primer banco de registros y de permitir el paso al segundo banco en el
siguiente ciclo después de recibir los 2𝑚 − 1 − 2𝑡 símbolos del mensaje.
La segunda máquina se encarga de esperar que el bloque que desarrolla el algoritmo de Forney
termine, para así llevar el mensaje que se encuentra en el segundo banco de registros al tercero,
además de ello permite la suma del polinomio del error, y por ultimo conectar los registros en
cascada y esperar a que salga el mensaje completo.
Como se explicó anteriormente el cálculo de los síndromes se realiza para saber si el mensaje tiene
o no errores, así que es el primer paso en la implementación del decodificador.
Para realizar el cálculo de los síndromes se usa el esquema de un elevador y la salida de éste se
conecta a un acumulador para llevar la cuenta, el esquema completo se muestra en la Figura 99.
Como es de esperarse, debido a que son 2𝑡 síndromes a calcular se usa esta misma cantidad de
elevador-acumulador.
El símbolo con la mayor potencia es el primero en llegar al receptor, así que el valor inicial de cada
elevador debe ser la raíz a evaluar elevada a la 𝑛, mientras que el factor de multiplicación debe ser
el inverso de la raíz que se está evaluando.
El habilitador general del decodificador, activa la máquina de estados que controla el cálculo de
síndromes, este a su vez en el primer instante de tiempo inicializa el registro elevador con el valor
de inicialización antes mencionado para su correcto funcionamiento. La máquina de estados
también genera una señal de (ready) cuando el mensaje ha pasado completamente para activar el
siguiente bloque y para activar unos registros de desplazamiento los cuales permiten que los
síndromes, que se encuentran concatenados en una sola señal, salgan de forma serial con el fin de
que el bloque que determina del polinomio localizador del error funcione. Además de esto
también tiene una salida que contiene los síndromes concatenados, que sirve para luego hacer
funcionar el bloque del algoritmo de Forney. El diagrama de pines de entrada y salida de este
bloque se muestra en la Figura 100.
Según [22] el algoritmo puede ser implementado como se muestra en la Figura 101, en ella se
puede observar que la única entrada necesaria para el cálculo del polinomio localizador del error
son los síndromes obtenidos en el bloque anterior. El polinomio tendrá como máximo 𝑡 raíces, es
decir, el número de errores que puede corregir, así que 𝑡 + 1 es el número máximo de ramas
necesarias para el desarrollo del algoritmo. Los registros 𝑇 se usan para guardar los síndromes
entrantes, los 𝜆 para guardar el polinomio auxiliar y los 𝜇 para guardar el polinomio localizador del
error. También están los registros 𝛾, 𝑙 y 𝑘 para guardar los valores respectivos de 𝛾, 𝑙 y 𝑘. El
circuito que genera la señal que va a los multiplexores es mostrado en la Figura 102. El sistema
total es controlado por una máquina de estados la cual se encarga de esperar los 2𝑡 ciclos que se
demora en calcular el polinomio localizador 𝜇, para luego generar una salida serial de cada
coeficiente con el fin calcular sus raíces en el bloque del algoritmo de Chien. También se tiene una
salida con todos los coeficientes concatenados para usarlos en el algoritmo de Forney.
Figura 102. Circuito controlador de los multiplexores del diagrama de bloques del algoritmo de Berlekamp-
Massey. Los comparadores generan señal alta cuando hay comparación 𝟐𝒍 ≤ 𝒌 y 𝜹 ≠ 𝟎.
Figura 103. Diagrama de entradas y salidas del bloque que calcula el polinomio localizador del error.
Este algoritmo es realmente rápido en términos de hardware debido a que puede ser
implementado de manera que funcione de forma paralela y así hallar las raíces del polinomio
localizador simultáneamente en 𝑡 + 1 ciclos de reloj.
La parte que interesa del mensaje son los primeros 𝑘 símbolos que corresponden a la información,
así que la corrección se realiza solamente para estos símbolos, por tanto solo se evalúan las raíces
que localizan el error en esta parte del mensaje. La implementación de este algoritmo se muestra
en la Figura 104 y es muy similar a la del cálculo de los síndromes, es decir, tiene un elevador y
acumulador, pero además de ello un comparador para saber que raíces hacen cero el polinomio.
Las raíces que se obtienen en este algoritmo deben ser evaluadas en el algoritmo de Forney, pero
el inverso de estas será la ubicación exacta del error. El mensaje, como se explicó anteriormente,
se encuentra en un banco de registros esperando por el polinomio del error; de modo que este
polinomio debe tener sus coeficientes ubicados en los correspondientes símbolos erróneos. Así
que este bloque producirá una salida de (2𝑚 − 1 − 2𝑡) ∗ 𝑚 bits que contendrá en la posición
correspondiente las raíces que se obtienen por medio del algoritmo. Al final de la evaluación del
polinomio localizador del error, se tendrá una salida, en el peor caso, con 2𝑡 raíces y el resto en
ceros, que luego el algoritmo de Forney utilizará como valores iníciales para evaluar el polinomio
del valor del error y la derivada del polinomio localizador; y de esta forma obtener el valor del
error localizado en la posición donde sea necesario.
Figura 104. Hardware que permite calcular las raíces del polinomio localizador (Chien Search)
Para desarrollar el algoritmo de Forney se necesita tener el polinomio evaluador del error Ω(𝑥),
el cual se obtiene multiplicando el polinomio localizador del error y un polinomio formado por los
síndromes modulo 𝑡, es decir:
Ω(𝑥) = 𝜇1 𝑆1 + 𝜇2 𝑆1 𝑥 + 𝜇3 𝑆1 𝑥 2 + 𝜇4 𝑆1 𝑥 3
+𝜇1 𝑆2 𝑥 + 𝜇2 𝑆2 𝑥 2 + 𝜇3 𝑆2 𝑥 3 + 𝜇4 𝑆2 𝑥 4
+𝜇1 𝑆3 𝑥 2 + 𝜇2 𝑆3 𝑥 3 + 𝜇3 𝑆3 𝑥 4 + 𝜇4 𝑆3 𝑥 5
+𝜇1 𝑆4 𝑥 3 + 𝜇2 𝑆4 𝑥 4 + 𝜇3 𝑆4 𝑥 5 + 𝜇4 𝑆4 𝑥 6
+𝝁𝟏 𝑺𝟓 𝒙𝟒 + 𝝁𝟐 𝑺𝟓 𝒙𝟓 + 𝝁𝟑 𝑺𝟓 𝒙𝟔 + 𝝁𝟒 𝑺𝟓 𝒙𝟕
+𝜇1 𝑆6 𝑥 5 + 𝜇2 𝑆6 𝑥 6 + 𝜇3 𝑆6 𝑥 7 + 𝜇4 𝑆6 𝑥 8
Para el desarrollo del algoritmo también se necesita la derivada del polinomio localizador, la
derivada se obtiene de la forma tradicional sólo que los coeficientes que en un principio tenían
variable con exponente par, desaparecen debido a que la suma de un número par de elementos
en Galois siempre da 0 y los de potencia impar seguirán siendo el mismo elemento. Con el fin de
evaluar el polinomio con las raíces obtenidas en Chien, la derivada del polinomio se implementa
con registros de desplazamiento, en los que los registros impares serán cargados con los valores
sobrevivientes y los registros pares con 0, tal como se muestra en la Figura 106.
Figura 106. a) Derivada del polinomio localizador del error cuando 𝒕 es impar, b) Derivada del polinomio
localizador del error cuando 𝒕 es par.
Figura 107. Implementación hardware que evalúa el polinomio evaluador del error y la derivada del
polinomio localizador para luego dividirlos y obtener el polinomio del valor del error.
El algoritmo de Forney establece que el polinomio del valor del error se calcula de la siguiente
forma:
Ω(𝑋𝑘 )
𝑒(𝑥) =
𝜇′ (𝑋𝑘 )
Donde 𝑋𝑘 es el inverso de las raíces del polinomio localizador del error. Cabe resaltar que desde el
bloque de Chien, el vector de raíces que genera ya son el inverso de las raíces, así que en este
bloque no es necesario realizar la inversión. Por tanto, se necesita otro bloque como el de la Figura
107 que evalúe los polinomios mientras se están creando, y realizar la división de estos para
obtener finalmente el polinomio del valor del error 𝑒(𝑥), con el fin de sumarlo a la información
que llegó y así obtener el mensaje enviado desde el receptor.
La función del canal AWGN es adicionar un ruido blanco Gaussiano a la señal que pasa a
través de él, teniendo en cuenta esta aclaración se propone un esquema de generación
del ruido blanco Gaussiano como se observa en la Figura 108.
La generación del ruido blanco fue implementada mediante 10 variables aleatorias diferentes
distribuidas uniformemente, a las cuales se les pueden ser parametrizadostanto en el tamaño de
los registros como la longitud, forma y valor inicial del polinomio semilla (generador), además de
poder parametrizar la relación señal a ruido para el canal. La figura Figura 109 muestra el esquema
general de generación del ruido con distribución normal. Se debe tener en cuenta que la relación
señal a ruido que es ingresada está en decibeles, sabiendo que esta descrita como:
Cada una de las variables aleatorias que componen el sistema están descritas por un grado
diferente para cada par de polinomios utilizado, logrando así describir con buena aproximación el
ruido blanco encontrado en toda clase de ambientes y aplicaciones. El sistema está en capacidad
de proveer para cada ciclo de reloj un valor diferente de acuerdo a la varianza y media que se le
haya configurado para la simulación que se desee realizar.
Además de las señales asociadas a los bits de salida, se incluye una señal de reloj que permite una
fácil sincronización de la operación del generador de ruido blanco Gaussiano con los bloques
vecinos.
En cuanto a la creación de cada una de las variables con distribución uniforme la Figura 111
muestra el diagrama de pines:
Estas variables fueron implementadas mediante estructura LFSR, teniendo en cuenta que cada
uno de los polinomios semilla es diferente tanto en su grado como en el valor de inicio.
El modelo clásico adoptado a los canales se basa en una línea de retardos, donde cada salto
representa unaseñal con un retardo 𝑇𝑥 y tiene una amplitud variable 𝐴𝑥 . Estos saltos se
consideran no correlacionados entre sí, debido a que cada uno proviene de obstáculos diferentes.
La Figura 112 ilustra un diagrama de bloques general para un modelo multitrayectoria de un canal
con este tipo de desvanecimiento.
Usualmente la ganancia de cada una de las réplicas que son agregadas a la señal original es
modelada mediante la distribución de Rice o Rayleigh.
La imagen anterior es una celda que compone el sistema completo. Cada una de estas celdas que
se observa es un retraso que se le aplica a la señal original, contando con una resolución de dos
ciclos de reloj por cada uno de los retrasos. El sistema está diseñado para funcionar a frecuencia,
número, posición y valor de retardos parametrizables, estableciendo así un modelo general para
describir todo tipo de ambiente con este tipo de desvanecimiento previamente estudiado y
caracterizado. El sistema completo se implementa en la Figura 114.
La estructura LFSR implementada proporciona una señal de retraso de la original para cada dos
ciclos de reloj, como se ha dicho anteriormente estos serán los retrasos implementados para la
simulación del canal. El funcionamiento de este sistema es el siguiente: los multiplexores son los
encargados de seleccionar cuáles serán los retardos que se desean agregar a la señal colocando a
la salida un ‘0’, si la posición no coincide con la deseada por el usuario; y un ‘1’ si esta salida 𝑥 es el
retardo deseado, conectando también cada uno de los multiplicadores que modificara la potencia
instantánea de cada una de las réplicas de la señal original; estos valores serán cargados
previamente. Luego cada uno de los retrasos se sumara con el siguiente sin importar que se
sumen todos, ya que los que no son deseados su valor será cero ‘0’, obteniendo así el resultado
esperado.
Como se puede observar cuenta con una señal de reloj que sincroniza el trabajo de este bloque,no
sólo de este mismo, sino también con otros que sean implementados para el uso conjunto,
además cuenta con una señal de (clear) para los registros que componen el sistema que a su vez
permite la salida de este.
Filtro Gaussiano
El filtro gaussiano realizado tiene una estructura polifase, lo que significa que está dispuesto de tal
forma que se encuentra expresado en 8 filtros en paralelo, que permite obtener 8 sub-señales
distintas correspondientes a la respuesta del filtro.
La entidad del filtro gaussiano tiene los pines de entrada y salida mostrados en la Figura 116.
Data_in Data_out
ND RFD
Clk RDY
Reset_n
Los pines data_in y data_out, son el dato de entrada y salida respectivamente, hay además un pin
llamado ND que controla la entrada de dato nuevo al sistema, informando la llegada de un dato
valido que deberá ser procesado, una señal de reloj (Clk), que es igual en todos los bloques por la
característica síncrona del sistema, una señal RFD que indica cuando el sistema está listo para
recibir nuevos datos, y que permanece en bajo cuando el sistema se encuentra ocupado
realizando una operación, un pin RDY que informa al siguiente bloque del sistema cuando hay un
dato válido en la salida data_out, para que este continúe con el procesamiento de la señal, y una
señal de Reset asíncrona (Reset_n), que es activa en bajo.
Así pues, el filtro gaussiano se compone de 8 grupos de filtros de respuesta finita al impulso (FIR)
con estructura simétrica, lo que ofrece menor costo computacional y un control más simple del
sistema. La Figura 117 muestra el diagrama de bloques del filtro gaussiano interpolador, con
estructura polifase. En él se puede observar la estructura interna del sistema, que se compone de
un banco de filtros ya mencionados que procesan la señal de entrada al transmisor, un multiplexor
y un bloque de control.
El ancho de banda del filtro gaussiano es de aproximadamente 1.400 Hz con el fin de cumplir con
el estándar de GMSK [3][4], para obtener esta respuesta se necesita un filtro gaussiano de orden
40.
Debido al orden 40 de la respuesta gaussiana deseada, se obtuvo el orden 4 de cada uno de los
filtros en el sistema, por lo que cada uno está compuesto por 5 registros en serie que retrasan la
señal y multiplicadores que realizan la operación con cada uno de los coeficientes del filtro;
posteriormente estos resultados se suman para obtener un dato de salida.
La Figura 118 muestra la estructura interna de cada filtro FIR dispuesto en el banco. Los
coeficientes correspondientes a cada bloque fueron calculados mediante la función gaussfir( ) en
MATLAB y posteriormente guardados como constantes en el sistema.
El bloque control Control pin RDY y multiplexor tiene como objetivo asegurar una señal válida a la
salida del bloque. Este trabajo es realizado en conjunto con el multiplexor, el cual está encargado
de seleccionar una de las salidas del banco de filtros a la vez. Este bloque está compuesto por un
contador y un comparador que sostiene la señal RDY durante los ciclos de reloj en los que se están
enviando salidas válidas.
Además, este bloque controla el pin de RFD poniéndolo en alto cuando todos los filtros han
procesado un dato de entrada y enviado un dato válido a la salida del bloque.
Este bloque tiene un parámetro modificable, el tamaño de palabra del dato de entrada y salida.
Además, es posible cambiar los coeficientes del banco de filtros FIR si es necesario.
El canal de transmisión debe ser implementado con el fin de aislar los relojes del transmisor y el
receptor; la frecuencia de la portadora es de 10 kHz, razón por la cual resulta conveniente hacer
esta implementación usando el CODEC de audio WM8731[12] contenido en la tarjeta DE-270 de
Altera [2].
La configuración de los registros del CODEC fue hecha usando el procesador NIOS II, por medio del
cual se alteran los registros bajo lenguaje C. en esta configuración se usó el CODEC en modo
maestro sin usar ganancias ni atenuaciones para no saturar o perder información en el canal.
Debido a que el sistema completo se implementó en un único FPGA, el canal de audio fue
conectado de manera retroalimentada, es decir, el canal de salida fue directamente conectado al
canal de entrada.
ANEXO B:
Nota: para instalar el driver del USB_blaster correctamente en Windows 7, se debe tener
desactivado el requerimiento de controladores firmados. Para hacer esto se presiona la
tecla F8 repetidamente al prender el computador y se elige la opción que deshabilita el
uso de controladores firmados.
Los mensajes contenidos en el documento de texto deben tener el formato que genera el
programa de matlab gen_msn_dec.m para el decodificador y gen_msn_enc.m.
1001
0010
0011
0000
0000
0001
0011
1001
0010
0011
0000
0000
0001
0011
Así que dependiendo del propósito, se puede crear el proyecto con la entidad de nivel alto
deseada.
Práctica 1
7 errores.
8 errores.
9 errores.
10 errores.
Práctica 2
7 errores.
8 errores.
9 errores.
10 errores.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity Sistema is
generic
n : natural:=63;
m : natural:=6;
t : natural:=8
);
port
clk : in std_logic;
reset : in std_logic;
);
end entity;
component Enc_Reed_Solomon_signal is
generic
n : natural;
m : natural;
t : natural
);
port
clk : in std_logic;
reset : in std_logic;
);
end component;
component Dec_Reed_Solomon is
generic
n : natural;
m : natural;
t : natural
);
port
enable : in std_logic;
clk : in std_logic;
reset : in std_logic;
);
end component;
component AWGN_Channel is
generic
m : natural
);
port(
reset : in std_logic;
enable: in std_logic;
clk : in std_logic
);
end component;
begin
msn_cod <=msn_cod_2_ch;
msn_noise<=msn_ch_2_dec;
Codificador:
Enc_Reed_Solomon_signal
generic map(m=>m,t=>t,n=>n)
port map(
clk =>clk,
reset =>reset,
enable =>enable,
msn =>msn,
msn_cod=>msn_cod_2_ch,
ready =>ready_cod_2_ch
);
Decodicador:
Dec_Reed_Solomon
generic map(m=>m,t=>t,n=>n)
port map(
enable =>ready_ch_2_dec,
clk =>clk,
reset =>reset,
msn =>msn_ch_2_dec,
msn_dec=>msn_dec,
ready =>ready_dec
);
Canal:
AWGN_Channel
generic map(m=>m)
port map(
data =>msn_cod_2_ch,
sal =>msn_ch_2_dec,
enable=>ready_cod_2_ch,
reset =>reset,
ready =>ready_ch_2_dec,
clk =>clk
);
end rtl;
Práctica 3
PRÁCTICA 1.
Para programar el FPGA se debe hacer clic en el botón (programmer), luego hacer clic en el
botón Hardware Setup y seleccionar USB-Blaster. Finalmente se hace clic en el botón Start.
Clic derecho en la ventana desplegable NIOS II C/C++ projects contenida en la parte de izquierda,
luego dar clic en import…, hacer clic en altera NIOS II, clic en import NIOS II IDE Project into
workspace. Seleccionar el proyecto simple_270 de la carpeta software. Finalmente hacer clic en el
botón finish. Con el fin de importar el proyecto en lenguaje C que configura el CODEC y poderlo
compilar.
Dar clic en el botón (Run) y esperar por el aviso “Codec programmed”, luego dar clic en el
botón (terminate).
Abrir el proyecto completo del sistema GMSK en Quartus II. Hacer clic en el botón settings del
menú assignments. Se abre una ventana. Dar clic en la opción Signal Tap II Logic Analizer y allí
seleccionar el archivo stp_BER.stp. Este paso se realiza con el fin de agregar el hardware necesario
para la obtención de datos del sistema por medio del Signal Tap II Logic Analizer.
Abrir el programa get_rom_in de MATLAB para generar los datos de entrada. Reemplazar el
contenido del archivo senal.vhd (en el proyecto de Quartus) por el contenido de rom_in_GMSK.txt
situado en el directorio de MATLAB.
Compilar el proyecto.
Programar el FPGA.
Los pasos realizados a continuación son con el fin de empezar a adquirir datos desde el FPGA.
Abrir el Signal Tap haciendo clic en el botón Signal Tap II Logic Analizer del menú Tools.
Hacer clic en la pestaña Setup y luego seleccionar el USB-Blaster en la opción Hardware haciendo
clic en el botón Setup.
Hacer clic en el botón (autorun analysis) para empezar a obtener datos desde el FPGA.
Después de haber visto el funcionamiento del sistema, hacer clic en el botón (stop analysis).
Hacer clic en el menú File, buscar la opción Create / Update, y hacer clic en la opción Create
SignalTap II list file. (esto genera un archivo .txt que contiene los datos obtenidos por el Signal Tap,
necesario para hacer los test de rendimiento del sistema. El archivo se crea en la carpeta del
proyecto de Quartus).
PRÁCTICA 2.
Para programar la FPGA se debe hacer clic en el botón (programmer), luego hacer clic en el
botón Hardware Setup y seleccionar USB-Blaster. Finalmente se hace clic en el botón Start.
Clic derecho en la ventana desplegable NIOS II C/C++ projects contenida en la parte de izquierda,
luego dar clic en import…, hacer clic en altera NIOS II, clic en import NIOS II IDE Project into
workspace. Seleccionar el proyecto simple_270 de la carpeta software. Finalmente hacer clic en el
botón finish. Con el fin de importar el proyecto en lenguaje C que configura el CODEC y poderlo
compilar.
Dar clic en el botón (Run) y esperar por el aviso “Codec programmed”, luego dar clic en el
botón (terminate).
Abrir el proyecto completo, hacer clic en el botón settings del menú assignments. Se abre una
ventana. Dar clic en la opción Signal Tap II Logic Analizer y allí seleccionar el archivo stp_EE.stp.
Este paso se realiza con el fin de agregar el hardware necesario para la obtención de datos del
sistema por medio del Signal Tap II Logic Analizer.
Compilar el proyecto.
Programar el FPGA.
Los pasos realizados a continuación son con el fin de empezar a adquirir datos desde el FPGA.
Abrir el Signal Tap haciendo clic en el botón Signal Tap II Logic Analizer del menú Tools.
Hacer clic en la pestaña Setup y luego seleccionar el USB-Blaster en la opción Hardware haciendo
clic en el botón Setup.
Hacer clic en el botón (autorun analysis) para empezar a obtener datos desde la FPGA.
Después de haber visto el funcionamiento del sistema, hacer clic en el botón (stop analysis).
Hacer clic en el menú File, buscar la opción Create / Update, y hacer clic en la opción Create
SignalTap II list file. (esto genera un archivo .txt que contiene los datos obtenidos por el Signal Tap,
necesario para hacer los test de rendimiento del sistema. El archivo se crea en la carpeta del
proyecto de Quartus).
PRáCTICA 3.
Los parámetros que se pueden modificar sin alterar el funcionamiento total del sistema se
encuentran en la entidad de alto nivel completo, y son:
ANEXO C:
FILTROS CIC
INTRODUCCIÓN
Son filtros de respuesta finita al impulso (FIR) que se utilizan para cambiar la frecuencia de
muestreo de una señal drásticamente.
control de la
Segmentación Segmentación
ND Segmentación RDY
de los Combs de los Integs
de los integs
-1
Z
ext. de -1 Inserción
DATOS EN Combs Integradores DATOS SAL
signo Z de ceros
Interpolador.
Segmentación Segmentación
ND Reductor RDY
de los Integs de los Combs
ext. de -1
DATOS ENT Integradores Combs DATOS SAL
signo Z
Diezmador.
Parámetros modificables
Estos filtros tienen tres parámetros modificables para ajustarse a diferentes necesidades:
R: Factor de re-muestreo.
N: Número de etapas.
ND: Este pin es para controlar los datos de entrada, debe estar activo durante un ciclo de
reloj cada vez que se quiera ingresar un dato al sistema.
RFD: Cuando este pin está en nivel alto, el sistema está listo para recibir datos.
CLK: reloj del filtro, este reloj debe ser al menos de la frecuencia más alta del sistema.
RDY: Cuando se encuentra en nivel alto, indica que hay un dato válido en el bus d_out.
DIAGRAMAS DE TIEMPOS
Este diagrama de tiempos muestra un caso en el cual se le ingresan datos un filtro CIC
interpolador cada R+1 ciclos de reloj. Los parámetros seleccionados fueron R=8, B=8 y
N=4.
EJEMPLOS DE INSTANCIACIÓN
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity prueba_interpolador is
generic
DATA_WIDTH : natural := 16
);
port
clk: in std_logic;
reset_n: in std_logic;
nd: in std_logic;
);
end entity;
component cic_filter is
generic
--||||PARÁMETROS MODIFICABLES||||--
B : natural := 8;
R : natural:= 6;
N : natural:= 8
);
port
nd: in std_logic;
clk: in std_logic;
reset_n: in std_logic;
);
end component;
begin
interpolador: cic_filter
generic map(
R=>6,--factor de interpolado
N=>8—numero de etapas
port map(
d_in=>data_in,
d_out=>out_CIC,
nd=>nd,
rfd=>rfd,
clk=>clk,
reset_n=>reset_n,
rdy=>rdy
);
end rtl;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity prueba_diezmador is
generic
DATA_WIDTH : natural := 16
);
port
clk: in std_logic;
reset_n: in std_logic;
nd: in std_logic;
);
end entity;
component diezmador is
generic
--||||PARÁMETROS MODIFICABLES||||--
R=>6,--factor de interpolado
N=>8—numero de etapas
);
port
nd: in std_logic;
clk: in std_logic;
reset_n: in std_logic;
);
end component;
begin
diezm: diezmador
generic map(
B=>DATA_WIDTH,
R=>6,
N=>8
port map(
d_in=>data_in,
d_out=>out_CIC,
nd=>nd,
rfd=>rfd,
clk=>clk,
reset_n=>reset_n,
rdy=>rdy
);
end rtl;
MODULADOR FM
INTRODUCCION
A la salida del modulador se presenta una señal compleja con sus partes real e imaginaria
desfasadas 90°.
Sal_Real
EN + x CORDIC
Sal_Imag
-1 RDY
ND Z Sens
Parámetros modificables
D: Sensibilidad de la modulación.
La sensibilidad de la modulación tiene que estar representada en punto fijo con una parte
fraccionaria Q=13. Su valor por defecto es de 𝜋⁄2 ∙ 𝑛𝑠𝑝𝑠 donde 𝑛𝑠𝑝𝑠 es el número de
muestras por símbolo del filtro gaussiano, que en este caso particular es 8.
d_out_sin
d_in
d_out_cos
ND
clk
reset_n RDY
d_out_cos, d_out_sin: Buses de datos de salida (entre los dos forman la señal compleja).
ND: Este pin es para controlar los datos de entrada, debe estar activo durante un ciclo de
reloj cada vez que se quiera ingresar un dato al sistema.
clk: reloj del filtro, este reloj debe ser al menos de la frecuencia más alta del sistema.
RDY: Cuando se encuentra en nivel alto, indica que hay un dato válido en los buses
d_out_cos, d_out_sin.
DIAGRAMAS DE TIEMPOS
Este diagrama de tiempos muestra el funcionamiento del modulador FM. Los parámetros
seleccionados fueron d=1608 y B=16.
En esta figura se puede observar como la frecuencia de la salida varía con respecto al valor
de la entrada, además se puede observar el desfase de 90° entre la señal real y la
imaginaria.
EJEMPLO DE INSTANCIACIÓN
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity prueba_FM is
generic
B: natural := 16
);
port
clk: in std_logic;
nd: in std_logic;
reset_n: in std_logic;
);
end entity;
component mod_fm is
generic
--||||PARÁMETROS MODIFICABLES||||--
B : natural := 16;
d : natural:= 1608
);
port
nd: in std_logic;
clk: in std_logic;
reset_n: in std_logic;
);
end component;
----------------------------------------------------------
----------------------------------------------------------
begin
modulador: mod_fm
generic map(
port map(
d_in=>data_in,
d_out_sin=>d_out_sin,
d_out_cos=>d_out_cos,
nd=>nd,
clk=>clk,
reset_n=>reset_n,
rdy=>rdy
);
end rtl;
MODULADOR I/Q
INTRODUCCION
El modulador I/Q recibe una entrada compleja con un desfase de 90° y la multiplica por
una señal compleja con el fin de realizar un traslado en frecuencia.
Este sistema se utiliza en la etapa de transmisión para llevar los datos desde banda base
hasta la frecuencia de la señal portadora.
CORDIC Algorithm
In_Real x Xn Sal
In_Imag y z RDY RDY
módulo 2 pi
Contador
Parámetros modificables
Este sistema tiene dos parámetros modificables para ajustarse a diferentes necesidades:
2𝜋 ∗ 𝑓𝑐
𝑖𝑛𝑐𝑟𝑒𝑚𝑒𝑛𝑡𝑜 = ∗ 2𝑄
𝑓𝑠
in_real
in_imag
ND sal
clk
reset_n RDY
ND: Este pin es para controlar los datos de entrada, debe estar activo durante un ciclo de
reloj cada vez que se quiera ingresar un dato al sistema.
clk: reloj del sistema, este reloj debe ser al menos de la frecuencia más alta del sistema.
RDY: Cuando se encuentra en nivel alto, indica que hay un dato válido en el bus sal.
DIAGRAMAS DE TIEMPOS
Este diagrama de tiempos muestra el funcionamiento del modulador I/Q. Los parámetros
seleccionados fueron incremento=15725 y B=16.
EJEMPLO DE INSTANCIACIÓN
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity prueba_IQ is
generic
B: natural := 16;
);
port
nd : in std_logic;
reset_n : in std_logic;
clk : in std_logic;
);
end entity;
component mod_IQ is
generic
B : natural := 16;
);
port
reset_n : in std_logic;
clk : in std_logic;
nd : in std_logic;
);
end component;
begin
modulador: mod_IQ
generic map(
port map(
sal=>sal,
in_real=>d_real,
in_imag=>d_imag,
nd=>nd,
clk=>clk,
reset_n=>reset_n,
rdy=>rdy
);
end rtl;
DEMODULADOR I/Q
INTRODUCCION
Este demodulador realiza la operación inversa del modulador I/Q, recibe una entrada
desplazada en frecuencia y realiza una operación de multiplicación por una exponencial
compleja para trasladar nuevamente la señal a su posición original en banda base.
Algoritmo CORDIC
Contador
Zo RDY
0 Xo (Imag) Xn
Data_in
Yo Nd (real) Yn
Nd
𝑍 −1
Parámetros modificables
El sistema de demodulación I/Q cuenta con una serie de parámetros modificables iguales
a los del modulador, nombrados a continuación:
2𝜋 ∗ 𝑓𝑐
𝑖𝑛𝑐𝑟𝑒𝑚𝑒𝑛𝑡𝑜 = ∗ 2𝑄
𝑓𝑠
Donde Q es la parte fraccionaria de los datos que para este bloque particularmente tiene
un valor de 𝑄 = 13.
Data_in RDY
Nd (Imag) Xn
Clk (Real) Yn
Reset_n
En esta entidad:
Nd: indica una entrada valida en el bus data_in, por lo cual se coloca en alto durante un
ciclo de reloj cada vez que se desea entrar un dato al sistema.
Clk: señal de reloj del sistema. Esta señal es común para todos los módulos.
RDY: esta señal esta en alto cuando el bloque indica que existe un dato valido en las
salidas.
DIAGRAMA DE TIEMPO
Diagrama de tiempos
Se puede observar que por cada dato en la entrada del demodulador se obtiene un dato
tanto real como imaginario a la salida del mismo.
EJEMPLO DE INSTANCIACION
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity prueba_demIQ is
generic
B: natural := 16;
);
port
nd : in std_logic;
reset_n : in std_logic;
clk : in std_logic;
);
end entity;
component dem_IQ is
generic
B : natural := 16;
);
port
reset_n : in std_logic;
clk : in std_logic;
nd : in std_logic;
);
end component;
begin
u1: dem_IQ
generic map(
port map
reset_n =>reset_n,
clk =>clk,
nd =>nd,
rdy =>rdy,
sal_real =>out_real,
sal_imag =>out_imag,
);
end rtl;
El bloque filtro gaussiano con estructura polifase es un filtro cuya respuesta al impulso es
una función gaussiana; este filtro está dispuesto de tal forma que puede ser expresado en
8 filtros en paralelo, utilizados para aumentar la tasa de muestreo.
…
Data_out
Parámetros modificables
Data_in Data_out
ND RFD
Clk RDY
Reset_n
En esta entidad:
Nd: indica una entrada valida en el bus data_in, por lo cual se debe poner en alto durante
un ciclo de reloj cada vez que se desea entrar un dato al sistema.
Clk: señal de reloj del sistema. Esta señal es común para todos los módulos.
RDY: esta señal esta en alto cuando el bloque indica que existe un dato valido en las
salidas.
RFD: indica cuando el sistema está listo para recibir un nuevo dato. Se pone en alto
cuando todos los filtros han procesado un dato de entrada y enviado un dato válido a la
salida del bloque.
El parámetro configurable del filtro gaussiano puede ser modificado en la entidad de alto
nivel sistema_GMSK.vhd.
DIAGRAMA DE TIEMPO
EJEMPLO DE INSTANCIACION
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
--library work;
--use work.coeficientes.all;
entity prueba_gauss is
generic
B : natural := 16
);
port
clk : in std_logic;
reset_n : in std_logic;
nd : in std_logic;
);
end entity;
component filtro_gauss is
generic
B : natural:=16
);
port
nd: in std_logic;
clk: in std_logic;
reset_n: in std_logic;
);
end component;
begin
port map
data_in=>d_in,
data_out=>d_out,
nd=>nd,
clk=>clk,
rfd=>rfd,
reset_n=>reset_n,
rdy=>rdy
);
end architecture;
DEMODULADOR FM
INTRODUCCION
Su función es recibir la señal compleja, y convertirla en una señal real cuya amplitud varía
en función de las variaciones de frecuencia en la entrada.
A la entrada del modulador se presenta una señal compleja con sus partes real e
imaginaria desfasadas 90°.
Parámetros modificables
Este bloque tiene básicamente cuatro parámetros modificables para ajustarse a diferentes
necesidades:
N: Tamaño de la entrada.
Q: Parte fraccionaria
La sensibilidad de la modulación tiene que estar representada en punto fijo con una parte
fraccionaria Q=13. Su valor por defecto es el recíproco de la sensibilidad del modulador
2. 𝑛𝑠𝑝𝑠⁄
FM, es decir 𝜋 donde 𝑛𝑠𝑝𝑠 es el número de muestras por símbolo del filtro
gaussiano, que en este caso particular es 8.
enable: Este pin es para controlar los datos de entrada, debe estar activo durante un ciclo
de reloj cada vez que se quiera ingresar un dato al sistema.
clk: reloj del filtro, este reloj debe ser al menos de la frecuencia más alta del sistema.
salida_rdy: Cuando se encuentra en nivel alto, indica que hay un dato válido en la salida.
DIAGRAMAS DE TIEMPOS
Este diagrama de tiempos muestra el funcionamiento del modulador FM. Los parámetros
seleccionados fueron D_GAIN=41721, N=16 , DATA_WIDTH=18 y Q=13.
EJEMPLO DE INSTANCIACIÓN
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity prueba_dem_fm is
generic
N : natural := 16
);
port
clk : in std_logic;
enable : in std_logic;
reset_n : in std_logic;
);
end entity;
component dem_fm is
generic
--||||PARÁMETROS MODIFICABLES||||--
Q : natural := 13;
N : natural := 16;
);
port
clk : in std_logic;
enable : in std_logic;
reset_n : in std_logic;
);
end component;
Q=>13,
N=>N,
DATA_WIDTH=>DATA_WIDTH,
port map(
);
end rtl;
SINCRONIZADOR M&M
INTRODUCCIÓN
El sincronizador M&M calcula la diferencia temporal que existe entre la señal demodulada
y el reloj propio del sistema. En la entrada se presentan los datos con amplitud variable los
cuales usan 8 muestras por símbolo. Luego de ser corregido el error temporal, se tiene a la
salida 1 muestra por símbolo y los datos presentados como una cadena de bits.
y (t) Bloque
ak
Muestreador de
Decisión
Detector
de Error
M&M
x (e)
Filtro
Lazo
Cerrado
Reloj
Ajustable
Parámetros modificables
Los siguientes parámetros sólo pueden ser cambiados en la entidad ganancias.vhd, que se
encuentra dentro de la entidad general.
Los valores D_OMEGA_MID y D_OMEGA_REL son los parámetros que manejan la función
saturadora, es decir, valor central y desviación cuyos valores por defecto son 8 y 0.005
respectivamente. Nótese que el valor de D_OMEGA_MID es el mismo valor de nsps, esto
es debido a que el sincronizador también realiza la etapa final de diezmado.
new_data: Este pin es para controlar los datos de entrada, debe estar activo durante un
ciclo de reloj cada vez que se quiera ingresar un dato al sistema.
clk: reloj del filtro, este reloj debe ser al menos de la frecuencia más alta del sistema.
s: Salida del sincronizador expresada en un bit, representa al bus salida comparado con
cero.
nd: Cuando se encuentra en nivel alto, indica que hay un dato válido en la salida.
DIAGRAMAS DE TIEMPOS
Este diagrama de tiempos muestra el funcionamiento del modulador FM. Los parámetros
seleccionados fueron D_GAIN_OMEGA=63, D_OMEGA_MID=65536, D_OMEGA_REL=41,
D_GAIN_MU= 1433 y DATA_WIDTH=18.
EJEMPLO DE INSTANCIACIÓN
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity prueba_m&m is
generic
DATA_WIDTH : natural := 18
);
port
clk : in std_logic;
new_data : in std_logic;
reset_n : in std_logic;
);
end entity;
component muller is
generic
DATA_WIDTH : natural := 18
);
port
clk : in std_logic;
new_data : in std_logic;
reset_n : in std_logic;
);
end component;
DATA_WIDTH=>DATA_WIDTH
)
port map(
end rtl;
CODIFICADOR CONVOLUCIONAL
INTRODUCCÍON
Codificador Convolucional.
Parámetros
El codificador Convolucional utiliza el estándar IEEE 802.11a el cual sugiere las siguientes
características:
𝑟 = 1⁄2: Indica la cantidad de bits de redundancia por cada bit de entrada, es decir que
por cada bit que ingresa, salen dos bits.
reset: tiene como fin poner los registros en cero de manera asíncrona.
DIAGRAMA DE TIEMPO
𝑑𝑎𝑡𝑎_𝑖𝑛: 101101110111101111101111110111111101111111000000
EJEMPLO DE INSTANCIACIÓN
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity shift_registers is
port(
data_in: in std_logic;
clk: in std_logic;
enabled: in std_logic;
reset: in std_logic;
a: out std_logic;
b: out std_logic
);
end entity;
component reg is
port
clk : in std_logic;
reset : in std_logic;
a : in std_logic;
s : out std_logic
);
end component;
begin
process (clk)
begin
if (rising_edge(clk)) then
ready_aux<='1';
ready_aux1<=ready_aux;
else
ready_aux<='0';
ready_aux1<=ready_aux;
end if;
end if;
end process;
ready<=ready_aux1;
a<=n_1;
b<=n_2;
end rtl;
clc
clear all;
close all;
long=7;
%tasa=bits_entrada/bits_salida
tasa=rats(t.numInputSymbols/t.numOutputSymbols);
mensaje=[1;0;1;1;0;1;1;1;0;1;1;1;1;0;1;1;1;1;1;0;1;1;1;1;1;1;0;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;0;0;0;0;0;0]
odigo=convenc(mensaje,t)
DECODIFICADOR VITERBI
INTRODUCCÍON
En 1967 Andrew James Viterbi inventó el algoritmo de Viterbi, método que utilizó para la
recepción de datos codificados convolucionalmente, el cual es muy utilizado en los
códigos correctores de errores usados en las comunicaciones digitales.
Este algoritmo encuentra las secuencias de estados más probables a partir de una
observación al modelo oculto de Markov, es decir, se obtiene la secuencia óptima que
explica la secuencia observada.
Interfaz de entrada y salida: Estos bloques proporcionan una conexión con los demás
dispositivos externos como el receptor de comunicación y el demodulador de la señal
entregada por el decodificador.
Métricas de rama: Este bloque calcula las métricas de rama de cada etapa del diagrama de
Trellis, hallando las distancias Hamming entre el símbolo recibido y el símbolo esperado.
Memoria de métricas: Este bloque almacena la ruta parcial en cada estado de la etapa
actual.
ASC (Add-Compare-Select): Este bloque se encarga de sumar la métrica del origen con la
métrica de rama de cada una de las posibles 2 rutas que puede tomar hacia el estado
destino, dejando como métrica nueva acumulada, aquella con mejor métrica.
ready: pin de sincronización que indica cuando fue decodificada la secuencia de entrada.
bit_codificado_0 y bit_codificado_1: son los pines de entrada de los dos bits referentes a los
símbolos de la secuencia enviada por el codificador Convolucional.
DIAGRAMA DE TIEMPO
Este diagrama de tiempo muestra el funcionamiento del decodificador Viterbi, cuya entrada es la
misma arrojada por el codificador Convolucional, es decir la secuencia codificada de la trama de
bits 101101110111101111101111110111111101111111000000.
Ahora el diagrama de tiempo con errores inducidos en el mensaje como se observa en las
posiciones indicadas por las flechas rojas.
Simulación temporal del decodificador Viterbi con algunos errores en los símbolos de entrada.
EJEMPLO DE INSTANCIACIÓN
library ieee;
use ieee.std_logic_1164.all;
use work.viterbidecoPkg.all;
entity ViterbiDecodificador is
port(
---------------Entradas --------------
--Softbit 0
bit_codificado_0: in std_logic;
--Softbit 1
bit_codificado_1: in std_logic;
--Señal de reloj
clk: in std_logic;
reset: in std_logic;
--Señal de habilitación
enable: in std_logic;
------------------Salidas---------------
--Bit decodificado
--Bit válido
);
end ViterbiDecodificador;
begin
sym_0_v<=bit_codificado_0;
sym_1_v<=bit_codificado_1;
dec0: viterbideco
port map(
clk=>clk,
reset=>reset,
enable=>enable,
bit_decodificado=>bit_decodificado,--Bit decodificado
ready=>ready
);
end ViterbiDecodificadorArch;
Canal AWGN
INTRODUCCIÓN
AWGN (Additive White Gaussian Noise) es un modelo de canal que a la señal que se transmite a
través de un medio le adiciona ruido blanco. Básicamente son datos que se suman a la señal
original, dichos datos son característicos debido al tipo de distribución Gaussiana por la que son
dominados.
Canal AWGN.
Parámetros modificables
Este sistema tiene principalmente cuatro (4) parámetros modificables para ajustarse a
diferentes necesidades:
G : Polinomio generador.
El Grado del polinomio (N) base quiere decir el exponente de mayor valor presente en el
polinomio elegido para la generación de esa variable aleatoria normal.
El factor init indica cada uno de los valores que serán asignados inicialmente a los registros
que conforman el LFSR.
DIAGRAMAS DE TIEMPOS
EJEMPLOS DE INSTANCIACIÓN
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity awgn_channel is
generic (
!!!Factores Parametrizables!!!!!
m : natural := 5;
N2 : integer:= 7;
G2 : std_logic_vector:= "0010001";--1+x3+x7
N3 : integer := 4;
G3 : std_logic_vector:= "1001";--1+x+x4
N4 : integer := 4;
G4 : std_logic_vector:= "0011";--1+x3+x4
N5 : integer := 3;
G5 : std_logic_vector:= "101";--1+x+x3
N6 : integer := 3;
G6 : std_logic_vector:= "011";--1+x2+x3
N7 : integer := 5;
G7 : std_logic_vector:= "01001";--1+x2+x5
N8 : integer := 5;
G8 : std_logic_vector:= "11011";--1+x+x2+x4+x5
N9 : integer:= 6;
G9 : std_logic_vector:= "100011";--x6 + x5 + 1
N10 : integer:= 6;
N21 : integer:= 7;
N22 : integer:= 7;
N23 : integer:= 4;
N24 : integer:= 4;
N25 : integer:= 3;
N26 : integer:= 3;
N27 : integer:= 5;
N28 : integer:= 5;
N29 : integer:= 6;
N210 : integer:= 6;
);
port(
clk : in std_logic;
reset : in std_logic;
);
end awgn_channel;
component awgn_channel_m is
generic (
m : natural;
N1 : integer;
G1 : std_logic_vector;
init1 : std_logic_vector;
N2 : integer;
G2 : std_logic_vector;
init2 : std_logic_vector;
N3 : integer;
G3 : std_logic_vector;
init3 : std_logic_vector;
N4 : integer;
G4 : std_logic_vector;
init4 : std_logic_vector;
N5 : integer;
G5 : std_logic_vector;
init5 : std_logic_vector;
N6 : integer;
G6 : std_logic_vector;
init6 : std_logic_vector;
N7 : integer;
G7 : std_logic_vector;
init7 : std_logic_vector;
N8 : integer;
G8 : std_logic_vector;
init8 : std_logic_vector;
N9 : integer;
G9 : std_logic_vector;
init9 : std_logic_vector;
N10 : integer;
G10 : std_logic_vector;
init10 : std_logic_vector;
N21 : integer;
G21 : std_logic_vector;
init21 : std_logic_vector;
N22 : integer;
G22 : std_logic_vector;
init22 : std_logic_vector;
N23 : integer;
G23 : std_logic_vector;
init23 : std_logic_vector;
N24 : integer;
G24 : std_logic_vector;
init24 : std_logic_vector;
N25 : integer;
G25 : std_logic_vector;
init25 : std_logic_vector;
N26 : integer;
G26 : std_logic_vector;
init26 : std_logic_vector;
N27 : integer;
G27 : std_logic_vector;
init27 : std_logic_vector;
N28 : integer;
G28 : std_logic_vector;
init28 : std_logic_vector;
N29 : integer;
G29 : std_logic_vector;
init29 : std_logic_vector;
N210 : integer;
G210 : std_logic_vector;
init210 : std_logic_vector
);
port(
clk : in std_logic;
clear : in std_logic;
);
end component;
begin
AWGN :
awgn_channel_m
generic map(
m =>m,
N1 =>N1,
G1 =>G1,
init1 =>init1,
N2 =>N2,
G2 =>G2,
init2 =>init2,
N3 =>N3,
G3 =>G3,
init3 =>init3,
N4 =>N4,
G4 =>G4,
init4 =>init4,
N5 =>N5,
G5 =>G5,
init5 =>init5,
N6 =>N6,
G6 =>G6,
init6 =>init6,
N7 =>N7,
G7 =>G7,
init7 =>init7,
N8 =>N8,
G8 =>G8,
init8 =>init8,
N9 =>N9,
G9 =>G9,
init9 =>init9,
N10 =>N10,
G10 =>G10,
init10 =>init10,
N21 =>N21,
G21 =>G21,
init21 =>init21,
N22 =>N22,
G22 =>G22,
init22 =>init22,
N23 =>N23,
G23 =>G23,
init23 =>init23,
N24 =>N4,
G24 =>G24,
init24 =>init24,
N25 =>N25,
G25 =>G25,
init25 =>init25,
N26 =>N26,
G26 =>G26,
init26 =>init26,
N27 =>N27,
G27 =>G27,
init27 =>init27,
N28 =>N28,
G28 =>G28,
init28 =>init28,
N29 =>N29,
G29 =>G29,
init29 =>init29,
N210 =>N210,
G210 =>G210,
init210 =>init210
port map(
sal =>sal_m,
clear =>not(reset)
);
end rtl;
CANAL DE RAYLEIGH
INTRODUCCIÓN
Diagrama de bloques.
Parámetros modificables
N : Numero de retardos.
El parámetro q corresponde al número de bits decimales con los que será descrita la
entrada y cada una de las replicas obtenidas con este modelo de canal. Se debe tener en
cuenta que el sistema es implementado en aritmética de punto fijo.
EJEMPLO DE INSTANCIACIÓN
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity Rayleigh_channel is
generic
);
port
reset : in std_logic;
clk : in std_logic;
);
end entity;
component channel is
generic
q : integer ;
freq : integer ;
N : integer ;
stop : integer ;
m : natural
);
port
reset : in std_logic;
clk : in std_logic;
);
end component;
begin
R_cnannel:
channel
generic map(
N =>N,
q =>q,
freq =>freq,
stop =>stop,
m =>m
port map(
sal_gen =>sal_gen,
sign =>sign,
clk =>clk,
reset =>reset
);
end rtl;
Además de los modelos de canal y tipos de codificación que son presentados también se anexa un
sistema de conexión entre los canales y los métodos de corrección de errores.
reed_box_n
INTRODUCCIÓN
DIAGRAMA DE BLOQUES
Diagrama de bloques
PROPIEDADES
Parámetros modificables
G : Polinomio generador.
Todos estos parámetros pueden ser ubicados en la entidad de alto nivel reed_box_n.vhd.
La entidad del conector entre Reed Solomon y el modelo de canal AWGN cuenta con los
siguientes pines de entrada y salida:
DIAGRAMAS DE TIEMPOS
Diagrama de tiempos
EJEMPLO DE INSTANCIACIÓN
El siguiente código muestra un ejemplo de cómo instanciar el conector para para recibir
directamente el ruido del generador WGN.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity reed_box_n is
generic (
m : natural := 8;
N2 : integer:= 7;
G2 : std_logic_vector:= "0010001";--1+x3+x7
N3 : integer := 4;
G3 : std_logic_vector:= "1001";--1+x+x4
N4 : integer := 4;
G4 : std_logic_vector:= "0011";--1+x3+x4
N5 : integer := 3;
G5 : std_logic_vector:= "101";--1+x+x3
N6 : integer := 3;
G6 : std_logic_vector:= "011";--1+x2+x3
N7 : integer := 5;
G7 : std_logic_vector:= "01001";--1+x2+x5
N8 : integer := 5;
G8 : std_logic_vector:= "11011";--1+x+x2+x4+x5
N9 : integer := 6;
G9 : std_logic_vector:= "100011";--x6 + x5 + 1
N10 : integer := 6;
N21 : integer:= 7;
N22 : integer:= 7;
N23 : integer := 4;
N24 : integer := 4;
N25 : integer := 3;
N26 : integer := 3;
);
port(
clk : in std_logic;
reset : in std_logic;
);
end entity;
component box_cmp is
generic (
m : natural;
N1 : integer;
G1 : std_logic_vector;
init1 : std_logic_vector ;
N2 : integer;
G2 : std_logic_vector;
init2 : std_logic_vector ;
N3 : integer ;
G3 : std_logic_vector;
init3 : std_logic_vector;
N4 : integer ;
G4 : std_logic_vector;
init4 : std_logic_vector;
N5 : integer ;
G5 : std_logic_vector;
init5 : std_logic_vector;
N6 : integer ;
G6 : std_logic_vector;
init6 : std_logic_vector;
N7 : integer ;
G7 : std_logic_vector;
init7 : std_logic_vector;
N8 : integer ;
G8 : std_logic_vector;
init8 : std_logic_vector ;
N9 : integer ;
G9 : std_logic_vector;
init9 : std_logic_vector;
N10 : integer ;
G10 : std_logic_vector;
init10 : std_logic_vector ;
N21 : integer;
G21 : std_logic_vector;
init21 : std_logic_vector ;
N22 : integer;
G22 : std_logic_vector;
init22 : std_logic_vector ;
N23 : integer ;
G23 : std_logic_vector;
init23 : std_logic_vector;
N24 : integer ;
G24 : std_logic_vector;
init24 : std_logic_vector;
N25 : integer ;
G25 : std_logic_vector;
init25 : std_logic_vector;
N26 : integer ;
G26 : std_logic_vector;
init26 : std_logic_vector
);
port(
clk : in std_logic;
reset : in std_logic;
clear : in std_logic;
);
end component;
begin
box :
box_cmp
generic map(
m =>m,
N1 =>N1,
G1 =>G1,
init1 =>init1,
N2 =>N2,
G2 =>G2,
init2 =>init2,
N3 =>N3,
G3 =>G3,
init3 =>init3,
N4 =>N4,
G4 =>G4,
init4 =>init4,
N5 =>N5,
G5 =>G5,
init5 =>init5,
N6 =>N6,
G6 =>G6,
init6 =>init6,
N7 =>N7,
G7 =>G7,
init7 =>init7,
N8 =>N8,
G8 =>G8,
init8 =>init8,
N9 =>N9,
G9 =>G9,
init9 =>init9,
N10 =>N10,
G10 =>G10,
init10 =>init10,
N21 =>N21,
G21 =>G21,
init21 =>init21,
N22 =>N22,
G22 =>G22,
init22 =>init22,
N23 =>N23,
G23 =>G23,
init23 =>init23,
N24 =>N4,
G24 =>G24,
init24 =>init24,
N25 =>N25,
G25 =>G25,
init25 =>init25,
N26 =>N26,
G26 =>G26,
init26 =>init26
port map(
clk =>clk,
reset =>reset,
clear =>reset,
new_noise =>noise,
data =>data,
sal =>out_ar
);
end rtl;
conv_box
INTRODUCCIÓN
Diagrama de bloques
PROPIEDADES
Parámetros modificables
Este parámetro depende del tamaño de palabra con el que sea generado el ruido de
entrada. Puede ser ubicado en la entidad de alto nivel reed_box_n.vhd.
La entidad del conector entre Reed Solomon y el modelo de canal AWGN cuenta con los
siguientes pines de entrada y salida:
DIAGRAMAS DE TIEMPOS
Diagrama de tiempos
EJEMPLO DE INSTANCIACIÓN
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity conv_ray is
generic
m : natural :=8
);
port(
a : in std_logic;
b : in std_logic;
clk : in std_logic;
);
end entity;
component conv_ray_t is
generic
m : natural
);
port(
a : in std_logic;
b : in std_logic;
clk : in std_logic;
);
end component;
begin
box : conv_ray_t
generic map
m =>m
port map (
a =>a,
b =>b,
noise =>noise,
clk =>clk,
out_a =>out_a,
out_b =>out_b
);
end rtl;
CODIFICADOR REED-SOLOMON
INTRODUCCIÓN
Para efectuar las operaciones antes descritas se usa la arquitectura que se muestra a
continuación.
Codificador Reed-Solomon
Entradas:
Clk: Reloj del sistema, este debe ser menor de 144.59 𝑀𝐻𝑧.
Enable: Habilitador del sistema, debe estar en alto al ingreso del primer símbolo.
Salidas:
Mensaje Codificado: Mensaje codificado, como es de esperarse la salida de los símbolos es
de forma serial y tiene un retardo de un ciclo de reloj con respecto al mensaje de entrada.
Ready: Este pin se pone en alto al momento que el codificador está generando el mensaje
codificado.
DIAGRAMAS DE TIEMPOS
Este diagrama de tiempos muestra un mensaje que quiere ser codificado en Reed-
Solomon. Los parámetros seleccionados fueron 𝑛 = 255, 𝑡 = 16 𝑦 𝑚 = 8.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity prueba_codificador is
generic
n : natural;
m : natural;
t : natural
);
port
clk : in std_logic;
reset : in std_logic;
);
end entity;
component codificador is
generic
n : natural;
m : natural;
t : natural
);
port
clk : in std_logic;
reset : in std_logic;
);
end component;
begin
Cod_Reed_Solomon:
codificador
generic map(n=>n,m=>m,t=>t)
port map
clk =>clk,
teset =>reset,
enable =>enable,
msn =>mensaje,
msn_cod =>mensaje_codificado,
ready =>ready
);
end rtl;
DECODIFICADOR REED-SOLOMON
INTRODUCCIÓN
síndromes tiene una latencia de 𝑛 ciclos de reloj, está compuesto por un sistema que
eleva las raíces del polinomio generador con el fin de evaluarlas en el mensaje a medida
que va ingresando al decodificador. El bloque del cálculo del polinomio localizador está
implementado con el algoritmo de Berlekamp-Massey sin inversión, por tanto, tiene una
latencia de 2𝑡 + 1 ciclos de reloj. El bloque de localización del error se encuentra
implementado con el algoritmo de Chien, el cual es el más eficiente en términos de
hardware, y tiene una latencia de 𝑡 + 1 ciclos de reloj. El bloque del cálculo del valor del
error está implementado con el algoritmo de Forney, el cual tiene una latencia de 𝑡 + 1
ciclos de reloj. El bloque de almacenamiento y corrección del mensaje, tiene una latencia
de 2 ciclos de reloj y permite guardar hasta 3 mensajes al tiempo, esto con el fin de que el
sistema pueda funcionar sin retardos. Y por último está la unidad de control, este bloque
es simbólico, ya que cada bloque cuenta con su propia unidad de control, excepto el
bloque del algoritmo de Berlekamp-Massey y el de Chien que comparten la misma unidad
de control. Si se suma la cantidad de retardos que produce cada bloque se obtiene que
cada símbolo se demora 𝑛 + 4𝑡 + 5 ciclos de reloj en ser procesado.
Entradas:
Clk: Reloj del sistema, este debe ser menor de 77.21 𝑀𝐻𝑧.
Enable: Habilitador del sistema, debe estar en alto al ingreso del primer símbolo.
Salidas:
Mensaje Decodificado: Mensaje decodificado, como es de esperarse la salida de los
símbolos es de forma serial y tiene un retardo 𝑛 + 4𝑡 + 5 ciclos de reloj con respecto al
mensaje de entrada.
Ready: Este pin se pone en alto al momento que el decodificador está generando el
mensaje decodificado.
DIAGRAMAS DE TIEMPOS
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity Prueba_Reed_Deco is
generic
n : natural:=50;
m: natural:=8;
t: natural:=16
Proyecto de Investigación N° 467
UNIVERSIDAD DEL QUINDIO
SISTEMA INTEGRADO DE GESTIÓN
);
port
clk : in std_logic;
reset : in std_logic;
enable : in std_logic;
);
end entity;
component Reed_deco is
generic
n : natural;
m: natural;
t: natural
);
port
enable : in std_logic;
clk : in std_logic;
reset : in std_logic;
);
end component;
begin
Decoder:
Reed_Deco
generic map(m=>m,n=>n,t=>t)
port map(
enable=>enable,
clk=>clk,
reset=>reset,
msn=>msn,
msn_dec=>msn_dec,
ready=>ready
);
end rtl;
ANEXO D: ARTÍCULOS