Pfc Modulador Digital Programable Modulad Mediber

  • Uploaded by: Juan Tebar
  • 0
  • 0
  • May 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Pfc Modulador Digital Programable Modulad Mediber as PDF for free.

More details

  • Words: 86,356
  • Pages: 242
` UNIVERSITAT POLITECNICA DE CATALUNYA ` ESCOLA TECNICA SUPERIOR D´ENGINYERIA DE TELECOMUNICACIONS DE BARCELONA

PROJECTE FI DE CARRERA

MODULADOR DIGITAL PROGRAMABLE

Juan Luis T´ebar Garc´ıa Barcelona, 2000

PROJECTE FI DE CARRERA

MODULADOR DIGITAL PROGRAMABLE

Autor:

Juan Luis T´ebar Garc´ıa

Tutor:

Josep Vidal Manzano Profesor Titular del Dept. de Teoria del Senyal i Comunicacions Universitat Polit`ecnica de Catalunya

DEPARTAMENT DE TEORIA DEL SENYAL I COMUNICACIO ` ESCOLA TECNICA SUPERIOR D´ENGINYERIA DE TELECOMUNICACIONS DE BARCELONA ` UNIVERSITAT POLITECNICA DE CATALUNYA

Barcelona, 2000

A mi u ´nica familia

Agradecimientos Este Proyecto de Fin de Carrera no hubiera sido posible sin la ayuda de algunas personas a quienes me gustar´ıa expresar mi sincera gratitud. Comenzar´e este turno por mi familia, pues ellos han sido en gran parte los “culpables” de que este trabajo haya visto la luz: A mis padres Eusebio y Emilia por sus continuos ´ animos, a mi hermano Eusebio por ser el responsable de mi reciclaje software, a Jos´e Antonio y Mar´ıa Jos´e por su ayuda y soporte “hardware” en mis viajes a Barcelona, y en general a todos por su cari˜ no y apoyo moral. Tambi´en he de dar las gracias a mi tutor, Josep Vidal, por las facilidades y consejos prestados a la hora de desarrollar este trabajo en la distancia. No puedo dejarme en el tintero a mi amigo Cesar, quien con su inestimable ayuda tanto en el plano t´ecnico como en el an´ımico tiene parte del m´erito de este trabajo. Gracias tambi´en a mi compa˜ nero Ces´areo por su ayuda con los equipos de medida y a Garve por su apoyo con la mecanograf´ıa. No puedo tampoco dejar de nombrar a mis amigos de siempre Avelino, I˜ naki, Juan Ernesto, Claudio y a sus familias por su paciencia conmigo a lo largo de tanto tiempo.

Barcelona Septiembre del 2000

Juan Luis T´ebar Garc´ıa

i

Resumen El objetivo de este trabajo ha sido el desarrollo de un Modulador Digital Programable para su empleo en la realizaci´ on de pruebas de laboratorio. Se pretende realizar medidas de propagaci´ on con nuevos tipos de comunicaciones digitales tales como W − CDM A, habi´endose conseguido alcanzar una velocidad de modulaci´on de 13.5 Mbps, valor suficiente para la realizaci´ on de las mismas. El trabajo realiza un repaso te´orico de lo que es la S´ıntesis Digital Directa poniendo de relieve los avances m´ as recientes en este campo. Se observa un esfuerzo por parte de los fabricantes en a˜ nadir nuevas prestaciones a los circuitos integrados DDS que ya est´a incidiendo en la implantaci´ on de estos sistemas de forma generalizada. Al final de este cap´ıtulo te´ orico se incluye una recopilaci´on de circuitos DDS comerciales junto con sus principales caracter´ısticas, aunque cada mes aparecen chips que igualan o superan las prestaciones de sus competidores. El montaje pr´ actico utiliza un modulador DDS, y en ´el se ven aplicados los conceptos de interpolaci´ on y filtrado mediante filtros FIR. Es por ello que tambi´en se repasan estos conceptos e incluso se incluye un ejemplo de utilidad en el propio dise˜ no: Se han calculado los coeficientes a programar en cada etapa del filtro seg´ un la curva de respuesta en coseno alzado, acompa˜ n´ andose gr´ aficas mostrando los resultados obtenidos. En segundo lugar, y para poder llevar a cabo las pruebas de funcionamiento del modulador, se ha desarrollado conjuntamente un generador de secuencias pseudoaleato´ rias. Este sistema funciona como un equipo medidor de tasa de bits err´oneos BER y est´a dise˜ nado para poder funcionar de manera aut´onoma e independiente del modulador, con lo que se puede aprovechar para realizar todo tipo de medidas por separado. Con respecto a la medida de tasas de error, ha sido necesario el estudio de los criterios establecidos al respecto por la UIT. Aquellos contenidos b´asicos de aplicaci´on en el trabajo tambi´en han sido reflejados en esta memoria. Lo que se pretend´ıa era realizar una aplicaci´ on que pudiera ser utilizada en la pr´actica, de modo que era deseable suscribir al m´aximo posible las citadas recomendaciones. Para los dos sistemas desarrollados se han realizado sendas aplicaciones de control desde PC en el entorno Labwindows CVI. Por sencillez, econom´ıa y facilidad de uso se ha escogido como m´etodo de control el puerto paralelo del PC, para as´ı favorecer su utilizaci´ on en un entorno port´ atil si se desean realizar medidas de campo.

ii

´Indice general 1. La s´ıntesis digital directa 1.1. Teor´ıa de operaci´ on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2. Espectro de salida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3. Capacidad de sinton´ıa en fase y frecuencia de los DDS . . . . . . . . . . . 1.3.1. Sinton´ıa en frecuencia . . . . . . . . . . . . . . . . . . . . . . . . . 1.3.2. Velocidad de cambio de sinton´ıa . . . . . . . . . . . . . . . . . . . 1.3.3. Registros adicionales preprogramados . . . . . . . . . . . . . . . . 1.4. Efecto del DAC en sistemas DDS . . . . . . . . . . . . . . . . . . . . . . . 1.4.1. Conversores D/A de alta velocidad . . . . . . . . . . . . . . . . . . 1.4.2. Conversores A/D de alta velocidad . . . . . . . . . . . . . . . . . . 1.4.2.1. Par´ ametros de los dispositivos de conversi´on . . . . . . . 1.4.2.2. Efectos del “jitter” de apertura y del reloj de muestreo . 1.4.2.3. Arquitectura de conversores A/D de alta velocidad . . . . 1.4.3. Efecto del sobremuestreo en el nivel de ruido de cuantificaci´on . . 1.5. Efecto del truncamiento del acumulador de fase . . . . . . . . . . . . . . . 1.5.1. Magnitud de los esp´ ureos por truncamiento de fase . . . . . . . . . 1.5.2. Distribuci´ on espectral de los esp´ ureos por truncamiento de fase . . 1.5.3. Resumen del truncamiento de fase . . . . . . . . . . . . . . . . . . 1.6. Otras fuentes de esp´ ureos en un sistema DDS . . . . . . . . . . . . . . . . 1.7. Consideraciones sobre el filtrado de salida . . . . . . . . . . . . . . . . . . 1.8. Caracter´ısticas de salida de los sistemas DDS . . . . . . . . . . . . . . . . 1.8.1. Acoplamiento con transformador sim´etrico . . . . . . . . . . . . . . 1.8.2. Consideraciones sobre la potencia de salida . . . . . . . . . . . . . 1.8.3. Terminaci´ on de salida del DDS-DAC . . . . . . . . . . . . . . . . . 1.9. Modulaci´ on digital con DDS . . . . . . . . . . . . . . . . . . . . . . . . . . 1.9.1. Requerimientos y arquitectura del sistema . . . . . . . . . . . . . . 1.9.2. Filtros digitales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.9.2.1. Filtros FIR . . . . . . . . . . . . . . . . . . . . . . . . . . 1.9.2.2. Filtros IIR . . . . . . . . . . . . . . . . . . . . . . . . . . 1.9.3. Procesado DSP a varias velocidades . . . . . . . . . . . . . . . . . 1.9.3.1. Interpolaci´on . . . . . . . . . . . . . . . . . . . . . . . . . 1.9.3.2. Decimado . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.9.3.3. Conversi´on de velocidad racional n/m . . . . . . . . . . . 1.9.3.4. Filtros digitales multivelocidad . . . . . . . . . . . . . . . 1.9.3.5. Consideraciones acerca del sincronismo entre el reloj y los datos de entrada . . . . . . . . . . . . . . . . . . . . . . . 1.10. Evoluci´ on y t´ecnicas auxiliares en los DDS . . . . . . . . . . . . . . . . . .

iii

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4 5 7 10 10 11 12 12 12 14 15 19 19 21 22 24 25 28 29 31 34 35 36 37 37 38 40 40 41 43 44 45 47 47

. 51 . 52

1.10.1. 1.10.2. 1.10.3. 1.10.4. 1.10.5.

Mejora del Margen Libre de Esp´ ureos mediante dithering de fase Generaci´ on de barridos “chirp” mediante DDS . . . . . . . . . . Generaci´ on de modulaci´on de amplitud mediante DDS . . . . . . Funcionalidades adicionales en DDS . . . . . . . . . . . . . . . . Chips DDS comerciales . . . . . . . . . . . . . . . . . . . . . . .

2. Secuencias pseudoaleatorias y registros de desplazamiento 2.1. Secuencias con propiedades de aleatoriedad . . . . . . . . . . . 2.1.1. Propiedades de las secuencias aleatorias . . . . . . . . . 2.2. Secuencias generadas mediante registros de desplazamiento . . 2.2.1. Funciones generadoras . . . . . . . . . . . . . . . . . . . 2.2.2. Determinaci´ on del per´ıodo . . . . . . . . . . . . . . . . . 2.2.2.1. Una condici´on necesaria para longitud m´axima 2.2.3. El m´etodo matricial . . . . . . . . . . . . . . . . . . . . 2.3. Polinomios m´ odulo 2 . . . . . . . . . . . . . . . . . . . . . . . . 2.3.1. Periodos primos de Mersenne . . . . . . . . . . . . . . . 2.3.2. Las funciones de Euler y de M¨obious . . . . . . . . . . . 2.3.3. N´ umero de polinomios irreducibles . . . . . . . . . . . . 2.3.4. Periodos mas peque˜ nos . . . . . . . . . . . . . . . . . . 2.4. Aleatoriedad de las secuencias de registros de desplazamiento . 2.4.1. Propiedad de balance . . . . . . . . . . . . . . . . . . . 2.4.2. Propiedad de realizaci´on . . . . . . . . . . . . . . . . . . 2.4.3. Propiedad de correlaci´on . . . . . . . . . . . . . . . . . . 2.5. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . .

. . . . . . . . . . . . . . . . .

. . . . .

53 54 55 56 58

. . . . . . . . . . . . . . . . .

61 62 62 63 65 67 67 68 69 69 69 70 72 72 72 73 73 74

3. Medidas de calidad 75 3.1. La Recomendaci´ on G.821 ITU . . . . . . . . . . . . . . . . . . . . . . . . . 75 3.2. Asignaci´ on de los objetivos G.821 . . . . . . . . . . . . . . . . . . . . . . . . 78 3.3. Especificaciones G.821 para otras velocidades . . . . . . . . . . . . . . . . . 80 4. Modulador DDS 4.1. Especificaciones de la placa DDS . . . . . . . . . . . . . . . . . . 4.2. Dise˜ no hardware de la placa DDS . . . . . . . . . . . . . . . . . . 4.2.1. El modulador AD9853 . . . . . . . . . . . . . . . . . . . . 4.2.1.1. Filtrado de datos (FIR + etapas interpoladoras) 4.2.2. Bloques funcionales de la placa DDS . . . . . . . . . . . . 4.2.2.1. Puerto paralelo de control . . . . . . . . . . . . . 4.2.2.2. Buffer de control y datos . . . . . . . . . . . . . 4.2.2.3. Modulador DDS . . . . . . . . . . . . . . . . . . 4.2.2.4. Generador de reloj de bit . . . . . . . . . . . . . 4.2.2.5. Oscilador de referencia . . . . . . . . . . . . . . 4.2.2.6. Salida de FI . . . . . . . . . . . . . . . . . . . . 4.2.2.7. Entrada-salida de datos . . . . . . . . . . . . . . 4.2.2.8. Alimentaci´on . . . . . . . . . . . . . . . . . . . . 4.3. Software de control . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.1. M´ odulo principal mod.c . . . . . . . . . . . . . . . . . . . 4.3.1.1. Funci´ on ValorDiv . . . . . . . . . . . . . . . . . 4.3.1.2. Funci´ on ValorFirAx . . . . . . . . . . . . . . . .

iv

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

82 83 86 86 90 94 97 97 99 101 104 105 106 107 108 108 110 111

4.3.2. M´ odulo de funciones hardware mod hard.c 4.3.2.1. Funci´ on prog hard . . . . . . . . . 4.3.2.2. Funci´ on interpolador . . . . . . . 4.4. Resultados pr´ acticos . . . . . . . . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

112 112 112 114

5. Generador medidor de tasa de bits err´ oneos 5.1. Opciones de dise˜ no . . . . . . . . . . . . . . . . . . . . . . . . 5.2. Especificaciones de la placa BER . . . . . . . . . . . . . . . . 5.3. Dise˜ no hardware de la placa BER . . . . . . . . . . . . . . . . 5.3.1. Composici´ on interna del DS2172 . . . . . . . . . . . . 5.3.1.1. Configuraci´on del registro de desplazamiento 5.3.2. Bloques funcionales de la placa de BER . . . . . . . . 5.3.2.1. Puerto paralelo de control . . . . . . . . . . . 5.3.2.2. Buffer de control . . . . . . . . . . . . . . . . 5.3.2.3. Buffer de datos . . . . . . . . . . . . . . . . . 5.3.2.4. Medidor de BER DS2172 . . . . . . . . . . . 5.3.2.5. Conector de transmisi´on-recepci´on . . . . . . 5.3.2.6. Alimentaci´on . . . . . . . . . . . . . . . . . . 5.4. Software de control . . . . . . . . . . . . . . . . . . . . . . . . 5.4.1. M´ odulo principal ber.c . . . . . . . . . . . . . . . . . . 5.4.1.1. Funci´ on principal bucle . . . . . . . . . . . . 5.4.2. M´ odulo de funciones hardware ber hard.c . . . . . . . 5.4.2.1. Funci´ on lee par bert . . . . . . . . . . . . . . 5.4.2.2. Funci´ on escribe par bert . . . . . . . . . . . 5.4.2.3. Funci´ on aplicacion bert . . . . . . . . . . . . 5.5. Resultados pr´ acticos . . . . . . . . . . . . . . . . . . . . . . . 5.6. Mejoras futuras . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

120 120 122 123 124 126 129 130 131 132 133 135 137 137 138 138 139 140 140 141 142 144

A. El puerto paralelo del PC A.1. Generalidades . . . . . . . . . . . . . . A.2. Propiedades de la interfaz f´ısica . . . . A.3. Direcciones del puerto paralelo . . . . A.4. Registros software . . . . . . . . . . . A.5. Utilizaci´ on particular en la aplicaci´on

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

146 146 148 149 149 152

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . .

. . . . .

. . . .

. . . . .

. . . .

. . . . .

. . . .

. . . . .

. . . .

. . . . .

. . . . .

B. Fotograf´ıas del montaje

154

C. Listados fuente C.1. Aplicaci´ on modulAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C.2. Aplicaci´ on mediBER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C.3. Ficheros de Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

v

158 . 158 . 196 . 226

´Indice de figuras 1.1. Esquema interno de un NCO . . . . . . . . . . . . . . . . . . . . . . . . 1.2. Flujo de se˜ nal a trav´es de la arquitectura DDS . . . . . . . . . . . . . . 1.3. Rueda digital de fase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4. Reconstrucci´ on de la se˜ nal a la salida del convertidor D/A . . . . . . . . 1.5. Ejemplo de se˜ nal anal´ ogica y sus diversos tipos de muestreo . . . . . . . 1.6. Espectro resultante para los diferentes tipos de muestreo pr´actico . . . . 1.7. Espectro positivo te´ orico de salida de un sistema DDS . . . . . . . . . . 1.8. Cambios de frecuencia en la arquitectura DDS . . . . . . . . . . . . . . 1.9. Estructura completa de un dispositivo DDS . . . . . . . . . . . . . . . . 1.10. Estructuras de los conversores D/A . . . . . . . . . . . . . . . . . . . . . 1.11. Degradaci´ on del margen libre de esp´ ureos en un D/A . . . . . . . . . . . 1.12. Espectro de salida de un conversor D/A . . . . . . . . . . . . . . . . . . 1.13. Espectro de la FFT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.14. Potencia equivalente de ruido (NPR) . . . . . . . . . . . . . . . . . . . . 1.15. Relaci´ on S/N en funci´ on del “jitter” de apertura y del reloj de muestreo 1.16. Conversor de subrango de 8 bits . . . . . . . . . . . . . . . . . . . . . . 1.17. Conversor A/D serie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.18. El efecto del sobremuestreo sobre el ruido de cuantificaci´on . . . . . . . 1.19. Rueda de fase y Error por truncamiento de fase . . . . . . . . . . . . . . 1.20. Relaci´ on del Truncamiento de fase con los esp´ ureos generados . . . . . . 1.21. Secuencia seguida por el acumulador de fase . . . . . . . . . . . . . . . . 1.22. Comportamiento de la palabra de truncamiento . . . . . . . . . . . . . . 1.23. Espectro de los esp´ ureos producidos por el truncamiento de fase . . . . 1.24. Efecto del desdoblamiento de los arm´onicos por el aliasing . . . . . . . . 1.25. Glitches a la salida de un DAC . . . . . . . . . . . . . . . . . . . . . . . 1.26. Filtro antialiasing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.27. Respuestas de la familia Chevyshev . . . . . . . . . . . . . . . . . . . . . 1.28. Respuestas de la familia Gausiana . . . . . . . . . . . . . . . . . . . . . 1.29. Respuesta de la familia Legendre . . . . . . . . . . . . . . . . . . . . . . 1.30. Combinaci´ on de salidas complementarias en un DDS-DAC . . . . . . . . 1.31. Acoplo de cargas reactivas a la salida del conjunto DDS-DAC . . . . . . 1.32. Estructuras de modulaci´on b´asicas en el dominio temporal . . . . . . . . 1.33. Estructuras de modulaci´on b´asicas digitales . . . . . . . . . . . . . . . . 1.34. Estructuras de modulaci´on b´asicas DDS . . . . . . . . . . . . . . . . . . 1.35. Modulador DDS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.36. Filtro FIR b´ asico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.37. Respuesta FIR de ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . 1.38. Filtro FIR generalizado . . . . . . . . . . . . . . . . . . . . . . . . . . . vi

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5 6 6 7 8 9 10 11 13 13 14 15 17 18 19 20 21 22 23 24 26 27 28 29 30 31 32 33 34 35 36 37 38 39 39 40 41 42

1.39. Filtro IIR b´ asico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.40. Filtro IIR generalizado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.41. Interpolador b´ asico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.42. Visi´ on en el dominio frecuencial de la interpolaci´on . . . . . . . . . . . . . . 1.43. Decimador b´ asico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.44. Visi´ on en el dominio frecuencial de la decimaci´on . . . . . . . . . . . . . . . 1.45. Convertidor de velocidad de muestreo n/m b´asico . . . . . . . . . . . . . . . 1.46. Etapas b´ asicas de los bloques filtro peine e integrador . . . . . . . . . . . . 1.47. Respuesta en frecuencia de los bloques b´asicos del filtro peine y del integrador 1.48. CIC funcionando de interpolador y de decimador . . . . . . . . . . . . . . . 1.49. Respuesta en frecuencia del filtro CIC b´asico . . . . . . . . . . . . . . . . . 1.50. Variaciones al bloque CIC b´asico . . . . . . . . . . . . . . . . . . . . . . . . 1.51. Comparaci´ on de las respuestas CIC modificadas . . . . . . . . . . . . . . . . 1.52. Diagrama de bloques de un modulador DDS gen´erico . . . . . . . . . . . . . 1.53. Compresi´ on de la memoria ROM . . . . . . . . . . . . . . . . . . . . . . . . 1.54. Diagrama de bloques de un DDS gen´erico . . . . . . . . . . . . . . . . . . . 1.55. Dithering de fase en un DDS . . . . . . . . . . . . . . . . . . . . . . . . . . 1.56. Sistema Chirp basado en DDS . . . . . . . . . . . . . . . . . . . . . . . . . 1.57. DDS con control de amplitud . . . . . . . . . . . . . . . . . . . . . . . . . . 1.58. Prestaciones a˜ nadidas en un sistema DDS . . . . . . . . . . . . . . . . . . . 1.59. Modulaciones de fase en un dispositivo DDS . . . . . . . . . . . . . . . . . .

42 44 45 45 46 46 47 48 48 49 49 50 50 51 52 53 54 54 56 56 57

2.1. Ejemplo de registro de desplazamiento con realimentaci´on lineal . . . . . . . 64 2.2. Funci´ on de autocorrelaci´on de la secuencia pseudoaleatoria de ejemplo . . . 66 3.1. 3.2. 3.3. 3.4.

Consideraci´ on de los errores en la determinaci´on del tiempo de disponibilidad Tiempo de disponibilidad en un enlace . . . . . . . . . . . . . . . . . . . . . T´erminos de la recomendaci´on G.821 . . . . . . . . . . . . . . . . . . . . . . La conexi´ on hipot´etica de referencia seg´ un la recomendaci´on G.821 . . . . .

4.1. Puentes de configuraci´ on hardware en la placa DDS . . . . . . . . . . . . 4.2. Diagrama de bloques del modulador DDS AD9853 . . . . . . . . . . . . . 4.3. Funcionamiento del codificador Reed-Solomon . . . . . . . . . . . . . . . . 4.4. Detalle de construcci´ on de las etapas de interpolaci´on en el AD9853 . . . 4.5. Simulaci´ on en Matlab de respuestas impulsivas en coseno alzado . . . . . 4.6. Compensaci´ on del efecto de la etapa CIC en el filtro FIR . . . . . . . . . 4.7. Esquema de bloques de la placa DDS . . . . . . . . . . . . . . . . . . . . . 4.8. Buffer de control y datos de la placa DDS . . . . . . . . . . . . . . . . . . 4.9. El circuito AD9853 y su conexionado en la placa DDS . . . . . . . . . . . 4.10. Selector JP2 de habilitaci´on de transmisi´on . . . . . . . . . . . . . . . . . 4.11. Esquema del generador de reloj de bit . . . . . . . . . . . . . . . . . . . . 4.12. Formas de onda de salida del generador de reloj de bit . . . . . . . . . . . 4.13. Oscilador interno de referencia y jumper JP1 de selecci´on de reloj maestro 4.14. Filtro antialiasing de salida en la placa DDS . . . . . . . . . . . . . . . . . 4.15. Conector de entrada de datos de la placa DDS . . . . . . . . . . . . . . . 4.16. Reguladores de alimentaci´on independientes en la placa DDS . . . . . . . 4.17. Distintas pantallas de la aplicaci´on de control modulAD . . . . . . . . . . 4.18. Protocolo hardware del puerto serie en el AD9853 . . . . . . . . . . . . . 4.19. Placa DDS y placa de BER trabajando conjuntamente . . . . . . . . . . . vii

. . . . . . . . . . . . . . . . . . .

76 76 77 78 85 86 88 90 93 95 96 98 100 100 101 103 104 105 106 108 109 112 114

4.20. Medidas de salida realizadas con analizador vectorial HP89410A . . . . . 4.21. Medidas de los esp´ ureos de truncamiento de fase de salida . . . . . . . . . 4.22. Medidas en banda ancha para QPSK con im´agenes generadas por el proceso de conversi´ on D/A. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.23. Medidas en banda ancha para FSK sin filtro antialiasing . . . . . . . . . . 4.24. Efecto del filtro antialiasing de salida. . . . . . . . . . . . . . . . . . . . . 4.25. Espectro cercano para los tres tipos de modulaciones principales. . . . . .

. 115 . 116 . . . .

117 117 118 119

5.1. Diagrama de bloques del integrado medidor de BER DS2172 . . . . . . 5.2. Registro de desplazamiento para generaci´on de secuencias en el DS2172 5.3. Diagrama de bloques de la placa de BER . . . . . . . . . . . . . . . . . 5.4. Buffer de control de la placa de BER . . . . . . . . . . . . . . . . . . . . 5.5. Buffer de datos de la placa de BER . . . . . . . . . . . . . . . . . . . . . 5.6. El DS2172 y su conexionado en la placa de BER . . . . . . . . . . . . . 5.7. Entrada salida de se˜ nales en la placa de BER . . . . . . . . . . . . . . . 5.8. Regulador de alimentaci´on de la placa de BER . . . . . . . . . . . . . . 5.9. Entorno gr´ afico de la aplicaci´on de control mediBER . . . . . . . . . . . 5.10. Conexi´ on de la placa de BER para la simulaci´on de una medida . . . . . 5.11. Diversos tipos de secuencias generadas en la placa de BER . . . . . . . .

. . . . . . . . . . .

125 126 130 131 133 134 135 137 137 142 143

. . . . . . . . . . .

A.1. Conexionado externo para lectura de datos en el puerto paralelo del PC . . 147 A.2. Hardware interno del PC en puertos bidireccionales . . . . . . . . . . . . . . 151 A.3. Utilizaci´ on particular del puerto paralelo en nuestra aplicaci´on . . . . . . . 153 B.1. B.2. B.3. B.4.

Vista Vista Vista Vista

general del montaje que contiene las placas DDS y BER . . . interior donde se pueden distinguir las dos placas . . . . . . lateral con los conectores de IF y de entrada/salida de datos lateral con los conectores de control y alimentaci´on . . . . .

viii

. . . .

. . . .

. . . .

. . . .

. . . .

155 155 156 157

´Indice de cuadros 1.1. “Estado del Arte” de la tecnolog´ıa DDS comercial (1999) . . . . . . . . . . 58 2.1. Primos de Mersenne: 2p − 1. Primeros 23 valores de p. . . . . . . . . . . . . 70 2.2. Funciones φ y µ tabuladas hasta para n = 50 . . . . . . . . . . . . . . . . . 71 2.3. Funciones ψ y λ tabuladas hasta r = 24 . . . . . . . . . . . . . . . . . . . . 72 3.1. 3.2. 3.3. 3.4.

Objetivos m´ aximos de servicio defectuoso seg´ un G.821 . . . . . . . . Asignaci´ on de objetivos de minutos degradados y segundos err´oneos Distribuci´ on del 0.1 % de segundos severamente err´oneos . . . . . . . Clasificaci´ on de calidad de secci´on digital . . . . . . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

77 79 79 80

4.1. 4.2. 4.3. 4.4. 4.5.

Funci´ on de los puentes hardware de la placa DDS . . . . . Coeficientes del filtro FIR sin compensar . . . . . . . . . . Coeficientes del filtro FIR compensados . . . . . . . . . . Interface paralelo de la placa DDS. . . . . . . . . . . . . . Sumario de velocidades de bit generadas en la placa DDS

. . . . .

. . . . .

. . . . .

. . . . .

84 92 95 97 104

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

5.1. Descripci´ on matem´ atica de las secuencias generadas en la placa de BER . . 128 5.2. Descripci´ on de las secuencias repetitivas programadas en la placa de BER. . 129 5.3. Interface entre la placa BER y el puerto paralelo del PC. . . . . . . . . . . 131 A.1. A.2. A.3. A.4. A.5. A.6.

Hilos del puerto paralelo del PC . . . . . . . . . . . . . . . Posiciones de la BIOS que almacenan las direcciones de I/O Puerto de datos . . . . . . . . . . . . . . . . . . . . . . . . . Puerto de estado . . . . . . . . . . . . . . . . . . . . . . . . Puerto de control . . . . . . . . . . . . . . . . . . . . . . . . Puerto paralelo en la aplicaci´on . . . . . . . . . . . . . . . .

. . . . . . de LPTs . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . .

. . . . . .

. . . . . .

148 149 150 150 151 152

B.1. B.2. B.3. B.4.

Conector Conector Pines del Conector

. . . .

. . . .

. . . .

. . . .

156 156 157 157

de interface de la placa DDS de interface de la placa BER conector al puerto paralelo . de alimentaci´ on . . . . . . .

ix

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

Introducci´ on En la era de la informaci´ on en que vivimos, y dado que la naturaleza de la mayor´ıa de la misma, por no decir la pr´ actica totalidad, es digital, la actual tendencia de desarrollo tecnol´ ogico se ha ido dirigiendo claramente desde hace a˜ nos hacia el procesado digital de se˜ nal. Sin embargo, hasta hace poco tiempo, la “limpieza” que supon´ıa el realizar las operaciones a nivel te´ orico en el dominio digital se ve´ıa devaluada por el elevado coste de los circuitos pr´ acticos unido a su considerable consumo. Esto reduc´ıa el margen de empleo de las t´ecnicas DSP (Procesado Digital de la Se˜ nal) al rango de aplicaciones de baja frecuencia. Actualmente la situaci´ on ha cambiado de manera radical, pues el DSP m´as avanzado de Texas est´ a ya sobre los 800 MIPS (los modelos TMS320C55xx) haciendo gala de unos rendimientos de 0.05 mw/MIPS, con lo que se puede ver que la industria se est´a volcando es este campo. Lo mismo sucede en la rama de la s´ıntesis digital directa, donde se ha conseguido integrar el n´ ucleo DDS junto a DACs exhibiendo un excelente comportamiento din´amico, bajo consumo, tama˜ no y precio. Tradicionalmente la aplicaci´on m´as corriente e inmediata de la s´ıntesis digital directa ha sido en sintetizadores de se˜ nal como sustituci´on de los tradicionales PLLs anal´ogicos. A medida que ha ido avanzando el grado de integraci´on de estos circuitos, los fabricantes han a˜ nadido filtros digitales y otras funcionalidades DSP a los mismos. De esta manera, ya podemos encontrar todo tipo de sistemas como moduladores y demoduladores integrados en un s´ olo chip, que dan lugar a aplicaciones pr´acticas m´as compactas y de menor consumo, liberando as´ı de carga computacional a los controladores. Este trabajo hace un repaso a la tecnolog´ıa de la s´ıntesis digital directa mostrando el actual “estado del arte” de esta especialidad, a la vez que se desarrolla un sistema de utilidad pr´ actica en el laboratorio. Por otra parte se ha realizado otro sistema como fuente de se˜ nal de datos para el montaje DDS. Lo que en un principio iba a ser una peque˜ na aplicaci´on, al final ha resultado tener casi la misma entidad que el sistema principal. Por esta raz´on, no se considera desacertado incluir en la memoria un peque˜ no cap´ıtulo que repase las bases de este “sistema auxiliar”. Se trata de una introducci´on sobre las secuencias generadas en registros de desplazamiento realimentados. Constituye un intento de animar al lector a profundizar en el conocimiento de las secuencias pseudoleatorias y los polinomios primitivos, pues a pesar de ser un tema poco novedoso, no es f´acil encontrar informaci´on ordenada sobre el mismo. Personalmente, este inter´es resurgi´o durante el dise˜ no de la placa de generaci´on de medida de BER.

1

2

Organizaci´ on de la memoria El trabajo se ha organizado en dos partes principales: Descripciones Te´ oricas. Comprenden los 3 primeros cap´ıtulos, y en ellos se resumen los fundamentos te´oricos de aplicaci´ on en los dos montajes del trabajo. El cap´ıtulo 1 es el principal componente de este bloque te´orico. En ´el se comentan los aspectos principales de las t´ecnicas de s´ıntesis digital directa (DDS) haciendo especial incapi´e en los procesos de conversi´on D/A [?]. Como complemento a la descripci´ on te´ orica, se ha realizado una labor de recopilaci´on de datos y comparativa entre algunos de los chips que implementan t´ecnicas DDS de entre los principales fabricantes [?]. A continuaci´ on, el cap´ıtulo 2 contiene una descripci´on particularmente interesante de las caracter´ısticas matem´aticas de las secuencias pseudoaleatorias recogidas principalmente de [?]. Por u ´ltimo, en el cap´ıtulo 3 se recogen las precisiones principales establecidas por la UIT para la realizaci´on de medidas de calidad en los enlaces de datos, obtenidas de las recomendaciones [?] y [?]. Dise˜ no Pr´ actico. La segunda mitad del trabajo comprende dos cap´ıtulos que constituyen la memoria de las mismas aplicaciones pr´acticas. En ellos se comenta el funcionamiento individual de cada circuito incluyendo esquem´aticos, y tambi´en se hace una descripci´on del software de control desarrollado para cada placa. El cap´ıtulo 4 est´ a dedicado a la placa PCB donde se ha montado un modulador DDS. Se trata de un modulador digital QPSK, FSK y 16QAM, con un margen de frecuencia de salida de hasta 65 Mhz y diversas funcionalidades integradas que se ver´an durante su exposici´ on. Entre estas, podemos destacar la inclusi´on dentro del chip DDS de un filtro de datos FIR, que permite la realizaci´on de gran cantidad de caracter´ısticas de filtrado en el dominio digital. La aplicaci´on de control del modulador digital dispone de una pantalla donde se pueden cambiar los coeficientes del filtro. Para servir de ayuda en el c´ alculo de los mismos se realiza un ejercicio en Matlab de c´alculo de los coeficientes de un filtro FIR con una curva de respuesta en coseno alzado. El cap´ıtulo 5 corresponde a la placa de circuito impreso donde se ha implementado un generador de secuencias pseudoaleatorias. Este dise˜ no, construido como apoyo de la placa de modulaci´ on DDS, constituye por s´ı mismo un montaje independiente que puede utilizarse por separado para la medida de tasa de bits err´oneos. El programa de control suministra informaci´on sobre los par´ametros m´as importantes recomendados por la UIT para la realizaci´ on de medidas de calidad en enlaces. Entre ellos podemos destacar el n´ umero de segundos con errores, los segundos severamente err´oneos, y por supuesto, la tasa de BER del canal bajo prueba. Las secuencias generadas en la parte de transmisi´on de este circuito se utilizar´ an como se˜ nal de informaci´ on en la placa de modulaci´on DDS sirviendo como trama digital de entrada al mismo. Durante la exposici´ on de estos cap´ıtulos se presentan medidas variadas obtenidas con diferentes equipos de laboratorio tales como analizador de espectros, analizador vectorial y osciloscopio.

3

Para finalizar, se presentan tres ap´endices con informaci´on adicional. El ap´endice A contiene una breve descripci´ on te´orica del funcionamiento del puerto paralelo en el PC, los diversos registros que son de inter´es para el programador, y unos pocos conceptos referentes a su construcci´ on hardware. Todo ello para entender mejor el modo en que se ha desarrollado la interface de control del sistema. En el ap´endice B se muestran diversas fotograf´ıas presentando el aspecto real de los circuitos y el chasis donde se ha mecanizado todo el conjunto, y tambi´en se han incluido unas tablas recopilando las funciones de cada terminal en los diversos conectores a los que tiene acceso el usuario. Por u ´ltimo, en el ap´endice C se han incluido los c´odigos fuente de las aplicaciones de control realizadas en Labwindows CVI.

Cap´ıtulo 1

La s´ıntesis digital directa La S´ıntesis Digital Directa (DDS) se puede definir como un medio de generar se˜ nales a partir de representaciones digitales arm´onicamente puras y altamente precisas. Esta representaci´ on digital es posteriormente reconstruida mediante un convertidor DigitalAnal´ogico de alta velocidad, para proporcionar una se˜ nal de salida anal´ogica, t´ıpicamente un tono sinusoidal o una secuencia de tonos. Como en estos dispositivos la se˜ nal se procesa de forma digital, su generaci´ on es f´acilmente configurable mediante software, haciendo m´ as amplia su gama de utilidades. Actualmente se encuentran disponibles una amplia gama de DACs de altas prestaciones con los que se consiguen esp´ ureos de potencia extremadamente baja a la salida del conjunto DDS-DAC. Las t´ecnicas DDS ofrecen prestaciones u ´nicas en contraste con los otros m´etodos de s´ıntesis. Aunque se encuentran limitados por el criterio de Nyquist (hasta 1/2 de la frecuencia del reloj aplicado como referencia), la t´ecnica DDS permite un control en la resoluci´ on de frecuencia del orden de milihertzios, al igual que con la resoluci´on en fase, donde es f´ acil obtener resoluciones de 0.02o en los dispositivos comerciales. Adicionalmente, las t´ecnicas DDS no imponen restricciones de tiempo de establecimiento (settling time) en cambios de frecuencia, salvo los requeridos por el control digital. Como resultado se consiguen frecuencias de conmutaci´on extremadamente elevadas, del orden de nanosegundos. Todos los cambios de frecuencia se realizan autom´aticamente sin discontinuidad de fase. Como la se˜ nal se genera en el dominio digital, el proceso se puede manipular con excepcional precisi´ on. Esto permite un control preciso tanto de la fase como de la frecuencia, consigui´endose f´ acilmente las modulaciones PSK ´o FSK. Si se desea, un sistema controlado por microprocesador se puede utilizar para almacenar datos de compensaci´ on de frecuencia en lazo abierto de un dispositivo particular o de alg´ un par´ ametro del sistema. El microprocesador puede controlar el DDS para corregir de forma din´ amica la frecuencia seg´ un se necesite. Con un detector de frecuencia adecuado en un sistema de recepci´ on, se puede construir f´acilmente un sistema de lazo cerrado. En resumen, podemos enumerar las ventajas de las t´ecnicas DDS: Resoluci´ on en frecuencia muy elevada (hasta ´ordenes de µHz, y tambi´en en fase (mejor del orden de un grado), todo bajo control digital. Extremada velocidad de “salto de frecuencia o fase”, cambios de frecuencia continuos en fase y sin problemas de transitorios como ocurre en los sintetizadores anal´ogicos.

4

´n 1.1 Teor´ıa de operacio

5

Eliminaci´ on de los problemas relacionados con los retoques y la sinton´ıa fina manual ocasionados por el envejecimiento de componentes y derivas de temperatura t´ıpicos de los sintetizadores anal´ ogicos. Control digital del sistema, con las ventajas que esto conlleva: posibilidad de control remoto, ajuste optimizado, y cualquier aplicaci´on que se nos pueda ocurrir bajo control de un microprocesador. Cuando se utilizan como sintetizadores en cuadratura, posibilidad de afrontar ajustes y controles independientes para cada canal I y Q.

1.1.

Teor´ıa de operaci´ on

Un DDS est´ a formado b´ asicamente por un contador de elevado n´ umero de bits que direcciona una memoria ROM en la que se han almacenado los valores de amplitud de una funci´on del tipo seno o coseno. La salida de la memoria va directamente a un convertidor D/A el cual transforma los “n´ umeros” almacenados en la memoria en valores de tensi´on, reconstruyendo as´ı la se˜ nal anal´ ogica. El problema fundamental con esta arquitectura es que para cambiar la frecuencia de salida es necesario cambiar la frecuencia de reloj, lo que es un m´etodo poco pr´actico. Para evitar esto, se emplea una t´ecnica hardware muy eficiente que se denomina Oscilador Controlado Num´ericamente (NCO). Un diagrama de bloques de esta t´ecnica se puede ver en la figura 1.1.

Figura 1.1: Esquema interno de un NCO

El coraz´ on del sistema es el acumulador de fase cuyos contenidos se actualizan una vez por ciclo de reloj. Cada pulso de reloj, el n´ umero digital almacenado en el registro de fase se incrementa con el valor almacenado en el registro de incremento de fase M. Por lo tanto, puesto que el acumulador es de un elevado n´ umero de bits, por ejemplo N = 32 32 bits, se necesitan 2 ciclos de reloj (m´as de 4000 millones) para que el acumulador genere un ciclo completo. Otra forma de entender la funci´on del acumulador de fase es observando la figura 1.3, donde se puede considerar la oscilaci´on de salida como un vector girando a velocidad constante alrededor de un c´ırculo de fase (la velocidad de giro ser´a la del reloj de referencia). Cada punto del c´ırculo de fase se corresponde con un punto equivalente de un ciclo de la funci´on seno. El acumulador de fase se utiliza para “direccionar” cada uno de los puntos

´n 1.1 Teor´ıa de operacio

6

Figura 1.2: Flujo de se˜ nal a trav´es de la arquitectura DDS

del c´ırculo y la palabra de sinton´ıa M determina el salto del vector en cada pulso de reloj. La resoluci´ on del acumulador N determina el n´ umero de puntos en que se divide la “rueda”.

Figura 1.3: Rueda digital de fase

Para transformar la salida lineal del acumulador de fase en cualquier tipo de amplitud, normalmente senoidal, se necesita una tabla de referencia, generalmente en memoria ROM. Existen t´ecnicas para ahorrar memoria en esta tabla, por ejemplo el explotar la simetr´ıa de la forma de onda senoidal, de manera que s´olo se guardan los valores de amplitud correspondientes a 1/4 de ciclo y por medio de los 2 bits m´as significativos se determina el cuadrante de situaci´ on: el m´ as significativo directamente indica el signo de la amplitud al DAC, mientras que el segundo determina la forma de recorrer la tabla de referencia. El acumulador de fase es un contador m´odulo N que incrementa su valor cada vez que recibe un pulso de reloj. La magnitud de ese incremento depende de la palabra de sinton´ıa M cargada en el “registro de incremento de fase”. Este registro es el que determina la cantidad de puntos que se avanzan en cada salto de la rueda de fase. Por tanto si M = 1 la frecuencia del reloj de referencia se divide por 232 (continuando con el ejemplo anterior de N = 32), si M = 2 por la mitad, y as´ı sucesivamente. De acuerdo con esto, la frecuencia de salida vale: Fout =

M · fclk 2N

(1.1)

1.2 Espectro de salida

7

Ecuaci´ on conocida como de sinton´ıa b´asica del NCO, siendo la resoluci´on en frecuencia: fclock (1.2) 2N Como la resoluci´ on del convertidor D/A de salida est´a limitada a 12 ´o 14 bits, la salida del acumulador se trunca a los 13 - 15 bits m´as significativos. Esto reduce el tama˜ no de la tabla de referencia y no afecta a la resoluci´on en frecuencia. El truncamiento de fase solamente a˜ nade una cierta cantidad de ruido de fase a la salida del circuito. La resoluci´ on del convertidor D/A es t´ıpicamente 2 a 4 bits menor que el ancho de la tabla de referencia, siendo los esp´ ureos generados por el truncamiento del acumulador inferiores a 90 dBc, [?] y [?], para el caso de emplear 15 bits en el acumulador, valor superior a las prestaciones que ofrecen los mejores convertidores D/A. ∆f =

1.2.

Espectro de salida

Para entender m´ as f´ acilmente el espectro de la forma de onda que se genera a la salida del convertidor D/A, en la figura 1.4 se incluye una representaci´on de lo que ser´ıa un ciclo de onda senoidal reconstruida a la salida del mismo:

Figura 1.4: Reconstrucci´on de la se˜ nal a la salida del convertidor D/A

Dado que por mucha resoluci´on que quiera tener un DAC, ´esta va a ser siempre limitada, a su salida la se˜ nal siempre tendr´a la forma de onda t´ıpica con escalones de amplitud equiespaciados un per´ıodo de tiempo igual a la frecuencia de reloj del sistema, que es la frecuencia a la que se actualiza. Comparando las figuras 1.4 y 1.5, se puede deducir que la salida del convertidor es equivalente al muestreo pr´ actico instant´ aneo de la se˜ nal senoidal a reconstruir x(t), por una se˜ nal muestreadora s(t) en forma de trenes de pulsos muestreadores p(t − nTs ), llevando el caso al l´ımite en el que la duraci´on del pulso es igual al periodo de muestreo; en la figura corresponde al apartado (d). El pulso muestreador y la se˜ nal muestreadora son: Y t  ∼ p(t) = (1.3) Ts s(t) =

X n

resultando:

p(t − nTs )

(1.4)

1.2 Espectro de salida

8

Figura 1.5: Ejemplo de se˜ nal anal´ogica y sus diversos tipos de muestreo (a) Forma de onda anal´ogica original (b) Muestreo pr´actico natural (c) Muestreo pr´actico instant´aneo (d) Muestreo pr´actico instant´aneo de tipo sample and hold

xsi (t) = x(t) · s(t) para t = nTs xsi (t) =

X

x(nTs ) · p(t − nTs )

(1.5)

n

que es lo mismo que: "

#

xsi (t) = p(t) ∗ x(t) ·

X

δ(t − nTs )

(1.6)

n

Realizando la transformada de Fourier encontramos el espectro de salida: Xsi (f ) =

X 1 m · P (f ) · X(f − ) Ts T s m

(1.7)

como P (f ) = Ts ·

sen(πf Ts ) πf Ts

(1.8)

resulta el espectro de salida de la se˜ nal generada por el convertidor D/A: XDAC (f ) =

sen(πf Tclk ) X m · X(f − ) πf Tclk Tclk m

(1.9)

que corresponde al espectro de la se˜ nal muestreada, en nuestro caso la se˜ nal sintetizada sen(ωt), repetida a intervalos iguales a la frecuencia de muestreo, el reloj del sistema DDS, y conformado por la envolvente sinc(f Tclk ). La representaci´on gr´afica de este resultado para una se˜ nal paso bajo generalizada la podemos apreciar el la figuras 1.6 (g) y (h),

1.2 Espectro de salida

9

donde se representa tambi´en el espectro resultante para los dem´as tipos de muestreo. El resultado particular para un tono fijo se muestra en la figura 1.7.

Figura 1.6: Espectro resultante para los diferentes tipos de muestreo pr´actico

Seg´ un se puede apreciar, el proceso de construcci´on de la se˜ nal anal´ogica por el DAC produce por s´ı mismo la aparici´on de respuestas imagen alrededor de N · fclock ± fout . Tambi´en es de destacar la coincidencia de los nulos de la envolvente con los m´ ultiplos de la frecuencia de reloj del sistema. Para eliminar las componentes imagen, lo normal es utilizar un filtro pasobajo externo con frecuencia de corte ligeramente inferior al ancho de banda de Nyquist fclock /2 (por conveniencia pr´actica en los requerimientos del mismo, normalmente el 40 % de fclock ). Se puede calcular la ca´ıda de la curva de respuesta en un sistema DDS a causa de la envolvente sinc(f Tclk ), resultando valer −3,92 dB desde DC hasta el ancho de banda de Nyquist. Las arquitecturas DDS actuales incluyen un filtro con curva caracter´ıstica x/sen(x) que compensa esta ca´ıda, dejando la respuesta en amplitud a la salida del convertidor A/D pr´ acticamente plana (±0,1 dB) sobre un ancho de banda igual al 45 % de la frecuencia de reloj, equivalente al 80 % de Nyquist.

1.3 Capacidad de sinton´ıa en fase y frecuencia de los DDS

10

Figura 1.7: Espectro positivo te´orico de salida de un sistema DDS. No se consideran las no-linealidades del mismo

Es de destacar la gran amplitud de la primera frecuencia imagen, que para valores de frecuencia de salida cercanos a Nyquist puede tener niveles de amplitud muy similares a la componente fundamental. Es preciso, por tanto, realizar un estudio del margen de frecuencias u ´tiles seg´ un la aplicaci´on particular, y especificar un filtro antialiasing apropiado. El resto de imperfecciones del sistema tales como errores de linealidad, energ´ıa de glitches asociada al convertidor D/A, acoplamiento de la frecuencia de reloj, etc, no siguen la curva de ca´ıda sen(x)/x, dependiendo en este caso del layout del circuito impreso, la calidad de la fuente de alimentaci´on, la calidad del reloj de referencia, etc. De estos efectos se hablar´ a en las secciones siguientes.

1.3.

Capacidad de sinton´ıa en fase y frecuencia de los DDS

En principio, la frecuencia de salida del DDS es f´acilmente controlable siguiendo las ecuaciones 1.1 y 1.2 de sinton´ıa del NCO. Veamos a continuaci´on un ejemplo concreto donde se emplean estas relaciones para conseguir una resoluci´on en pasos de Hz exactos.

1.3.1.

Sinton´ıa en frecuencia

Por ejemplo, utilizando una frecuencia de reloj fclock = 227 = 134,217728 MHz, si disponemos de un DDS con un registro de frecuencia de 32 bits (N=32), se puede generar una frecuencia decimal exacta: 227 = 1Hz/25 232 Ahora s´ olo tenemos que calcular la palabra M de sinton´ıa de frecuencia: ∆f =

Fout = M · ∆f M = 25 = 20(h

para

fout = 1Hz

M = 26 = 40(h

para

fout = 2Hz

M = 96 = 60(h .. .

para .. .

fout = 3Hz

M = 1720583456 = 668E0520(h

para

fout = 53768233Hz

1.3 Capacidad de sinton´ıa en fase y frecuencia de los DDS

1.3.2.

11

Velocidad de cambio de sinton´ıa

Esta prestaci´ on es clave en aplicaciones en las que se requiere una m´axima velocidad de cambio de frecuencia como GMSK y FSK en “modo rampa”. Viene claramente determinada por la velocidad m´ axima de la interface de control y por su configuraci´on. Existen muchos tipos de configuraciones para esta interface, tanto con carga paralelo como su contrapartida serie. Se puede encontrar desde registros simples de 40 bits que almacenan todas las palabras de configuraci´on, hasta puertos de comunicaciones s´ıncronos compatibles con algunos microprocesadores. Obviamente ser´ a mucho m´ as r´apida una interface de tipo paralelo que una serie. La desventaja est´ a en el n´ umero de pines empleados, cuya cuenta aumenta considerablemente en el caso de la interface paralelo. Actualmente ya se encuentran DDS con control paralelo y velocidades de carga de datos del orden de 100 MHz. Esto significa que se puede presentar una palabra de frecuencia nueva a la salida del DDS cada ¡10ns!. La caracter´ıstica de cambio de fase continua de los dispositivos DDS los hace adecuados para aplicaciones de salto de frecuencias a alta velocidad (frequency hopping).

(a)

(b)

Figura 1.8: Cambios de frecuencia en la arquitectura DDS (a) Cambio de frecuencia en el acumulador de fase (b) Detalle del cambio de frecuencia en la se˜ nal de salida

Existen dispositivos DDS con diversos registros adicionales que pueden programarse con otras palabras de sinton´ıa de frecuencia; el contenido de estos registros se ejecuta por medio de alg´ un terminal externo del integrado, consiguiendose f´acilmente la generaci´on de FSK. Utilizando estos registros preprogramados se pueden obtener velocidades de salto de fase de hasta 250 MHz. La velocidad de conmutaci´on es un tema importante en muchos dise˜ nos de sintetizadores. Un sintetizador se consideraba “r´apido” cuando su tiempo de asentamiento era de pocos milisegundos. La evoluci´on de los sintetizadores anal´ogicos-directos permiti´o conseguir el establecimiento en unos pocos microsegundos. Sin embargo, DDS es incuestionablemente la t´ecnica de conmutaci´on m´as r´apida.

1.4 Efecto del DAC en sistemas DDS

12

Los dise˜ nos m´ as lentos DDS incluyen t´ecnicas pipeline que degradan la caracter´ıstica de conmutaci´ on. Cuando la velocidad de conmutaci´on es una especificaci´on cr´ıtica, la velocidad del DDS puede ser tan r´apida como un ciclo de reloj m´as el retardo a˜ nadido por el filtro de salida. Algunos dise˜ nos DDS pueden conmutar a cualquier frecuencia dentro de su ancho de banda en un ciclo de reloj.

1.3.3.

Registros adicionales preprogramados

Aunque en la secci´ on anterior nos hemos referido u ´nicamente a la conmutaci´on en frecuencia, todo lo dicho sirve para la caracter´ıstica de fase si el dispositivo DDS dispone de un registro de fase entre el acumulador de fase y la memoria ROM del mismo. En general, existen otros registros adicionales que no forman parte de la estructura madre de un DDS, pero que aportan beneficios indudables a la hora de utilizarlos en aplicaciones pr´ acticas. Algunos de ellos ya se han nombrado, pero de nuevo se enumeran todos a continuaci´ on, de forma que la estructura final de un dispositivo DDS gen´erico puede ser la que se observa en la figura 1.9: 1. Registro adicional de sinton´ıa de frecuencia (acumulador de fase). Seleccionando con un terminal externo del DDS un registro u otro se consiguen f´acilmente modulaciones FSK. 2. Registro de control de fase cuyo contenido se suma al acumulador, permitiendo al usuario comandar retardos de fase programados. La cantidad de retardo que se puede programar var´ıa desde 11.5o (5 bits), hasta ±0,02o (14 bits). Es la forma inmediata de implementar modulaciones del tipo PSK. 3. Registro de control de amplitud. La salida de la memoria ROM se multiplica con el contenido de este registro. Se toman los bits m´as significativos del resultado para alimentar al DAC. De este modo obtenemos modulaciones de amplitud. 4. En otras arquitecturas DDS m´as espec´ıficas como moduladores y convertidor ascendentes digitales, se incluyen registros adicionales para realizar funciones tales como filtros FIR, etapas de interpolaci´on, as´ı como inversi´on espectral de la se˜ nal de salida. Se tratar´ an en la secci´ on 1.9.

1.4.

Efecto del DAC en sistemas DDS

Los convertidores D/A son los que marcan las prestaciones de los sistemas DDS. Dado que el sistema trabaja con representaciones de se˜ nales en el dominio digital, por tanto perfectas en teor´ıa y sin fuentes de ruido alguno, de el bloque de conversi´on D/A va a depender en buena parte la calidad y el funcionamiento final del sistema. En esta secci´ on se van a analizar los distintos tipos de conversores existentes, sus prestaciones, problemas pr´acticos, etc.

1.4.1.

Conversores D/A de alta velocidad

Un conversor D/A est´ a formado por una serie de fuentes de corriente que se conmutan por medio de conmutadores anal´ogicos para generar las distintas tensiones de salida, como se puede ver en la figura 1.10.

1.4 Efecto del DAC en sistemas DDS

13

Figura 1.9: Estructura completa de un dispositivo DDS equipado para todas las funcionalidades

Figura 1.10: Estructuras de los conversores D/A

Los problemas derivados de esta arquitectura son: Resoluci´ on No linealidades Generaci´ on de impulsos o “glitches” Dependencia de la distorsi´ on con la relaci´on reloj de salida/frecuencia de salida Un convertidor D/A no ideal introduce distorsi´on por varios motivos, entre los principales que podemos citar est´ an las no linealidades del amplificador de entrada, las diferencias entre las fuentes de corriente y los impulsos que se producen al conmutar los interruptores anal´ ogicos. Las dos primeras fuentes de distorsi´on son dif´ıciles de cuantificar y analizar, pues son par´ ametros intr´ınsecos del circuito.

1.4 Efecto del DAC en sistemas DDS

14

El tercer problema es la generaci´on de impulsos o “glitches”. Este efecto presenta la m´axima incidencia a mitad de escala, cuando se pasa del c´odigo 1000..00 al 0111..11, y por tanto se deben conmutar todos los interruptores de corriente al mismo tiempo. En esta situaci´ on, se producen impulsos por el desigual tiempo de conmutaci´on de los interruptores de corriente lo que produce la aparici´on de ruido dentro y fuera de la banda de trabajo del conversor. Este proceso se repite con menor incidencia a 1/4, 1/8 de escala, etc.

(a)

(b)

Figura 1.11: Degradaci´on del margen libre de esp´ ureos (D/A de 12 bits) (a) En funci´on de la frecuencia de entrada. (b) En funci´on de la frecuencia de entrada para 5 MSPS.

Por otra parte, la energ´ıa de impulso aumenta exponencialmente al aumentar la frecuencia de reloj y al aumentar la frecuencia de la se˜ nal de entrada, por lo que las prestaciones del D/A se degradan de forma logar´ıtmica al aumentar la frecuencia de reloj por causa de este fen´ omeno. En la figura 1.11 se puede ver este par´ametro que se caracteriza por medio del margen libre de esp´ ureos “SFDR”, tanto en funci´on de la frecuencia de entrada como de la de muestreo. En la figura 1.12 se compara el SFDR de dos conversores, uno de 10 bits y otro de 12 bits, trabajando a un r´egimen elevado de frecuencia de reloj (100 MSPS). A pesar de que la frecuencia de salida no es la misma en ambos, se observa una importante reducci´ on o del nivel de esp´ ureos en el de 12 bits, siendo ´este el actual l´ımite pr´actico del n de bits en los conversores D/A de alta velocidad con tecnolog´ıa TTL, pues el aumento del n´ umero de bits a 14 o superior no supone una reducci´on del nivel de esp´ ureos a causa de las no linealidades y los glitches que se producen. En resumen, si se van a emplear frecuencias de muestreo del orden de 50 Mhz, el conversor D/A ´ optimo ser´ a de 12 bits con tecnolog´ıa TTL, con lo que conseguir´ıamos un margen libre de esp´ ureos de unos 60 dB. De cualquier forma, las prestaciones de las etapas de conversi´on D/A son superiores a las de conversi´ on A/D, por lo tanto es ´este el elemento m´as delicado en un procesador digital de se˜ nal.

1.4.2.

Conversores A/D de alta velocidad

Hoy en d´ıa est´ an apareciendo multitud de aplicaciones en las que se realiza muestreo de alta velocidad. Las m´ as comunes son aplicaciones de v´ıdeo y de radiofrecuencia donde se muestrea una se˜ nal de frecuencia intermedia para luego procesarla.

1.4 Efecto del DAC en sistemas DDS

(a)

15

(b)

Figura 1.12: Espectro de salida de un conversor D/A. (a) Conversor D/A de 10 bits, 125 MSPS. (b) Conversor D/A de 12 bits, 100 MSPS

El auge de estas aplicaciones, ha provocado el desarrollo de los convertidores anal´ogico/ digital (ADC) que han aumentado sus prestaciones de forma considerable, pues son estos dispositivos los que limitan la calidad m´axima en un procesador de se˜ nal. En estos nuevos conversores dise˜ nados para aplicaciones de alta velocidad, las caracter´ısticas en alterna y el margen din´amico son mucho m´as importantes que las de cont´ınua, por lo tanto existe una nueva generaci´on de dispositivos espec´ıficamente optimizados para el trabajo en alta velocidad. 1.4.2.1.

Par´ ametros de los dispositivos de conversi´ on

En este apartado vamos a tratar los efectos de la cuantificaci´on en los conversor A/D (y tambi´en D/A). Los u ´nicos errores asociados a un conversor ideal de N bits son los asociados al proceso de muestreo y cuantificaci´on. El m´aximo error que comete un convertidor al digitalizar una se˜ nal de DC es ±1/2LSB. Por lo tanto cualquier se˜ nal de CA generada por un conversor de n bits ideal producir´a un ruido de cuantificaci´on cuyo valor eficaz medido en el ancho de banda de Nyquist y para se˜ nal uniforme es: q ERRORRM S = √ 12

(1.10)

as´ı, para una se˜ nal sinusoidal tenemos que la relaci´on se˜ nal ruido vale: S = 6,02N + 1,76dB (1.11) N donde “N” es el n´ umero de bits. Esta relaci´on solamente es v´ alida si el ruido es medido en todo el ancho de banda de Nyquist, desde DC a fs /2. Por ejemplo, un convertidor A/D de 8 bits exhibe un SQR de 49.92 dB. Una precisi´ on importante a la ecuaci´ on 1.11 es que en ella no se hace referencia a la situaci´on frecuencial de los esp´ ureos ni a su amplitud individual, u ´nicamente se calcula la potencia combinada total de los mismos en relaci´ on a la componente fundamental.

1.4 Efecto del DAC en sistemas DDS

16

Otro punto a considerar es que la SRQ definida en la ecuaci´on 1.11 toma la amplitud de salida de la componente fundamental como la del fondo de escala. Por tanto, cuando tal situaci´ on no sea la real se empeorar´a un factor igual a: A = 20log(F F S)

(dB)

(1.12)

con FFS igual a la fracci´ on del fondo de escala a la que opera el DAC. Tomando en consideraci´ on este efecto resulta: SQR = 1, 76 + 6,02N + A = 1, 76 + 6,02N + 20log(F F S)

(dB)

(1.13)

Continuando con el ejemplo anterior, si el DAC opera al 70 % del fondo de escala (A=0.7), el SQR resultante es de 46.82 dB ( una reducci´on de 3.1 dB respecto al funcionamiento original del DAC). En √ lo que respecta al ruido de cuantificaci´on, aunque su valor eficaz si es aproximadamente q/ 12, su contenido en el dominio de la frecuencia puede estar altamente correlado con la se˜ nal alterna de entrada. As´ı por ejemplo, hay una correlaci´on mucho mayor para se˜ nales peri´ odicas de peque˜ na amplitud que para se˜ nales aleatorias de gran amplitud. Por eso, aunque normalmente se toma el ruido de cuantificaci´on como ruido blanco distribuido uniformemente en todo el ancho de banda, esta suposici´on no es correcta, pues en el caso de fuerte correlaci´ on el ruido aparece concentrado en los arm´onicos de la se˜ nal, justamente donde menos se desea. Normalmente se muestrean se˜ nales aleatorias, centradas en una banda de frecuencias, por lo que el ruido de cuantificaci´on suele ser aleatorio. Sin embargo, las correlaci´on entre el ruido de cuantificaci´ on y la se˜ nal depende de la relaci´on entre la frecuencia de muestreo y la se˜ nal de entrada. As´ı, si introducimos dos tonos de distinta frecuencia a un conversor A/D y variamos la diferencia de frecuencias entre ellos, podemos observar como el nivel de esp´ ureos var´ıa en funci´ on de dicha diferencia, por lo tanto dicho nivel no viene marcado por la distorsi´ on del conversor A/D sino que se trata de un artefacto del proceso de muestreo y de la correlaci´ on del error de cuantificaci´on con la frecuencia de entrada. En una aplicaci´ on pr´ actica de conversi´on A/D, generalmente el ruido de cuantificaci´on es aleatorio, porque siempre existe una cierta cantidad de ruido en el sistema que act´ ua como “dither” aleatorizando el espectro del error de cuantificaci´on. Es importante entender este proceso, porque la prueba que se emplea habitualmente para medir las prestaciones en alterna de un A/D consiste en realizar la FFT de las muestras de un tono sinusoidal. Se trata de un m´etodo universalmente aceptado, y para medir de forma precisa la distorsi´on arm´onica se deben respetar una serie de normas para asegurar que realmente se mide la distorsi´on del A/D. En primer lugar hay que elegir adecuadamente la relaci´ on de frecuencias, y algunas veces inyectar una cierta cantidad de ruido. Luego hay que tener en cuenta el n´ umero de muestras que se toman en la FFT, pues estas marcan el nivel de ruido de la funci´on. Este nivel vale:   M GF F T = 10log (1.14) 2 siendo M el n´ umero de puntos, por tanto si por ejemplo M=4096, la ganancia de proceso de la FFT ser´ıa de 33 dB, por lo que el ruido de la FFT estar´ıa 33 dB por debajo del ruido del conversor A/D. En la figura 1.13 se puede ver detalladas los distintos par´ametros que se usan para caracterizar un conversor A/D de 12 bits.

1.4 Efecto del DAC en sistemas DDS

17

Figura 1.13: Espectro de la FFT

Un conversor A/D real presenta una serie de fuentes de ruido y distorsi´on. En primer lugar est´ a el buffer de entrada que es un circuito de banda ancha que aporta ruido blanco y no linealidades, y presenta un ancho de banda limitado. A continuaci´on est´a el circuito de muestreo y retenci´ on que introduce m´as no linealidades, limitaciones del ancho de banda y “jitter”, por u ´ltimo el cuantificador del A/D introduce ruido de cuantificaci´on y no linealidades diferenciales. De acuerdo a estas fuentes de error se emplean una serie de par´ametros para caracterizar los conversores A/D: Distorsi´ on arm´ onica. Peor arm´ onico. Distorsi´ on arm´ onica total. Distorsi´ on arm´ onica total m´as ruido. Relaci´ on se˜ nal ruido y relaci´on de distorsi´on.(SINAD) N´ umero efectivo de bits.(ENOB) Relaci´ on se˜ nal a ruido.(SNR) Ancho de banda anal´ ogico (ABW). Margen libre de esp´ ureos (SFDR). Distorsi´ on de intermodulaci´on de dos tonos. Relaci´ on de potencia de ruido (NPR). Hay varias formas de medir la distorsi´ on arm´ onica de un A/D, pero todas ellas emplean la FFT para medir dicho valor. Para medir este efecto se introduce al A/D una se˜ nal 1 dB por debajo del fondo de escala y se mide la relaci´on en dB de la se˜ nal con

1.4 Efecto del DAC en sistemas DDS

18

respecto a el peor arm´ onico, para saber el pero caso, o con respecto al valor cuadr´atico medio de la suma de todos los arm´onicos para saber la distorsi´on arm´onica total. La distorsi´ on total m´ as ruido es igual a la distorsi´on arm´onica total pero teniendo en cuenta el ruido de cuantificaci´on. La relaci´ on se˜ nal-ruido-distorsi´ on es la relaci´on entre el valor eficaz de la amplitud de la se˜ nal con respecto al valor cuadr´atico medio de todas las dem´as componentes espectrales. El n´ umero efectivo de bits se define (ENOB) como: EN OB =

SIN AD − 1,76dB 6,02

(1.15)

La relaci´ on se˜ nal ruido (S/N) sin arm´onicos se define como la relaci´on entre el valor RMS de la se˜ nal con respecto al valor medio de la suma de los cuadrados de todas las dem´ as componentes espectrales excluyendo los 5 primeros arm´onicos y la componente cont´ınua [?]. El ancho de banda anal´ ogico es el valor para el cual el espectro de un barrido de entrada plano en frecuencia cae 3 dB. El margen libre de esp´ ureos (SFDR) es uno de las medidas m´as empleadas y se define como el valor rms entre la componente principal y los picos de las componente esp´ ureas, medido sobre la primera ventana de Nyquist. Este valor depende de la amplitud de la se˜ nal y se suele expresar en funci´on del fondo de escala. La distorsi´ on de intermodulaci´ on de dos tonos es igual a la medida cl´asica en cualquier circuito anal´ ogico. Se emplean dos se˜ nales cuya amplitud est´a 6 dB por debajo del nivel de fondo de escala del A/D y se miden las componentes nf1 ± mf2 .

Figura 1.14: Potencia equivalente de ruido (NPR)

La relaci´ on de potencia de ruido (NPR) se emplea frecuentemente en los sistemas de m´ ultiples por divisi´ on en frecuencia (FDM). En estos sistemas los canales de voz se multiplexan en bloques de 4 Khz para su transmisi´on, por lo que resulta importante ver la influencia de los canales adyacentes sobre el de inter´es. Para realizar la medida se inyecta ruido blanco al A/D y se filtra una banda de 4 Khz por medio de un filtro banda eliminada, de forma que el ruido que aparece en esa banda es debido a la intermodulaci´ on

1.4 Efecto del DAC en sistemas DDS

19

y distorsi´ on del A/D, midi´endose la relaci´on (NPR) entre el nivel de ruido de entrada y el de la banda filtrada. Esta medida se puede ver en la figura 1.14. 1.4.2.2.

Efectos del “jitter” de apertura y del reloj de muestreo

El jitter de apertura es otro par´ametro importante que hace disminuir la relaci´ on S/N de un A/D. El “jitter de fase” causa un error que es funci´on del tiempo de subida y que resulta en una degradaci´ on total de la relaci´on S/N. Este es un par´ametro muy importante, especialmente para frecuencia de entrada/salida muy elevadas, por lo que el reloj de muestreo debe ser de muy bajo “jitter”. En la figura 1.15 se puede ver dicho efecto.

Figura 1.15: Relaci´ on S/N en funci´on del “jitter” de apertura y del reloj de muestreo

1.4.2.3.

Arquitectura de conversores A/D de alta velocidad

La arquitectura de los conversores resulta determinante en sus caracter´ısticas din´amicas, por lo que es muy importante conocer las posibilidades existentes para aplicaciones de alta velocidad: Aproximaciones sucesivas (SAR). Flash. Subrango. Serie. Los conversores de Aproximaciones Sucesivas han sido muy populares y se han usado y siguen us´ andose para frecuencias de muestreo por debajo de 1 MSPS o menos.

1.4 Efecto del DAC en sistemas DDS

20

Un bloque SAR es u ´nicamente un cuantificador, pues no realiza muestreo, y para una conversi´ on adecuada la entrada debe permanecer constante durante todo el tiempo de conversi´ on. Los conversores FLASH tambi´en llamados paralelo, son los A/D m´as r´apidos existentes lo que consiguen gracias al empleo de un gran n´ umero de comparadores en paralelo. N Un conversor Flash de N bits emplea 2 resistencias y 2N − 1 comparadores en paralelo, de forma que cada comparador tiene una tensi´on de referencia que es 1 LSB superior a la del anterior. La se˜ nal de entrada se aplica a todos los comparadores a la vez, por lo que el retardo de propagaci´ on es el de un solo comparador, sin embargo la arquitectura emplea un gran n´ umero de resistencias y comparadores, lo que limita su resoluci´on a un n´ umero reducido de bits. Adem´ as para que los comparadores sean r´apidos deben trabajar con una potencia elevada, por lo tanto los problemas de los conversores Flash son su limitada resoluci´ on, elevada disipaci´ on de potencia y elevado coste. T´ıpicamente, los conversores Flash emplean 8 bits y alcanzan frecuencias de 500 Msps con anchos de banda anal´ ogicos de m´as de 300 Mhz. Pero como se ha mencionado antes, el ancho de banda de potencia total no tiene porqu´e ser el mismo que el ancho de banda de resoluci´ on. Idealmente los comparadores de un convertidor Flash est´an bien adaptados en CC y CA, pero en la pr´ actica hay diferencias cuando se aplica una se˜ nal a la entrada de todos los comparadores simult´ aneamente, lo que causa una degradaci´on en la se˜ nal a altas frecuencias. Esto se traduce en que la distorsi´on de estos conversores es de unos 70 dBc para frecuencias de 1 Mhz y se degrada a 35 dBc a 100 Mhz. Por lo tanto, estos conversores tienen aplicaci´on en sistemas donde se requiere un muestreo de muy alta velocidad con una calidad media o baja en cuanto a distorsi´on y esp´ ureos. Algunas aplicaciones ser´ıan por ejemplo, osciloscopios digitales, aplicaciones de comunicaciones de alta velocidad, etc. Aunque no es pr´ actico realizar un conversor FLASH con un elevado n´ umero de bits, sin embargo estos conversores se utilizan como subsistemas para realizar Conversores de Subrango tambi´en denominados como conversores “medio Flash” que son capaces de conseguir una resoluci´ on de hasta 16 bits y cuya arquitectura interior es la de la figura 1.16.

Figura 1.16: Conversor de subrango de 8 bits

En estos conversores, el proceso de conversi´on se realiza en dos pasos, en el primero los 4 bits m´ as significativos se digitalizan por medio de un conversor anal´ogico digital

1.4 Efecto del DAC en sistemas DDS

21

del tipo Flash, el dato digitalizado se convierte de nuevo a anal´ogico por medio de otro conversor D/A y se resta del valor de entrada, de forma que el residuo resultante se amplifica y se aplica al segundo conversor Flash. Por u ´ltimo, la salida de los dos conversores Flash se combina en una palabra binaria de 8 bits. Esta t´ecnica de conversi´ on multietapa se puede extender a dos, tres o cuatro etapas de forma que la precisi´ on en bits puede llegar a ser de 12, 14 ´o 16 bits. El tiempo de conversi´ on se multiplica por el n´ umero de etapas de que disponga el sistema, por lo tanto un A/D de dos etapas y 12 bits tendr´a un r´egimen de muestreo de 50 MSPS. Por u ´ltimo los conversores Serie emplean una etapa por bit para realizar una conversi´on A/D, por tanto son equivalentes a conversores de subrango con un bit por etapa y sin correcci´ on de errores. La figura 1.17 muestra un conversor de este tipo.

Figura 1.17: Conversor A/D serie

El circuito de muestreo y retenci´on mantiene la se˜ nal de entrada constante durante el tiempo que dura el ciclo de conversi´on , y hay N etapas, cada una tiene una salida de bit y una de residuo que va a la etapa siguiente. El u ´ltimo bit es detectado con un comparador como se muestra en la figura. El problema fundamental de esta arquitectura son las discontinuidades en el residuo de salida y la necesidad de que exista un tiempo de establecimiento adecuado entre etapas, por lo tanto, no es una arquitectura adecuada para aplicaciones de alta velocidad. Para terminar este apartado dedicado a los procesos de conversi´on, podemos resumir el margen de posibilidades de elecci´on en aplicaciones de alta velocidad a los siguientes tipos: Flash: muy alta velocidad (500 MSPS), con baja resoluci´on (8-9 bits) y elevada distorsi´ on (SFDR=-30 dBc) Subrango: alta resoluci´ on (10-14 bits) con baja distorsi´on (SFDR= -60 dBc ) y alta velocidad de operaci´ on (50 MSPS).

1.4.3.

Efecto del sobremuestreo en el nivel de ruido de cuantificaci´ on

Sobremuestrear equivale a utilizar una frecuencia de muestreo mayor de la de Nyquist intencionadamente. La figura 1.18 demuestra c´omo el sobremuestreo mejora la relaci´ on SQR, Se˜ nal-Ruido de Cuantificaci´ on. En la ecuaci´ on 1.11 se mostraba la relaci´on se˜ nal-ruido para el caso en que el ancho de banda u ´til era el de Nyquist. Cuando se sobremuestrea, el ancho de banda de inter´es

1.5 Efecto del truncamiento del acumulador de fase

22

Figura 1.18: El efecto del sobremuestreo sobre el ruido de cuantificaci´on

o utilizado, BW, es menor de Fs /2. La relaci´on S/N con respecto al ancho de banda se incrementa porque el porcentaje de ruido de cuantificaci´on es menor. La resoluci´ on del DAC determina la potencia de ruido de cuantificaci´on, es una cantidad fija y est´ a representada por el ´area sombreada en la figura. En el caso de sobremuestreo la potencia de ruido es la misma que el caso de muestreo a la frecuencia de Nyquist. Al existir un ancho de banda mayor sobre el que distribuir la potencia de ruido de cuantificaci´ on, en la banda de inter´es el rect´angulo que representa la potencia de ruido tiene menor altura, lo que indica que se mejora la relaci´on se˜ nal-ruido en esta zona. El efecto de mejora producido por el sobremuestreo es cuantificable: C = 10log(Fsos /Fs )

(dB)

(1.16)

donde Fs es la frecuencia de muestreo de Nyquist y Fsos la frecuencia de sobremuestreo. La relaci´ on SQR modificada por todos los efectos es:

SQR = 1, 76 + 6,02N + A + C = 1, 76 + 6,02N + 20log(F F S) + 10log(Fsos /Fs )

1.5.

(dB) (1.17)

Efecto del truncamiento del acumulador de fase

El truncamiento de fase es un aspecto importante de las arquitecturas DDS. Por ejemplo, consideremos un DDS con un acumulador de fase de 32 bits. Convertir cada uno de esos valores en un nivel de amplitud requerir´ıa una tabla de 232 entradas, o lo que es lo mismo, ¡ 4294967296 posiciones de memoria !. Si cada una de estas entradas almacenara un valor de amplitud de 8 bits, ser´ıa necesaria una memoria de 4 Gigabits. Claramente esto es algo impracticable. La soluci´ on es utilizar una fracci´on de los bits m´as significativos del acumulador para proporcionar la informaci´ on de fase. En el ejemplo anterior, de los 32 bits del acumulador de fase s´ olo se aprovechan los 12 m´as significativos. Los 20 restantes ser´an ignorados. Ahora s´ olo se necesitan 48 kilobits de memoria suponiendo informaci´on de amplitud de 12 bits. Para entender las implicaciones del truncamiento de fase se recurrir´a con insistencia a la figura 1.19, que dibuja el caso hipot´etico de un acumulador de 8 bits donde solamente los 5 bits superiores se utilizan para resolver la fase.

1.5 Efecto del truncamiento del acumulador de fase

23

Figura 1.19: Rueda de fase y Error por truncamiento de fase

En esta figura se representan dos c´ırculos punteados representando los valores de fase representables con cada una de las resoluciones utilizadas: con 8 bits se dispone de una resoluci´ on de 360o /28 = 1,41o , mientras que si utilizamos u ´nicamente los 5 bits m´ as significativos de la palabra de fase, en este caso tendremos una resoluci´on de 360o /25 = 11,25o . El c´ırculo externo de puntos verdes representa la resoluci´on de 8 bits, mientras que al caso de peor resoluci´ on le corresponde la circunferencia de puntos rojos interior. Ahora supongamos por ejemplo que la palabra de sinton´ıa programada en nuestro DDS del ejemplo es igual a 6. Esto quiere decir que la cuenta del acumulador se realiza con incrementos de 6 en 6. En la ya nombrada figura 1.19, tambi´en se representan los cuatro primeros cambios de ´ angulo de fase realizados por el DDS. Como se puede distinguir, se produce una discrepancia entre la fase indicada en el acumulador (la circunferencia externa de 8 bits), y la fase determinada por la resoluci´on de 5 bits (circunferencia interior). Estas discrepancias corresponden a los arcos E1 para la primera cuenta, E2 para la segunda y as´ı sucesivamente hasta llegar a la cuarta cuenta para la que no se produce error. La equivalencia en grados es de 8.46o , 5.64o y 2.82o para los errores E1, E2 y E3 respectivamente. A partir de ah´ı el patr´ on se repite peri´odicamente conforme el acumulador se incrementa a saltos de 6 en 6 posiciones en la circunferencia exterior a cada intervalo de reloj del sistema. Obviamente, estos errores de fase introducidos por el truncamiento de fase se traducir´an en errores de amplitud durante el proceso de conversi´on fase-amplitud inherente a todo dispositivo DDS. Estos errores son peri´odicos porque, independientemente de la palabra de sinton´ıa elegida, tras un n´ umero determinado de vueltas en la rueda de fase, la fase de acumulador y la fase truncada coincidir´an. Como los errores de amplitud son peri´odicos en el tiempo, aparecen como l´ıneas espectrales de frecuencia conocidos con el nombre de esp´ ureos por truncamiento de fase. En [?] se determina que la magnitud y distribuci´on de los esp´ ureos por truncamiento de fase dependen de tres factores: 1. Tama˜ no del acumulador de fase (A bits) 2. Tama˜ no de la palabra de fase, es decir, el n´ umero de bits de fase despu´es del trun-

1.5 Efecto del truncamiento del acumulador de fase

24

camiento (P bits) 3. Palabra de sinton´ıa (M)

1.5.1.

Magnitud de los esp´ ureos por truncamiento de fase

Hay palabras de sinton´ıa que no provocan esp´ ureos de truncamiento de fase, mientras que otras los generan del m´ aximo nivel. Si la diferencia entre el tama˜ no del acumulador A y el tama˜ no de la palabra de fase despu´es del truncamiento P es mayor de 4, (A − P ≥ 4), lo cual es muy corriente en los dise˜ nos DDS pr´acticos, se puede establecer el nivel m´aximo de esp´ ureos: Pmax

espur trunc

∼ = −6,02 · P

(dBc)

(1.18)

Por ejemplo, para un DDS de 32 bits de resoluci´on en frecuencia y un truncamiento de fase a 12 bits, los esp´ ureos por truncamiento de fase nunca estar´an por encima de −72 dBc independientemente de la palabra de sinton´ıa de frecuencia elegida.

(a)

(b)

Figura 1.20: Relaci´ on del Truncamiento de fase con los esp´ ureos generados (a) Patrones de palabras de sinton´ıa que provocan el m´aximo nivel de esp´ ureos (b) Patrones de sinton´ıa que provocan el m´ınimo nivel de esp´ ureos

En la figura 1.20 se representa gr´aficamente el acumulador de fase de un dispositivo DDS de A bits de resoluci´ on en la que aparece indicado el truncamiento a los P bits m´ as significativos. La primera parte de la figura corresponde al caso en que se generan los esp´ ureos de mayor nivel; son aquellas palabras de sinton´ıa M que cumplen: M CD(M, 2(A−P ) ) = 2A−P −1

(1.19)

1.5 Efecto del truncamiento del acumulador de fase

25

siendo M CD(X, Y ) el m´ aximo com´ un divisor de X e Y . En el ejemplo de la figura, la palabra de sinton´ıa es de A bits (resoluci´on del acumulador de fase), d´ onde los P bits superiores constituyen la palabra de fase (los bits que se van a utilizar para la conversi´on). Los bits A − P inferiores se desprecian, esto es, se ignoran en lo que se refiere a resoluci´on de fase. La palabra de sinton´ıa T, consta de los A − 1 bits menos significativos (el bit m´as significativo de la palabra de sinton´ıa debe ser 0 para evitar el aliasing). Tal y como se aprecia en la figura, cualquier palabra de sinton´ıa con un 1 en la posici´ on de bit 2A−P −1 y ceros en el resto de los bits de menos peso nos dan el truncamiento de fase con peor nivel de esp´ ureos (−6,02P dBc). El otro extremo se da en las palabras de sinton´ıa que no producen esp´ ureos algunos. Son palabras de sinton´ıa cuya parte “despreciada” es igual a cero. Formalmente son aquellas que cumplen: M CD(M, 2(A−P ) ) = 2A−P (1.20) Para que esta ecuaci´ on se cumpla, el patr´on de la palabra de sinton´ıa debe ser el del apartado (b) de la figura 1.20. Por tanto, las palabras de sinton´ıa que no provocan esp´ ureos de truncamiento de fase se caracterizan por tener un 1 en la posici´on de bit 2A−P y ceros en los restantes bits de menos peso. El resto de patrones de palabra de sinton´ıa provocan niveles intermedios de espureos.

1.5.2.

Distribuci´ on espectral de los esp´ ureos por truncamiento de fase

Analizar de forma precisa la distribuci´on de los esp´ ureos que provoca el truncamiento de la palabra de fase es bastante complicado. Un an´alisis detallado se puede encontrar en [?]. Aqu´ı se har´ a una presentaci´ on m´as intuitiva. Hay que recordar, en primer lugar, que el n´ ucleo de un DDS consta de un acumulador que suma de forma recursiva el valor de la palabra de sinton´ıa. En la figura 1.21 se pueden ver varias iteraciones de este proceso. Inicialmente, el acumulador contiene el valor de la palabra de sinton´ıa, (en este caso el valor arbitrario K). A cada ciclo sucesivo de reloj la palabra de sinton´ıa se suma al contenido anterior del acumulador. El proceso contin´ ua indefinidamente hasta que se vuelve a la posici´on de partida, pues al ser el acumulador m´odulo 2A , llega un momento en el cual se produce desbordamiento en el mismo. El n´ umero de pulsos de reloj necesarios hasta completar uno de estos ciclos se llama Velocidad de Repetici´ on Superior, (GRR). GRR = 2A /M CD(M, 2A )

(1.21)

Por ejemplo, si A vale 20 y M es 182.898 (base 10), resulta un GRR de 524.288. De este resultado se desprende que se necesitan alrededor de medio mill´on de ciclos de reloj antes de que el acumulador comience a repetir su secuencia. Aunque esto puede parecer un per´ıodo de repetici´ on grande, no es comparable al de algunos DDS que utilizan acumuladores de 48 bits. Volvamos a la figura 1.21. Como de los A bits de la palabra de fase, (que representan la verdadera fase), s´ olo se utilizan en el proceso de conversi´on a amplitud los P bits m´ as significativos, podemos considerar la se˜ nal de salida como una se˜ nal compuesta de una se˜ nal de resoluci´ on completa (que ser´ıa la que se obtendr´ıa sin truncamiento de fase) y una se˜ nal de error equivalente a los B bits de la palabra de truncamiento. Se puede considerar entonces que la se˜ nal de error es la fuente de los esp´ ureos. Estudiando las propiedades de esta palabra de truncamiento profundizaremos en la naturaleza de la se˜ nal de error.

1.5 Efecto del truncamiento del acumulador de fase

26

Figura 1.21: Secuencia seguida por el acumulador de fase

Si se consideran por separado los bits de truncamiento, es posible determinar el per´ıodo de repetici´ on de la palabra de truncamiento; es decir, el GRR de la palabra de truncamiento. Por ejemplo, para las condiciones de la figura 1.21, el valor de A se convierte en 12 (el n´ umero de bits de truncamiento). La palabra de truncamiento se comporta como un acumulador de B bits con una palabra de sinton´ıa equivalente (ETW) dada por: ET W = T modulo 2B

(1.22)

donde T es la palabra de sinton´ıa original. El resultado de ´esta operaci´on no es nada m´as que el valor de la parte truncada de la palabra de sinton´ıa original. En el ejemplo considerado, la ETW vale 2.674 (base 10). Por tanto, con A = 12 y T = 2674, la GRR es 2.048. Esto quiere decir que cada 2.048 ciclos de reloj, la palabra de truncamiento repetir´ a el patr´ on de su secuencia. Acabamos de demostrar una propiedad importante de la palabra de truncamiento: su per´ıodo. ¿Cu´ al es el comportamiento de la palabra de truncamiento durante este per´ıodo? La cuesti´on se puede responder observando que la “capacidad” de la palabra de truncamiento es 2B . Dividiendo la capacidad por la ETW obtendremos el n´ umero de ciclos de reloj necesarios para provocar que el acumulador se desborde. En el ejemplo considerado, como B=12, la capacidad de la palabra de truncamiento es 212 = 4,096. Antes de dividir por la ETW, sin embargo, es importante se˜ nalar que el bit m´ as significativo del ETW es un 1. Esto implica un per´ıodo de desbordamiento menor de 2 ciclos de reloj, o lo que es lo mismo, se producir´ıa una frecuencia con aliasing. Por tanto, debemos ajustar la ETW rest´ andola de la capacidad de la palabra de truncamiento (4.096). As´ı la ETW ajustada es 1.422 (4.096-2.674). Si el bit m´as significativo de la ETW hubiera sido 0, este ajuste no hubiese sido necesario. Ahora que ya conocemos la capacidad de la palabra de truncamiento y el valor de ETW ajustado correctamente, podemos determinar el per´ıodo de desbordamiento de la palabra de truncamiento:

1.5 Efecto del truncamiento del acumulador de fase

Capacidad/ET W = 2B /1422 = 4096/1422 = 2,88045

27

(1.23)

Este valor es el n´ umero medio de ciclos de reloj que se necesitan para que la palabra de truncamiento se desborde. Como sabemos que la GRR de la palabra de truncamiento es de 2.048 ciclos de reloj y que se lleva 2,88 ciclos de reloj el que la palabra de truncamiento se desborde, entonces el n´ umero de desbordamientos que ocurren sobre un per´ıodo de la GRR es:

N ro de desbordamientos = GRR/(Capacidad/ET W ) = 2048/2,88045 = 711

(1.24)

Con esta informaci´ on se puede observar el comportamiento de la palabra de truncamiento en la figura 1.22.

Figura 1.22: Comportamiento de la palabra de truncamiento

La palabra de truncamiento alcanza un valor m´aximo de 2B . Tiene la forma de diente de sierra con un per´ıodo de 4,096/1,422 = 2,88 ciclos de reloj. La forma de onda de diente de sierra resulta de la caracter´ıstica de desbordamiento del acumulador. Tambi´en se ve que la secuencia completa de valores de la palabra de truncamiento se repite despu´es de un per´ıodo de 2.048 ciclos de reloj. Como el comportamiento de la palabra de truncamiento es peri´odico en el dominio del tiempo su transformada de Fourier es peri´ odica en el dominio de la frecuencia. Como la secuencia de la palabra de truncamiento es una secuencia real, su transformada se puede representar por la mitad de puntos de los que consta la secuencia en el dominio del tiempo aprovechando sus propiedades de simetr´ıa. Por tanto, habr´a 1.024 frecuencias discretas asociadas al comportamiento de la palabra de truncamiento, y estas frecuencias constituyen los esp´ ureos de truncamiento. Por tanto, el espectro de la secuencia de la palabra de truncamiento ser´a el de una forma de onda en diente de sierra con el matiz siguiente: La frecuencia fundamental del diente de sierra es Fs × (ET W/Capacidad) ´o 0,3472Fs en el ejemplo. Como sabemos que hay 1.024 frecuencias asociadas con la secuencia de la palabra de truncamiento, entonces el espectro est´ a formado por los primeros 1.024 arm´onicos del espectro de la forma de onda en diente de sierra espaciados a intervalos de 0,3472Fs . Esto se expande hasta un margen de frecuencia de 355,5Fs . Por supuesto, se produce aliasing de los arm´onicos de alto orden dentro del ancho de banda de Nyquist, Fs /2. La figura 1.23 ilustra este fen´omeno. La traza superior de la figura 1.23 muestra el espectro parcial de la forma de onda en diente de sierra. La figura intermedia indica “la reflexi´on”de las l´ıneas espectrales debida al aliasing. Obs´ervese que los esp´ ureos que caen dentro de bandas de frecuencia que son

1.5 Efecto del truncamiento del acumulador de fase

28

Figura 1.23: Espectro de los esp´ ureos producidos por el truncamiento de fase

m´ ultiplos enteros impares de Fs /2 coinciden directamente en la regi´on de Fs /2. En cambio, los esp´ ureos que caen en bandas de frecuencias que son m´ ultiplos pares de Fs /2 quedan como im´ agenes sim´etricas en la regi´on de Nyquist. La traza inferior de la figura muestra la regi´ on Fs /2 resultante. Este es el verdadero espectro de esp´ ureos que se produce en el DDS a causa del truncamiento del acumulador de fase. Por supuesto, aunque en la figura solo se representa el margen desde 0 hasta 3Fs , ya hemos determinado en el ejemplo que los arm´ onicos generados llegaban hasta 355,5Fs . Esto quiere decir que realmente habr´ıa much´ısimos m´ as esp´ ureos por truncamiento de los que se representan en esta figura.

1.5.3.

Resumen del truncamiento de fase

En resumen, el truncamiento del acumulador de fase resulta en un error de la se˜ nal de salida del DDS. Esta se˜ nal de error se caracteriza mediante el estudio de la palabra de truncamiento (la palabra de truncamiento es la porci´on del acumulador de fase que contiene los bits truncados). Adem´as la se˜ nal de error de truncamiento provoca esp´ ureos discretos en frecuencia a la salida del DDS. La magnitud de los esp´ ureos de truncamiento de fase tiene un l´ımite superior determinado por el n´ umero de bits de la palabra de fase P. El valor de este l´ımite es −6,02P dBc y este l´ımite superior se da en un tipo espec´ıfico de palabras de sinton´ıa. Nominalmente, estas palabras de sinton´ıa son aquellas en las que los bits truncados son todos 0 excepto el bit truncado m´ as significativo. Sin embargo una segunda clase de palabras de sinton´ıa no provocan esp´ ureos de truncamiento de fase. Estas se caracterizan por ser todo ceros en la palabra de sinton´ıa y un 1 en al menos la posici´on del bit menos significativo de la palabra de fase. El resto de palabras de sinton´ıa producen esp´ ureos de truncamiento de fase cuyo m´ aximo valor es siempre menor de −6,02P dBc. La distribuci´ on espectral de las palabras de truncamiento no se caracteriza tan f´acilmente como su magnitud m´axima. Sin embargo, se ha explicado que la porci´on de palabra de truncamiento del acumulador se puede considerar como una fuente de se˜ nal

´ reos en un sistema DDS 1.6 Otras fuentes de espu

29

de error de fase. Esta se˜ nal de error tiene la forma de onda de diente de sierra con un frecuencia de: F esp trunc = Fs (ET W/2B )

(1.25)

D´ onde Fs , es la frecuencia del reloj del sistema del DDS, ETW es la palabra de sinton´ıa equivalente representada por los bits truncados (despu´es de la correcci´on del aliasing), y B es el n´ umero de bits truncados. El n´ umero de arm´onicos de esta frecuencia que se deben de considerar en el an´alisis de esp´ ureos de truncamiento de fase viene dado por: No

armonicos trunc

= 2B−1 /M CD(ET W, 2B )

(1.26)

d´ onde M CD(x, y) es el m´ aximo com´ un divisor de x e y. El resultado es un espectro que se expande muchos m´ ultiplos de Fs . Sin embargo, debido al desdoblamiento de arm´onicos producido por el aliasing, todos estos arm´onicos caen dentro del ancho de banda de Nyquist, constituyendo la distribuci´on de esp´ ureos por truncamiento de fase que se genera en los DDS.

1.6.

Otras fuentes de esp´ ureos en un sistema DDS

Hasta ahora, hemos analizado en las dos secciones anteriores las dos fuentes principales de esp´ ureos en un DDS, el ruido de cuantificaci´on en el convertidor D/A y el truncamiento de fase. Podemos enumerar otras fuentes adicionales de esp´ ureos a la salida de un sistema DDS: 1. Distorsi´ on arm´ onica a causa de la no linealidad del DAC. Tambi´en tratamos la no linealidad y sus fuentes en el apartado 1.4. Su efecto es la generaci´on de arm´onicos de la se˜ nal sintetizada. Para conocer la situaci´on exacta de estos arm´onicos hay que considerar el fen´ omeno de “reflexi´on” que se produce en aquellos que son superiores al ancho de banda de Nyquist. El fen´omeno se muestra en la figura 1.24.

Figura 1.24: Efecto del desdoblamiento de los arm´onicos por el aliasing

El procedimiento para determinar la frecuencia resultante al aliasing del N-´esimo arm´ onico es: a) Calcular el resto R del cociente (N fo )/Fs d´onde N es el orden del arm´onico.

´ reos en un sistema DDS 1.6 Otras fuentes de espu

30

b) Sea SP U RN la frecuencia reflejada del N-´esimo arm´onico. c) Entonces SP U RN = R si R ≤ 1/2Fs , en otro caso SP U RN = Fs − R El procedimiento anterior es un medio para conocer la situaci´on del arm´onico que resulta de las no linealidades asociadas a un convertidor D/A pr´actico. Como ya se ha dicho antes, la magnitud de este arm´onico no se puede predecir ya que est´a directamente relacionada con la cantidad de no linealidad exhibida por el DAC en particular. 2. Transitorios de conmutaciones asociados con el DAC. Los “glitches” de conmutaci´ on constituyen otra fuente de esp´ ureos que se generan debido a la arquitectura f´ısica del DAC. Tiempos de subida y bajada desiguales contribuyen tambi´en a la distorsi´ on arm´ onica. La cantidad de distorsi´on est´a determinada por la funci´on de transferencia din´ amica. Los transitorios pueden provocar oscilaciones en los flancos de subida y / o bajada de la forma de onda de salida del DAC. Estas oscilaciones tienden a ocurrir a la frecuencia natural de resonancia del circuito implicado y se pueden manifestar como esp´ ureos en la salida. Su efecto de salida se observa en la figura 1.25.

(a)

(b)

Figura 1.25: Glitches a la salida de un DAC (a) Se˜ nal de salida con glitches de conmutaci´on (b) Etapa de conmutaci´on dise˜ nada para minimizar los glitches

3. El acoplamiento de la se˜ nal de reloj. Es otra fuente importante de esp´ ureos en los sistemas DDS. Muchos dise˜ nos incluyen uno o m´as circuitos de reloj integrados. No es extra˜ no que estas se˜ nales de reloj aparezcan a la salida del DAC a causa de acoplamientos inductivos o capacitivos. Obviamente este acoplamiento se manifiesta en el espectro de salida como una l´ınea espectral a la frecuencia del reloj interferente. Otra posibilidad es que la se˜ nal de reloj se acople al reloj de muestreo del DAC. Esto provoca que la se˜ nal de salida del DAC est´e modulada por la se˜ nal de reloj. El resultado se manifiesta en esp´ ureos sim´etricos alrededor de la frecuencia de la se˜ nal de salida.

1.7 Consideraciones sobre el filtrado de salida

31

La u ´nica defensa contra esta forma de esp´ ureos consiste en una buena t´ecnica de fabricaci´ on del circuito impreso, con un buen desacoplo en las fuentes de alimentaci´on.

1.7.

Consideraciones sobre el filtrado de salida

Fundamentalmente, un DDS es un sistema muestreado. Como tal, el espectro de salida es infinito. Aunque el dispositivo est´e “sintonizado” a una frecuencia espec´ıfica, (se supone que ´esta cae dentro del ancho de banda de Nyquist), en realidad, el espectro de salida consta de F0 y sus componentes de aliasing como se demostr´o en la secci´on 1.2. Tambi´en se puede ver el espectro resultante en un ejemplo para un tono sintetizado en la figura 1.7. La teor´ıa de muestreo en banda base vigente en la generaci´on DDS implica, como ya se ha dicho, que la se˜ nal generada est´e en la primera zona de Nyquist. Sin embargo, siempre es necesario filtrar la salida del convertidor D/A, en primer lugar para eliminar las componentes generadas fuera de esta zona, pero tambi´en para evitar el efecto nocivo de cualquier se˜ nal o esp´ ureo que caiga fuera del ancho de banda de Nyquist, ya que tambi´en tendr´an una imagen solapada dentro de esta zona. Por esta raz´on, un filtro anti-aliasing se usa en casi todas las aplicaciones DDS. Las especificaciones de este filtro pueden limitar el margen din´ amico a determinadas frecuencias, como se puede ver en la figura 1.26. En muchas aplicaciones no se emplea todo el ancho de banda de Nyquist por lo que el empleo de este filtro no es tan riguroso, aunque en las aplicaciones basadas en DSP si se suele aplicar este criterio.

Figura 1.26: Filtro antialiasing

El filtro antialiasing es un elemento cr´ıtico en el dise˜ no de un sistema DDS. Existen muchas clases de filtros en la literatura t´ecnica. Sin embargo, para la mayor´ıa de aplicaciones el campo se restringe a tres familias de filtros b´asicos. Los tres tipos de filtros son las respuestas de las familias Chebyshev, Gausianos y de Legendre. Las aplicaciones de filtrado que requieren respuestas en frecuencia bastante abruptas utilizan respuestas de tipo Chebyshev. En este caso, en cambio, se asume que la respuesta en el dominio del tiempo no tiene gran importancia. Por contra, las aplicaciones de filtrado que requieren caracter´ısticas en el dominio temporal suaves (sobreimpulso y retardo de grupo constante) suelen utilizar la respuesta de tipo Gausiano. En estas aplicaciones se supone que no se necesitan transiciones abruptas en frecuencia. Para las aplicaciones que est´an entre estos dos extremos, la familia de filtros de Legendre es la mejor elecci´on. En resumen, la complejidad del filtro antialiasing puede llegar a ser muy grande, especialmente cuando la se˜ nal de inter´es est´a muy pr´oxima a fs /2. Por ejemplo, si se

1.7 Consideraciones sobre el filtrado de salida

32

emplea un filtro Butterworth que consigue 6 dB de atenuaci´on por octava, para obtener 60dB de atenuaci´ on en un ancho de banda de 1 a 2 Mhz se requiere un m´ınimo de 10 polos, lo que no es ni mucho menos un filtro trivial. Por lo tanto, para aplicaciones de alta velocidad que utilicen todo el ancho de banda de Nyquist el filtro utilizado debe de cumplir los siguientes requerimientos: Transici´ on abrupta. Respuesta plana en la banda de paso. Respuesta en fase lineal. Los filtros el´ıpticos suelen cumplir estos criterios y son la soluci´on m´as popular, de cualquier forma son filtros complejos y caros. Otra posibilidad que permite relajar el filtro antialiasing es que no halla nunca una se˜ nal de fondo de escala en alta frecuencia. Esto ocurre en muchas aplicaciones de alta frecuencia en las que la se˜ nal se concentra en una zona del espectro centrada en una frecuencia. De todas formas, cada aplicaci´on particular tiene sus propias connotaciones, y ser´a preciso realizar un estudio pormenorizado de las especificaciones concretas a la hora de seleccionar el filtro antialiasing. Seguidamente se recuerdan brevemente las caracter´ısticas m´ as importantes de las tres familias de filtros. Las respuestas de la Familia Chebyshev Esta familia generalmente ofrece caracter´ısticas abruptas en el dominio de la frecuencia. Como tal, la respuesta en el dominio del tiempo es bastante pobre con sobreimpulsos y retardos de grupo significativos. Esto hace que la familia de Chebyshev sea la adecuada en aplicaciones para las cuales las caracter´ısticas en frecuencia son la premisa dominante, mientras que las caracter´ısticas temporales son de menor importancia.

Figura 1.27: Respuestas de la familia Chevyshev

La respuesta de Butterworth es completamente mon´otona. La atenuaci´on se incrementa continuamente seg´ un la frecuencia aumenta; es decir, no existe rizado en la curva de atenuaci´ on. De la familia de filtros Chebyshev, la respuesta de Butterworth es la mas plana. Su frecuencia de corte se toma como el punto de atenuaci´on a 3 dB. La atenuaci´ on contin´ ua increment´ andose con la frecuencia, pero el ritmo de atenuaci´on despu´es del corte es bastante lento. La respuesta Chebyshev se caracteriza por rizados de atenuaci´on en la banda de paso seguida de atenuaci´ on que se incrementa de forma mon´otona en la banda eliminada.

1.7 Consideraciones sobre el filtrado de salida

33

Tiene una transici´ on de la banda de paso a la banda eliminada mucho m´as abrupta que la respuesta de Butterworth. El coste es el rizado de la banda de paso. La profundidad de la atenuaci´ on en la banda eliminada es directamente proporcional a la magnitud del rizado en la banda de paso; cuanto mayor es el rizado, mas profunda es la atenuaci´on. La respuesta Chebyshev Inversa se caracteriza por una atenuaci´on que se incrementa continuamente en la banda de paso con rizado en la banda eliminada. Igual que en la respuesta de Chebyshev, cuanto m´as grande es el rizado en la banda eliminada m´as abrupta es la transici´ on de la banda de paso a la banda eliminada. La respuesta el´ıptica ofrece la transici´on desde la banda de paso a la banda eliminada m´ as profunda de toda esta familia. La contrapartida, por supuesto, son los rizados de atenuaci´ on. En este caso se producen tanto en la banda de paso como en la banda eliminada. En aplicaciones de filtros anti aliasing, ´este suele ser el filtro utilizado debido a lo abrupto de su regi´ on de transici´on. Las respuestas de la Familia Gausiana La familia Gausiana de respuestas es la m´as adecuada para aplicaciones en las que es fundamental la respuesta temporal. Ofrecen caracter´ısticas suaves en el dominio del tiempo con m´ınimo sobreimpulso. Adem´ as, el retardo de grupo es pr´acticamente constante. Como las caracter´ısticas en el dominio del tiempo tienen buen comportamiento, la respuesta frecuencial no exhibe transiciones muy abruptas. De hecho, la respuesta en frecuencia es completamente constante. La curva de atenuaci´on siempre mantiene una pendiente negativa sin picos tanto en la banda de paso como en la banda eliminada. La familia Gausiana se puede dividir en tres tipos de respuesta, cada una de ellas con sus caracter´ısticas especiales. Son las respuestas Magnitud Gausiana, Bessel, y Retardo de Grupo con Rizado Constante. La figura 1.28 muestra estos tres tipos de respuesta. Aunque la curva de amplitud parece ser la misma en los tres tipos, cada una tiene su caracter´ıstica particular en el dominio del tiempo para la que ha sido optimizada.

Figura 1.28: Respuestas de la familia Gausiana

La respuesta de Magnitud Gausiana est´a optimizada para conseguir la curva en amplitud que m´ as se asemeje a la distribuci´on gausiana. La caracter´ıstica en el dominio del tiempo ofrece respuesta de fase pr´acticamente lineal con el m´ınimo sobreimpulso. El retardo de grupo no es tan constante, pero es mucho mejor que el de la familia Chebyshev. La respuesta de Bessel est´a completamente optimizada para el retardo de grupo. Ofrece un retardo de grupo casi plano en la banda de paso. La respuesta de Bessel es al dominio de tiempo lo que la respuesta de Butterworth al dominio de la frecuencia. Esto hace del filtro de Bessel la elecci´on adecuada cuando el retardo de grupo es la principal especificaci´ on. Ofrece respuesta de fase pr´acticamente lineal con el m´ınimo sobreimpulso.

1.8 Caracter´ısticas de salida de los sistemas DDS

34

La respuesta de Retardo de Grupo con Rizado Constante est´a optimizada para proporcionar rizados en la respuesta del retardo del grupo que no excedan el m´aximo especificado en la banda de paso (muy parecido a la respuesta en amplitud del filtro Chebyshev). Debido a que la banda de paso completa ofrece un m´aximo retardo de grupo, este filtro es adecuado para aplicaciones de banda ancha donde el retardo de grupo se debe de controlar sobre la banda de inter´es en su totalidad. Al igual que en los otros filtros gausianos, la respuesta de fase es principalmente lineal con m´ınimo sobreimpulso. La respuestas de la Familia Legendre

Figura 1.29: Respuesta de la familia Legendre

La familia de filtros Legendre consta de un u ´nico tipo. Su respuesta en la banda de paso tiene ligeros rizados y es similar a la respuesta de Chebyshev de 0.1 dB de rizado. La respuesta en la banda eliminada decae continuamente. La velocidad de atenuaci´ on despu´es de la frecuencia de corte es m´as pronunciada que la del tipo Butterworth, pero no tanto como la del tipo Chebyshev. El retardo de grupo es virtualmente constante sobre el primer 25 % de la banda de paso, pero se incrementa continuamente conforme se aproxima la frecuencia de corte.

1.8.

Caracter´ısticas de salida de los sistemas DDS

Los DDS de alta velocidad con DAC integrado proporcionan una salida en modo corriente. Esta corriente se puede aplicar a cualquier carga resistiva, incluyendo un cortocircuito, siempre que la tensi´ on generada en el pin de salida referida a masa, no viole la especificaci´ on de salida del DAC. Esta especificaci´on es simplemente la tensi´on m´axima que el pin de salida del DAC aguanta. Las tensiones que superen los l´ımites provocar´ an distorsi´ on de salida del DAC de moderada a dr´astica. Normalmente, las salidas se terminan a masa mediante una resistencia, aunque se pueden terminar a cualquier otra tensi´ on que no viole las especificaciones de operaci´on del DAC. Por regla general la corriente de salida se puede predefinir mediante una resistencia conectada a un pin especial. Los convertidores D/A con salida de tensi´on se evitan en aplicaciones DDS debido a que las p´erdidas internas provocar´ıan que la salida variara de acuerdo con la resistencia de carga. Las salidas de alta impedancia suministran su corriente especificada con pocas variaciones de salida a ´ o desde la carga siempre que no se sobrepasen las especificaciones de tensi´ on de salida. Los DACs con conmutadores de corriente generalmente son los que exhiben mejores prestaciones a velocidades de reloj altas. La especificaci´ on de resistencia de salida de un DDS/DAC es la impedancia combinada de los dispositivos CMOS que forman los conmutadores y la circuiter´ıa de la fuente

1.8 Caracter´ısticas de salida de los sistemas DDS

35

de corriente. Normalmente es tan alta (usualmente mayor de 100K), que su presencia se puede ignorar y es la resistencia de carga elegida por el usuario la que determina la impedancia de salida del sistema. En DACs con salida de corriente de tipo unipolar, si la resistencia de carga est´a terminada en masa, entonces los voltajes que se desarrollan en la resistencia variar´an entre 0 y un valor extremo positivo o negativo (fondo de escala). Por el contrario, una corriente bipolar desarrollar´ a una tensi´ on negativa en un extremo (0 de escala) y positiva en el otro (fondo de escala). El punto medio entre los dos extremos suele ser 0 voltios. ¿En qu´e afecta el que la corriente sea unipolar? Primero, los puntos centrales de la forma de onda senoidal de salida del DDS tendr´an un offset de continua que estar´a en el punto central del margen de fondo de escala. Esto puede ser importante cuando se aplica la se˜ nal de salida a alg´ un amplificador acoplado en continua para evitar que la componente de continua provoque recortes en la forma de onda. Por otro lado, cuando se modula en AM la salida utilizando la resistencia de control de corriente del DAC, la envolvente de la modulaci´ on ser´ a asim´etrica, asemej´andose m´as a una salida pulsada, que a una portadora modulada sim´etricamente.

1.8.1.

Acoplamiento con transformador sim´ etrico

Existen DDS-DAC cuya salida se compone de 2 terminales en oposici´on de fase. Estas dos se˜ nales se pueden combinar en un transformador de RF con toma intermedia para producir formas de onda sim´etricas tal y como se muestra en la figura 1.30. En estos casos, cuando se programa la corriente de salida del DAC, se est´a programando la suma de las dos corrientes disponibles en las salidas Iout A e Iout B. Por ejemplo, si se programa una corriente de fondo de escala de 10mA, entonces si una salida tiene 2 mA, la otra tendr´a 8 mA. Combinando estas dos corrientes complementarias en un transformador, la salida de corriente se convierte en sim´etrica y se pierde el offset de continua.

Figura 1.30: Combinaci´on de salidas complementarias en un DDS-DAC

El acoplamiento por transformador tambi´en es beneficioso cuando se quiere acoplar las corrientes de salida del DAC a entradas reactivas como filtros LC . El camino de baja impedancia existente a masa a trav´es de la toma central del transformador es mucho mejor que tomar el camino reactivo a trav´es del filtro LC que est´a terminado solamente a la salida del filtro, figura 1.31 (c). Sin transformador, el siguiente m´etodo preferible es aplicar la corriente de salida del DAC a un filtro LC que est´e doblemente terminado, como se muestra en la figura 1.31 (b). Las flechas en la figura 1.30 muestran el flujo de corriente en el primario del transformador 1:1 de banda ancha y c´omo la corriente unipolar de 2 salidas complementarias se puede usar para simular una corriente bipolar. La resistencia de carga de 50Ω del secundario del transformador se refleja en el primario d´onde aparece como una resistencia

1.8 Caracter´ısticas de salida de los sistemas DDS

36

Figura 1.31: Acoplo de cargas reactivas a la salida del conjunto DDS-DAC

de carga de 25Ω para cada salida. Se puede escoger otra relaci´on de transformaci´on distinta, lo que permite cargas diferentes siempre que no se viole la especificaci´on de salida del DDS-DAC. En el ejemplo de la figura, los voltajes presentes en los pines de salida no ser´an unipolares como lo ser´ıan si cada pin estuviera conectado mediante una resistencia de carga a tierra. En cambio, ser´ an bipolares y sim´etricos alrededor de la tensi´on presente en el punto central del transformador (masa en el ejemplo) a causa del efecto producido por los acoplamientos magn´eticos del transformador. Se necesita prestar atenci´on a la especificaci´ on de tensi´ on negativa adem´as de a la positiva cuando se configuran las salidas para acoplamiento de transformador. Otro beneficio del acoplamiento por transformador es el fen´omeno del rechazo del modo com´ un. Si las salidas del DDS-DAC Iout A e Iout B contienen se˜ nales comunes o id´enticas tales como acoplamiento del reloj, componentes de la fuente de alimentaci´on, y otras se˜ nales esp´ ureas, estas se˜ nales se pueden ver reducidas o eliminadas en el espectro de salida por el acoplamiento del transformador. Si las se˜ nales id´enticas est´an presentes en las dos entradas del primario del transformador, entonces sus campos opuestos se cancelar´ an uno a otro en alg´ un grado. El grado de cancelaci´on depende de la coincidencia del bobinado del transformador adem´ as de la coincidencia de las se˜ nales “id´enticas”.

1.8.2.

Consideraciones sobre la potencia de salida

Combinar dos salidas complementarias en un transformador no ofrece ninguna ganancia de potencia. La u ´nica manera de incrementar la potencia de salida es configurando una corriente de salida mayor mediante la resistencia de ajuste de corriente. Se deben consultar las hojas del fabricante y elevar la corriente de operaci´on hasta cerca del nivel m´aximo; sin embargo, la distorsi´ on arm´ onica de la salida puede incrementarse ligeramente. La utilizaci´on de un transformador permite la transferencia m´as eficiente de la potencia a la carga, eliminando la necesidad de una resistencia de terminaci´on que disipe potencia que debe transferirse a la salida.

´ n digital con DDS 1.9 Modulacio

1.8.3.

37

Terminaci´ on de salida del DDS-DAC

Sin tener en cuenta el esquema de terminaci´on de salida que se escoja, la experiencia ha demostrado que la supresi´ on ´optima de arm´onicos y esp´ ureos se consigue cuando las salidas complementarias est´ an terminadas de la misma manera. Si esto no se hace, puede que no se note la diferencia a bajas frecuencias, pero a altas frecuencias de salida, d´onde cada dB de SFDR cuenta, esta pr´actica dar´a un espectro de salida m´as limpio, esp´ ureos m´as d´ebiles y mayor SFDR.

1.9.

Modulaci´ on digital con DDS

Dado que nuestro montaje es un DDS en funciones de modulador, dedicaremos este apartado a comentar las caracter´ısticas particulares de este m´etodo de modulaci´on. Ya sabemos que modular una se˜ nal es trasladarla en el espectro. Matem´aticamente, esto se consigue multiplicando la se˜ nal a modular por una sinusoide, lo que desplaza la se˜ nal modulada en ±fc , con fc la frecuencia de la se˜ nal senoidal moduladora. Existe tambi´en la variante de modulaci´ on en cuadratura en la que dos informaciones se modulan con dos se˜ nales senoidales de la misma frecuencia desfasadas π/2. La figura 1.32 muestra los diagramas de bloque funcionales de las dos estructuras b´asicas de modulaci´ on. La figura (a) muestra modulaci´on senoidal, mientras que (b) representa modulaci´ on en cuadratura. Habr´ıa que a˜ nadir las variaciones de estos dos esquemas para producir formas especializadas de modulaci´on como banda lateral u ´nica y doble banda lateral.

Figura 1.32: Estructuras de modulaci´on b´asicas en el dominio temporal

La modulaci´ on digital es la contrapartida en tiempo discreto a los conceptos de modulaci´ on en tiempo continuo que se acaban de mencionar. En vez de tratar con formas de onda anal´ ogicas, x(t), ya sabemos que tratamos con muestras instant´aneas de esas ondas, x(n). Aqu´ı, n que es un n´ umero entero, equivale a los instantes de muestreo en el tiempo. Esto es, si T representa el intervalo de tiempo entre muestras sucesivas, nT representa el tiempo instant´ aneo en que se toman las muestras. La similitud entre se˜ nales en tiempo continuo y discreto resulta obvia cuando se escriben juntas. Por ejemplo, considere una se˜ nal sinusoidal x(t) = Acos(ωt)

tiempo continuo

x(n) = Acos(ωnT )

tiempo discreto

´ n digital con DDS 1.9 Modulacio

38

La principal diferencia en la se˜ nal en tiempo discreto es que existen ciertas restricciones sobre ω y T como resultado del teorema de Nyquist. Espec´ıficamente, T debe ser menor de π/ω. Como x(n) es una serie de muestras instant´aneas de x(t), entonces x(n) se puede representar como una serie de n´ umeros, cada uno de ellos es el valor instant´aneo de x(t) en los instantes nT. Esta idea es fundamental para comprender los moduladores digitales. La modulaci´ on en el mundo anal´ ogico se consigue multiplicando formas de onda continuas en el tiempo utilizando circuitos anal´ ogicos especializados. Sin embargo, en el mundo digital es posible conseguir la modulaci´ on simplemente manipulando secuencias de n´ umeros. Una operaci´ on puramente num´erica. Los esquemas de modulaci´ on para se˜ nales en tiempo continuo se pueden adaptar en las moduladores digitales tal y como se muestra en la figura 1.33.

Figura 1.33: Estructuras de modulaci´on b´asicas digitales

Aqu´ı, g(n), g1 (n), g2 (n), sen(ωc nT ) y cos(ωc nT ) son secuencias de n´ umeros. Los multiplicadores y sumadores son elementos l´ogicos. Su complejidad es funci´on del n´ umero de bits utilizados para representar las muestras de las formas de onda de entrada. Esto parece f´acil en teor´ıa. Sin embargo, cuando se implementan en hardware, el n´ umero de elementos de circuiter´ıa puede crecer muy r´apidamente. Por ejemplo, si las formas de onda digital se representan como n´ umeros de 8 bits, entonces se requieren multiplicadores y sumadores capaces de manejar palabras de 8 bits. Por otra parte, si las se˜ nales digitales est´an representadas por n´ umeros flotantes de doble precisi´on (64 bits), entonces los multiplicadores y sumadores se convierten en estructuras muy grandes. Es en el entorno de los moduladores digitales d´onde la tecnolog´ıa DDS se vuelve m´as atractiva. Ello es debido a que un DDS genera directamente las series de n´ umeros que representan muestras de una onda senoidal o cosenoidal. Estructuras de moduladores digitales basadas en DDS se muestran en la figura 1.34.

Figura 1.34: Estructuras de modulaci´on b´asicas DDS

´ n digital con DDS 1.9 Modulacio

1.9.1.

39

Requerimientos y arquitectura del sistema

Las estructuras de modulaci´on b´asicas DDS descritas en la secci´on previa son muy simples. Falta a˜ nadir el resto de componentes constitutivos de un DDS para que un modulador digital trabaje en la pr´ actica. El elemento m´as cr´ıtico es la fuente de reloj. Un DDS puede solo generar muestras si est´a alimentado de un reloj de muestreo. Tambi´en, hemos visto que se necesitaba un convertidor A/D para trasformar el conjunto de n´ umeros que se mueve por el interior de la estructura DDS en se˜ nales reales. Un modulador DDS m´ as realista se presenta en la figura 1.35. Con objeto de facilitar la exposici´ on u ´nicamente se muestra el modulador sinusoidal. La extensi´on a una estructura de modulaci´ on en cuadratura es trivial.

Figura 1.35: Modulador DDS

A primera vista, el modulador DDS parece bastante simple. Sin embargo, existe una serie de requerimientos que hacen que la modulaci´on digital sea un poco m´as dif´ıcil de implementar. Este requerimiento es que g(n) debe de ser una secuencia muestreada a la misma frecuencia que la velocidad de muestreo del DDS. De lo contrario, la etapa de multiplicaci´ on estar´ıa multiplicando valores que hubiesen sido tomados en instantes de tiempo completamente distintos. Pongamos un ejemplo sencillo. Supongamos que la se˜ nal moduladora vale g(n) = cos[2π(1khz)nT1 ] donde T1 vale 0.25 ms. Por tanto, g(n) se puede describir como una se˜ nal de 1 Khz muestreada a 4 Khz. Supongamos, tambi´en, que la salida del DDS es DDS = cos[2π(3khz)nT2 ] donde T2 es igual a 0.1 ms. Esto significa que la salida del DDS es una se˜ nal de 3khz muestreada a 10 Khz. En el modulador DDS, el valor de n (el ´ındice de muestra) del multiplicador es el mismo tanto para las entradas como para las salidas. As´ı, para un valor espec´ıfico de n, digamos n = 10, el ´ındice del tiempo para el DDS es nT2 , el cual vale 1 ms. Claramente, nT1 6= nT2 (2.5 ms 6= 1 ms). Por tanto, en un ´ındice de tiempo n=10, el tiempo DDS es 1 ms mientras que el tiempo g(n) es 2.5 ms. La consecuencia es que el resultado de salida del multiplicador g(n)cos(ωc nT ), no es lo que se espera que sea, debido a que la referencia de tiempo de g(n) no es la misma que la de cos(ωc nT ). El requerimiento de “coincidencia en la velocidad de muestreo” es la primera consideraci´on de dise˜ no en un modulador digital. Si, en un sistema de modulaci´on DDS, la fuente de la se˜ nal g(n) opera a una velocidad de muestreo distinta a la del reloj DDS, se deben de realizar los pasos necesarios para corregir esta discrepancia en velocidad. El dise˜ no de un modulador DDS se convierte entonces en un ejercicio de procesamiento digital de se˜ nal multimuestreo. Este tipo de procesado requiere un conocimiento de las t´ecnicas implicadas

´ n digital con DDS 1.9 Modulacio

40

de interpolaci´ on y decimado. Sin embargo, la interpolaci´on y el decimado requieren alg´ un conocimiento de filtros digitales. De todo ello hablaremos en las siguientes secciones.

1.9.2.

Filtros digitales

Los filtros digitales son la contrapartida en tiempo discreto a los filtros anal´ogicos de tiempo continuo. Ya se repasaron algunas caracter´ısticas sobre filtros anal´ogicos en el apartado 1.7 cuando se trat´ o el filtrado antialiasing de la salida del DDS. Existen dos tipos b´ asicos de filtros digitales; uno es el tipo FIR (respuesta al impulso finita) y el otro es el filtro IIR (respuesta al impulso infinita). Desde el punto de vista del dise˜ no de filtros, el tipo FIR es el m´as sencillo de trabajar. Sin embargo, desde el punto de vista de los requerimientos hardware, el IIR tiene una ventaja. Usualmente requiere mucha menos circuiter´ıa que un filtro FIR para la misma respuesta b´asica. Desafortunadamente, el tipo IIR tiene la caracter´ıstica de ser potencialmente inestable bajo ciertas condiciones. Esta propiedad lo excluye a menudo en sistemas d´onde no se conoce a priori la se˜ nal de entrada. 1.9.2.1.

Filtros FIR

Fundamentalmente, un FIR es una estructura muy simple. Est´a compuesto de una cadena de etapas de retardo, multiplicaci´on, y suma. Cada etapa consta de un camino de datos de entrada y de salida y un coeficiente fijo (que sirve como uno de los multiplicandos en la secci´ on multiplicadora). La figura 1.36 muestra un filtro FIR de 2 etapas.

Figura 1.36: Filtro FIR b´asico

Para este filtro simple obtenemos la secuencia de salida: y(n) = a0 x(n) + a1 x(n − 1) Esto quiere decir, para un instante dado, que la salida del filtro FIR no es ni m´ as ni menos que la suma de la muestra actual y de la muestra anterior ponderadas por los valores a0 y a1 respectivamente. Realizando la transformada z de la ecuaci´on anterior, la funci´on de transferencia H(z), resulta: H(z) = a0 + a1 z −1 donde z = ejω , ω = 2πf /Fs y Fs es la frecuencia de muestreo. Ahora apliquemos algunos n´ umeros a nuestro ejemplo para hacer las cosas un poco m´as visuales. Supongamos que empleamos una velocidad de muestreo de 10 khz y uti-

´ n digital con DDS 1.9 Modulacio

41

lizamos a0 = a1 = 0,5. La representaci´on de H(z) en funci´on de la frecuencia resulta en la figura 1.37.

Figura 1.37: Respuesta FIR del ejemplo

Claramente, esto constituye una respuesta del tipo paso bajo. En la figura s´olo se representa el ancho de banda de Nyquist por la caracter´ıstica de simetr´ıa en la banda de fs /2 a fs . El comportamiento de un filtro FIR es f´acil de analizar si se calcula su respuesta impulsiva. Su calculo se realiza de forma similar al equivalente anal´ogico. En este caso, la secuencia de entrada que se utiliza es la secuencia impulso unitario δ(n) = 1, 0, 0, 0, 0, 0, . . . En la figura 1.38, que representa un filtro FIR de n etapas generalizado, el 1 inicial de la secuencia δ(n) se propaga a cada pulso de reloj hasta la u ´ltima etapa de retardo. Esto significa que y(n) = 0 despu´es de la n-´esima muestra y tambi´en permanecer´a a 0 en adelante. Se observa entonces que la respuesta impulsiva solo existe durante n muestras. De aqu´ı su nombre, filtro de respuesta al impulso finita. Adem´as, la respuesta impulsiva tambi´en demuestra que una entrada a un filtro FIR necesita exactamente n muestras para propagarse a trav´es del filtro completo antes de que su efecto est´e presente a la salida. El incremento del n´ umero de etapas n incrementar´a el retardo total a trav´es del filtro final. Esto puede ser un problema en sistemas que son poco tolerantes al retardo. Sin embargo, la ventaja inherente al incrementar n es que se aumenta la pendiente de la curva de respuesta. La ecuaci´ on que expresa la salida y(n) en funci´on de la entrada x(n) en el dominio temporal es: y(n) = a0 x(n) + a1 x(n − 1) + a2 x(n − 2) + . . . + aN −1 x(n − N − 1)

(1.27)

resultando una ecuaci´ on de transferencia H(z), para un filtro FIR multietapa de N coeficientes de realimentaci´ on: H(z) = a0 + a1 z −1 + a2 z −2 + . . . + aN −1 z −(N −1) 1.9.2.2.

(1.28)

Filtros IIR

La diferencia entre un IIR y un FIR est´a en la realimentaci´on. Un filtro IIR tiene una secci´on de alimentaci´ on con retardo, multiplicaci´on y suma adicionales. En la figura 1.39 se muestra una estructura simple IIR. La parte de la izquierda es una copia exacta de un filtro FIR; esta porci´on del IIR se conoce normalmente como la secci´on “feedforward”. La porci´on de la derecha es la secci´ on de realimentaci´ on “feedback”. La realimentaci´on es una versi´on retardada y escalada de

´ n digital con DDS 1.9 Modulacio

Figura 1.38: Filtro FIR generalizado

Figura 1.39: Filtro IIR b´asico

42

´ n digital con DDS 1.9 Modulacio

43

la se˜ nal de salida y(n), y todo ello se suma con la salida de la secci´on feedforward. La existencia de realimentaci´ on en un filtro IIR supone una diferencia sustancial en el comportamiento del filtro. Como en cualquier sistema realimentado, la estabilidad se convierte en un asunto importante. La elecci´on inadecuada de los coeficientes o un desconocimiento de la se˜ nal de entrada pueden provocar inestabilidades en un IIR. El resultado puede ser oscilaciones o distorsi´ on severa de la se˜ nal de salida. El problema de la estabilidad puede ser suficiente para excluir el uso de un IIR en ciertas aplicaciones. El ejercicio de c´ alculo de la respuesta impulsiva realizado para el filtro FIR anterior puede servirnos de ayuda para examinar el comportamiento del IIR. El comportamiento de la parte izquierda es exactamente id´entico, esto es, despu´es de n muestras su salida ser´a 0. La diferencia reside en el bloque de realimentaci´on de la derecha. Cada nuevo instante de muestreo modifica el valor de y(n) con el valor anterior de y(n) recursivamente. El resultado es que y(n) continua sacando valores indefinidamente, incluso aunque la se˜ nal de entrada haya desaparecido. As´ı, un impulso u ´nico a la entrada puede resultar en una secuencia infinita de impulsos a la salida. De aqu´ı el nombre, filtro de respuesta al impulso infinita. A´ un as´ı, el concepto infinito es un ideal en la pr´actica. Los filtros IIR solo pueden ser implementados con una cantidad finita de resoluci´on num´erica. Por ejemplo, en aplicaciones d´ onde el camino de datos se debe restringir, digamos a palabras de 16 bits, los valores muy peque˜ nos ser´ an redondeados a un valor de 0. Esto lleva a que el funcionamiento del IIR se desv´ıe del ideal. Un filtro IIR ideal continuar´ıa infinitamente su salida con valores que se aproximar´ıan a 0 gradualmente. Sin embargo, a causa de la resoluci´on finita, llega un momento en que los valores se redondean a 0 y por tanto provocan el fin de la “respuesta impulsiva infinita”. La estructura de un filtro IIR simple nos lleva, al igual que en caso anterior, a la descripci´ on de un filtro IIR multietapa. En este caso, sin embargo, los lados izquierdo y derechos del filtro IIR no tiene porqu´e tener el mismo n´ umero de etapas de retardo. Por lo tanto, la cantidad de coeficientes A y B no tiene por que ser la misma. La figura 1.40 muestra un filtro IIR multietapa. Examinando la figura obtenemos al ecuaci´on de la salida y(n), en t´erminos de la entrada x(n). El resultado es

y(n) = a0 x(n) + a1 x(n − 1) + a2 x(n − 2) + . . . + aN −1 x(n − N − 1)+ b1 y(n − 1) + b2 y(n − 2) + . . . + bM y(n − M )

(1.29)

cuya funci´ on de transferencia general, H(z) resulta ser, para un filtro IIR multietapa de N coeficientes de realimentaci´ on hacia delante y M coeficientes de feedback: H(z) =

1.9.3.

a0 + a1 z −1 + a2 z −2 + . . . + aN −1 z −(N −1) 1 − b1 z −1 − b2 z −2 − . . . − bM z −M

(1.30)

Procesado DSP a varias velocidades

Este proceso consiste en convertir datos muestreados con una frecuencia Fs1 a datos muestreados a otra velocidad Fs2 . Si Fs1 > Fs2 , el proceso se llama decimado. Si Fs1 < Fs2 , el proceso se denomina interpolaci´ on. La necesidad del procesamiento a diferentes velocidades se pone de manifiesto con el siguiente ejemplo. Supongamos que tenemos 1.000 muestras de una onda senoidal de un

´ n digital con DDS 1.9 Modulacio

44

Figura 1.40: Filtro IIR generalizado

1 Khz almacenadas en memoria, y que estas muestras se adquirieron con una velocidad de muestreo de 10 Khz. Esto implica que la duraci´on en tiempo del conjunto completo de muestras es 100 ms (1000 muestras a 10.000 muestras/seg.). Si este mismo conjunto de muestras es ahora le´ıdo de la memoria a una velocidad de 100 Khz, solo se necesitar´an 10 ms para extraer todos los datos. Por tanto, las 1.000 muestras de datos a una velocidad de 100 Khz parecer´ an ahora una onda de 10 Khz en lugar de la onda original a 1 Khz. Obviamente, si se cambia la velocidad de muestreo pero no los datos, el resultado es indeseable. Sin embargo, si los datos originales a 10 Khz representaban una se˜ nal de 1 Khz, ser´ıa deseable tener tambi´en una salida muestreada a 100 Khz de una se˜ nal de 1 Khz. Para hacer esto posible se deben modificar de alguna manera los datos originales. 1.9.3.1.

Interpolaci´ on

El problema del ejemplo es un caso de interpolaci´on. La funci´on de un interpolador es tomar datos que fueron muestreados a una velocidad y convertirlos en nuevos datos muestreados a otra velocidad mas alta. Los datos deben de ser modificados de tal modo que cuando se muestreen a mayor velocidad se preserve la se˜ nal original. Una representaci´ on gr´afica del proceso de interpolaci´on se muestra en la figura 1.41.

Figura 1.41: Interpolador b´asico

´ n digital con DDS 1.9 Modulacio

45

Se pueden distinguir dos procesos separados: una secci´on de entrada que muestrea a una velocidad Fs y una secci´ on de salida que muestrea a otra velocidad nFs d´onde n es un n´ umero entero positivo mayor de 1. La estructura de un interpolador b´asico indica que para cualquier muestra de entrada habr´a n muestras de salida. Esto nos plantea la pregunta: ¿qu´e debemos de hacer a los datos originales de manera que, cuando se muestreen a una velocidad m´ as alta, la se˜ nal original quede preservada?. Se podr´ıa razonar intuitivamente que, si se insertan n − 1 ceros entre cada una de las muestras de entrada, (zero stuffing), entonces el dato de salida tendr´ıa la caracter´ıstica deseada. Despu´es de todo, a˜ nadir nada (0) a algo, no deber´ıa cambiarlo. Es un buen punto de partida, aunque todav´ıa nos faltar´ıa algo m´as para completar el cuadro.

Figura 1.42: Visi´ on en el dominio frecuencial de la interpolaci´on

Tal y como se aprecia en la figura 1.42, que es un ejemplo para un factor de interpolaci´on de 3, el proceso de interpolaci´on genera r´eplicas del espectro de la se˜ nal original que ahora caen dentro del nuevo ancho de banda de Nyquist, 3 veces mayor. Es decir, que para que la se˜ nal interpolada mantenga las propiedades de la se˜ nal original, es preciso realizar un filtrado pasobajo a posteriori, que elimine esas componentes “r´eplicas”. Lo normal es realizarlo mediante un filtro FIR en el dominio digital. 1.9.3.2.

Decimado

En este caso la funci´ on del decimado es la opuesta a la de la interpolaci´on: datos que fueron adquiridos a una velocidad de muestreo Fs1 se vuelven a muestrear a otra velocidad menor subm´ ultiplo entero de la original Fs2 = Fs1 /m. La figura 1.43 muestra el esquema de un decimador simple, con m un entero igual a la relaci´ on entre las dos frecuencias de muestreo. De nuevo se nos plantea la misma cuesti´on que en el apartado anterior: ¿c´omo se deben de manipular los datos originales

´ n digital con DDS 1.9 Modulacio

46

para que tom´ andolos a una velocidad menor no se cambien las caracter´ısticas originales de la se˜ nal?

Figura 1.43: Decimador b´asico

Se podr´ıa pensar que tomando las muestras m-´esimas de la trama original y despreciando las dem´ as, la se˜ nal resultante de salida tendr´ıa las mismas propiedades. La idea es buena pero todav´ıa no tendr´ıamos toda la soluci´on. Observemos la figura 1.44, donde de nuevo se utiliza un ejemplo sencillo en el que la relaci´on entre las frecuencias de muestreo es 3.

Figura 1.44: Visi´ on en el dominio frecuencial de la decimaci´on

En este caso, al ser la frecuencia de muestreo de salida 3 veces menor a la de entrada, el criterio de Nyquist cambia y se hace m´as restrictivo. Para evitar el aliasing en la se˜ nal de salida, es preciso asegurarnos de que la se˜ nal de entrada al interpolador cumpla con el criterio de Nyquist en el nuevo marco de salida, es decir, en un ancho de banda de Nyquist 3 veces menor al de la se˜ nal original. Esto nos lleva a la regla clave de la decimaci´on: El ancho de banda de los datos antes de la decimaci´ on debe de confinarse al ancho de banda de Nyquist de la velocidad de muestreo menor de salida. As´ı, para un factor de decimaci´on de m, la informaci´on original debe de residir en un ancho de banda dado por Fs1 /(2m), con Fs1 igual a la velocidad

´ n digital con DDS 1.9 Modulacio

47

original de muestreo. Si los datos originales contienen informaci´on v´alida en la porci´on del espectro m´ as all´ a de Fs1 /(2m), el decimado no es posible. Este ser´ıa el caso del ejemplo, si la porci´ on del espectro de los datos originales m´as all´a de Fs1 /6 de la figura 1.44 fuese parte integrante de la se˜ nal de informaci´on en lugar de ruido o se˜ nales interferentes. El filtrado pasobajo previo de la trama digital a decimar se suele realizar, al igual que en el caso de la interpolaci´ on, mediante filtros FIR. El paso siguiente consiste en “sacar” cada muestra m-´esima utilizando la velocidad de muestreo menor de salida. El resultado se puede ver en la figura 1.44 (c). 1.9.3.3.

Conversi´ on de velocidad racional n/m

Los procesos que se acaban de describir de interpolaci´on y decimado s´olo permiten cambios de velocidades de muestreo enteras. Si se precisa un cambio racional en la velocidad, se pueden llevar a cabo los dos procesos en cascada. Sin embargo, es importante para que no se pierdan las caracter´ısticas originales de la se˜ nal, que el proceso de interpolaci´ on preceda al proceso de decimado. De lo contrario, ser´a preciso confinar el ancho de banda de los datos originales a Fs /(2m), donde Fs es la velocidad de muestreo original.

Figura 1.45: Convertidor de velocidad de muestreo n/m b´asico

1.9.3.4.

Filtros digitales multivelocidad

Hemos visto que tanto en interpoladores como en decimadores se precisa el uso de filtros pasobajo. En estos casos, se pueden utilizar los conocidos filtros FIR, aunque existen otros tipos de filtros que no se han mencionado hasta ahora y que encuentran una aplicaci´ on ideal en los casos de cambio de velocidad de muestreo. Son los filtros FIR polifase y los filtros peine-integrador en cascada, CIC. Filtro FIR polifase Este filtro est´ a particularmente indicado para aplicaciones de interpolaci´on. Normalmente la interpolaci´ on comienza con la inserci´on de n − 1 ceros entre cada muestra de se˜ nal, para posteriormente filtrarse la trama resultante una vez muestreada a la velocidad de salida. Sin embargo, es posible hacer todas las operaciones de una vez, si el filtro FIR se dise˜ na de una forma peculiar: En principio, el filtro se dise˜ na normalmente pensando en que la frecuencia de muestreo va a ser nFs . Como resultado se obtendr´a un filtro FIR de un cierto n´ umero de etapas, T. Ahora, se a˜ nade a cada etapa un n´ umero de retardos igual a n − 1, que equivalen a las mismas operaciones de multiplicaci´on por cero entre cada etapa del filtro FIR. De esta manera se consigue la respuesta deseada, a la vez que

´ n digital con DDS 1.9 Modulacio

48

se realiza la inserci´ on de los ceros de relleno. El resultado es un filtro FIR de nT etapas, pero con (n − 1)T de las etapas multiplicadas por cero. Filtro peine-integrador en cascada, (Cascaded Integrador-Comb, CIC) El filtro CIC es la combinaci´on de un filtro peine y de un integrador. Un filtro peine es un filtro FIR simple que contiene un retardo y una etapa sumadora. El integrador es un tipo de filtro IIR pero sin bloque de realimentaci´on hacia adelante. Un diagrama de bloques de ambas estructuras se incluye en la figura 1.46.

Figura 1.46: Etapas b´asicas de los bloques filtro peine e integrador

Una caracter´ıstica importante que hace a esta topolog´ıa tan atractiva es el hecho de no incluir etapas multiplicadoras: en el integrador se da la multiplicaci´on impl´ıcita por uno, mientras que el filtro peine lleva impl´ıcita la multiplicaci´on por −1, pero ´esta puede realizarse f´ acilmente mediante una negaci´on. Con esta ausencia de multiplicadores se consigue un ahorro tremendo en hardware comparado con las arquitecturas t´ıpicas FIR e IIR. Por lo que respecta a la curva de respuesta en frecuencia, el filtro peine act´ ua como filtro eliminabanda. Para la etapa simple de la figura 1.46, aparecen dos puntos de atenuaci´on, uno en DC y otro a la frecuencia de muestreo Fs . A˜ nadiendo etapas de retardo, se puede modificar ligeramente la curva de respuesta. De hecho, K bloques de retardo producen K + 1 puntos de atenuaci´on equiespaciados. De los K + 1 puntos, uno ocurre en DC y otro en Fs . El resto se distribuye de manera equiespaciada entre DC y Fs . Por otra parte, el integrador act´ ua como filtro pasobajo. La respuesta de cada bloque se representa en la figura 1.47, normalizadas a Fs .

Figura 1.47: Respuesta en frecuencia de los bloques b´asicos del filtro peine y del integrador

El filtro CIC se construye conectando en cascada los bloques de integrador y filtro peine. Con vista a realizar la conversi´on de velocidad de muestreo, el integrador se opera

´ n digital con DDS 1.9 Modulacio

49

a una velocidad mientras que el filtro peine funciona con otra distinta siempre divisor entero de la frecuencia de muestreo del integrador. Lo interesante del montaje es que puede funcionar tanto de interpolador como de decimador dependiendo del orden en que se conecte cada etapa. Esta importante caracter´ıstica se representa en la figura 1.48.

Figura 1.48: CIC funcionando de interpolador y de decimador

En el caso de filtro CIC funcionando en modo de interpolaci´on, hay que a˜ nadir una ligera puntualizaci´ on para que el montaje funcione adecuadamente. La modificaci´ on consiste en que la etapa de integraci´on debe de ser capaz de realizar el rellenado de ceros a su entrada, para asimilar el incremento de velocidad de muestreo. Para cada muestra suministrada por el filtro peine, el integrador debe de insertar n − 1 ceros. En la figura 1.49 se aprecia la respuesta en frecuencia de un filtro b´asico CIC para un factor de interpolaci´ on o decimado de 2. (m ´o n = 2 en la figura anterior).

Figura 1.49: Respuesta en frecuencia del filtro CIC b´asico

En esta figura se pone de manifiesto uno de sus problemas potenciales, la distorsi´ on de atenuaci´ on. Se puede ver c´ omo el nulo se produce para la frecuencia normalizada de f = 0,5. Como se representa un ejemplo con factor de interpolaci´on igual a 2, resulta un ancho de banda de Nyquist de f = 0,25. En ese punto, la curva de respuesta manifiesta una ca´ıda de aproximadamente 5 dB, en lo que corresponder´ıa a la banda de paso de la se˜ nal. Esta ca´ıda puede resultar un problema serio en algunas aplicaciones a menos que se compense de alguna manera. Un m´etodo de compensaci´ on consiste en preceder la etapa CIC con un filtro inverso que corrija la ca´ıda que se produce en ´el a lo largo del ancho de banda de Nyquist. Otro m´etodo consiste en asegurar la limitaci´on en banda de los datos de entrada, de forma que se asegure que su banda est´ a concentrada lejos de la ca´ıda de la curva de respuesta en la parte mas hacia la izquierda de la gr´afica, donde ´esta es pr´acticamente plana. Existen dos m´etodos de cambiar la curva de respuesta b´asica de la figura 1.49. El primer m´etodo consiste en aumentar el n´ umero de etapas en cascada, siempre insertando el mismo n´ umero de etapas de filtro peine que de etapas integradoras. Un ejemplo en el

´ n digital con DDS 1.9 Modulacio

50

que se utilizan el triple de etapas se representa en la figura 1.50 (a).

(a)

(b)

Figura 1.50: Variaciones al bloque CIC b´asico (a) Interpolador CIC triple (b) Decimador CIC con doble retardo

El segundo m´etodo es a˜ nadir m´ ultiples retardos dentro de la secci´on de filtro peine, siempre a˜ nadiendo el mismo n´ umero de retardos a todas las etapas peine en el caso de existir varias de ellas en cascada. Un ejemplo de un filtro b´asico CIC con un bloque de retardo adicional en la etapa de filtro peine se representa en la figura 1.50 (b). El efecto de cada una de estas opciones se representa en la figura 1.51, junto con la respuesta b´ asica para comparaci´ on. En cada caso se ha empleado un factor de cambio de velocidad de muestreo igual a 2.

(a)

(b)

(c)

Figura 1.51: Comparaci´on de las respuestas CIC modificadas

La gr´ afica (b) corresponde a un aumento del n´ umero de etapas en cascada, apreci´andose c´ omo se incrementa la pendiente de ca´ıda y la amplitud de la banda eliminada.

´ n digital con DDS 1.9 Modulacio

51

Por otro lado, la gr´ afica (c) representa el caso de adicci´on de etapas de retardo en la etapa de filtro peine, que resulta en un incremento del n´ umero de ceros de la funci´on de transferencia. Tambi´en se incrementa la atenuaci´on en la banda de paso, disminuy´endose a su vez en la banda eliminada. Se suele emplear una combinaci´on de los dos m´etodos para conseguir respuestas de tipo variado. 1.9.3.5.

Consideraciones acerca del sincronismo entre el reloj y los datos de entrada

En los moduladores digitales es importante mantener la correcta temporizaci´on entre la fuente de datos y el modulador. En la figura 1.52 se representa un ejemplo de diagrama de bloques de un modulador digital que se parece bastante al utilizado en el trabajo pr´actico. La primera fuente de tiempo en un modulador DDS es el reloj que alimenta al DDS. De este modo se establece la velocidad de muestreo en las se˜ nales seno y coseno del modulador. Ahora, cualquier se˜ nal que se propague desde la entrada de datos hasta el modulador debe de muestrearse a la misma velocidad que la portadora de salida. Esto es importante para que exista una correspondencia uno a uno con las muestras de la portadora. De otro modo, se puede deducir que las operaciones de procesado llevadas a cabo en el interior del modulador no se realizar´an adecuadamente.

Figura 1.52: Diagrama de bloques de un modulador DDS gen´erico

Aqu´ı es donde entra en juego el bloque llamado “convertidor multivelocidad” de la figura 1.52. Es la manera de trasladar la velocidad de datos de entrada hasta la frecuencia de muestreo del DDS. Como este convertidor s´olo puede trabajar con un factor racional, ´esa debe de ser obligatoriamente la relaci´on entre la velocidad de datos y el reloj del sistema. Es decir, el reloj del sistema debe operar a un factor n/m veces el reloj de datos (o un m´ ultiplo entero de ese factor). En los sistemas moduladores corrientes, este convertidor de velocidad est´ a formado simplemente por una o varias etapas de interpolaci´on o decimado. En estos casos, el multiplicador de reloj es simplemente un multiplicador o un divisor por un entero. Por tanto, la fuente de datos y el reloj del sistema est´an relacionados por un m´ ultiplo entero en lugar de por un m´ ultiplo fraccional. En el cap´ıtulo 4 dedicado al modulador DDS realizado en la pr´actica, veremos que la relaci´ on entre las dos velocidades de reloj se adec´ ua mediante dos etapas interpoladoras CIC en cascada con factor de interpolaci´on ajustable para acomodar diferentes velocidades de datos de entrada.

´ n y te ´cnicas auxiliares en los DDS 1.10 Evolucio

1.10.

52

Evoluci´ on y t´ ecnicas auxiliares en los DDS

Las retos m´ as obvios de un DDS son la velocidad (ancho de banda) y la pureza espectral. Ambos est´ an relacionadas inversamente, mientras que ancho de banda y consumo lo est´an de forma directa. Cuanto m´as densa es la circuiter´ıa, m´as precisa es la forma de onda de salida y se suprimen m´as los esp´ ureos, pero la circuiter´ıa adicional limita la velocidad y de aqu´ı el ancho de banda, etc. Otros factores son a menudo importantes, incluyendo funciones de modulaci´on, velocidad de conmutaci´on o actualizaci´on. Actualmente se encuentran f´ acilmente dispositivos DDS con convertidores D/A integrados de 10 bit soportando velocidades de reloj internas de 180 MHz. El actual “estado del arte” en tecnolog´ıa DDS se encuentra a 300 MHz de velocidades de reloj con un convertidor D/A integrado de 12 bits. Las tendencias actuales de desarrollo de la tecnolog´ıa DDS focalizan su atenci´on en la mejora de los convertidores D/A. La pureza espectral est´a relacionada con la resoluci´ on del DAC. Si bien es te´ oricamente posible multiplexar tanto el acumulador como la memoria a casi cualquier nivel, y por tanto, conseguir virtualmente cualquier velocidad, el DAC es un cuello de botella a trav´es del que debe pasar la se˜ nal, y es la tecnolog´ıa del DAC la que impone el l´ımite en los DDSs avanzados. El acumulador de fase es el menos cr´ıtico de los bloques constitutivos de los sistemas DDS. Aunque debe ser construido cuidadosamente, su expansi´on no es un problema serio. De hecho los nuevos conceptos de dise˜ no de acumuladores reducen complejidad, n´ umero de puertas l´ ogicas, tama˜ no y consumo, por tanto haciendo m´as pr´acticos estos sistemas. Otro asunto complicado es la reducci´on de la memoria utilizada para convertir los datos de fase en datos de amplitud. Las metodolog´ıas convencionales requieren aproximadamente 119 K para mapear 14 bits de informaci´on de fase (del acumulador) a 12 bits de amplitud (para el DAC). Actualmente ninguna tecnolog´ıa soporta una memoria de 200 K a alta velocidad (500 Mhz o m´as), aunque se est´an realizando desarrollos que intentan comprimir la memoria considerablemente. Basada en la expansi´on en serie de Taylor de la funci´ on seno, se consigue comprimir el tama˜ no de la memoria desde 192K hasta ∼ 3K, que ya pueden funcionar a 2 nanosegundos (figura 1.53).

Figura 1.53: Compresi´on de la memoria ROM basada en la monotonicidad de la funci´ on seno

Adem´ as de esta mejora en la memoria de conversi´on fase-amplitud, a continuaci´ on comentaremos brevemente otras funcionalidades f´aciles de a˜ nadir a la estructura b´asica DDS y que, o bien mejoran sus caracter´ısticas b´asica, o bien permiten ampliar el margen de aplicaciones de estos sistemas. Actualmente, ya existen gran cantidad de dispositivos comerciales que las incorporan.

´ n y te ´cnicas auxiliares en los DDS 1.10 Evolucio

1.10.1.

53

Mejora del Margen Libre de Esp´ ureos mediante dithering de fase

En la secci´ on 1.5 se habl´ o del efecto del truncamiento de fase en la arquitectura DDS. El resultado principal es su traducci´on en esp´ ureos en el espectro de salida dependiendo de la elecci´ on de la palabra de sinton´ıa. En algunas aplicaciones, es deseable reducir la energ´ıa de los esp´ ureos a cualquier precio. La agitaci´ on (dithering) de fase es una t´ecnica para conseguirlo. Esto se consigue a costa de elevar el suelo de ruido e incrementar el ruido de fase del sistema. La figura 1.54, es un diagrama de bloques de un DDS simple. En la figura 1.54 (a), la palabra de sinton´ıa de T bits se aplica a la entrada del acumulador. Los A bits m´as significativos de la salida del acumulador alimentan al bloque de conversi´on ´anguloamplitud, el cual suministra valores de D bits al conversor A/D. Se supone que T > A > D.

(a)

(b)

Figura 1.54: Diagrama de bloques de un DDS gen´erico

En figura 1.54(b) se ve la relaci´on entre esta variedad de longitudes en las palabras del DDS. Podemos apreciar que los bits de salida del acumulador de tama˜ no A, constituyen un subconjunto del grupo de palabras de sinton´ıa de tama˜ no T . De la misma manera, la salida del convertidor fase-amplitud tiene un tama˜ no de palabra D que es subconjunto del tama˜ no de la palabra de salida del acumulador. El dithering de fase requiere que los valores de fase generados por el acumulador contengan una cierta cantidad de ruido. Esto se puede conseguir a˜ nadiendo un peque˜ no numero aleatorio generado a la salida del acumulador. El m´etodo se describe en la figura 1.55. En el modelo de dithering de fase, un generador de secuencia binaria seudoaleatoria se utiliza para producir un nuevo n´ umero aleatorio de R bits con cada actualizaci´on del acumulador. Los n´ umeros seudoaleatorios se escalan en potencias de 2 para encajar dentro del margen deseado de la palabra de P bits de salida del acumulador. El n´ umero aleatorio se posiciona de forma que su bit m´ as significativo sea menor que el bit menos significativo de la palabra de A bits de entrada al convertidor angulo-amplitud (AAC). No se recomienda desplazar el n´ umero aleatorio de forma que se superponga a la palabra de A bits. Hacer esto desecha el prop´ osito de tener A bits de resoluci´on de fase en primer lugar, ya que ello a˜ nade un ruido que es mayor al ruido de cuantificaci´on asociado a la palabra de A bits. La posici´ on de la palabra de R bits tiene impacto significativo en la magnitud del dithering de fase. En efecto, el desplazar a la izquierda el n´ umero aleatorio incrementa su impacto cuando se suma con la palabra de P bits tomada a la salida del acumulador.

´ n y te ´cnicas auxiliares en los DDS 1.10 Evolucio

54

Figura 1.55: Dithering de fase en un DDS

T´ıpicamente, el bit mas significativo del n´ umero aleatorio se posiciona un bit menos del bit menos significativo de la palabra de A bits que se env´ıa al AAC. El n´ umero de bits del n´ umero aleatorio determina el modo en el que la fase aleatoria se disgrega en el espectro de salida del DDS. T´ıpicamente, un n´ umero aleatorio de 3 a 4 bits es suficiente.

1.10.2.

Generaci´ on de barridos “chirp” mediante DDS

El “chirp” (chirrido) en frecuencia es un m´etodo de realizar transiciones entre dos frecuencias de salida, f1 y f2 durante un intervalo de tiempo espec´ıfico. La forma m´ as simple de realizaci´ on es un barrido lineal desde f1 a f2 . Sin embargo, en sistemas m´ as avanzados, la transici´ on de frecuencias desde f1 a f2 puede ser una funci´on no lineal en el tiempo. Un sistema chirp basado en DDS se muestra en la figura 1.56.

Figura 1.56: Sistema Chirp basado en DDS

Empezando desde el acumulador de fase y trabajando hacia la derecha, el sistema es un DDS b´ asico. Sin embargo, el acumulador de fase no est´a alimentado por una palabra de sinton´ıa est´ atica como es el caso del DDS b´asico. En cambio, la entrada al acumulador de fase es la suma de la palabra de sinton´ıa de inicio y la salida del acumulador de frecuencia. La palabra de sinton´ıa de inicio es la palabra de sinton´ıa de frecuencia que marca f1 (la

´ n y te ´cnicas auxiliares en los DDS 1.10 Evolucio

55

frecuencia inicial del barrido). El acumulador de frecuencia suma recursivamente la palabra delta de frecuencia a la velocidad prescrita por el “reloj de rampa”. Por tanto, a cada pulso del reloj de rampa se incrementa el valor de entrada al acumulador de fase una cantidad igual a la palabra delta de frecuencia. Como la entrada al acumulador de fase determina la frecuencia de salida del DDS y este valor est´ a cambiando con el tiempo, entonces tambi´en la frecuencia de salida del DDS lo har´ a. Este es el mecanismo b´asico de generaci´on de barridos “chirp”. Asumiendo que el reloj de rampa genera un pulso de reloj a intervalos regulares y que la palabra delta de frecuencia es constante, entonces la salida del acumulador de frecuencia crece a velocidad lineal. Esto es, la pendiente de la frecuencia en funci´on del tiempo es constante. Estar´ıamos ante un “chirp” lineal. Tambi´en es posible general barridos no lineales. Si la palabra delta de frecuencia se modifica, la velocidad a la cual la frecuencia de salida del DDS cambia tambi´en se modifica. Esto es, la pendiente de la frecuencia en funci´on del tiempo cambia, de manera que modificar la palabra delta de frecuencia durante el intervalo del barrido var´ıa la pendiente de la frecuencia en funci´ on del tiempo. Esto proporciona un medio de generar cualquier funci´on “chirp” mediante aproximaciones lineales de la respuesta deseada. La funcionalidad de implementar barridos en un DDS requiere temporizaci´on y controles adicionales. Esta es funci´ on de la l´ ogica de temporizaci´ on de rampa. Realmente sirve a dos prop´ ositos. En primer lugar, debe de dividir el reloj del sistema para producir la adecuada frecuencia de reloj de rampa definida en el registro ramp rate. En segundo lugar, debe terminar el reloj de rampa cuando la frecuencia de salida alcanza el valor f2 (la frecuencia de final del barrido). La determinaci´on del momento en que el reloj de rampa debe terminar se consigue monitorizando la salida del acumulador de frecuencia y el valor de la palabra de final de sinton´ıa. Cuando la salida del acumulador de frecuencia es mayor o igual a la palabra de stop, el reloj de rampa se deshabilita. La l´ogica de temporizaci´ on de rampa debe de asegurar que el acumulador de frecuencia no sobrepase el valor de la palabra de final de sinton´ıa.

1.10.3.

Generaci´ on de modulaci´ on de amplitud mediante DDS

Para algunas aplicaciones es interesante controlar la amplitud de salida de la se˜ nal DDS. Tal es el caso de un transmisor AM basado en DDS o en aplicaciones en las que la portadora est´ a presente u ´nicamente durante los intervalos de trasmisi´on. En aplicaciones de se˜ nales pulsadas se pueden producir problemas en las transiciones bruscas de amplitud, que pueden producir interferencias en los canales adyacentes. En estos casos, un control preciso de amplitud permite que la se˜ nal se desvanezca poco a poco, haciendo menor el ruido durante los transitorios de conmutaci´on. La arquitectura b´ asica DDS no permite el control de amplitud. Sin embargo, esto se consigue con una modificaci´ on muy simple: la adici´on de una etapa multiplicadora precediendo al convertidor D/A. Muchos dispositivos comerciales suelen incorporar esta caracter´ıstica. En la figura 1.57, si suponemos que la palabra de control de amplitud de entrada puede tomar valores entre 0 y 1, la salida del DDS presentar´a una versi´on a escala del valor suministrado desde el convertidor ´angulo-amplitud. Un valor 0 anula la salida del DDS, mientras que para el valor de 1 la salida es la indicada desde el conversor AAC. Se ve que es una manera inmediata de generar se˜ nales AM, tambi´en de controlar el transitorio ON-OFF en se˜ nales pulsadas.

´ n y te ´cnicas auxiliares en los DDS 1.10 Evolucio

56

Figura 1.57: DDS con control de amplitud

1.10.4.

Funcionalidades adicionales en DDS

En resumen, los nuevos dise˜ nos a˜ naden gran cantidad de registros y circuiter´ıa que, sin formar parte de la estructura b´asica DDS hacen que estos sistemas se acerquen realmente al mundo pr´ actico. En este apartado se realiza un resumen de todas estas variaciones que habiendo sido nombradas a lo largo del cap´ıtulo, a buen seguro formar´an parte del n´ ucleo de evoluci´ on de esta tecnolog´ıa. El diagrama de bloques de un dispositivo DDS con prestaciones a˜ nadidas ya se represent´ o el la figura 1.9. Por comodidad se presenta de nuevo a continuaci´on.

(a)

(b)

Figura 1.58: Prestaciones a˜ nadidas en un sistema DDS (a) Puntos sobre los que se accede para conseguir estas prestaciones (b) Esquema de bloques de un dispositivo DDS con prestaciones a˜ nadidas

Enumeramos los bloques adicionales que se representan en la figura 1.58 (b). Multiplicador interno del reloj de referencia. De este modo se reduce la frecuencia

´ n y te ´cnicas auxiliares en los DDS 1.10 Evolucio

57

del reloj de referencia de entrada facilitando la utilizaci´on de los dispositivos DDS con fuentes de reloj m´ as f´ aciles de manejar. Acumulador de fase despu´es del sumador, que permite retardos de fase dependiendo de una palabra de sinton´ıa de fase. De este modo se consiguen modulaciones de fase, con una resoluci´ on que depende de los bits de la palabra de sinton´ıa de fase. T´ıpicamente se utilizan registros de 14 bits, aunque pueden llegarse a utilizar 32 bits, con lo que la resoluci´ on de fase es enorme, figura 1.59 (a).

(a)

(b)

Figura 1.59: Modulaciones de fase en un dispositivo DDS (a) Modulaci´on de fase. (b) Modulaci´on de frecuencia

Bloque sinc inverso. Compensa la ca´ıda sinx/x producida por la curva de respuesta de la salida cuantificada del DAC minimizando este efecto. Multiplicador digital insertado entre la salida de la tabla de referencia y el conversor D/A, permitiendo la modulaci´on de amplitud de la salida senoidal. A veces se integra otro conversor adicional D/A para generar simult´aneamente la funci´ on coseno, lo que permite generar las salidas I y Q totalmente coincidentes en frecuencia, cuadratura de fase y amplitud. Comparador adicional, que facilita el uso del dispositivo DDS como generador de reloj, convirtiendo la senoide del DDS en una forma de onda cuadrada. Registros adicionales de frecuencia y fase que pueden ser preprogramados a priori, activ´ andose mediante un u ´nico pin de control. Es una configuraci´on ideal para generar FSK si se dispone de dos registros de frecuencia, uno programado a la frecuencia de “marca el otro a la de “espacio”. 2

´ n y te ´cnicas auxiliares en los DDS 1.10 Evolucio

58

Aunque la tecnolog´ıa DDS est´a en continuo avance, y circuitos con prestaciones que hoy nos parecen superiores en seis meses quedan superadas por los nuevos dise˜ nos, podemos resumir el actual estado de desarrollo de esta t´ecnica en la tabla 1.1.

Caracter´ıstica

Prestaci´on

Observaciones

Sinton´ıa en frecuencia

48 bits

Resoluci´on de 1 µHz

Sinton´ıa de fase

32 bits

Resol. control de retardo de fase 0.00000008o

fclk interno Rango de multiplic. CLKref

300 MHz

Hab. multiplic. interno ×10

×4 hasta ×10

Ancho de Banda salida

100 MHz

Asumiendo 1/3 de fclk

Velocidad de cambio de frec.

100 MHz

8 bit carga paralela

Control de amplitud Espureos

12bits -50 dBc

Desde 0 a fondo escala Peor caso en WB para fout de 80 MHz

Adaptaci´ on I-Q

0.01o

Rizado desde DC a Niquist

0.01 dB

DAC

12 bits

Doble

Cuadro 1.1: “Estado del Arte” de la tecnolog´ıa DDS comercial (1999)

1.10.5.

Chips DDS comerciales

Terminamos el cap´ıtulo con una tabla donde se incluye una recopilaci´on realizada en internet sobre los u ´ltimos dispositivos DDS del mercado. Son circuitos de las marcas Analog Devices, Harris Semiconductor, Qualcom y Standford Telecom. En cada entrada de la tabla se incluyen las caracter´ısticas fundamentales de cada circuito, que pueden servir de comparaci´on con el resto de los integrados.

´ n y te ´cnicas auxiliares en los DDS 1.10 Evolucio Nombre Q2240

1

59

Clk max. Mhz

Disipaci´ on mW

Res Frec bits

DAC bits

Control

Descripci´ on

100

2000

32

12 (NI)2

Paralelo, 100Mhz

NCO simple sin DAC integrado

1250

32 × 2

12(NI)

Paralelo, Serie

Doble DDS, BPSK/BFSK/QPSK/8PSK/Chirp, Circuito de reducci´ on de esp´ ureos NCR patentado

Q2368

130 65×2

Q2334

50

667

32 × 2

12(NI)

Paralelo

Doble DDS, PSK/FSK/MSK/FH, 32 bits de resoluci´ on de fase

25

120

32

10

Serie

DDS Completo, Capacidad FM/PM, Truncamiento a 12 bits

AD9831

25

120

32

10

Paralelo

DDS Completo, Capacidad FM/PM, Truncamiento a 12 bits

AD9835

50

200

32

10

Serie

DDS Completo, Capacidad FM/PM, Truncamiento a 12 bits, 16 pines

AD9830

50

300

32

10

Paralelo

DDS Completo, Capacidad FM/PM, Truncamiento a 12 bits

AD9850

125

480

32

10

Paralelo, Serie

DDS Completo, Comparador indep

AD9853

165

1150

32

10

Serie

Modulador DDS, FSK/QPSK/16QAM, Multiplicador fclk interno ×6, Filtro programable, compensaci´ on sen(x)/x

AD9851

180

650

32

10

Paralelo, Serie

DDS Completo, Comparador indep, Multiplicador fclk interno ×6

AD9856

180

450

32

12

Serie

Convertidor cuadratura

AD9854

300

1200

-

2 × 12

-

DDS Completo, Modo Chirp, Multiplicador fclk programable

AD9852

300

1200

-

12

-

DDS Completo, Modo Chirp, Multiplicador fclk programable

AD7008

50

625

32

10

Paralelo, Serie

DDS Generador vectorial, Tablas de seno y coseno, Truncamiento fase a 12 bits, AM/FM/PM, Modulador I/Q 10 de bit

40

785

32

12 (NI)

Serie

DDS simple sin DAC integrado, FSK/QPSK

HSP45106

33

1240

32

16 (NI)

Paralelo

NCO, FM/FSK/BPSK/QPSK/8PSK, Reg. offset fase de 32 bits, Truncamiento a 20 bits

HSP45116A

52

2850

32

16 (NI)

Paralelo

NCO, AM/FM/PM/QAM etc, Reg. offset fase de 32 bits, Truncamiento a 20 bits, Acumulador/multiplicador complejo de 16 bit (modulaciones I/Q)

STEL-1172B

50

750

32

2 × (NI)

Paralelo

NCO con tablas de seno y coseno, Truncamiento a 12 bits

5

50

750

48

12 (NI)

Paralelo

NCO alta resoluci´ on, Truncamiento a 13 bits, tabla de seno o coseno

AD9832

3

HSP45102

4

STEL-1173

1 2 3 4 5

o

Qualcomm, http://www.qualcomm.com DAC no incluido en el chip Analog Devices, http://www.analog.com/ Harris, http://www.harris.com/ Standford Telecom, http://www.stelhq.com/

8

ascendente

en

´ n y te ´cnicas auxiliares en los DDS 1.10 Evolucio

60

Nombre

Clk max. Mhz

Disipaci´ on mW

Res Frec bits

DAC bits

Control

Descripci´ on

STEL-1174

50

750

16

12 (NI)

Paralelo

NCO de bajo costo, Truncamiento a 13 bits, tabla de seno o coseno

STEL-1175

125

1875

32

12 (NI)

Paralelo

NCO Modulador, Truncamiento a 13 bits, tabla de seno o coseno, Salida lineal 12 bits disponible para PM/PSK/QAM/FSK

STEL-1176

80

1200

35

12 (NI)

Paralelo

NCO Modulador, Truncamiento a 15 bits, modulaci´ on directa 8PSK con 3 bits

STEL-1177

60

2100

32

2 × 12 (NI)

Paralelo

NCO Modulador, Truncamiento a 13 bits, Tablas de seno y coseno, FM/PM/FSK, Reg. offset fase de 12 bits

STEL-1178A

80

800

2 × 32

2× 12(NI)

Paralelo

NCO Modulador DOBLE, Truncamiento de fase a 13 bits, PM (3 bits)/FM

STEL-1179

25

250

24

12 (NI)

Serie

NCO Modulador, PM (3 bits)

STEL-1180

60

-

32

12 (NI)

-

NCO-Chirp, Truncamiento a 13 bits, PM (16 bits)/FM, Generaci´ on lineal chirp 16 bits con producto pendiente/duraci´ on de 16 bits, chirp no lineal programable

STEL-2173

800

-

32

8 (NI)

-

NCO Modulado, Truncamiento a 10 bits, BPSK/QPSK 2 bits

STEL-2176

160

1010

32

10

Paralelo

Modulador-Demodulador DDS Completo, BPSK/QPSK/16QAM, Multiplicador interno de fclk , filtro FIR de 32 etapas, m´ axima velocidad 10Mbps en BPSK

Cap´ıtulo 2

Secuencias pseudoaleatorias y registros de desplazamiento Desde hace cuatro d´ecadas se ha desarrollado, explotado y refinado la idea de utilizar registros de desplazamiento para generar secuencias binarias. Actualmente, existe una gran variedad de aplicaciones diferentes de los registros de desplazamiento, incluida la generaci´ on de secuencias pseudoaleatorias. El creciente inter´es por este tipo de secuencias justifica la inclusi´ on de este cap´ıtulo. Las principales ´ areas de aplicaci´on de las secuencias generadas en registros de desplazamiento son las siguientes: Generadores de c´ odigos seguros y de acceso limitado. 1. Cifrado: Se realiza la suma en m´odulo 2 del mensaje binario con una secuencia generada en un registro de desplazamiento que act´ ua como “llave”. Para descifrar se vuelve a sumar la llave al mensaje codificado. 2. C´ odigos de direcciones m´ ultiples: Diferentes porciones de una secuencia generada en un registro de desplazamiento se pueden asignar como direcci´on caracter´ıstica de un gran n´ umero de elementos, estaciones, aeronaves, nodos de red, etc. Se consigue que un gran n´ umero de generadores puedan enviar informaci´ on sistem´ aticamente a su controlador. Generadores de c´ odigos eficientes. 1. C´ odigos correctores de error: Los c´ odigos c´ıclicos se basan en secuencias de registros de desplazamiento. Ejemplos de este tipo de c´odigos son los c´odigos de Hamming, de Golay extendidos, los c´odigos BCH (Bose-Chadhuri-Hocquenghem), y los c´ odigos de Reed-Solomon. 2. Se˜ nales recuperables en entorno ruidoso: La propiedad de autocorrelaci´on de estas secuencias hace que en aplicaciones de radar de largo alcance con mucho ruido de fondo, trenes de pulsos modulados por un registro de desplazamiento sean recuperables incluso bajo relaciones se˜ nal/ruido negativas de muchos dB. 3. Modulaciones de espectro ensanchado: Esa misma propiedad de autocorrelaci´ on hace que un gran n´ umero de usuarios pueda compartir una misma frecuencia de transmisi´ on y un mismo ancho de banda, si cada uno de ellos utiliza una secuencia pseudoaleatoria diferente para modular su informaci´on. 61

2.1 Secuencias con propiedades de aleatoriedad

62

Generadores de c´ odigos con propiedades predefinidas. 1. Generadores de per´ıodo predefinido: Se ha probado que con un registro de desplazamiento de grado n, todas las longitudes de secuencias p entre 1 y 2n (inclusive) se pueden conseguir si se escoge adecuadamente la l´ogica de realimentaci´ on. Modelos matem´ aticos. 1. Generadores de secuencias aleatorias: Un registro de desplazamiento que genere secuencias de longitud m´axima sirve como modelo aproximado de experimento aleatorio, al margen de la componente determinista del sistema. 2. M´ aquinas de estados finitos: Un registro de desplazamiento con realimentaci´ on sirve como el ejemplo no trivial m´as simple de m´aquina de estados finitos sin entradas externas. El registro de desplazamiento sirve como “animal experimental” para investigaciones en m´aquinas de l´ogica recursiva y de aut´omatas. 3. Procesos de Markov: Se puede establecer una analog´ıa entre el diagrama de estados y transiciones de un registro de desplazamiento de n-etapas y el diagrama de estados de Markov para un canal binario con dependencia estad´ıstica limitada a n bits anteriores.

2.1.

Secuencias con propiedades de aleatoriedad

El uso de secuencias de datos binarios que se asemejen el m´aximo posible a secuencias aleatorias est´ a muy extendido en la actualidad: modulaciones de espectro ensanchado spread spectrum, donde se trata de distribuir la energ´ıa lo m´as amplia y uniformemente posible a lo largo de un gran ancho de banda simulando ruido; tambi´en se utilizan circuitos aleatorizadores, scramblers, circuitos que generan este tipo de secuencias, . . . Cualquiera que sea la aplicaci´on para la que se utilicen, se trata siempre de secuencias lo m´as parecidas al ruido blanco, pero generadas de modo controlado. ¿En qu´e se diferencia una se˜ nal pseudoaleatoria de una verdaderamente aleatoria? Una se˜ nal aleatoria no se puede predecir ; sus variaciones futuras solo pueden ser descritas en sentido estad´ıstico. Sin embargo, una se˜ nal pseudoaleatoria no es en absoluto aleatoria, es determinista, peri´ odica y conocida tanto por el transmisor como por el receptor. ¿Por qu´e entonces las llamamos “pseudoruido” ´o “pseudoaleatorias¿: Incluso aunque la se˜ nal sea determinista, parece tener las propiedades estad´ısticas del ruido blanco muestreado. Para un escucha no autorizado parece como si se tratase de una verdadera se˜ nal aleatoria.

2.1.1.

Propiedades de las secuencias aleatorias

¿Cu´ ales son las propiedades que hacen que una se˜ nal pseudoaleatoria aparezca como verdaderamente aleatoria? Hay tres propiedades b´asicas que pueden ser aplicadas a cualquier secuencia binaria peri´odica como prueba de su grado de aleatoriedad. Las propiedades, llamadas de balance, realizaci´ on y correlaci´ on, se describen a continuaci´ on para se˜ nales binarias: Propiedad de Balance . Un buen balance requiere que en cada periodo de la secuencia, el n´ umero de unos binarios difiera del n´ umero de ceros binarios como m´aximo en una unidad.

2.2 Secuencias generadas mediante registros de desplazamiento

63

Propiedad de realizaci´ on . Una realizaci´on se define como una secuencia de un u ´nico tipo de d´ıgitos binarios. La aparici´on de un d´ıgito alterno en una secuencia arranca una nueva realizaci´ on. La longitud de una realizaci´on es el n´ umero de d´ıgitos en la misma. Entre las realizaciones de unos y ceros en cada periodo, es deseable que alrededor de la mitad de las mismas de cada tipo sean de longitud 1, alrededor de un cuarto sean de longitud 2, la octava parte de longitud 3 y as´ı sucesivamente. Propiedad de correlaci´ on . Si un periodo de la secuencia es comparado t´ermino a t´ermino con cualquier desplazamiento c´ıclico de la misma, es mejor que el n´ umero de coincidencias difiera del n´ umero de diferencias en no m´as de una unidad. Esto es equivalente a decir que su funci´on de autocorrelaci´on R(τ ) tienda a cero para τ 6= 0. La funci´ on de autocorrelaci´on Rx (τ ) de una funci´on peri´odica x(t) de periodo To , se define de forma normalizada como: 1 Rx (τ ) = K



1 T0

Z

T0 /2

x(t)x(t + τ )dt

para − ∞ < τ < ∞

(2.1)

−T0 /2

donde 1 K= T0

Z

T0 /2

x2 (t)dt

(2.2)

−T0 /2

Cuando x(t) es una secuencia peri´odica representando un c´odigo pseudoaleatorio, nos referimos a cada d´ıgito fundamental como un s´ımbolo del c´ odigo pseudoaleatorio o un chip. Para una secuencia pseudoaleatoria de periodo p chips, la funci´on de autocorrelaci´ on normalizada se puede expresar como:  1 Rx (τ ) = p

numero de coincidencias menos numero de desacuerdos

  comparando un periodo completo de la secuencia con ·  on desplazada de la misma un numero τ de  una versi´ desplazamientos c´ıclicos

     

(2.3)

La funci´ on de autocorrelaci´on normalizada para una secuencia de longitud m´axima, Rx (τ ), se puede apreciar en la figura 2.2. Est´a claro que para τ = 0, cuando x(t) y su r´eplica coinciden perfectamente, Rx (τ ) = 1. Sin embargo, para cualquier otro desplazamiento c´ıclico ente x(t) y x(t + τ ) con 1 ≤ τ < p, la funci´on de autocorrelaci´on es igual a −1/p (para valores de p grandes, las secuencias est´an virtualmente incorreladas para un desplazamiento de un u ´nico chip. En la siguiente secci´ on se genera una secuencia pseudoaleatoria para comprobar estas tres propiedades.

2.2.

Secuencias generadas mediante registros de desplazamiento

Consideremos el registro de desplazamiento de la figura 2.1. Consta de cuatro registros de desplazamiento, un sumador m´odulo 2 y una conexi´on de realimentaci´on desde el sumador a la entrada del registro. El sumador m´odulo dos puede ser implementado

2.2 Secuencias generadas mediante registros de desplazamiento

64

mediante una puerta or-exclusiva. La operaci´on del registro de desplazamiento se controla mediante los pulsos de reloj que no aparecen en la figura. En cada pulso de reloj los contenidos de cada etapa del registro se desplazan una etapa a la derecha. Tambi´en, a cada pulso de reloj los contenidos de las etapas x3 y x4 se suman m´odulo 2 (una operaci´ on lineal), y el resultado es llevado de nuevo hacia atr´as a la etapa x1 . Prestemos atenci´ on a la sucesi´on de estados de una etapa, por ejemplo la primera. Supongamos que la historia del registro est´a formada por los sucesivos t´erminos a0 , a1 , a2 , . . . , an . Desde el punto de vista de la realimentaci´on, an es una suma m´odulo 2 de los contenidos de varias etapas del registro en el estado n − 1. De hecho cada registro en la suma m´ odulo 2 que calcula an se puede tracear hacia atr´as hasta llegar a un estado previo de la primera etapa del registro en s´ı. Por tanto, an satisface una ecuaci´on del tipo: an = c1 an−1 + c2 an−2 + · · · + cr an−r donde los coeficientes c1 , c2 , . . . , cr son unos y ceros que no dependen de n. Por supuesto la suma es m´ odulo 2. A esta relaci´on se la denomina recurrencia lineal.

Figura 2.1: Ejemplo de registro de desplazamiento con realimentaci´on lineal

Siguiendo con el ejemplo de la figura 2.1 asumamos que la etapa x1 est´a inicialmente a uno y las restantes a cero, esto es, el estado inicial del registro es 1000. De la figura 2.1 podemos ver que la sucesi´ on de estados en las etapas del registro ser´an las siguientes: 1000 1010

0100 1101

0010 1110

1001 1111

1100 0111

0110 0011

1011 0001

0101 1000

Como el u ´ltimo estado, 1000, se corresponde con el inicial, vemos que el registro repite la secuencia anterior despu´es de 15 ciclos de reloj. Se han generado todos los estados posibles exceptuando el 0000. La secuencia de estados de la primera etapa es la siguiente: 100110101111000 Esta secuencia cumple la recurrencia lineal an = an−3 + an−4

2.2 Secuencias generadas mediante registros de desplazamiento

65

Adem´ as se cumple que la historia de estados de la segunda etapa es la misma que la de la primera con un retardo de un periodo de reloj, y as´ı sucesivamente con las dem´ as etapas. Esto quiere decir que todas las etapas cumplen la misma relaci´on de recurrencia lineal al igual que la primera etapa. Se puede decir que todo el registro de desplazamiento cumple la relaci´ on de recurrencia. No es dif´ıcil demostrar el enunciado que sigue a continuaci´on, referido a que la sucesi´ on de estados en un registro de desplazamiento es peri´ odica, con un periodo p 5 2r − 1, donde r es el n´ umero de etapas del registro. Cada estado del registro de desplazamiento viene determinado por su predecesor. De aqu´ı que si siempre ocurre que un estado es igual a alg´ un estado anterior, entonces los siguientes estados son los mismos, de manera que ya tenemos establecida una perioricidad. Con r etapas en un registro de desplazamiento existen s´olo 2r estados posibles. Por lo tanto la repetici´ on se produce entre alguno de los primeros 2r + 1 estados, y de aqu´ı ya tenemos la perioricidad con p 5 2r . Finalmente, si se produce el estado “todo ceros”, los siguientes estados ser´an siempre tambi´en “todo ceros”, y la perioricidad es p = 1. Por lo tanto el periodo largo no puede incluir este estado, y p 5 2r − 1. Este teorema se cumple independientemente del estado inicial del registro de desplazamiento. Comprobemos en la secuencia anterior las propiedades de aleatoriedad de la secci´on 2.1.1 . En primer lugar. la propiedad de balance; hay siete ceros y ocho unos en la secuencia; de aqu´ı, se ve que la secuencia cumple la condici´on de balance. A continuaci´ on la propiedad de realizaci´ on; consideremos las realizaciones del cero, hay cuatro. La mitad son de longitud 1, y un cuarto son de longitud 2. Lo mismo ocurre con las realizaciones del uno. La secuencia es demasiado peque˜ na para ir m´as all´a, pero podemos ver que la condici´ on de realizaci´ on se cumple. Para comprobar si la secuencia de salida del registro de desplazamiento de la figura 2.1 cumple la tercera propiedad de aleatoriedad, correlaci´on, se muestra la secuencia de salida y tambi´en la misma secuencia desplazada de forma c´ıclica en un chip: 000100110101111 100010011010111 dccddcdcddddccc Los d´ıgitos coincidentes est´an etiquetados con una c¸”, mientras que con una ”d”se indican los desacuerdos. Seg´ un la ecuaci´on 2.3 el valor de la funci´on de autocorrelaci´ on para este desplazamiento simple de un chip es: 1 1 (7 − 8) = − 15 15 Cualquier desplazamiento c´ıclico que difiera de la coincidencia completa resulta tener el mismo valor de autocorrelaci´on, −1/p. De aqu´ı que la secuencia cumple la tercera propiedad de aleatoriedad. R(τ = 1) =

2.2.1.

Funciones generadoras

Dada la secuencia {an } = {a0 , a1 , a2 , . . . }, sucesi´on de estados de la primera etapa de un registro de desplazamiento, podemos asociar a ella la funci´ on generadora:

2.2 Secuencias generadas mediante registros de desplazamiento

66

Figura 2.2: Funci´ on de autocorrelaci´on de la secuencia pseudoaleatoria de ejemplo

G(x) =

∞ X

an xn

(2.4)

n=0

El estado inicial del registro de desplazamiento se puede considerar como a−1 , a−2 , . . . , a−r

(2.5)

Si an satisface la relaci´ on de recurrencia an =

r X

ci an−i ,

i=1

operando resulta: Pr G(x) =

i −i + · · · + i=1 ci x (a−i x Pr 1 − i=1 ci xi

a−1 x−1 )

(2.6)

Esta relaci´ on expresa G(x) enteramente en funci´on de las condiciones iniciales a−1 , a−2 ,. . . , a−r , y de los coeficientes de realimentaci´on c1 , c2 ,. . . cr . De hecho, el denominador de 2.6 es independiente incluso de las condiciones iniciales. Si las condiciones iniciales son a−1 = a−2 = · · · = a1−r = 0, a−r = 1, la expresi´ on 2.6 se reduce a G(x) =

1−

c Prr

i i=1 ci x

(2.7)

Al denominador de esta u ´ltima relaci´on se le llama polinomio caracter´ıstico de la secuencia {an } y del registro de desplazamiento que la produce f (x) = 1 −

r X

ci xi

(2.8)

i=1

P n Obs´ervese lo f´ acil que se genera el polinomio caracter´ıstico f (x) = 1 − x , donde el sumatorio se aplica a los valores de n donde la n-´esima etapa del registro de desplazamiento se realimenta al sumador m´ odulo 2 (figura 2.1). Tambi´en conviene recordar que la resta en aritm´etica m´ odulo 2 equivale a la suma.

2.2 Secuencias generadas mediante registros de desplazamiento

2.2.2.

67

Determinaci´ on del per´ıodo

Ya sabemos que las secuencias generadas en los registros de desplazamiento son peri´odicas, y conocemos la acotaci´on superior para tal per´ıodo. La ecuaci´on 2.7 nos permite dar una aproximaci´ on m´ as exacta. Si se cumplen las condiciones iniciales descritas en el apartado anterior a−1 = a−2 = · · · = a1−r = 0, a−r = 1, se demuestra que el periodo de la secuencia es el entero positivo menor p para el cual el polinomio caracter´ıstico f (x) divide a 1 − xp m´odulo 2: Bajo las condiciones indicadas, al ser la secuencia {an } de per´ıodo p se cumple: ∞

G(x) =

X 1 = an cn f (x)

(2.9)

n=0

1 f (x)

= (a0 + a1 x + · · · + ap−1 xp−1 ) + xp (a0 + a1 x + · · · + ap−1 xp−1 ) +x2p (a0 + a1 x + · · · + ap−1 xp−1 ) + . . . = (a0 + a1 x + · · · + ap−1 xp−1 )(1 + xp + x2p + x3p + . . . ) = (a0 + a1 x + · · · + ap−1 xp−1 )/(1 − xp )

Por tanto: f (x)(a0 + a1 x + · · · + ap−1 xp−1 ) = 1 − xp ,

(2.10)

y f (x) divide a 1 − xp . Seg´ un 2.6, G(x) = g(x)/f (x), donde el numerador g(x) tiene un grado menos que f (x). Si el registro de desplazamiento est´a aprovechando el hecho de que tiene r etapas, entonces f (x) tiene grado r, y no se pierde la generalidad si se supone que siempre es ´este el caso. Si g(x) no tiene factores en com´ un con f (x), entonces se sigue cumpliendo el teorema demostrado anteriormente y el n´ umero entero menor p tal que f (x) divide a 1 − xp , es el per´ıodo de la correspondiente secuencia. Al n´ umero p se le conoce como exponente de Fax. El caso particular de la demostraci´on corresponde a g(x) = 1. Otro caso muy importante se da cuando f (x) es irreducible, en cuyo caso no puede tener factores en com´ un con g(x), un polinomio de grado m´ as bajo, a no ser que g(x) = 0, que corresponde a unas condiciones iniciales “todo ceros”. Por lo tanto, cuando f (x) es irreducible, el periodo de la secuencia del registro de desplazamiento no depende de las condiciones iniciales, exceptuando u ´nicamente el caso de la condici´on inicial “todo ceros”. 2.2.2.1.

Una condici´ on necesaria para longitud m´ axima

En el caso en que la secuencia A = {an } sea de longitud m´ axima, su per´ıodo es p = 2r − 1, y se cumple que su polinomio caracter´ıstico f (x) es irreducible. El rec´ıproco no es cierto. La demostraci´ on de este teorema parte de que al ser la secuencia A de longitud m´axima, existir´ an a lo largo de la misma todas las combinaciones de secuencias de unos y ceros de longitud r (excepto r ceros consecutivos). En particular, se podr´a encontrar un uno seguido de r − 1 ceros, que constituyen las condiciones iniciales con las que se obtuvo el polinomio caracter´ıstico del registro de desplazamiento. Consecuentemente se cumple que el per´ıodo de la secuencia A es el exponente de f (x). Por reducci´on al absurdo se

2.2 Secuencias generadas mediante registros de desplazamiento

68

demuestra que no puede cumplirse el que la secuencia sea de longitud m´axima si se diera el caso de que f (x) fuese reducible y tuviera dos factores de la forma f (x) = s(x)t(x), alcanz´ andose en este caso una longitud de secuencia menor a 2r − 1. Tampoco se cumple el rec´ıproco, es decir, el hecho de que el polinomio caracter´ıstico f (x) sea irreducible no es condici´on suficiente para establecer que la secuencia sea de longitud m´ axima: Por ejemplo, f (x) = x4 + x3 + x2 + x + 1 es irreducible, pero como divide a 1 − x5 , la secuencia que genera es de periodo 5, en lugar del periodo m´aximo 24 − 1 = 15. De la misma manera, f (x) = x6 + x3 + 1 es irreducible, pero tiene exponente 9 en vez de 63.

2.2.3.

El m´ etodo matricial

Tambi´en se llega a las mismas deducciones si se considera a cada estado de un registro de desplazamiento de r etapas como un vector r-dimensional. El registro de desplazamiento es entonces un operador lineal que cambia cada estado en el siguiente. De esta forma, lo m´as conveniente es representar al operador lineal sobre vectores r-dimensionales mediante una matriz de r × r. En general, una matriz representativa de un registro de desplazamiento toma la forma:   c1 1 0 . . . 0    c2 0 1 0     .. . . ..  M =  ... , (2.11) . .  .     1   cr−1 0 0 cr 0 0 . . . 0 con unos a lo largo de la diagonal justo encima de la diagonal principal, y los “coeficientes de realimentaci´ on.en la primera columna. Realicemos una verificaci´on expl´ıcita:    (an−1 , an−2 , . . . , an−r )   

c1 1

0

c2 0 1 .. .. . . . . .

... 0



 0    .. . 1 

cr 0 0 . . . 0 = (c1 an−1 + c2 an−2 + · · · + cr an−r , an−1 , an−2 , . . . , an−r+1 ) =

(an , an−1 , . . . , an−r+1 )

La ecuaci´ on caracter´ıstica de la matriz M es:

´ dulo 2 2.3 Polinomios mo

0 ··· c1 − λ 1 c2 −λ 1 · · · f (λ) = det|M − λI| = c3 0 −λ · · · .. .. .. .. . . . . cr 0 0 h c cr i c c 3 1 2 = −(−λ)r 1 − − 2 − 3 − ··· − r λ λ λ λ  (−1)r+1  = 1 − (c1 x + c2 x2 + · · · + cr xr ) r x

69

0 0 0 −λ

donde se ha realizado la sustituci´on x = 1/λ. Se puede apreciar que exceptuando el t´ermino(−1)r+1 /xr , la ecuaci´ on caracter´ıstica de la matriz M es el polinomio caracter´ıstico del registro de desplazamiento. En este caso, determinar el periodo del registro de desplazamiento equivale, excepto en casos degenerados, a encontrar la potencia m´as baja p de la matriz equivalente M tal que M p = I, la matriz identidad. La teor´ıa de matrices establece que toda matriz cumple su ecuaci´on caracter´ıstica: por tanto f (M ) = 0. Si f (x) divide a 1 − xp , entonces M es una ra´ız de I − X p , ya que es ra´ız del factor f (X) = 0. Esto es, si f (x) divide a 1 − xp , entonces M p = I. A la inversa, si f (x) es irreducible, entonces divide todo polinomio que tenga la ra´ız M en com´ un con p p ´el, y dividir´ a a 1 − x si M = I.

2.3.

Polinomios m´ odulo 2

En esta secci´ on se incluye el m´etodo para determinar el n´ umero de polinomios irreducibles y primitivos de un grado determinado.

2.3.1.

Periodos primos de Mersenne

Cualquier polinomio irreducible m´odulo 2, de grado r > 1, divide al polinomio 1− Para r = 3, por ejemplo, se cumple que tanto 1 + x + x3 como 1 + x2 + x3 dividen a 1 − x7 . Realmente 1 − x7 = (1 − x)(1 + x + x3 )(1 + x2 + x3 ) m´odulo 2. De este hecho y del teorema demostrado en 2.2.2 sobre la duraci´on del periodo de una secuencia (es el menor entero p para el que el polinomio caracter´ıstico f (x) divide a 1 − xp ) se concluye f´ acilmente que si una secuencia tiene un polinomio caracter´ıstico irreducible de grado r, el per´ıodo de la secuencia es un factor de 2r − 1. Como corolario a este u ´ltimo enunciado, si 2r − 1 es primo, entonces a cualquier polinomio irreducible de grado r le corresponde una secuencia de longitud m´axima. Los n´ umeros primos correspondientes a 2r −1 son conocidos como primos de Mersenne. Los primeros veintitr´es primos de Mersenne se han calculado mediante ordenador y se muestran en la tabla 2.1. r x2 −1 .

2.3.2.

Las funciones de Euler y de M¨ obious

Existe una f´ ormula expl´ıcita para calcular el n´ umero de polinomios irreducibles mod 2 de grado r, e incluso para calcular el n´ umero de polinomios de “exponente m´aximo”(en

´ dulo 2 2.3 Polinomios mo

70

Cuadro 2.1: Primos de Mersenne: 2p − 1. Primeros 23 valores de p.

2

17

107

2203

9689

3

19

127

2281

9941

5

31

521

3217

11213

7

61

607

4253

13

89

1279

4423

algunos textos tambi´en llamados polinomios primitivos) de grado r. Estas f´ormulas est´ an constituidas a partir de dos funciones utilizadas usualmente en teor´ıa de n´ umeros y se definen en esta secci´ on. Por el teorema de factorizaci´on u ´nica de aritm´etica, todo entero n > 1 se puede descomponer en factores primos, n=

k Y

pαi i

(2.12)

i=1

Seg´ un los t´erminos de esta factorizaci´on, la funci´on de Euler φ se define como ( 1 si n = 1 φ(n) = (2.13) Qk αi −1 (pi − 1) si n > 1 i=1 pi En particular, si P es un n´ umero primo φ(P ) = P − 1. Si Q es tambi´en primo, φ(P Q) = (P − 1)(Q − 1). Tambi´en, φ(P 2 ) = P (P − 1). La funci´on φ est´a tabulada en la tabla 2.2 Una definici´ on equivalente de la funci´on de Euler es: φ(n) es el n´ umero de fracciones positivas irreducibles no mayores de 1 con denominador n. Por ejemplo, si n = 6, los u ´nicos sextos irreducibles son 1/6 y 5/6. Entonces φ(6) = 2. Esto coincide con la definici´on original puesto que, seg´ un esta, φ(6) = φ(2 · 3) = (2 − 1)(3 − 1) = 2. La funci´ on de M¨ obius µ se define seg´ un 2.12 como:   1 si n = 1    Q  0 si ki=1 αi > 1 µ(n) = (2.14)  (−1)k en cualquier otro caso (ej. si n es el     producto de k distintos primos) µ(P 2 )

Si P es primo, µ(P ) = −1. Si Q tambi´en es primo, µ(P Q) = 1, mientras que = 0. Tambi´en la funci´ on de M¨obius est´a tabulada en 2.2.

2.3.3.

N´ umero de polinomios irreducibles

El n´ umero de polinomios irreducibles m´odulo 2 de grado n viene dado por: ψ2 (r) =

1X d r 2 µ( ), r d d|r

donde la suma se extiende sobre todos los divisores positivos d de r.

(2.15)

´ dulo 2 2.3 Polinomios mo

71

n

µ(n)

φ(n)

n

µ(n)

φ(n)

n

µ(n)

φ(n)

1

1

1

18

0

6

35

1

24

2

-1

1

19

-1

18

36

0

12

3

-1

2

20

0

8

37

-1

36

4

0

2

21

1

12

38

1

18

5

-1

4

22

1

10

39

1

24

6

1

2

23

-1

22

40

0

16

7

-1

6

24

0

8

41

-1

40

8

0

4

25

0

20

42

-1

12

9

0

6

26

1

12

43

-1

42

10

1

4

27

0

18

44

0

20

11

-1

10

28

0

12

45

0

24

12

0

4

29

-1

28

46

1

22

13

-1

12

30

-1

8

47

-1

46

14

1

6

31

-1

30

48

0

16

15

1

8

32

0

16

49

0

42

16

0

8

33

1

20

50

0

20

17

-1

16

34

1

16

Cuadro 2.2: Funciones φ y µ tabuladas hasta para n = 50

Por ejemplo, para calcular el n´ umero de polinomios irreducibles m´odulo 2 de grado 8, los divisores de 8 son d = 1, 2, 4, 8. Entonces r/d = 8, 4, 2, 1 y µ(8/d) = 0, 0, −1, +1. Por P d tanto, d|r 2 µ(8/d) = 0 + 0 − 16 + 256 = 240, y ψ2 (8) =

1X d 8 2 µ( ) = 30 8 d d|8

Los valores de ψ2 (r) se incluyen en la tabla 2.3 para r 5 24. Ya se ha dicho que no todos los polinomios irreducibles de grado r tienen m´aximo exponente (no todos son primitivos). Es decir, no todos corresponden a secuencias de registros de desplazamiento de longitud 2r − 1. El n´ umero de polinomios m´odulo 2 de grado r que tienen m´ aximo exponente viene dado por: φ(2r − 1) r Por ejemplo, el n´ umero de polinomios primitivos de grado 8 es λ2 (r) =

(2.16)

φ(255) φ(3,5,17) 2 · 4 · 16 = = = 16 8 8 8 Por tanto, en este caso, la mitad de los polinomios irreducibles tienen m´aximo exponente. Sin embargo, cuando 2r − 1 es primo, ψ2 (r) = λ2 (r) = (2r − 2)/r. Tambi´en se ha tabulado λ2 (r) en 2.3. λ2 (8) =

2.4 Aleatoriedad de las secuencias de registros de desplazamiento

72

r

2r − 1

λ2 (r)

ψ2 (r)

r

2r − 1

λ2 (r)

ψ2 (r)

1

1

1

2

13

8191

630

630

2

3

1

1

14

16383

756

1161

3

7

2

2

15

32767

1800

2182

4

15

2

3

16

65535

2048

4080

5

31

6

6

17

131071

7710

7710

6

63

6

9

18

262143

8064

14532

7

127

18

18

19

524287

27594

27594

8

255

16

30

20

1048575

24000

52377

9

511

48

56

21

2097151

84672

99858

10

1023

60

99

22

4194303

120032

190557

11

2047

176

186

23

8388607

356960

364722

12

4095

144

335

24

16777215

276480

698870

Cuadro 2.3: Funciones ψ y λ tabuladas hasta r = 24

2.3.4.

Periodos mas peque˜ nos

No es dif´ıcil catalogar los posibles periodos cortos (es decir, los exponentes menores) que un polinomio irreducible mod 2 de grado r puede tener. Tambi´en es f´acil establecer cu´antos polinomios irreducibles existen con cada uno de estos exponentes. Cada factor f de 2r − 1 que no es factor de cualquier n´ umero 2s − 1 con s < r se da como exponente de los polinomios irreducibles de grado r. Concretamente, existen φ(f )/r polinomios irreducibles de grado r con exponente f . Por ejemplo,si r = 8, 2r − 1 = 255, que tiene los factores 1, 3, 5, 15, 17, 51, 85, 255. De ellos, 1, 3, 5, y 15 ya dividen 24 − 1. Por tanto, los otros factores 17, 51, 85 y 255 se dan como periodos de polinomios irreducibles. En particular, hay φ(17)/8 = 2 con exponente 17, φ(51)/8 = 4 con exponente 51, φ(85)/8 = 8 con exponente 85, y φ(255)/8 = 16 con exponente 255. Ya tenemos los 30 polinomios irreducibles de grado 8, 2 + 4 + 8 + 16 = 30.

2.4. 2.4.1.

Aleatoriedad de las secuencias de registros de desplazamiento Propiedad de balance

Supongamos que un registro de desplazamiento de r etapas recorre todos los 2r − 1 estados posibles antes de volver a repetir la secuencia. Si numeramos estos estados en notaci´ on binaria desde 1 hasta 2r − 1, y consideramos el d´ıgito unitario (el menos significativo), veremos que ´este es un 1 para los n´ umeros impares y 0 para los pares. Desde 1 hasta 2r −1, hay 2r−1 n´ umeros impares, y 2r−1 −1 n´ umeros pares. Por tanto, en cualquier secuencia de registro de desplazamiento de longitud m´axima hay 2r − 1 unos, y 2r−1 ceros. Por lo tanto, podemos concluir que la propiedad de balance se cumple en todas las secuencias generadas en registros de desplazamiento.

2.4 Aleatoriedad de las secuencias de registros de desplazamiento

2.4.2.

73

Propiedad de realizaci´ on

En la secuencia de m´ axima longitud {an } generada en un registro de desplazamiento, hay 2r − 1 formas de elegir r t´erminos consecutivos. Es decir, cualquier posible array de r t´erminos consecutivos, exceptuando la combinaci´on “todo ceros”, ocurre exactamente una vez. En particular, r unos consecutivos ocurre s´olo una vez. Esta realizaci´on debe estar precedida por un cero y seguida de un cero, ya que de lo contrario existir´ıa alguna otra realizaci´ on de r unos consecutivos. Un cero seguido por r − 1 unos ocurre exactamente una vez. Pero eso ya se ha tenido en cuenta en la secuencia de r unos, que viene precedida de un cero. De forma similar, r − 1 unos seguidos por un cero ocurre exactamente una vez, y aqu´ı se tiene en cuenta el que la realizaci´ on de r unos debe de ir seguida de un cero. Entonces, ´esta no es una verdadera realizaci´ on de r − 1 unos. Supongamos 0 < k < r − 1. Para encontrar el n´ umero de realizaciones de unos de longitud k, consideremos r t´erminos consecutivos que empiecen en cero seguido de k unos, despu´es un cero, y los restantes r − k − 2 t´erminos arbitrarios. Esto ocurre 2r−k−2 veces, ya que cada modo de completar los r t´erminos (los r − k − 2 t´erminos arbitrarios), ocurre s´olo una vez. Razonamientos an´ alogos se cumplen para el n´ umero de realizaciones de ceros de longitud k, para 0 < k < r − 1. La combinaci´on de r ceros consecutivos no se da nunca (esto parar´ıa al registro de desplazamiento). El resto de combinaciones, como por ejemplo un “uno seguido de r − 1 ceros”debe de producirse, de manera que exista una realizaci´ on de r − 1 ceros. De esta manera se ha determinado completamente la forma de estudiar la estructura completa de una secuencia de longitud m´axima generada en un registro de desplazamiento, en lo que se refiere a n´ umero de realizaciones de unos (a partir de aqu´ı se llamar´an bloques) y de ceros (llamadas huecos): Si 0 < k < r − 1, hay 2r−k−2 bloques y huecos de longitud k. Tambi´en, hay un s´olo hueco de longitud r − 1 y un bloque de longitud r. En t´erminos del periodo p de la secuencia (p = 2r − 1), hay (p + 1)/2 realizaciones, la mitad de ellas bloques y la otra mitad huecos. De los bloques, la mitad tienen longitud 1, un cuarto tienen longitud 2, la octava parte tienen longitud 3, . . . y lo mismo ocurre con los huecos. As´ı se contin´ ua hasta llegar a s´olo un bloque y un hueco de longitud r − 2. S´olo queda un hueco de longitud r − 1 y un bloque de longitud r. Este resultado se puede resumir diciendo que la propiedad de realizaci´ on se cumple en las secuencias de longitud m´ axima generadas en registros de desplazamiento.

2.4.3.

Propiedad de correlaci´ on

Sea {bn }la secuencia resultante de transformar la secuencia binaria {an } mediante la operaci´ on bn = 1 − 2an , esto es, los ceros se transforman en unos y los unos en -1. Tambi´en es equivalente la transformaci´on bn = eiπan . Si tomamos las secuencias A0 , A1 , . . . , Ap del apartado ?? y les aplicamos la transformaci´ on anterior, obtenemos las secuencias B0 , B1 , . . . , Bp . Ahora la adici´on m´odulo 2 para las secuencias Ai equivale a la multiplicaci´on de las Bi , como se pone de manifiesto en las tablas de adici´ on y multiplicaci´on:

2.5 Resumen

74



1

0

×

-1

1

1

0

1

-1

1

-1

0

1

0

1

-1

1

(2.17)

Como Ai + Aj = Ak , ahora Bi Bj = Bk , donde el producto Bi Bj tambi´en se toma t´ermino a t´ermino. Tambi´en se cumple (con la excepci´on de Bk = B0 = {1, 1, 1, . . .}, que s´olo ocurre cuando i = j), que Bk contiene (p − 1)/2 unos y (p + 1)/2 menos unos, por la propiedad de balance y pertenecer al grupo Abeliano. La funci´ on de autocorrelaci´on ya se enunci´o en el apartado 2.1.1 pero se repite particularizada para las secuencias {bn } a continuaci´on: ( p 1X 1 si τ = 0 Rb (τ ) = bn bn+τ = (2.18) p −1/p si 0 < τ < p, n=1

ya que {bn bn+τ } es una secuencia del tipo Bi · Bj , y por tanto tambi´en es del tipo Bk . Entonces, el exceso de +1 con respecto a −1 es p para B0 , y -1 en cualquier otro caso. De aqu´ı se puede establecer que todas las secuencias generadas en registros de desplazamiento de longitud m´ axima cumplen la tercera propiedad de aleatoriedad.

2.5.

Resumen

En este cap´ıtulo se han enunciado las propiedades que cumplen las secuencias binarias consideradas pseudoaleatorias. Se ha visto que un m´etodo muy sencillo de generarlas consiste en utilizar un registro de desplazamiento con realimentaci´on m´odulo 2. Las secuencias generadas en registros de desplazamiento satisfacen una relaci´on de P recurrencia lineal an = ri=1 ci an−i , donde los coeficientes ci valen 0 ´o 1 en funci´on de si la etapa i est´ a o no implicada en la realimentaci´on.PA partir de esta relaci´on de recurrencia se deduce el polinomio caracter´ıstico f (x) = 1 − ri=1 ci xi , cuyas propiedades matem´aticas determinan el comportamiento de la secuencia. En concreto, se demuestra que el periodo de la secuencia es el menor entero positivo p para el que se cumple que 1 − xp es divisible por f (x). Seg´ un t´erminos de teor´ıa elemental de n´ umeros, se enuncian las formulas expl´ıcitas que determinan el n´ umero de polinomios irreducibles de grado r, y el n´ umero de polinomios primitivos, tambi´en llamados de m´aximo exponente, de grado r. Este n´ umero coincide r u ´nicamente si 2 − 1 resulta ser un n´ umero primo. El n´ umero de polinomios irreducibles es ligeramente menor a 2r /r (asint´ oticamente igual), y el n´ umero de polinomios primitivos es del mismo orden de magnitud. Por u ´ltimo, se ha demostrado que las secuencias generadas a partir de polinomios primitivos satisfacen las tres caracter´ısticas b´asicas de aleatoriedad. La referencia [?] constituye una recopilaci´on excelente sobre el tema. En ella se pueden encontrar diversos procedimientos para encontrar polinomios primitivos, aunque dada su extensi´ on no se pueden incluir en este trabajo.

Cap´ıtulo 3

Medidas de calidad Despu´es de haber efectuado un repaso de la teor´ıa de las secuencias pseudoaleatorias, su generaci´ on y propiedades fundamentales, necesitamos saber c´omo se utilizan estas secuencias a la hora de hacer las pruebas de simulaci´on de tr´afico real. Las consideraciones y procedimientos definidos a este respecto por la ITU han sido tenidas en cuenta en la medida de lo posible a la hora de realizar este trabajo. Estas consideraciones se han ido revisando ya que en la actualidad el aumento de las transmisiones de datos ha cambiado las exigencias de calidad en los enlaces. Definir y medir el factor de calidad no es una tarea f´acil. Primeramente, es necesario contestar a preguntas como, si la calidad es el n´ umero total de errores de bit o si es la probabilidad de errores de bit dentro de un cierto per´ıodo, si se requiere una configuraci´on de prueba especial y c´omo comparar diferentes resultados provenientes de l´ıneas diferentes con distintas velocidades. La transmisi´ on de voz en las redes digitales no es muy sensible a los errores de bit, dado que ´estos ocasionan s´ olo una leve distorsi´on del sonido, mientras que la exactitud en la recepci´ on de informaci´ on es algo cr´ıtico en la transmisi´on de datos. Con el fin de asegurar que el t´ermino “calidad” tenga el mismo significado para todos, la ITU especific´o en las recomendaciones G.821 y M.550 las condiciones y l´ımites de clasificaci´on para hacer mediciones en servicios defectuosos.

3.1.

La Recomendaci´ on G.821 ITU

Los par´ ametros de servicio defectuoso son especificados en la Recomendaci´on G.821 de la ITU. La recomendaci´ on especifica la calidad de servicio de una conexi´on digital hipot´etica de referencia con longitud de 27.500 km, y se recomienda un per´ıodo de medici´on de un mes. La asignaci´ on de los datos de calidad del servicio a una parte de la conexi´ on y mediciones durante un per´ıodo menor que un mes est´an especificadas en las Recomendaciones G.821 y M.550. Como se requiere un cierto nivel de calidad de una l´ınea antes que pueda ser usada para transmisi´ on de datos, la recomendaci´ on divide la medici´ on en tiempo disponible y tiempo no disponible. La medici´ on de errores s´olo se debe evaluar mientras la conexi´ on est´e en estado de disponibilidad. Un cambio de tiempo disponible a tiempo no disponible es ocasionado por 10 segundos sucesivos con alarmas o con una proporci´on o relaci´on de bits err´oneos de m´as de 10−3 . Los 10 segundos ser´ an parte del tiempo no disponible. Un cambio de tiempo no disponible a tiempo disponible es ocasionado por 10 se-

75

´ n G.821 ITU 3.1 La Recomendacio

76

gundos sucesivos en los cuales la relaci´on de errores de bit ha sido mejor de 10−3 . De la misma manera que en el caso anterior, los 10 segundos ser´an parte del tiempo disponible. Una indicaci´ on gr´ afica de los dos cambios de estado se muestra en la figura 3.1.

Figura 3.1: Consideraci´ on de los errores en la determinaci´on del tiempo de disponibilidad

La figura 3.2 pone de manifiesto c´omo se deben considerar los dos sentidos de un enlace a la hora de realizar la medida de calidad del mismo en lo que se refiere a tiempos de disponibilidad. Como se podr´ıa deducir f´acilmente, el enlace est´a fuera de servicio o en periodo de tiempo no disponible cuando alguno de los dos sentidos lo est´e.

Figura 3.2: Tiempo de disponibilidad en un enlace seg´ un la disponibilidad de los dos sentidos

Los par´ ametros de servicio son calculados y clasificados s´olo para el tiempo disponible. Esto significa que cuando se realicen las mediciones de servicio es importante comprobar cu´anto tiempo ha sido clasificado como tiempo no disponible. En el tiempo disponible se usan diferentes t´erminos para definir el nivel de degradaci´ on en el enlace. Los t´erminos son los siguientes: Segundo Err´ oneo (SE, en ingl´es ES): Un segundo en tiempo disponible en el cual se produce al menos un error en un bit. Segundo Severamente Err´ oneo (SSE, en ingl´es SES): Un segundo en tiempo disponible con una relaci´ on de bits err´oneos superior a 10−3 , o un segundo en el cual se ha detectado un alarma.

´ n G.821 ITU 3.1 La Recomendacio

77

Minuto Degradado (MD, ingl´es DM): Un minuto en tiempo disponible con una proporci´ on de bits err´ oneos superior a 10−6 , en la cual los segundos severamente err´oneos son excluidos del tiempo disponible y el resto del tiempo es dividido en bloques de 60 segundos. Un bloque es un minuto degradado si la proporci´on de bits err´oneos es superior a 10−6 .

Figura 3.3: T´erminos de la recomendaci´on G.821

Una clasificaci´ on de la calidad de transmisi´on es inevitablemente un compromiso entre el deseo de satisfacer las necesidades de diferentes servicios y la necesidad de realizar sistemas de transmisi´ on tomando en consideraci´on condiciones t´ecnicas y econ´omicas. En la Recomendaci´ on G.821, se han convenido los objetivos de servicio defectuoso para la conexi´ on hipot´etica de referencia1 , durante un per´ıodo de medici´on de un mes, que se muestran en la tabla 3.1. Clasificaci´ on de servicio

Objetivo ( % m´ax. de tiempo)

Minutos degradados

10

Segundos severamente err´oneos

0.2

Segundos err´ oneos

8

Cuadro 3.1: Objetivos m´aximos de servicio defectuoso seg´ un G.821

Otro par´ ametro que a menudo es usado en las mediciones de servicio defectuoso para sistemas de radioenlaces es la proporci´on de errores de bit residual. En los sistemas de radioenlaces, los errores son causados principalmente por desvanecimientos, los cuales provocan que los sistemas de protecci´on mediante redundancia conmuten autom´aticamente el enlace a una conexi´ on alternativa. Por ello, el tiempo que contiene la proporci´on de errores m´ as grande no deber´ a ser tomado en cuenta. La proporci´on de errores de bit residual no est´ a descrita en la recomendaci´on G. 821, pero s´ı en la Rec. 634 de la ITU, donde el procedimiento de medici´ on est´a descrito preliminarmente. Este principio consiste en hacer mediciones de proporci´ on de bits err´oneos durante un per´ıodo de un mes usando un tiempo de integraci´ on de 15 minutos. El 50 % de los intervalos que contienen la proporci´ on m´as alta de bits con error son descartados y la proporci´on m´as alta del resto de intervalos es entonces la proporci´ on de errores de bits residual. Otra manera, m´ as pr´ actica, de calcular la proporci´on residual de bits err´oneos, y que est´a m´ as relacionada con los par´ ametros de la recomendaci´on G.821, es similar al c´alculo 1

Ver la Figura 3.4

´ n de los objetivos G.821 3.2 Asignacio

78

de los minutos degradados. Los segundos severamente err´oneos son excluidos del tiempo disponible y la proporci´ on de bits err´oneos del tiempo restante es entonces la proporci´ on residual de bits err´ oneos. De todas maneras, a la vista de comparaciones realizadas con otros equipos profesionales de medida de BER, y por coherencia con la filosof´ıa adoptada en ellos, no han sido tomadas en cuenta estas u ´ltimas precisiones de la norma acerca de la tasa de BER residual. Es una medida m´ as realista el tener en cuenta todos y cada uno de los errores, incluidos los que provocan las conmutaciones de redundancia porque al fin y al cabo, si dichas conmutaciones se producen, y de hecho ocurre en la pr´actica, los enlaces y comunicaciones afectados se ver´ an perjudicados por ellas. En tal caso, ¿por qu´e no van a ser tenidos en cuenta estos errores en el momento de las mediciones?.

3.2.

Asignaci´ on de los objetivos G.821

A fin de asignar los objetivos a mediciones reales, la conexi´on hipot´etica de referencia es dividida en grado local, grado medio y grado alto. Los circuitos en grado local son definidos como aquellos que operan entre el recinto del usuario y una central local a velocidades bajo los 2 Mbits/s. Los sistemas en grado medio son aquellos que operan entre centrales locales y la red nacional. La longitud combinada de los enlaces en grados medio y local no debe exceder 1250 km. Los circuitos en grado alto son conexiones de larga distancia e internacionales que operan preferentemente a altas velocidades.

Figura 3.4: La conexi´on hipot´etica de referencia y su divisi´on seg´ un los diferentes grados de la recomendaci´on G.821

Los segundos err´ oneos y minutos degradados son asignados a los diferentes grados, de manera que al grado local le es permitido el 15 % de los objetivos en cada extremo, al grado medio, el 15 % de los objetivos en cada extremo, y al grado alto, el 40 % restante de los objetivos. La asignaci´ on de segundos severamente err´oneos est´a basada en un principio diferente. El objetivo total es 0.2 %, y el 0.1 % es asignado a las tres clasificaciones de circuitos en las mismas relaciones que para los segundos err´oneos y los minutos degradados. Esto da la siguiente distribuci´ on:

´ n de los objetivos G.821 3.2 Asignacio

79

Clasificaci´ on de circuito

Asignaci´on de objetivos MD y SE

Grado Local (dos extremos)

15 % asignaci´on en bloque a cada extremo

Grado Medio (dos extremos)

15 % asignaci´on en bloque a cada extremo

Grado Alto

40 %

Cuadro 3.2: Asignaci´on de objetivos de minutos degradados y segundos err´oneos

Clasificaci´ on de circuito

Asignaci´on de objetivos SSE

Grado Local (dos extremos)

0.015 % asignaci´on en bloque a cada extremo

Grado Medio (dos extremos)

0.015 % asignaci´on en bloque a cada extremo

Grado Alto

0.04 %

Cuadro 3.3: Distribuci´on del 0.1 % de segundos severamente err´oneos

El resto del 0.1 % de segundos severamente err´oneos es asignado a la clasificaci´ on grado alto y medio para dar cabida a los meses peores del a˜ no para sistemas de transmisi´ on de larga distancia. Pero debido a la naturaleza estad´ıstica de los meses peores en una conexi´ on mundial, es recomendable la distribuci´on siguiente: El 0.05 % de los segundos severamente err´oneos a un sistema de radioenlaces de 2500 km que puede ser usado en el grado alto o medio de la conexi´on. El 0.01 % de los segundos severamente err´oneos para una conexi´on por sat´elite. Para circuitos en grado medio y grado local, la distribuci´on es una en bloque. Esto significa que es el total permitido de extremo a extremo sin que importe la longitud de la conexi´ on. Para conexiones de grado alto, la longitud de la conexi´on tiene que ser tomada en cuenta al asignar los objetivos de calidad del servicio. Para demostrar la manera de calcular la distribuci´ on, se usar´ a una conexi´on con una longitud de 10000 km para el c´alculo de la distribuci´ on de los segundos err´oneos. El 40 % del 8 % es asignado a una conexi´ on en grado alto con una longitud de 25000 km. Esto significa que el 3,2 % es asignado a toda la longitud, pero como la longitud es s´olo 10000 km, se deber´a multiplicar por 10000/25000. Por consiguiente, la asignaci´on es 1,28 % de segundos err´oneos. Para los segundos severamente err´ oneos, el 0,04 % es asignado al grado alto, lo cual debe ser multiplicado por 10000/25000. Por tanto, la asignaci´on ser´a 0.016 % m´as el valor extra arriba mencionado si se trata de una conexi´on por sat´elite o un sistema de radioenlaces. Como en realidad los enlaces rara vez tienen 27500 km de longitud, una distribuci´ on m´as pr´ actica de los objetivos de calidad del servicio es indicada en la recomendaci´on G.821 donde se describen las secciones digitales con longitudes de 280 km y 50 km. En teor´ıa, s´olo se pueden usar las secciones de 280 km, pues la asignaci´on basada en la longitud solamente es usada para los circuitos en grado alto. Sin embargo, como las conexiones de grado medio pueden ser divididas en diferentes secciones, la asignaci´on para circuitos en grado medio es usada tambi´en. Al calcular la asignaci´ on para las diferentes secciones, la longitud es redondeada al valor entero m´ as alto de 280 km y multiplicada por el valor apropiado de la tabla. Por ejemplo, la asignaci´ on de minutos degradados para un enlace con una longitud de 500 km puede ser calculada con la f´ormula siguiente: 2 × 0,45 % del 10 % = 0,09 %. De la misma manera, la asignaci´ on de segundos severamente err´oneos puede ser calculada

3.3 Especificaciones G.821 para otras velocidades

80

Clase de calidad de

Longitud SDHR

Asignaci´on

Para clasificaci´on de

secci´ on

(Km)

( %)

circuitos

1

280

0.45

Alto o medio

2

280

2

Medio

3

50

2

Medio

4

50

5

Medio

Cuadro 3.4: Clasificaci´on de calidad de secci´on digital

como: 2 × 0,45 % del 0,1 % = 0,0009 % m´as el valor de margen extra para los sistemas de radioenlaces o conexiones por sat´elite.

3.3.

Especificaciones G.821 para otras velocidades

Como los objetivos de G.821 son especificados para una conexi´on de 64 kbit/s, las mediciones en otras velocidades tienen que ser normalizadas a 64 kbits/s. La manera de proceder est´ a especificada en el Ap´endice D de esa recomendaci´on. Los segundos severamente err´ oneos y minutos degradados est´an basados en la proporci´on de errores de bit y por lo tanto pueden ser calculados directamente. Sin embargo, esto puede causar problemas en r´ afagas de errores menores de un segundo pues ´estas pueden no resultar en un segundo severamente err´ oneo en el orden superior, mientras que pueden resultar en segundos severamente err´ oneos en los canales de 64 kbit/s debido a la p´erdida de alineaci´on de trama en multiplexores de orden superior. Para solucionar este problema, un tiempo de integraci´ on menor de un segundo o l´ımites m´as estrictos deber´an ser tenidos en cuenta. Un segundo err´ oneo es definido como un segundo con uno o m´as errores de bit en un canal de 64 kbit/s, lo cual hace m´as complicado normalizar segundos err´oneos a otras velocidades. El m´etodo m´ as sencillo es dividir el n´ umero de errores en un segundo con una constante para la velocidad. Esta constante es la velocidad dividida por 64 kbit/s, es decir, el equivalente en n´ umero de canales telef´onicos contenidos en la trama que se trasmite. Por ejemplo, si en un enlace de 2 Mbit/s se cuentan 16 errores en el per´ıodo de un segundo, se contar´ an 16/32 = 0.5 segundos err´oneos. Si la medici´on tiene lugar durante 10 segundos, el porcentaje de segundos err´oneos ser´a 0.5/10 = 5 %. Como un segundo jam´ as puede considerarse como m´ as de un segundo err´oneo, la f´ormula es solamente usada si el n´ umero de errores es menor de la velocidad dividida por 64 kbit/s, si no, el segundo es un segundo err´ oneo. En otras palabras, en un enlace de 2 Mbps, 32 o m´as bits err´oneos en un segundo se comportar´ an como un segundo err´oneo, y menos de 32 errores como menos de un segundo err´ oneo. Esta f´ ormula est´ a basada en la suposici´on de que, en el peor de los casos, 32 errores de bit dar´ an un error en cada uno de los canales de 64 kbit/s, lo cual no tiene porqu´e ser estrictamente cierto, y menos de 32 bits err´oneos jam´as afectar´an a todos los canales. De la misma manera, el n´ umero de errores en un segundo err´oneo puede ser calculado para las otras velocidades. Es importante se˜ nalar los c´alculos anteriormente mencionados est´an u ´nicamente especificados para velocidades de 2 Mbit/s o m´as altas, y que el uso del c´alculo para servicio defectuoso del sistema no asegura que el objetivo de calidad se cumpla seg´ un el

3.3 Especificaciones G.821 para otras velocidades

criterio de la recomendaci´ on G.821 a nivel de canal telef´onico de 64 kbit/s.

81

Cap´ıtulo 4

Modulador DDS Terminada la exposici´ on te´ orica, comenzamos la parte pr´actica del trabajo en la que se incluyen las memorias correspondientes a los dos circuitos desarrollados. Este cap´ıtulo corresponde al primero de ellos, y consiste en el montaje de un modulador digital que utiliza las t´ecnicas DDS expuestas en el cap´ıtulo 1. La placa moduladora DDS constituye un modesto intento de poner en pr´actica los conceptos tratados sobre la s´ıntesis digital directa, y de comprobar “in situ” el estado del arte en lo que se refiere a integraci´on de estos sistemas. Como en casi todas las ramas de la ciencia y de la t´ecnica, los fundamentos te´oricos siempre se establecen de antemano y su aplicaci´ on suele topar contra alguna barrera de ´ındole tecnol´ogico. En este caso particular ha ocurrido as´ı, y ha sido necesario esperar un par de d´ecadas hasta que la s´ıntesis digital directa ha alcanzado el factor de integraci´on suficiente como para poder resultar en chips atractivos y compactos, aptos para su utilizaci´on a escala masiva. El dise˜ no tiene como componente fundamental un dispositivo DDS al que el fabricante ha a˜ nadido recursos hardware para implementar los tipos de modulaci´on m´ as ampliamente utilizados: FSK, QPSK y 16QAM. ¿Por qu´e se ha escogido para el dise˜ no este modulador y no otro? Se puede comprobar en la tabla resumen de la secci´on 1.10.5 que para realizar un modulador completo utilizando t´ecnicas DDS no hab´ıa muchas posibilidades de elecci´ on. La mayor´ıa de los circuitos integrados son dispositivos DDS-DAC a secas, es decir, u ´tiles en la generaci´on de tonos fijos, o si tienen los registros auxiliares necesarios para generar las modulaciones, entonces no integran el conversor D/A. As´ı que son pocos, al menos que se hayan encontrado, los que pod´ıan generar las modulaciones requeridas. Cumpliendo estos objetivos generales se encuentran en la misma tabla los chips AD9853 de Analog Devices y el STEL-2176 de Standford Telecom. Los dos son bastante parecidos, aunque el segundo supera al primero en cuanto a que tambi´en es demodulador, lo que lo encarece considerablemente, adem´as de aumentar la complejidad de su control. La u ´nica pega que se le puede achacar al integrado de Standford es que no se encuentra en sus abundantes hojas caracter´ısticas la resoluci´on en frecuencia del dispositivo DDS del modulador. El integrado de Analog es u ´nicamente modulador, con lo que su control es bastante m´ as sencillo, adem´ as de que su uso est´a bastante m´as extendido. Al final optamos por el modulador AD9853 bas´ andonos en criterios econ´omicos y de facilidad en cuanto a su disponibilidad. En la placa del circuito impreso, a la que en el resto de la memoria denominaremos placa DDS, se han incluido una serie de accesorios que complementan su funcionamiento convirti´endola en un sistema completo de modulaci´on, capaz de funcionar en un amplio 82

4.1 Especificaciones de la placa DDS

83

margen de velocidades de modulaci´on y de frecuencia de salida. El interface de control utilizado para todo el montaje es el puerto paralelo del PC. En el ap´endice A se ha incluido un resumen de funcionamiento del mismo, haciendo incapi´e en la forma en que se utiliza en nuestro trabajo.

4.1.

Especificaciones de la placa DDS

La placa DDS es la encargada de generar la se˜ nal modulada con la que se quiere realizar medidas de propagaci´ on en el laboratorio. El rango de frecuencias de salida est´a en lo que comercialmente se denomina de frecuencia intermedia, FI, que corresponde a un margen que va desde lo que ser´ıan frecuencias altas de la banda de HF, hasta las frecuencias bajas de la banda de VHF. Todav´ıa no tenemos el sistema completo si lo que queremos medir es la banda L, banda de 1800 Mhz asignada a comunicaciones m´oviles, que es donde se plantean los problemas pr´ acticos de propagaci´on. Queda por lo tanto pendiente la adquisici´on o dise˜ no de un convertidor que traslade la se˜ nal modulada de salida de esta placa a la frecuencia de inter´es. No ser´a dif´ıcil encontrar equipos comerciales con estas caracter´ısticas. A modo de introducci´ on sobre la placa DDS, podemos empezar esta exposici´on con una s´ıntesis de lo que son sus prestaciones. Generales Aplicaciones: Modulador digital en transmisores digitales. Se puede emplear en redes de cable e inal´ ambricas para el env´ıo de video, voz o cualquier tipo de datos digitales. Modulaciones soportadas: FSK, QPSK, 16QAM, DQPSK y D16QAM. Se˜ nal de salida de FI modulada de 0 a 65 Mhz, (40 % Nyquist), con una impedancia de 50 Ω. Filtro antialiasing pasobajo con frecuencia de corte a 3 dB de 67 Mhz. Modo de trabajo: 1. Modo continuo. El dise˜ no est´a optimizado para este modo de transmisi´on. 2. Modo a r´ afagas controlado por un terminal externo. La trama de datos a transmitir debe cumplir la condici´on de ser una fracci´ on par de la frecuencia del reloj del sistema adem´as de estar sincronizada con ´el. Caracter´ısticas operacionales principales Formato de las se˜ nales digitales: TTL NRZ. Frecuencia de referencia de 27 MHz (oscilador a cristal TTL de estabilidad media). El sistema est´ a equipado con un z´ocalo por si se desea cambiar esta frecuencia y tambi´en admite una fuente de reloj externa. Frecuencia de reloj del sistema de 162 Mhz, (frecuencia de referencia multiplicada ×6).

4.1 Especificaciones de la placa DDS

84

Generador de reloj de bit incorporado. Crea la frecuencia de transmisi´on de datos a partir del reloj de referencia de la placa. As´ı se solventa el requisito general de sincronismo entre estas dos se˜ nales. La forma de onda puede ser sim´etrica o asim´etrica dependiendo de la selecci´ on realizada en el puente hardware JP3. El reloj de referencia es dividido por un factor que var´ıa entre 2 y 2047 para salida asim´etrica mas otro factor adicional de 2 si la salida se prefiere sim´etrica. Se˜ nales de entrada a la placa DDS: 1. Trama de datos de transmisi´on sincronizada y con una velocidad divisor par de la frecuencia de reloj del sistema. El reloj del sistema y el reloj de referencia de la placa DDS est´ an relacionados mediante el factor ×6; seg´ un esta relaci´on, se cumple que cualquiera de las valores creados en el generador de reloj de bit anterior cumple esta condici´on. Existe adem´as otra restricci´on por la cual no todas las velocidades de bit que se pueden generar en la placa DDS est´ an permitidas: la descomposici´on en factores primos del valor que relaciona la frecuencia del sistema con la velocidad de datos que tenga un factor mayor a 63 no est´ a permitida. En el apartado 4.2.1.1 se profundiza sobre este tema, aunque para la tranquilidad del lector, podemos adelantar que el programa de control se encarga de evitar que estos valores se seleccionen, eliminando as´ı los problemas que se pudieran producir. 2. Oscilador externo seleccionable mediante el puente hardware JP1 de la placa. 3. Control de transmisi´ on externo, tambi´en seleccionable mediante un puente JP2, por si se quiere utilizar otro control de transmisi´on diferente al generado desde el programa de control y funcionar en modo a r´afagas. Puentes hardware de configuraci´on: Su funci´on est´a resumida en la tabla 4.1 y su situaci´ on f´ısica representada en la figura 4.1. Alimentaci´ on Tensi´ on de entrada: 12 voltios DC. Regulaci´ on independiente para las partes anal´ogicas (PLL y DAC) y la parte digital del circuito. Consumo: 680 mA + 70 mA del ventilador de refrigeraci´on. Control Puerto Paralelo est´ andar del PC en modo compatible. Programa de Control modulAD para los sistemas operativos Windows 98 y NT. Dise˜ nado para transmisi´ on en modo continuo controlada desde el PC. Software de control. Programa modulAD Control de los par´ ametros operacionales m´as importantes, tales como frecuencia de salida (marca y espacio en caso de FSK), tipo de modulaci´on, codificaci´on diferencial, tipo de aleatorizador y velocidad de transmisi´on de datos.

4.1 Especificaciones de la placa DDS

JP1

Efecto en la operaci´ on

1-2

Reloj interno utilizado como reloj de referencia

3-4

Reloj externo utilizado como reloj de referencia

1-2, 3-4

85

Reloj interno utilizado como reloj de referencia y accesible en el conector de datos

JP2 1-2

Habilitaci´ on de transmisi´on y programaci´on del DDS desde el programa de control

3-4 1-2,3-4

Se˜ nal externa de comienzo de transmisi´on Seleccionado control interno de transmisi´on y accesible al exterior en el conector de datos

JP3 1-2

Reloj de bit asim´etrico generado por el divisor principal accesible al exterior

3-4

Reloj de bit sim´etrico generado por el divisor principal, m´as un factor a˜ nadido de 2, accesible al exterior Cuadro 4.1: Funci´on de los puentes hardware de la placa DDS

Figura 4.1: Situaci´ on f´ısica de los puentes de configuraci´on hardware en la placa DDS

˜ o hardware de la placa DDS 4.2 Disen

86

Programaci´ on de los coeficientes del filtro FIR de conformaci´on de pulso, responsable de la eliminaci´ on de los l´ obulos laterales y de la forma del espectro de salida. Ventana principal de la aplicaci´on parecida al frontal de un equipo comercial. En ella se indican los principales par´ametros de inter´es: 1. Frecuencia de salida. 2. Tipo de modulaci´ on seleccionada. 3. Estado de activaci´ on del aleatorizador y del codificador diferencial. 4. Indicaci´ on de la velocidad de transmisi´on en bps. Desactivaci´ on de se˜ nal modulada a la salida. Permite el ahorro de energ´ıa cuando no se necesita transmitir.

4.2.

Dise˜ no hardware de la placa DDS

Ya sabemos que el elemento central de esta placa es el modulador AD9853, cuyo n´ ucleo es un DDS que genera dos se˜ nales desfasadas π/2 en el dominio digital, para multiplicarlas por dos tramas binarias I y Q conformadas de antemano tambi´en interiormente, constituyendo lo que ser´ıa un modulador en cuadratura, todo ello en el dominio digital (ver la figura 1.34). Para no desmerecer el resultado, tambi´en se incluye lo que ha sido el u ´ltimo avance en integraci´ on: el convertidor digital/anal´ogico, todo dentro del mismo chip. Nos encontramos entonces con un circuito integrado que ¡nos lo hace todo!. ¿Que necesitamos para obtener la se˜ nal de salida? Tan s´olo una trama binaria de datos con los que modular la se˜ nal, (el modulador se encarga de su procesado como veremos en la secci´ on siguiente), una se˜ nal de reloj para que la circuiter´ıa interna del modulador funcione, un filtro paso bajo antialiasing y un programa de control con el que cargar al modulador las opciones concretas de funcionamiento. Vemos entonces que la potencia de la placa de modulaci´on DDS reside en el interior del propio modulador DDS. Es casi obligatorio, por tanto, comenzar entendiendo todas y cada una de las funcionalidades del AD9853, pues es la llave con la que entender el resto de los circuitos auxiliares de la placa.

4.2.1.

El modulador AD9853

La figura 4.2, obtenida de las hojas de datos suministradas por el fabricante, es el diagrama de bloques interno del modulador AD9853, y a ella vamos a hacer referencia asiduamente a lo largo de este apartado. La parte de la derecha constituir´ıa el “n´ ucleo DDS” del sistema, donde se realizan las operaciones de modulaci´ on reci´en mencionadas. Tal y como se ve en la figura, el diagrama dibuja un modulador en cuadratura de libro, eso s´ı, este caso en el dominio digital. La se˜ nal modulada es una secuencia de palabras de 10 bits cuyo valor equivale al valor instant´ aneo en amplitud de la forma de onda modulada equivalente anal´ogica. Su velocidad de variaci´ on o r´egimen con el que cambian estas muestras ser´a la del reloj del sistema. Para generar esa se˜ nal anal´ogica, la secuencia se entrega a un convertidor anal´ogico-digital A/D lo m´ as perfecto posible para generar el menor n´ umero de se˜ nales

˜ o hardware de la placa DDS 4.2 Disen

87

Figura 4.2: Diagrama de bloques del modulador DDS AD9853

indeseadas, resultando, como consecuencia de este proceso de conversi´on, la se˜ nal modulada sintetizada originalmente mas unas componentes espectrales, que podr´ıamos llamar “im´agenes”, producidas por efecto de tratarse de un sistema muestreado. En el cap´ıtulo 1 se calcula te´ oricamente el espectro resultante. Un “defecto” notable de este espectro de salida es que tiene un factor envolvente en forma de funci´ on sen(x)/x. El dise˜ nador del AD9853 ha pensado en ello y ha incluido a la entrada del convertidor A/D una etapa para compensarlo. Se trata de un filtro pasoalto dise˜ nado con la funci´ on de transferencia inversa (x/sen(x)) dentro del ancho de banda de Nyquist, de manera que los usuarios s´olo tenemos que preocuparnos de eliminar las im´agenes generadas y olvidarnos del factor envolvente dentro del intervalo de Nyquist. Otra ventaja m´ as de este circuito la constituye el hecho de tener incorporado un multiplicador interno del reloj de referencia de entrada ×6 mediante PLL. Para alcanzar un amplio margen de variaci´on en la frecuencia de salida, (ancho de banda de salida), se deber´ a trabajar, en teor´ıa, como m´ınimo a una frecuencia de reloj igual al doble de ese ancho de banda, en la pr´actica algo m´as para facilitar el filtrado. En los m´ argenes en que nos movemos actualmente, estar´ıamos hablando de frecuencias del orden de 150 a 300 Mhz para circuitos DDS comerciales. Un oscilador a 300 Mhz es cualquier cosa menos f´ acil de realizar, ya que suelen producir problemas de estabilidad y de arm´ onicos. Pensando en facilitarnos la vida a los usuarios, de nuevo han a˜ nadido un circuito PLL dentro del AD9853 preparado para generar una frecuencia de reloj de sistema igual a seis veces la se˜ nal de reloj de referencia de entrada. El precio que hay que pagar por esta facilidad es que el espectro en banda estrecha de la se˜ nal de salida tiene un ruido de fase superior al del reloj de entrada, caracter´ıstica esta t´ıpica de los osciladores a partir de lazos de enganche de fase PLL. En este caso es el usuario quien decide si utiliza o no este multiplicador, puesto que su activaci´on se puede controlar desde el control externo. Haciendo referencia a la gr´ afica 4.2, este subsistema est´a en la esquina inferior izquierda de este esquema de bloques. El resto de los bloques funcionales que aparecen en el esquema 4.2 nada tienen que ver con la s´ıntesis digital directa. Se trata de diferentes manipulaciones a la trama binaria de entrada para acondicionarla antes de llegar a los moduladores digitales en cuadratura. Entre todos los procesos que refleja el esquema de bloques, el m´as conocido es el de la conformaci´ on del pulso de salida. Es el caso, por ejemplo, de las conocidas respuestas

˜ o hardware de la placa DDS 4.2 Disen

88

en coseno alzado, que eliminan los l´obulos laterales del espectro de salida. Trat´andose de se˜ nales en el dominio digital, la manera m´as c´omoda y fiable de sintetizar este filtro conformador es mediante una topolog´ıa del tipo FIR. En el esquema de bloques del AD9853 encontramos en el camino de las tramas I y Q otros elementos poco conocidos llamados “filtros de interpolaci´ on” a continuaci´on de los filtros FIR. Su funci´on resulta imprescindible para el correcto funcionamiento del sistema por lo que se tratar´an con un poco m´ as de detalle en el siguiente apartado. Para completar el gr´ afico nos quedar´ıan otros cuatro bloques que a˜ naden valor al sistema, pero que podr´ıan no estar dentro del integrado sin que ello supusiera la p´erdida de m´erito del circuito. El verdadero m´erito consiste en reunir todos los componentes del proceso de generaci´ on de la se˜ nal incluyendo un DAC que trabaja a 180 Mhz y 10 bits de precisi´ on. Volviendo al hilo de la exposici´on, el primer m´odulo que encontramos siguiendo la ruta de la trama de datos es un codificador Reed-Salomon. La codificaci´on de ReedSolomon es un tipo de codificaci´on c´ıclica especialmente u ´til en la correcci´on de errores a r´afagas, es decir, es efectiva en canales que tienen memoria. Las referencias [?] y [?] contienen abundante informaci´ on sobre este tipo de codificaci´on de bloque. Desde el punto de vista pr´ actico, un codificador Reed-Solomon a˜ nade bits de redundancia a la trama digital de entrada organizada en bloques. Se dice que un codificador R-S genera un c´ odigo (N, K), cuando a un bloque de K bytes, se le a˜ naden otros 2t m´as, con t siendo el n´ umero de bytes err´ oneos corregibles, (aqu´ı los errores se consideran a nivel de byte, da lo mismo que haya uno u ocho bits err´oneos dentro del mismo), resultando una longitud de bloque de c´ odigo (mensaje + paridad) de: N = K + 2t

bytes

(4.1)

Cuando se utiliza el codificador R-S, los datos del mensaje deben “rellenarse” con datos no v´ alidos durante el per´ıodo en que el codificador a˜ nade los 2t bytes de redundancia, pues durante ese tiempo los bits de entrada son ignorados. Esa circunstancia se refleja en la figura 4.3

Figura 4.3: Funcionamiento del codificador Reed-Solomon

La siguiente etapa en el camino de modulaci´on es la etapa de aleatorizaci´ on. El problema que se trata de resolver en este caso, siempre se trata de eso, es la dependencia que existe entre la se˜ nal modulada y las caracter´ısticas estad´ısticas de la fuente digital. Las secuencias largas de ceros o unos pueden provocar errores de sincronismo en recepci´on. Si hay patrones de datos repetitivos, la se˜ nal modulada aparece con tonos esp´ ureos discretos que pueden producir intermodulaciones. Tambi´en ocurre que en esquemas de modulaci´ on con portadora suprimida, los datos no aleatorios empeoran el rechazo de portadora. La soluci´on es usar un aleatorizador para “blanquear” la trama de entrada.

˜ o hardware de la placa DDS 4.2 Disen

89

El esquema del aleatorizador en el AD9853 utiliza la t´ecnica de los registros de desplazamiento de la misma manera que el generador de tramas de BER en la placa de secuencias pseudoaleatorias. Los polinomios generadores que emplea el modulador DDS son, seg´ un las hojas del fabricante: 1 + x5 + x6 1 + x14 + x15

compatibilidad DAVIC/DVB compatibilidad MCNS(DOCSIS)

Los valores iniciales del registro de desplazamiento son totalmente programables. Tambi´en se incluye un bloque de inserci´on de secuencia pre´ ambulo programable. El pre´ambulo es un conjunto de hasta 96 bits que se transmiten cada vez que se inicia la transmisi´ on. El prop´ osito de enviar unos bits durante el inicio es el de ayudar al receptor a sincronizarse. Por un convenio establecido en las normas DAVIC/DVB, la secuencia de pre´ambulo no se codifica de forma diferencial en DQPSK, mientras que no ocurre lo mismo en D16QAM. El pre´ ambulo, seguido de los datos codificados y aleatorizados son a continuaci´ on formateados de acuerdo con la modulaci´on elegida. El u ´ltimo bloque, al que se conoce como codificador de modulaci´ on, tiene la funci´on de transformar la secuencia de entrada de bits, a s´ımbolos, para formar las dos corrientes I y Q que alimentan al modulador en cuadratura. En el caso concreto de FSK, y seg´ un los datos del fabricante, para poder crear saltos de frecuencia continuos en fase, la trama digital de entrada se salta todos los bloques de “preprocesado” y se dirige directamente a comandar los dos registros de palabra de sinton´ıa del DDS. Esto equivale en la pr´ actica a decir que en FSK no se permite la utilizaci´on de FEC Reed-Solomon, ni del aleatorizador, como tampoco de la secuencia pre´ambulo, algo que no tendr´ıa porqu´e ser as´ı. Los datos podr´ıan enviarse al control del DDS despu´es de salir de estos procesos para as´ı poder aprovechar la mejora que ofrecen en el rendimiento del sistema. Adem´ as del comentario pendiente sobre la funci´on de los interpoladores, no se ha aclarado hasta ahora de todos estos bloques qu´e se ha hecho o c´omo se utilizan en el trabajo pr´ actico. No es ´etico criticar al fabricante por haberse saltado los bloques de “precodificaci´ on” de la trama de datos en FSK, y no reconocer nuestras carencias. Hagamos entonces una puesta al d´ıa del resultado de nuestro trabajo, aunque m´as adelante se vuelvan a reflejar sus caracter´ısticas. En este momento tenemos frescos todos los conceptos: El codificador de s´ımbolos se controla totalmente mediante la aplicaci´on de control y de este modo se pueden generar cualquiera de los cinco esquemas de modulaci´ on posibles. De todas formas, hay que reconocer que es posible que la aplicaci´on de control lleve a error. Aunque en el pulsador de selecci´on de modulaci´on no aparecen DQPSK ni D16QAM, estos dos tipos de modulaci´on se activan cuando se selecciona el recurso “ficticio” llamado en la interface gr´afica de usuario codificador diferencial. El bloque de inserci´ on de pre´ambulo no ha sido tenido en cuenta a la hora de realizar la aplicaci´ on. En las hojas del fabricante se sugiere que siempre son necesarios como m´ınimo 4 bits de pre´ ambulo. Dicho y hecho, se program´o la secuencia pre´ambulo “0000” y no se pens´ o que alg´ un usuario del circuito pudiese evaluar la variaci´ on introducida por un cambio en esa secuencia. Son deformaciones del mundo pr´actico.

˜ o hardware de la placa DDS 4.2 Disen

90

Lo contrario se pens´ o respecto del aleatorizador. Existen controles que lo habilitan y deshabilitan, y adem´ as, tambi´en se puede seleccionar el tipo de scrambler utilizado, en las dos variantes permitidas. Del codificador Reed-Solomon no nos olvidamos. Desafortunadamente, por un fallo de dise˜ no, ha quedado inutilizado aunque en un principio se pens´o que lo ´ıbamos a poder utilizar. Sin embargo, a causa de la construcci´on hardware del generador de reloj de bit, que es un bloque funcional de esta placa DDS de que hablaremos m´ as adelante, era preciso generar otra temporizaci´on a˜ nadida para “bloquear” la transmisi´ on de bits de informaci´on durante el per´ıodo en que el codificador R-S inserta sus bytes de paridad. Para realizar este cambio hab´ıa que reconstruir toda la circuiter´ıa de divisi´ on de reloj, am´en de necesitar mayor n´ umero de buffers de control, que equival´ıa a volver a dise˜ nar una nueva placa. Bajo esta circunstancia, la decisi´ on que prim´ o fue la de rentabilizar el trabajo realizado hasta ese momento y continuar hacia adelante. Para resumir, se puede habilitar el funcionamiento del codificador Reed-Solomon, pero no se ha previsto en la aplicaci´on de control por no ser utilizable con nuestro sistema; s´ı que lo ser´ıa con una fuente de datos externa que tuviese en cuenta el detalle de los bytes de paridad. En ese caso, ser´ıa cuesti´ on de a˜ nadir una opci´ on m´ as al programa. Despu´es de esta cura de humildad, continuamos con la explicaci´on del funcionamiento del modulador DDS AD9853. A continuaci´on se trata el bloque que qued´o pendiente sobre los filtros interpoladores. 4.2.1.1.

Filtrado de datos (FIR + etapas interpoladoras)

A lo largo del camino seguido por los datos, se debe de llevar a cabo una “equiparaci´ on” entre la velocidad con que se realizan sus transiciones, que equivale a su intervalo de “muestreo.o velocidad de transmisi´on, y por otro lado, la velocidad a la que trabaja el DDS que en este caso, y puesto que vamos a modular, funciona como se˜ nal de oscilador local. Para que el sistema entregue el resultado que se espera de ´el, es obligatorio hacer coincidir estos dos intervalos de muestreo, ver figura 1.34. Como la velocidad de trabajo del DDS no se puede bajar, resulta obvio que la operaci´ on a realizar es la de volver a “muestrear” los datos de transmisi´on, pues entran a una velocidad menor que la del reloj del sistema DDS. Como resultado se transformar´an en nuevos datos muestreados a la frecuencia del sistema, siempre manteniendo las propiedades de la se˜ nal original de entrada. De ese modo conseguimos que las dos se˜ nales digitales que se procesan en el interior del modulador mantengan la misma referencia temporal. La transformaci´ on que acabamos de describir corresponde al funcionamiento de un interpolador, con algunos matices. Un interpolador sobremuestrea una trama digital de entrada a una velocidad m´ ultiplo entero de la misma. Como resultado se generan componentes espectrales im´ agenes de la se˜ nal de entrada solapadas dentro del ancho de banda de Nyquist del r´egimen binario de salida, (ver figura 1.42). De lo que se trata es de filtrar esas componentes solapadas en el nuevo ancho de banda de Nyquist resultante, para que las propiedades originales de la se˜ nal sobremuestreada no se alteren. Estas son las dos funciones b´asicas que llevan a cabo la etapa de filtrado FIR y las dos etapas interpoladoras encadenadas en el camino de datos, (todo ello para las dos tramas I y Q): por un lado acondicionar la escala de tiempo de los datos de entrada a la

˜ o hardware de la placa DDS 4.2 Disen

91

Figura 4.4: Detalle de construcci´on de las etapas de interpolaci´on en el AD9853

de proceso del DDS, y por otro lado, eliminar las componentes indeseadas que se generan en ese sobremuestreo de acondicionamiento. Dentro del filtrado pasobajo a que se somete la trama de datos, la etapa FIR se aprovecha para conformar la parte “fundamental” ´o significativa de la forma del espectro de salida, mientras que el efecto de las dos etapas interpoladoras CIC, tambi´en de respuesta pasobajo, no tiene relevancia en este caso. Su pendiente de ca´ıda en la banda de inter´es es menos pronunciada que la de los filtros FIR. Lo que se hace es compensar la ca´ıda originada por las etapas interpoladoras en el dise˜ no de la curva de respuesta del filtro de pulso FIR. En la secci´ on 1.9 se describe el funcionamiento de los filtros FIR y de los interpoladores CIC (Cascaded Integrator Comb). Los caminos I y Q del modulador contienen cada uno un filtro FIR conformador del pulso de 41 etapas con coeficientes ai de 10 bits. Los coeficientes se representan mediante valores enteros en complemento a dos. Por tanto, cada etapa tiene un coeficiente multiplicativo con valores posibles −512 ≤ ai ≤ 511. Respecto a la constituci´ on interna de los filtros, una importante caracter´ıstica es que por dise˜ no y para ahorrar el n´ umero de multiplicadores necesarios en total, el fabricante ha elegido una realizaci´ on sim´etrica de los mismos. Al programar los coeficientes, s´olo se pueden definir el de la etapa central y los de las 20 inferiores. Se puede demostrar, que los filtros digitales cuya respuesta impulsiva es de la forma h(n) = h(M − n)

para n = 0, 1, . . . , M

(4.2)

tienen una respuesta en frecuencia H(ejω ) = He (ejω )e−jωM/2

(4.3)

con He (ejω ) una funci´ on par real de ω. El t´ermino e−jωM/2 representa un t´ermino de fase lineal o retardo constante [?]. Por eso los filtros FIR con esta caracter´ıstica se denominan de fase lineal. El manual del fabricante advierte de que esta primera etapa FIR sobremuestrea ´o interpola la velocidad de s´ımbolo en un factor de 4. Al final de la cadena sin embargo, las tasas que hay que hacer coincidir son la del reloj del sistema con el que trabaja el DDS

˜ o hardware de la placa DDS 4.2 Disen

92

y la velocidad de transmisi´ on de datos en bits/seg. Por tanto, habr´a que tener en cuenta o “compensar” este factor de interpolaci´on de s´ımbolo ×4 en el factor total dependiendo de la modulaci´ on que se emplee. Un ejemplo del filtrado que se puede sintetizar corresponde a la caracter´ıstica en coseno alzado. En primer lugar se calcular´an los coeficientes a programar en cada una de las etapas sin tener en cuenta el efecto ya comentado de las etapas de interpolaci´on. Dicho efecto se tendr´ a en cuenta a posteriori. Puesto que trabajamos con se˜ nales reales, se calcula la transformada inversa de Fourier de la parte positiva de la caracter´ıstica, sustituyendo la exponencial compleja por un coseno. El ejercicio se ha realizado teniendo en cuenta el factor de interpolaci´on ×4 introducido por el filtro FIR. Los detalles del mismo se incluyen en el listado del fichero de Matlab que se incluye en el ap´endice ??. La figura 4.5 representa el resultado de la simulaci´on de algunas de las respuestas en coseno alzado para diferentes factores de α. En las distintas simulaciones de la gr´afica 4.5, se fue modificando manualmente el valor de α en el fichero de comandos ad9853 srrc.m. Como resultado, se obtuvieron los coeficientes que se debe programar en cada una de las etapas de los filtros FIR. En la tabla 4.2 se anotan los valores una vez normalizados al valor m´ aximo de 511, siendo la etapa n´ umero 20 el punto central del mismo. Ya se ha dicho que por construcci´ on interna del modulador DDS, los valores se cargan de forma sim´etrica alrededor de la toma central. α

0

1

2

3

4

5

6

7

8

9

10

0.1

-11

9

25

28

12

-16

-37

-38

-12

27

58

0.5

0

3

2

-2

-5

-2

5

7

1

-7

-7

0.9

0

2

0

-2

-1

2

1

-3

-3

3

4

α

11

12

13

14

15

16

17

18

19

20

0.1

55

13

-52

-102

-97

-13

138

315

457

511

0.5

7

19

7

-34

-71

-48

71

260

438

511

0.9

-5

-8

5

13

-11

-41

11

189

410

511

Cuadro 4.2: Coeficientes de cada etapa del filtro FIR en el AD9853 para las distintas curvas de respuesta en coseno alzado sin compensar la ca´ıda provocada por las etapas interpoladoras.

Si en el camino de datos intercalamos a continuaci´on unas etapas interpoladoras, el resultado en el dominio de la frecuencia es el de “repetici´on” de la curva de respuesta sintetizada dentro del nuevo ancho de banda de Nyquist. La figura 1.42 representaba esta situaci´ on en el dominio espectral, y en ella se pod´ıa apreciar c´omo el n´ umero de im´agenes solapadas depend´ıa del factor R de interpolaci´on. Afortunadamente, el mismo bloque utilizado para interpolar contiene la respuesta compensatoria del “defecto” descrito. Ya se coment´o la construcci´on interna de los filtros con estructura CIC, Cascaded Integrator-Comb, en la secci´on 1.9.3.4. Se puede demostrar que la respuesta de un filtro CIC viene determinada por:

HCIC (z) =

RM −1 X k=0

!N z

−k

(4.4)

˜ o hardware de la placa DDS 4.2 Disen

93

(a)

(b)

(c)

(d)

(e)

(f)

Figura 4.5: Respuestas impulsivas y en frecuencia simuladas en Matlab para el filtro FIR del AD9853 correspondientes a funciones en coseno alzado con factores α de 0.1, 0.5 y 0.9 (a) y (b) Curvas de respuesta para α 0.1 (c) y (d) Curvas de respuesta para α 0.5 (e) y (f) Curvas de respuesta para α 0.9

˜ o hardware de la placa DDS 4.2 Disen

94

donde N es el n´ umero de secciones de integraci´on y filtros peine contenidos en la estructura CIC, recordando que siempre coinciden en n´ umero. R es el factor de interpolaci´on programable del bloque, y M el n´ umero de retardos dentro de cada etapa de filtro peine. Dentro del AD9853 dos de estas variables se han fijado, N = 4 y M = 1 y queda disponible al usuario el factor de interpolaci´on. La curva de respuesta en frecuencia se encuentra evaluando H(z) para z = ej(2πf /R) :

HCIC (f ) =

RM −1 X

!N e−j(2πf /R)k

(4.5)

k=0

que es una respuesta pasobajo tal y como se vi´o en la figura 1.51 para distintos valores de par´ ametros M y N. Cada rama de datos I y Q dispone de dos de estas etapas adem´as del filtro conformador FIR, todas en cascada. Es preciso si se quiere conseguir una funci´on conformadora lo mas precisa posible, tener en cuenta la variaci´on introducida en la respuesta del filtro FIR por las etapas CIC, pues su caracter´ıstica no es perfectamente plana en la banda de paso. Lo que s´ı resulta pr´ actico es despreciar el efecto de la segunda de estas etapas, puesto que como ya hay que tener en cuenta el factor de interpolaci´on total, en este caso s´ı que resulta despreciable su efecto. Lo que se hace es “precompensar” la curva de respuesta del filtro FIR en su dise˜ no. Para ello, multiplicamos su funci´on de transferencia por una funci´on compensadora 1 HCOM P (f ) = (4.6) HCIC (f ) aplic´ andola en un margen del 90 % del ancho de banda de inter´es (par´ametro β en el fichero cic.m de simulaci´ on de Matlab). Si se aplica en todo el rango de frecuencias, el incremento de amplitud que experimentan los l´obulos esp´ ureos fuera de la banda no compensa con la precisi´ on conseguida en la banda de paso. Por u ´ltimo, otro efecto importante sobre el que se debe de actuar es el de la escala en frecuencia. La frecuencia de muestreo a la entrada de la etapa CIC resulta ser la de salida del filtro FIR, o lo que es lo mismo, cuatro veces la velocidad de s´ımbolo: existe por tanto un problema de escala. Afortunadamente la soluci´on es f´acil puesto que la interpolaci´ on en frecuencia equival´ıa a hacer un cambio de variable en la funci´on de transferencia de H(f ) por H(f /Escala). En este caso el factor Escala = 4. Se ha realizado en ejercicio en Matlab donde se ponen en pr´actica todas estas consideraciones. Su listado se incluye en el fichero cic.m del ap´endice C. Aqu´ı incluimos simplemente las gr´ aficas que ponen de manifiesto la precompensaci´on de la respuesta del filtro en coseno alzado y la tabla con los nuevos valores de los coeficientes. ¿Cual es el problema principal planteado por este fen´omeno? La compensaci´on es espec´ıfica para un factor de interpolaci´ on del filtro R determinado, ya que seg´ un se ha visto en la ecuaci´on 4.5, la curva de respuesta de las etapas CIC depende de este par´ametro, que var´ıa seg´ un lo haga la velocidad de transmisi´ on. Por tanto, idealmente ser´ıa necesario recalcular esta precompensaci´ on cada vez que cambiara la tasa de transmisi´on. En nuestra aplicaci´on no lo hacemos as´ı, y tampoco es que se haya visto una degradaci´on tan importante en la curva de respuesta, puesto que despu´es de haber jugado con el fichero cic.m cambiando algunos valores de par´ ametros, no se aprecia un cambio tan sustancial en los coeficientes resultantes.

˜ o hardware de la placa DDS 4.2 Disen

95

(a)

(b)

Figura 4.6: Compensaci´on de la ca´ıda producida por la etapa de interpolaci´on CIC en el filtro FIR del AD9853. Valores de R = 6, α = 0,5 y β = 0,9. (a) Respuesta impulsiva antes y despu´es de la compensaci´on (b) Curva de respuesta en frecuencia antes y despu´es de la compensaci´ on.

Nos quedar´ıa por determinar c´omo se calculan los valores de interpolaci´on que se deben de cargar en las distintas etapas, pero preferimos posponerlo para la secci´on 4.3 donde se describe el software, puesto que se tendr´a que volver a explicar un problema que se plantea al respecto. Etapa

0

1

2

3

4

5

6

7

8

9

10

Valor org.

0

3

2

-2

-5

-2

5

7

1

-7

-7

Valor comp.

1

4

2

-3

-6

-1

7

9

1

-10

-9

Etapa

11

12

13

14

15

16

17

18

19

20

Valor org.

7

19

7

-34

-71

-48

71

260

438

511

Valor comp.

8

24

12

-33

-78

-62

56

251

435

511

Cuadro 4.3: Coeficientes de cada etapa del filtro FIR en el AD9853 antes y despu´es de la compensaci´on del efecto de las etapas interpoladoras CIC. Valores de R = 6, α = 0,5 y β = 0,9.

4.2.2.

Bloques funcionales de la placa DDS

Despu´es de esta revisi´ on de las caracter´ısticas del circuito AD9853, vamos a tratar del resto de los m´ odulos que lo acompa˜ nan en la placa DDS. Est´a claro que la finalidad de estos m´ odulos es la de proporcionar las se˜ nales de control y sincronismo que el modulador necesita para funcionar satisfactoriamente. En este apartado trataremos en profundidad en cada uno de estos m´ odulos. La representaci´ on esquem´ atica de la placa DDS se muestra en la figura 4.7. En ella se pueden distinguir los principales m´odulos de que consta la placa: 1. Puerto paralelo de control

˜ o hardware de la placa DDS 4.2 Disen

96

Figura 4.7: Esquema de bloques de la placa DDS

2. Buffer de control y datos 3. Modulador DDS 4. Generador de reloj de bit 5. Oscilador de referencia 6. Salida FI 7. Entrada-salida de datos Los bloques de acceso al exterior son el puerto paralelo, la salida de FI y el bloque de entrada-salida de datos. El primero posibilita la comunicaci´on con el ordenador de control, y los restantes reciben o entregan las se˜ nales necesarias para la operaci´on. El bloque de salida de FI entrega la salida modulada y filtrada en un conector BNC, mientras que el bloque de entrada-salida es el que recibe la trama digital moduladora y un conjunto de se˜ nales de diversa ´ındole, todas teniendo la cualidad de ser se˜ nales digitales que forman parte de las distintas opciones operativas del sistema en su conjunto. De ellas hablaremos llegado su momento. Los bloques principales de la placa DDS son el oscilador de referencia, el generador de reloj de bit, y el modulador DDS. El primero genera la se˜ nal de reloj maestro para los otros dos m´ odulos: el generador de reloj de bit, del que se obtiene el reloj de transmisi´on de datos, y el modulador DDS, constituido por el circuito integrado AD9853 que ya conocemos en profundidad. El buffer de control y datos est´a formado por un grupo de demultiplexores que reciben las se˜ nales enviadas por el bus de datos del puerto paralelo y las acondicionan para ser utilizadas en el hardware del circuito.

˜ o hardware de la placa DDS 4.2 Disen

97

En los siguientes apartados entramos m´as en detalle en todos y cada uno de estos bloques. 4.2.2.1.

Puerto paralelo de control

Accesible por medio de un conector plano de 26 patillas, se prolonga mediante un cable plano paralelo hasta el conector exterior DB-25 del chasis que contiene todo el sistema. El mismo cable plano se emplea en paralelo para conectar tambi´en al puerto la placa de generaci´ on de secuencias. Desde el conector DB-25 del chasis s´olo hace falta conectar un cable paralelo hasta el PC de control. En la tabla 4.4 est´an anotados los terminales utilizados para la comunicaci´on de esta placa con el ordenador de control. Pin

Nombre

Funci´on en la placa DDS

2

D0

LSB del Bus de datos

3

D1

Bus de datos

4

D2



5

D3



6

D4



7

D5



8

D6



9

D7

14

LATCH1

15

OD3

16

LATCH2

LSB de Selecci´ on de Registro en placas DDS y BER

17

LATCH3

MSB de Selecci´ on de Registro en placas DDS y BER

18 a 26

GND

MSB del Bus de datos Strobe de carga del bus de datos en placa DDS Hilo de lectura de datos desde placa DDS

Masa

Cuadro 4.4: Interface paralelo de la placa DDS.

En este caso, el PC de control s´olo lee informaci´on de la placa DDS a trav´es del hilo de estado OD3, desde donde se lee el puerto serie de control del AD9853. Del resto de circuitos de la placa DDS no hay forma de obtener informaci´on. 4.2.2.2.

Buffer de control y datos

Este bloque es el encargado de recibir los datos del puerto paralelo y, como cualquier buffer, mantenerlos en sus terminales de salida al margen de las variaciones del bus cuando ´este se encuentra enviando informaci´on a otros perif´ericos, por ejemplo la placa de secuencias pseudoaleatorias. Casi podr´ıamos haber denominado a este bloque como de control, puesto que la mayor´ıa de las se˜ nales que se reciben realizan esa funci´on. La excepci´on corre a cargo del terminal etiquetado como BUS DATIN del buffer U5, encargado de soportar la comunicaci´on serie con el bus de control del modulador AD9853. Comentaremos la funci´ on de los componentes que constituyen este bloque apoy´andonos en la figura 4.8:

˜ o hardware de la placa DDS 4.2 Disen

98

Figura 4.8: Buffer de control y datos de la placa DDS

U10, 74HC139. Es un demultiplexor dos a cuatro que genera las se˜ nales de “enable” de activaci´ on de los drivers que retienen la informaci´on enviada desde el PC a trav´es del bus de datos del puerto paralelo (D0 a D7). Los hilos de selecci´on son los terminales LATCH2 y LATCH3 del puerto de control del PC, y su validaci´on tambi´en llega directamente desde el puerto paralelo a trav´es de la se˜ nal de control LATCH1. En la figura se ve c´ omo se aprovechan s´olo dos de las cuatro salidas demultiplexadas disponibles (CHIP0 y CHIP1). Es el resultado de la optimizaci´on realizada a fin de reducir en lo posible el tama˜ no y n´ umero de circuitos de la placa. U3, 74HC574. Es el primero de los buffers triestado de este bloque, siendo el encargado de mantener el byte menos significativo de la palabra de comando de divisi´on que el programa de control env´ıa al generador de reloj de bit, P0 a P7. Este componente tiene anulada su capacidad de poner en estado de alta impedancia sus salidas al no ser de utilidad en este caso. La salida se actualiza con el dato presente en los hilos del bus en el flanco de subida de su se˜ nal de enable, CHIP0, que le llega desde U10. U5, 74HC574. Es el otro buffer triestado, aunque esta caracter´ıstica no se emplea al igual que en su predecesor. Sus salidas ya se dirigen a sitios muy variados del sistema, raz´ on ´esta por la que se comenta separadamente de su compa˜ nero. Los tres bits menos significativos completan la funci´on de controlar el divisor programable del generador de reloj de bit, P8 a P10. Para programar el divisor ha de procederse de forma curiosa: si lo que se desea es programar un factor de divisi´ on de 2, hay que cargar el valor 37EH , o 111111111102 ; para programar el m´ aximo valor de divisi´on de 2047, en este caso el valor a cargar debe ser 1H . El valor 0H no tiene validez puesto que impide el correcto funcionamiento del circuito, y ser´ıa el correspondiente a un factor de divisi´on de 2048. Vemos por tanto que el valor a cargar corresponde al complemento a 2 del factor de divisi´ on deseado. Q4 es el hilo que resetea el modulador DDS, tambi´en accesible en el conector de entrada-salida por si se quiere aprovechar en otro sistema externo.

˜ o hardware de la placa DDS 4.2 Disen

99

Q5 es un terminal de control de la transmisi´on del AD9853 que tambi´en juega un papel importante en la programaci´on del mismo a trav´es de su puerto de control serie. Su funci´on se comenta con mayor rigor en el apartado dedicado al conexionado del modulador AD9853. Q6 a Q8 controlan el flujo de se˜ nales en el puerto serie de control del modulador. Utilizando sus etiquetas de la figura 4.8, 3 STATE BUS es el hilo que controla el estado de alta impedancia del transceptor U8 incluido dentro del bloque del modulador DDS. Este transceptor debe estar en alta impedancia durante las respuestas del integrado hacia el terminal OD3 del puerto paralelo del PC. BUS DATIN constituye el otro sentido de datos en el puerto serie; su contenido se env´ıa hacia el modulador pasando a trav´es del transceptor U8. Por u ´ltimo, BUS CLK es el hilo conectado al terminal de reloj que temporiza las transacciones del puerto serie del modulador DDS. En este caso, se requiere una alta actividad en el puerto paralelo del PC, puesto que como ya se podr´a intuir, los intercambios de informaci´on con el modulador DDS se han de realizar bit a bit. 4.2.2.3.

Modulador DDS

Es el bloque que m´ as conocemos, pues est´a constituido por el circuito integrado AD9853 con el que ya estamos familiarizados desde la secci´on 4.2.1. Genera la se˜ nal modulada directamente en el dominio digital a partir de la trama binaria moduladora de entrada. Su salida es una se˜ nal anal´ogica a la que u ´nicamente se debe someter a un proceso de filtrado para eliminar las componentes espectrales indeseadas que el procesado digital origina.

Figura 4.9: El circuito AD9853 y su conexionado en la placa DDS

En la figura 4.9 podemos observar el esquema de conexiones del AD9853 en la placa DDS. Se ha a˜ nadido el driver triestate U8B para resaltar el caracter bidireccional del puerto serie de control del AD9853 (terminal BUS DAT IN). Formalmente este integrado

˜ o hardware de la placa DDS 4.2 Disen

100

deber´ıa de haberse incluido en el bloque de datos y control. En la figura se puede apreciar c´omo los datos que se reciben de control han de pasar a trav´es del buffer U8B hacia el modulador, etiqueta BUS DATIN, mientras que las respuestas desde el modulador DDS exigen que este buffer pase al estado de triestate, dependiendo del hilo 3 STATE BUS, para que las se˜ nales de salida del terminal BUS DAT IN lleguen hasta el m´ odulo de control y datos, etiqueta BUS DAT, sin que la entrada cargue la l´ınea. La temporizaci´ on del bus est´a gobernada por medio del hilo BUS CLK, a donde se han de aplicar los pulsos de reloj seg´ un el diagrama que aparece en las hojas del fabricante [?]. Estos pulsos se “generan” desde el programa de control, pues es el que controla todo el proceso de programaci´on del AD9853. Otra parte integrante de este m´odulo, que tambi´en podr´ıa haber sido incluida en el bloque de control, est´ a representada en la figura 4.9. Su funci´on, m´as pr´oxima al modo de funcionamiento del modulador que al mero hecho de tratarse de un hilo de control, nos ha decidido a recogerlo dentro de este bloque. El terminal TX EN es el que determina el paso a la condici´ on de transmisi´on del modulador DDS, con la caracter´ıstica de que es obligatorio su deshabilitaci´on cuando se reprograman los registros del modulador. Cualquier cambio de configuraci´ on del modulador pasa por el cambio a nivel bajo de este terminal. Si este terminal est´ a activo, y por lo tanto la circuiter´ıa de modulaci´on tambi´en, el bus de control estar´ a inactivo y viceversa.

Figura 4.10: Selector JP2 de habilitaci´on de transmisi´on

Existe otra cuesti´ on operativa en la que est´a implicada el terminal TX EN. Se trata de que sirve como referencia de sincronismo en el inicio de la transmisi´on. Por eso se incluye el biestable U7B (figura 4.10): para que la transici´on de bajo a alto que se produce en este terminal durante el inicio de la transmisi´on est´e sincronizada con el reloj de bit, y a la postre con el reloj del sistema. Por otra parte, se puede gobernar la transmisi´ on del modulador si se le sincroniza a un sistema externo, cambiando el puente JP2 a las conexiones 3-4. Continuamos conociendo la funci´on del resto de terminales importantes para el funcionamiento del modulador DDS: REF CLK IN, reloj de referencia de entrada, en este caso se ha elegido 27Mhz, por estar cerca del l´ımite m´ aximo de 28 Mhz y haberse encontrado con relativa facilidad. El reloj del sistema, o reloj con el que trabaja el DDS es 6 veces mayor porque se ha habilitado el multiplicador interno a trav´es del bus de control.

˜ o hardware de la placa DDS 4.2 Disen

101

DAT IN, es el terminal al que se aplican los datos a transmitir. Est´a conectado a la etiqueta SDI, que llega desde el conector de entrada-salida. 4.2.2.4.

Generador de reloj de bit

Este bloque es simplemente un conjunto de divisores programables en cascada con el fin de obtener la frecuencia de reloj de bit a partir del reloj de referencia de la placa DDS. Esto quiere decir que no se puede generar cualquier velocidad de transmisi´on: todas ser´ an ´ divisores exactos de la frecuencia de referencia. Este es uno de los factores determinantes de la frecuencia de referencia de la placa.

Figura 4.11: Esquema del generador de reloj de bit

Por ejemplo, para transmitir a la velocidad est´andar de 2.048 Mbps, con el cristal de referencia actual de 27 Mhz se necesita una relaci´on de divisi´on de 13.1835, imposible de conseguir. En ese caso, seleccionando un factor de divisi´on de 13 necesitar´ıamos una referencia de 26.624 Mhz, que no sobrepasa el l´ımite superior de frecuencia permitida por el modulador DDS. El factor de divisi´on 14 da como resultado 28.672 Mhz que s´ı lo sobrepasa. En este ejemplo ser´ıa necesario, por tanto, sustituir el oscilador de referencia actual por uno de 26.624 Mhz. En nuestro dise˜ no no ten´ıamos especificada ninguna velocidad en particular, porque para hacer pruebas de laboratorio lo que importan son los ´ordenes de magnitud, as´ı que se escogi´ o la frecuencia que m´ as se acercaba al l´ımite m´aximo de 28 Mhz y que se encontr´o f´acilmente en el mercado: 27 Mhz. Por lo que respecta a la circuiter´ıa en particular, U1,U2 y U4 son los tres contadores s´ıncronos conectados en cascada que dividen el reloj de referencia CLK BUF. Se trata de contadores descendentes programables con un terminal de indicaci´on de final de cuenta RCO empleado como habilitaci´ on en el contador siguiente de la cadena. A´ un utilizando este m´etodo, se trata de un contador s´ıncrono si se observa que la se˜ nal de reloj CLK BUF se aplica a los tres contadores en paralelo.

˜ o hardware de la placa DDS 4.2 Disen

102

El terminal RCO del u ´ltimo contador U4 es la salida asim´etrica de este bloque, y como tal est´ a conectada a JP3; pero tambi´en se emplea en la carga de los valores de programaci´ on de todos los contadores despu´es de invertirse en U8A. El terminal Y1 de U8A es la se˜ nal de salida invertida, con lo que al final de cada ciclo se genera un pulso de bajada de duraci´ on igual a la del periodo de la frecuencia de referencia, que al estar conectado a los terminales LOAD de los contadores, provoca que los valores enviados desde el buffer de datos P0 a P10 se carguen en la salida de ´estos, comenzando de nuevo la cuenta descendente en el siguiente pulso de reloj. Se deduce que para programar una relaci´on de divisi´on en este circuito lo u ´nico que hace falta es colocar el valor adecuado de divisi´on en los hilos P0 a P10 y el mismo circuito se encarga de cargarlo en el siguiente ciclo. Se observa en la figura 4.11 que no se utiliza el terminal D de carga paralelo en U4. Esto es porque con 11 terminales, P0 a P10, podemos conseguir un margen de divisi´ on de 211 − 1 = 2047 (el valor 7F FH no es v´alido), margen m´as que suficiente en QPSK y 16QAM dado que el modulador DDS como m´aximo tiene un factor de interpolaci´on de 3906 al que hay que descontar el factor multiplicativo ×6 a que se somete la frecuencia de referencia en el interior del modulador AD9853. La u ´nica modulaci´on para la que resulta u ´til tanto margen de divisi´ on es para FSK que no tiene ning´ un procesado en el modulador DDS. Pod´ıamos habernos casi ahorrado incluso un hilo m´as de control del contador. No se hizo as´ı puesto que no se necesitaba para ninguna otra funci´on. El biestable U7A sobraba y se pens´o aprovecharlo para el caso en que se deseara un factor de forma en la se˜ nal de salida de reloj de bit del 50 %. Conectandolo en forma de biestable T conseguimos que su salida bascule a cada pulso de reloj asim´etrico, obteniendo por tanto un factor adicional de divisi´on ×2, adem´as del cambio en la forma de onda. La selecci´ on de salida de un reloj de bit u otro se realiza f´ısicamente en JP3, donde determinamos el reloj de bit disponible en el conector de entrada-salida: 1. Puente JP3 1-2. El reloj de bit utilizado es asim´etrico. 2. Puente JP3 3-4. El reloj de bit empleado tiene factor de forma del 50 % y adem´ as es sometido a una divisi´ on adicional ×2, adem´as de la comandada por el bus de control. Existe sin embargo un modo de indicarle al programa de control que se ha seleccionado esta opci´ on, de modo que las indicaciones del mismo no sean err´oneas. La capacidad de divisi´ on conjunta de todas las etapas de contadores en cascada resulta estar entre 2 y 2047 m´ as el factor adicional × 2 a˜ nadido con el biestable U7A. El l´ımite pr´ actico superior utilizado depende del tipo de modulaci´on que se est´e empleando, puesto que est´ a limitado por el software de control para no sobrepasar los l´ımites operativos de las etapas de interpolaci´ on del modulador DDS. Los m´argenes de funcionamiento del circuito se resumen en la tabla 4.5. Para un reloj de referencia de 27 Mhz, se obtiene una velocidad de transmisi´on de datos m´ axima de 13.5 Mbps en modo asim´etrico. Los l´ımites inferiores resultan ser en nuestro caso: 1. FSK:

13.190 Kbps en modo asim´etrico y 6.595 Kbps en modo sim´etrico.

2. QPSK y DQPSK: 3. 16QAM y D16QAM:

41.474 Kbps en ambos modos. 83.077 Kbps en ambos modos.

˜ o hardware de la placa DDS 4.2 Disen

103

(a)

(b)

(c)

(d)

(e)

(f)

Figura 4.12: Formas de onda de salida del generador de reloj de bit: (a),(c) y (e) Salida asim´etrica para valores del divisor principal 2, 13 y 2047. (b),(d) y (f) Salida sim´etrica para los mismos valores del divisor principal y con JP3 en la posici´on 3-4

˜ o hardware de la placa DDS 4.2 Disen

Modo asim´etrico

104

Modo sim´etrico

fBIT max

fBIT min

fBIT max

fBIT min

FSK

fREF /2

fREF /2047

fREF /4

fREF /4094

QPSK

fREF /2

fREF /651

fREF /4

fREF /650

16QAM

fREF /2

fREF /325

fREF /4

fREF /324

Cuadro 4.5: Sumario de velocidades de bit generadas en la placa DDS

Obviamente, estos valores dependen del reloj de referencia, por lo tanto se pueden variar cambiando el oscilador de referencia o utilizando uno externo seg´ un las necesidades de cada momento. Para ilustrar el funcionamiento independiente de este bloque se han obtenido f´acilmente las gr´ aficas de la figura ??. Al disponer en el terminal de salida de la placa DDS de la se˜ nal de reloj de bit generada en este bloque, no resulta dif´ıcil comprobar el funcionamiento de este circuito. Se puede distinguir el distinto factor de forma de la se˜ nal de salida cuando se intercala el divisor U7A, resultando el factor adicional de divisi´on ×2. 4.2.2.5.

Oscilador de referencia

Figura 4.13: Oscilador interno de referencia y jumper JP1 de selecci´on de reloj maestro

Se utiliza como reloj maestro de transmisi´on y tambi´en, tal y como se acaba de comentar en el apartado anterior, para la creaci´on del reloj de bit, puesto que ambos relojes deben de ser s´ıncronos seg´ un las especificaciones del modulador DDS. No ten´ıamos ninguna raz´ on que nos forzase la elecci´on de la frecuencia, al margen de no sobrepasar el l´ımite del AD9853 de 28 Mhz. Se escogi´o la frecuencia de 27 Mhz por ser un valor f´acilmente asequible en el mercado. De todos modos, si se desea trabajar con otra se˜ nal de informaci´ on generada en un circuito con su propia fuente de reloj, es preciso utilizar

˜ o hardware de la placa DDS 4.2 Disen

105

esa misma fuente de reloj como referencia en la placa DDS. Es por lo que se ha previsto la entrada de otro reloj externo en JP1. De acuerdo con la figura 4.13, la etiqueta CLK representa el terminal interno de reloj de la placa DDS. El bloque Y1 representa el oscilador a cristal incorporado en el circuito, con una frecuencia nominal de 27 Mhz y salida TTL, encapsulado en una carcasa DIL-16 similar a la de los circuitos integrados TTL tradicionales. Es un buen m´etodo si se quiere sustituir en el futuro por otro de frecuencia diferente. La contraprestaci´on que nos toca pagar por esa comodidad es la escasa precisi´on de los mismos, puesto que suelen tener una estabilidad caracter´ıstica de 10−7 . La etiqueta EXT OL es la entrada de oscilador externa del conector de entrada salida. Jugando con los puentes en JP1 podemos conseguir las siguientes posibilidades: 1. Puente JP1 1-2 aislado. El circuito trabaja con el oscilador interno Y1 de 27 Mhz. 2. Puente JP1 3-4 u ´nico. En este caso el reloj de la placa DDS es el externo suministrado desde el conector de entrada-salida. 3. Puentes JP1 1-2 y 3-4 conjuntos. Ahora el circuito trabaja con el reloj interno y adem´ as disponemos de ´el en lo que normalmente es entrada, por si queremos utilizar el reloj de la placa DDS en otro sistema distinto. 4.2.2.6.

Salida de FI

Esta etapa comprende el filtro antialiasing y el acoplamiento mediante transformador para convertir las salidas unipolares de corriente del DAC, a se˜ nales bipolares sim´etricas tal y como se recomienda en la secci´on 1.8.

Figura 4.14: Filtro antialiasing de salida en la placa DDS

El esquema de la etapa de salida se representa en la figura 4.14, donde no se incluyen las resistencias de terminaci´ on que se conectaron a los terminales de salida del DAC durante la etapa de dise˜ no mientras suministraban el transformador de banda ancha. La conexi´ on definitiva ha quedado tal y como aparece en la figura, u ´nicamente con el transformador y el filtro, y de ah´ı al conector BNC de salida. Las caracter´ısticas de los dos componentes se resumen a continuaci´ on: Transformador de banda ancha T1-1T-X65 de Minicircuits.

˜ o hardware de la placa DDS 4.2 Disen

106

Relaci´ on de impedancias: 1:1. Margen de frecuencia: 80 Khz a 200 Mhz. P´erdidas de inserci´ on 1 dB: 200 Khz a 80 Mhz. P´erdidas de inserci´ on 2 dB: 150 Khz a 150 Mhz. P´erdidas de inserci´ on 3 dB: 80 Khz a 200 Mhz. Filtro paso bajo PLP-70 de Minicircuits. Banda de paso: DC - 60 Mhz (atenuaci´on < 1 dB). Frecuencia de corte a 3 dB: 67 Mhz. Banda eliminada: atenuaci´on > 20 dB a 90 Mhz. 4.2.2.7.

Entrada-salida de datos

En este apartado comentaremos brevemente el conector de entrada-salida de la placa DDS, que es el punto donde se han reunido todas las se˜ nales digitales que por una causa u otra han de estar accesibles al exterior. La ubicaci´on f´ısica del mismo se encuentra en la parte lateral superior del chasis donde se ha mecanizado todo el sistema, justo encima de su hom´ ologo de la placa de secuencias pseudoaleatorias, y a la misma altura que el conector BNC de salida de se˜ nal.

Figura 4.15: Conector de entrada de datos de la placa DDS

Es un conector plano de diez terminales agrupados en dos filas, y las se˜ nales se han distribuido de tal forma que su correspondencia en el conector de la placa de secuencias permita un cable plano paralelo de interconexi´on. De este modo, los terminales conectados a este conector son los siguientes: SDI Serial Data Input. Entrada de la trama digital de informaci´on a transmitir. Debe de cumplir obligatoriamente la condici´on que ya se ha repetido muchas veces a esta altura, pero fundamental para el correcto funcionamiento del sistema: su velocidad debe ser un subm´ ultiplo par del reloj del sistema, adem´as de estar sincronizado con ´el. EXT OL External Oscillator. Entrada TTL de frecuencia de referencia externa. Se activa cambiando el puente JP1 a la posici´on 3-4 y su funci´on es permitir al modulador

˜ o hardware de la placa DDS 4.2 Disen

107

trabajar cuando la trama de datos a transmitir tiene ya un reloj de referencia que no se puede cambiar. Se puede jugar astutamente con los puentes de JP1 y utilizar este terminal tambi´en como terminal de salida de la frecuencia de referencia interna, tal y como se coment´ o en la secci´on 4.2.2.5. EXT TXE External Transmission Enable. Entrada de activaci´on de la transmisi´on cuando se quiere trabajar con otra se˜ nal distinta a su hom´ologa generada internamente. Es u ´til si se quiere trabajar en modo a r´afagas para sincronizar con la circuiter´ıa de datos la activaci´ on de la transmisi´on. CLK DAT Data Clock. Frecuencia de datos creada con la caracter´ıstica de ser s´ıncrona al reloj de referencia de la placa, por tanto apta para servir de se˜ nal de reloj en la circuiter´ıa de datos de entrada. La se˜ nal viene desde el generador de reloj de bit que tiene incorporado la placa DDS. En nuestra aplicaci´on particular se utiliza en la placa de secuencias pseudoaleatorias como se˜ nal de reloj de bit y como tal, determina la velocidad de transmisi´ on de datos. RESET. Se˜ nal de reset del modulador AD9853 generado desde el control de la placa y que se ha dejado accesible al exterior por si en alg´ un momento fuera de utilidad. 4.2.2.8.

Alimentaci´ on

El bloque de alimentaci´ on est´a constituido por tres reguladores similares, cada uno de los cuales suministra la tensi´ on de 5 voltios a partir de los 12 de entrada. El motivo de separar las distintas alimentaciones est´a en el intento de mejorar en lo posible las prestaciones de margen libre de esp´ ureos del modulador DDS. Se ha separado por una parte la alimentaci´ on al convertidor D/A del DDS (+VDA), por otro lado, la alimentaci´ on del PLL interno multiplicador de la frecuencia de referencia de la placa DDS × 6 para generar el reloj del sistema, en un intento de minimizar el acoplo de la se˜ nal de reloj a la salida (+VD). Por u ´ltimo, la alimentaci´on de la parte digital del modulador DDS y del resto de la placa, +V.

Figura 4.16: Reguladores de alimentaci´on independientes en la placa DDS

4.3 Software de control

108

Con la u ´ltima nos llevamos la sorpresa de tener que cambiar el regulador por otro que aguantase m´ as corriente, dado el elevado consumo del AD9853. La sorpresa sigui´o cuando descubrimos su calentamiento, lo que nos decidi´o a instalar un ventilador para mantener la temperatura dentro de los m´ argenes de seguridad. En el ap´endice A se puede ver c´omo ha quedado montado todo el sistema dentro de un chasis de aluminio.

4.3.

Software de control

Despu´es de tanto hardware llega el turno de revisar el software de control de la placa DDS, que comprende una aplicaci´on a la que se ha dado el nombre de modulAD. Consta fundamentalmente de dos ficheros fuente, separaci´on hecha con el fin de ordenar por un lado lo que son las funciones de bajo nivel encargadas de interactuar con el hardware de la placa DDS, y por otro las funciones t´ıpicamente encargadas del aspecto gr´afico de la interfaz de usuario. En el ap´endice C se presentan los listados completos de la aplicaci´on modulAD.

4.3.1.

M´ odulo principal mod.c

Las mayor´ıa de las funciones de este m´odulo est´an pendientes principalmente del aspecto gr´ afico de la aplicaci´ on. En la figura 4.17 se ha hecho el despliegue de todos los paneles gr´ aficos. De entre todas estas ventanas, las m´as interesantes son las de Configuraci´ on del generador de reloj de bit y Configuraci´ on del filtro FIR de datos. La primera controla directamente el valor de frecuencia de bit generado por el bloque del mismo nombre. En esta ventana se presenta una manera peculiar de comandar la frecuencia de bit deseada. Lo m´as l´ ogico hubiera sido mostrar un control num´erico donde escribir directamente la velocidad de datos que se deseara utilizar. Sin embargo, surge un problema por la necesidad que tiene este valor de ser m´ ultiplo par de la frecuencia del sistema, o lo que es equivalente, de la frecuencia de referencia de la placa. El resultado final cuando se hubiese querido hacer cambios r´ apidos, casi seguro que habr´ıa sido un continuo mareo al usuario advirti´endole de la imposibilidad de generar la velocidad que hubiese acabado de programar en el hipot´etico control. Puede que haya otra forma mejor de hacerlo, pero la soluci´on adoptada en este caso ha sido la de comandar directamente el valor entero de divisi´on que se quiere programar. Aqu´ı la aplicaci´ on es la encargada de mostrarnos autom´aticamente el valor de velocidad de transmisi´ on resultante. La funci´on directamente relacionada con la programaci´on del generador de reloj de bit es ValorDiv. Una aplicaci´ on comercial no hubiese dispuesto de la ventana para configurar los coeficientes del filtro FIR. Lo usual ser´ıa que el filtro estuviese programado para una curva determinada, resultando un proceso transparente para el usuario. Desde el punto de vista de la operaci´ on del modulador, lo importante es que el espectro de salida aparezca sin l´obulos laterales. Sin embargo, dado que se piensa utilizar esta aplicaci´on en el laboratorio, se ha a˜ nadido en este caso esta posibilidad de configuraci´on: resultar´a interesante ver en el futuro el efecto de distintas curvas conformadoras del pulso en el espectro de la se˜ nal de salida. Hablaremos de la funci´on ValorFirAx, con “x” refiri´endose al coeficiente respectivo del filtro FIR, que nos servir´a para introducirnos en uno de los aspectos clave en la programaci´ on del camino de procesado de datos.

4.3 Software de control

Figura 4.17: Distintas pantallas de la aplicaci´on de control modulAD

109

4.3 Software de control

110

Aunque las dos funciones que vamos a comentar en este apartado se encuentran en el m´odulo de la interface gr´ afica de usuario, la verdad es que en este caso se puede considerar que est´ an bastante cerca del hardware de la aplicaci´on. Evidentemente, pertenecen al m´odulo mod.c porque est´ an a cargo de unos controles concretos y bien determinados de las ventanas de la aplicaci´ on. 4.3.1.1.

Funci´ on ValorDiv

La primera funci´ on que vamos a comentar de este m´odulo se encuentra asociada a la ventana Configuraci´ on del generador del reloj de bit. Su control de llamada es el etiquetado como “Divisor programable se ejecuta cada vez que el usuario modifica su contenido a golpe de rat´ on o directamente escribiendo un n´ umero dentro del mismo. Esta es la forma de cambiar el valor de frecuencia del reloj de bit generado por la placa DDS, o lo que es lo mismo, la velocidad de transmisi´on de datos. La funci´on ValorDiv tambi´en es una funci´on importante porque se llama desde muchas otras funciones del m´odulo, siempre que la operaci´ on que realize el usuario implique un cambio “serio” de configuraci´on del sistema. A priori su funcionamiento no presenta muchas complicaciones conceptuales. De lo que se trata es de escribir la palabra de programaci´on en el divisor de la placa DDS, y este trabajo lo descarga sobre la funci´on de bajo nivel gen bit clk. Las complicaciones surgen cuando se analizan un poco todas las posibilidades de funcionamiento, pues los valores m´ aximos y m´ınimos de frecuencia de bit permitidos dependen del tipo de modulaci´on seleccionado, y hay que considerar la estructura interna del modulador que no nos permitir´ a programar todos los valores que f´ısicamente son posibles de generar. Toda esta complicaci´ on tambi´en se descarga sobre la funci´on del m´odulo mod hard.c interpolador que trataremos un poco m´ as adelante. De momento nos sirve con saber que esta funci´on chequea el valor que se ha comandado, y si se detecta un valor imposible de programar, la funci´on interpolador autom´aticamente busca el valor “permitido” por defecto y lo programa. Por supuesto, informa a la funci´on llamante para que la presentaci´on gr´afica se actualize correctamente y le aparezca al usuario el mensaje de aviso pertinente. Lo realmente destacable de esta funci´on puede que no sea f´acil de distinguir en su listado: es realmente la funci´on que gobierna la correcta temporizaci´on de la placa DDS. Por un lado se ejecuta cada vez que se cambia el tipo de modulaci´on (FSK, QPSK, 16QAM), tambi´en cuando se pulsa el bot´on del divisor fijo en la misma ventana, por supuesto cuando se cambia el valor desde el mismo control. A continuaci´on llama a la funci´on que valida el valor comandado, despu´es llama a la funci´on que modifica f´ısicamente la programaci´ on del generador de reloj de bit, tambi´en ordena la correcta reprogramaci´ on de todos los coeficientes del filtro de datos, y por u ´ltimo modifica los registros internos del modulador de acuerdo con la nueva velocidad. Es decir, es la encargada de que todo est´e como debe de estar. Otro detalle que se debe de mencionar no tiene nada que ver con ´esta funci´on, pero se refiere a un control junto al bot´on Divisor programable, en este caso de nombre Divisor fijo. Lo importante es se˜ nalar que no tiene ning´ un efecto sobre el hardware de la placa. Se ha incluido dentro de la interface gr´afica como medio de avisarle al programa de control de la posici´ on f´ısica del puente JP2. Es responsabilidad del usuario el no modificar inadecuadamente este control, porque de lo contrario la velocidad de datos indicada por la aplicaci´ on ser´ıa incorrecta. 2

4.3 Software de control

4.3.1.2.

111

Funci´ on ValorFirAx

Adem´ as del trabajo de programar el coeficiente del filtro FIR correspondiente, estas funciones (existe una por cada coeficiente) nos sirven de excusa para comentar una caracter´ıstica en la que tenemos pendiente profundizar como es el factor de escala del camino de datos. El efecto se aprecia en el listado viendo c´omo el valor a programar se divide por una variable esc old, para en la siguiente instrucci´on multiplicar el resultado por esc. El funcionamiento del modulador depende de la correcta propagaci´on de los datos a trav´es del filtro conformador de pulso y de los interpoladores en cascada. Seg´ un el manual del AD9853, el tama˜ no de las palabras que manejan las etapas CIC depende directamente de los factores de interpolaci´on con que trabajan. En efecto, los integradores de los filtros CIC realizan sumas que acumular´an mayores resultados a medida que aumenta su velocidad de trabajo en proporci´on directa al factor de interpolaci´on. De todas formas, los interpoladores se han dise˜ nado con suficiente margen para evitar el desbordamiento trabajando al m´ aximo de sus posibilidades. El problema se plantea porque a la salida de los mismos se realiza un truncamiento variando la precisi´on de los datos. Si se le echa un vistazo a la figura 4.4, vemos que a la salida de cada interpolador existe una etapa llamada scaler. Si el factor de interpolaci´on elegido es muy bajo, los valores significativos de los datos de salida estar´ an concentrados en los bit menor peso, mientras que lo contrario ocurre a velocidades de interpolaci´on alta. La funci´on de los bloques escaladores ser´ıa la de mantener siempre el mismo orden de precisi´on independientemente del factor de interpolaci´ on seleccionado. El problema que se plantea es el programar las etapas escaladoras de manera ´optima evitando por un lado p´erdidas en la precisi´on de salida, y por otro que se produzca el desbordamiento. Lo ideal ser´ıa estar siempre al borde del desbordamiento; de este modo mantendr´ıamos un alto grado de bits u ´tiles con pocos “ceros a la izquierda”. El fabricante recomienda programar las etapas escaladoras con un valor inferior en una unidad al factor de interpolaci´on asociado. En las hojas de datos se publica una tabla con un factor de “ganancia nominal” correspondiente a cada factor de escalado, siendo ´este un factor de m´erito que indica lo m´as o menos cerca que estamos del desbordamiento. Para que el sistema permanezca estable, la ganancia conjunta de la etapa FIR, del interpolador 1 y del interpolador 2 debe ser a toda costa ≤ 1. El fabricante recomienda elegir valores de escalado en los dos interpoladores que resulten en una ganancia lo m´ as cerca posible a 1 pero nunca por debajo, digamos z, para luego escalar los coeficientes del filtro FIR con un valor igual a 1/z, que siempre ser´a menor de la unidad. Es el proceso comentado al principio de este apartado. La b´ usqueda de los factores de escalado siguiendo el criterio del fabricante se realiza en la funci´ on busca esc llamada por interpolador, que a su vez es llamada por la funci´ on ValorDiv que acabamos de comentar. Es en la funci´on que nos ocupa cuando se completa el ciclo, al multiplicar el valor de programaci´on por la variable global esc.

4.3.2.

M´ odulo de funciones hardware mod hard.c

Hablaremos en primer lugar de la funci´on prog hard que es la funci´on encargada de dialogar con el modulador AD9853 a trav´es de su puerto serie, y tambi´en de la funci´ on interpolador, con la que terminaremos la descripci´on del camino de procesado de se˜ nal en el interior del modulador, pendiente desde el apartado 4.2.1.1.

4.3 Software de control

4.3.2.1.

112

Funci´ on prog hard

Hablar de esta funci´ on es comentar el protocolo de comunicaciones serie del modulador AD9853.

Figura 4.18: Protocolo hardware del puerto serie en el AD9853

Si observamos la figura 4.18, existe una parte com´ un en los protocolos de lectura y escritura del modulador en la cual se env´ıa la direcci´on del dispositivo y la del registro interno al que se quiere acceder, independientemente de que sea para leer o escribir. Como se habr´ a podido intuir, el trabajo se ha repartido entre tres funciones de bajo nivel: un a las operaciones de lectura/escritura, escribe ser y lee ser, carga reg ser, la parte com´ de funci´ on clara seg´ un indica su nombre. Comentando ya el funcionamiento concreto de la instrucci´on prog hard, se observa en el listado de la aplicaci´ on su funci´on de escribir datos de configuraci´on en el modulador. Seg´ un las hojas de datos del fabricante, la l´ınea f´ısica TXE debe estar desactivada durante la utilizaci´ on del puerto serie del modulador. Como durante la secuencia de inicializaci´ on del programa principal, la l´ınea TXE se deshabilita un tiempo considerable, se quiere evitar esa reiteraci´ on de ´ ordenes con la construcci´on if del interior de la funci´on. 4.3.2.2.

Funci´ on interpolador

Se explic´ o en el apartado 4.2.1.1 c´omo las etapas de interpolaci´on sirven para ajustar la frecuencia de datos a la frecuencia del reloj del sistema DDS. A continuaci´on vamos a analizar brevemente la relaci´ on entre todos los par´ametros que intervienen es este proceso para ver las opciones de maniobra que tenemos disponibles. En primer lugar enumerammos los par´ametros fijos que nos impone nuestra construcci´ on hardware. La frecuencia de referencia de la placa es constante e igual a la del cristal del circuito, en nuestro caso: FREF = 27M hz = cte La frecuencia del sistema DDS tambi´en lo ser´a puesto que se obtiene mediante multiplicaci´ on del valor de referencia . FSIS = 6FREF

(4.7)

El usuario puede modificar la frecuencia de transmisi´on de datos cambiando el factor de divisi´ on seg´ un hemos visto en el apartado anterior. FBIT =

FREF Div

(4.8)

4.3 Software de control

113

Ahora expresamos la relaci´ on entre la frecuencia del sistema y la velocidad de transmisi´on de datos seg´ un las hojas del fabricante: 1 FBIT (4.9) M donde el cuatro es un factor de interpolaci´on fijo en la etapa FIR y M es el n´ umero de bits por s´ımbolo de valor 2 en QPSK y 4 en 16QAM. Operando con todos estos datos, y teniendo en cuenta los valores m´aximos y m´ınimos de las etapas de interpolaci´ on, obtenemos FSIS = 4I1 I2

I1 I2 = 3Div I1 I2max = 1953

Divmax = 651

I1 I2min = 6

Divmin = 2

Para QPSK bit]

I1 I2 = 6Div I1 I2max = 1953

Divmax = 325

I1 I2min = 12

Divmin = 2

Para 16QAM

Jugando con estos valores y con la ecuaci´on 4.8 podemos calcular los valores m´aximos y m´ınimos de frecuencias de transmisi´on de datos de nuestro sistema. Podemos err´ oneamente pensar en este momento que todos los valores de factor de divisi´on entre los l´ımites que se acaban de enunciar son posibles. Sin embargo, hay que tener en cuenta que los interpoladores est´an dise˜ nados para funcionar con unos factores m´aximos de interpolaci´ on de 31 el primero y 63 el segundo. Esto supone una limitaci´ on importante puesto que elimina aquellos valores de divisi´on cuya descomposici´on en factores primos tenga un factor mayor de 63. Por ejemplo, podr´ıamos querer seleccionar un factor de divisi´ on de 316 para trabajar en QPSK a una velocidad de 85.443 kbps. Pues bien, como su descomposici´ on en factores primos es 316 = 79 × 22 , no podemos programar a ninguno de los interpoladores con el factor 79 y por tanto, aunque el circuito de generaci´ on de reloj de bit admitiese ese valor, luego no podr´ıamos trabajar con el modulador DDS. La funci´ on interpolador realiza este trabajo de control sobre los par´ametros de temporizaci´ on. En la aplicaci´ on se ha incluido una tabla con todos los valores que tienen un factor primo mayor de 63 mediante el fichero de encabezamiento primo 63.h. Cada vez que se cambia la velocidad de transmisi´on, lo primero hace esta funci´on es comprobar si el valor comandado es un valor permitido. Si esto no se cumple, la funci´ on empieza a buscar un valor de velocidad hasta que se encuentra el primero permitido por defecto. Cuando se ha encontrado un valor posible o bien el que se comand´o ya lo era, la funci´on busca la repartici´ on del factor de interpolaci´on m´as adecuada siguiendo las recomendaciones del fabricante. Aconsejan que el factor de interpolaci´on global se reparta lo m´as equitativamente posible en cada una de las etapas. Por ello, el algoritmo de b´ usqueda empieza haciendo la ra´ız cuadrada del valor a conseguir y le asigna a cada interpolador el entero m´ as cercano a ese valor.

´ cticos 4.4 Resultados pra

4.4.

114

Resultados pr´ acticos

Una vez finalizada la descripci´on de la placa DDS es obligado el comprobar el correcto funcionamiento del sistema. Para obtener los resultados que se presentan en este apartado se ha realizado la conexi´on representada en la figura 4.19, que es la forma usual de utilizar el montaje en su conjunto: La placa BER de secuencias pseudoaleatorias genera datos utilizando el reloj de bit proporcionado desde la placa DDS, datos que se aplican como se˜ nal de informaci´ on a transmitir a la entrada de la placa DDS. Obtendremos una se˜ nal modulada con la que se pretende hacer medidas de propagaci´on en el laboratorio. En caso de disponer de alg´ un m´etodo de demodulaci´on, ser´ıa bueno el volver a aplicar los datos recibidos a la placa de BER, para as´ı poder calcular la tasa de bits err´oneos del canal de transmisi´ on.

Figura 4.19: Conexionado usual del sistema: placa DDS y placa de BER trabajando conjuntamente

En el momento de redacci´on de este documento todav´ıa no ha sido posible llevar a cabo esta u ´ltima comprobaci´ on. Los u ´nicos medios a nuestro alcance han sido la observaci´ on de la se˜ nal en el dominio espectral y la revisi´on de los diagramas de ojos y la constelaci´ on generados con las diferentes modulaciones. Los gr´ aficos que se presentan en la figura 4.20 han sido obtenidas en el laboratorio con el analizador vectorial HP89410A, para una velocidad de transmisi´on de 2.5175 Mbps, resultando en una velocidad de s´ımbolo de 2.5175 Msps en FSK, 1.25875 Msps en QPSK, y 629 Ksps para 16QAM. El filtrado seleccionado en el equipo de medida fue un filtro en coseno alzado con factor α = 0,28. En el modulador DDS lo u ´nico que se program´o fue una frecuencia de salida dentro del margen operativo del analizador, que alcanza hasta los 15 Mhz, y como filtro de pulso no se modific´ o el que tiene la aplicaci´on modulAD cargado por defecto en coseno alzado con α = 0,5. Por otra parte se incluyen las medidas realizadas con el analizador de espectros, tanto en banda ancha para observar el comportamiento del modulador en lo referente a margen libre de esp´ ureos, como en banda estrecha para observar el filtrado que se realiza en el dominio digital mediante las etapas FIR conformadores del pulso. En la primera figura 4.21, se quer´ıa comprobar la teor´ıa sobre la generaci´on de esp´ ureos por truncamiento de fase expuesta en el apartado 1.5. En efecto, se puede apreciar c´omo existen palabras de sinton´ıa de frecuencia que no generan esp´ ureo alguno como en la figura (a), donde s´ olo se aprecia distorsi´on arm´onica, mientras que la figura (b) se presenta

´ cticos 4.4 Resultados pra

115

(a)

(b)

(c)

(d)

(e)

(f)

Figura 4.20: Medidas de salida para vt = 2,7175M bps realizadas con analizador vectorial HP89410A y filtro de datos en coseno alzado de factor α = 0,28. (a),(c) y (e) Diagramas I-Q para QPSK, 16QAM y FSK. (b),(d) y (f) Diagramas de ojos correspondientes

´ cticos 4.4 Resultados pra

(a)

116

(b)

Figura 4.21: Medidas de los esp´ ureos de truncamiento de fase de salida. (a) Palabra de sinton´ıa que no genera esp´ ureos. (b) Palabra de sinton´ıa donde se genera el m´aximo nivel de esp´ ureos

un caso de sinton´ıa para m´ aximo nivel de esp´ ureos. En aplicaciones donde sea importante esta especificaci´ on habr´ a que seleccionar adecuadamente la frecuencia de referencia para que nuestra frecuencia de inter´es caiga en una palabra de sinton´ıa “limpia”.

(a)

(b)

Figura 4.22: Medidas en banda ancha para QPSK donde se observan las im´agenes generadas por el proceso de conversi´on D/A. (a) QPSK a 13.5 Mbps a la frecuencia de 15 Mhz. (b) QPSK a 13.5 Mbps a la frecuencia de 65 Mhz

Se han obtenido gr´ aficas como las de la figura 4.22 habi´endose anulado el filtro antialiasing de la placa DDS. En ellas se pueden apreciar claramente las im´agenes generadas en el proceso de conversi´ on D/A alrededor de la frecuencia de reloj del sistema de 162 Mhz. Esta se˜ nal de reloj tiene un gran acoplamiento de salida, incluso despu´es de haberse realizado trabajos de blindaje en la placa. La gr´ afica (a) representa la se˜ nal de salida para una frecuencia nominal de 15 Mhz. En este caso, las dos im´ agenes representadas corresponden a las frecuencias de 162 ± 15M hz = 147 y 177 Mhz. Como curiosidad, los principales esp´ ureos que se aprecian

´ cticos 4.4 Resultados pra

117

corresponden a la banda de FM comercial de 88 a 108 Mhz. En la gr´afica (b) se representa la misma situaci´ on, en este caso para una frecuencia de salida nominal de 65 Mhz. Aqu´ı ya vemos u ´nicamente la imagen de 162 − 65 = 97 Mhz. Otro efecto que se pone de manifiesto es el empeoramiento de las prestaciones del sistema a medida que subimos en frecuencia, obs´ervense si no los esp´ ureos que aparecen.

Figura 4.23: Medidas en banda ancha para FSK sin filtro antialiasing

La figura 4.23 corresponde a la misma situaci´on de la anterior gr´afica, en este caso para una modulaci´ on FSK. La frecuencia nominal es 65 Mhz y la velocidad de datos de 133.66 kbps. La raz´ on de volver a incluir una gr´afica similar es destacar la mejor´ıa en SFDR de este caso, motivada por el cambio en el esquema de modulaci´on y el r´egimen de transmisi´ on: Para todos los esquemas de modulaci´on, el DAC del DDS genera la misma potencia de salida puesto que no se cambia para nada su configuraci´on de corriente m´axima. Ahora bien, en QPSK y 16QAM la potencia se distribuye uniformemente sobre todo el ancho de banda ocupado, mientras que en el ejemplo de FSK a baja velocidad, como el r´egimen de transmisi´ on es mucho menor, el espectro de salida se asemeja mucho m´as a dos tonos, por lo que esa potencia de salida se “concentra” y la relaci´on se˜ nal ruido mejora ostensiblemente. La inclusi´ on del filtro antialiasing de salida es muy efectiva como se aprecia en la gr´afica 4.24. La verdad es que para ser del todo realistas habr´ıa que decir que la gr´afica corresponde a la situaci´ on m´ as favorable del DDS puesto que la frecuencia de salida es bastante baja, 15 Mhz. Desgraciadamente, en el momento de confeccionar este trabajo todav´ıa no se dispon´ıa de el filtro nominal con frecuencia de corte de 67 Mhz que estaba especificado en el dise˜ no, y as´ı poder cubrir todo el margen de salida del DDS. De cualquier modo, es f´ acil de imaginar el resultado, si acaso con algunos esp´ ureos m´as que no se ven en la gr´ afica actual por haber sido eliminados con el filtro de 15 Mhz. Queda por comentar el espectro cercano para las tres modulaciones. En las figuras 4.25 (a) y (b) se puede comprobar el funcionamiento del filtro FIR conformador de pulso programado para una curva de respuesta en coseno alzado. La figura (c) corresponde a FSK, y aqu´ı no se da filtrado alguno, por lo cual la se˜ nal se expande considerablemente en el espectro. Hasta aqu´ı las medidas realizadas en la placa de modulaci´on. Queda por comprobar si los resultados pr´ acticos de laboratorio son satisfactorios, una vez se sustituya el filtro pasobajo de salida por el definitivo con frecuencia de corte 67 Mhz. En el ap´endice B se incluyen fotograf´ıas con indicaciones pr´acticas que facilitan el manejo del sistema. Son

´ cticos 4.4 Resultados pra

(a)

118

(b)

Figura 4.24: Efecto del filtro antialiasing de salida. (a) QPSK a 13.5 Mbps a la frecuencia de 15 Mhz. (b) FSK a 13.5 Mbps a la frecuencia marca de 15 Mhz

vistas laterales del chasis que contiene el sistema, y en ellas se indica qu´e conector es cada cual. Tambi´en se incluyen tablas con la funci´on de los pines de cada conector.

´ cticos 4.4 Resultados pra

119

(a)

(b)

(c)

Figura 4.25: Espectro cercano para los tres tipos de modulaciones principales. (a) QPSK a 13.5 Mbps a la frecuencia de 10 Mhz. (b) 16QAM a 13.5 Mbps a la frecuencia de 10 Mhz. (c) FSK a 133.66 Kbps a la frecuencia de marca de 10 Mhz.

Cap´ıtulo 5

Generador medidor de tasa de bits err´ oneos Corresponde a este cap´ıtulo la descripci´on del funcionamiento de la placa hardware de generaci´ on de secuencias aleatorias, as´ı como de su correspondiente aplicaci´on de control. La funci´ on de este circuito dentro del proyecto es servir como fuente de datos de informaci´ on a la placa de modulaci´on DDS. Esta es la forma m´as sencilla de obtener una trama de entrada para la evaluaci´on del funcionamiento y las prestaciones del sistema. El montaje pr´ actico est´ a basado en el integrado de Dallas DS2172, que genera las secuencias de salida gracias a un banco de registros de desplazamiento con realimentaci´ on configurable. Esta caracter´ıstica permite obtener una amplia gama de secuencias con algunas restricciones que se ver´ an m´as adelante. Aunque la aplicaci´ on particular para la que se utiliza es la generaci´on de secuencias pseudoaleatorias, el chip tambi´en dispone de un circuito “sincronizador” que permite detectar la recepci´ on coincidente con la secuencia transmitida, u ´til en la comprobaci´on de tasa de bit err´ oneos (BER). Con el objetivo de sacar el m´aximo partido a las prestaciones del integrado, tanto la placa hardware como la aplicaci´on de control se ha desarrollado para aprovechar la caracter´ıstica principal del chip DS2172: la medida de tasas de BER. El aspecto de la interface de usuario trata de emular el frontal “virtual” de un equipo de medida de BER, siguiendo un m´etodo similar al de algunas otras aplicaciones pr´acticas comerciales corrientes, como por ejemplo las tarjetas de adquisici´on de se˜ nal para PC utilizadas en forma de osciloscopios, analizadores de espectros y analizadores de bus. Durante la exposici´ on del resto del cap´ıtulo, haremos referencia a esta placa de circuito impreso como placa de BER.

5.1.

Opciones de dise˜ no

En principio, la necesidad de disponer de una trama de datos con la que comprobar la placa de modulaci´ on DDS obligaba a generar esos datos de alguna manera pr´actica. Se pensaron varias alternativas a la hora de acometer el dise˜ no del sistema, cotej´andose la medida en que cada una de estas alternativas se adaptaba a nuestras necesidades. Los requisitos que el sistema de generaci´on de tramas digitales necesitaba cumplir se pueden resumir en los siguientes puntos: Altas velocidades de operaci´on, del orden de decenas de Mhz, ya que se pretende 120

˜o 5.1 Opciones de disen

121

analizar el modulador a reg´ımenes altos de velocidades de transmisi´on simulando los nuevos servicios de telecomunicaciones en banda ancha que se est´an empezando a introducir. N´ umero de secuencias suficientemente amplio como para poder realizar diferentes tipos de pruebas. A ser posible ser´ıa interesante el contar con la posibilidad de generar secuencias arbitrarias creadas por el usuario permitiendo provocar determinadas condiciones en el modulador especialmente particulares: secuencias del tipo 1010... 1100... 11110000... hacen que la se˜ nal de salida de los moduladores adquiera en seg´ un qu´e tipos de modulaci´ on la caracter´ıstica de tonos fijos. Facilidad de control externo que permita el desarrollo de un software de control apropiado. La primera opci´ on que se baraj´o fue la de generar las secuencias de datos mediante un programa desde el ordenador. La ventaja inherente a la generaci´on software estriba en el control que se tiene sobre la secuencia generada, permitiendo ampliar f´acilmente el n´ umero de secuencias y patrones de transmisi´on para poder simular los nuevos escenarios pr´acticos que vayan apareciendo en el futuro. Por otra parte, el principal inconveniente de esta opci´on consiste en que el sistema operativo Windows proporciona un control de temporizaciones que como m´aximo llega a 1 milisegundo. Por tanto, si se pretende llegar a unos reg´ımenes de transmisi´on del orden de los 15 Mbit/s es preciso enviar a un buffer 15000 bits por operaci´on de entrada/salida, (15000 bits / 1 ms). El bus ISA del PC funcionar´ıa sobrado de capacidad, pero tendr´ıamos el inconveniente de necesitar un dispositivo hardware que estuviese dotado de una memoria de doble puerto que, funcionando en forma de buffer plesi´ocrono, recibiera los datos as´ıncronos del PC para enviarlos al modulador DDS de forma sincronizada. La necesidad de utilizar el bus ISA nos obliga a un desarrollo en forma de tarjeta de expansi´ on del PC, que dificulta su instalaci´on en un port´atil y limita considerablemente su abanico de utilizaci´ on a entornos cerrados de laboratorio. Alternativamente surgi´ o la idea de generar los datos directamente desde hardware, puesto que incluso la primera opci´on obligaba a realizar por este mismo m´etodo el ya comentado dispositivo de sincronizaci´on. De esta forma se liberar´ıa de mucho trabajo a la CPU principal del PC, a costa de disminuir el grado de libertad en la generaci´on de secuencias. Se buscaron circuitos integrados que realizaran ese trabajo, encontr´andose el integrado de Dallas DS2172. En este caso la opci´ on de dise˜ no contempla la realizaci´on de una placa de circuito impreso, siendo necesaria u ´nicamente la programaci´on de los registros del integrado dependiendo de la secuencia que se desee utilizar. Dada la relativamente escasa cantidad de instrucciones y comandos necesarios, al menos comparada con la primera opci´on, se puede utilizar al puerto paralelo del PC como interface de control, que adem´as es una interfaz ampliamente conocida y sobre la que se puede encontrar multitud de informaci´ on al formar parte integral del PC. [?]. Al utilizar el puerto paralelo del PC se gana en flexibilidad de uso, ya que lo u ´nico que hace falta en este caso es un cable paralelo, y por tanto se puede utilizar cualquier port´atil para controlar el circuito en medidas de campo. Se opt´ o por esta u ´ltima opci´on dadas sus ventajas sobre la primera filosof´ıa, con la particularidad de que fue ´esta decisi´on la que determin´o el tipo de control a utilizar

5.2 Especificaciones de la placa BER

122

en la placa DDS. No hubiese tenido sentido realizar dos tipos de control independientes pudiendo controlar los dos circuitos de modo homog´eneo.

5.2.

Especificaciones de la placa BER

Una vez justificada la opci´ on de dise˜ no seleccionada, resumimos las prestaciones que se han conseguido en el trabajo. Generales Aplicaciones: Generaci´ on de secuencias aleatorias de prueba y medida de tasas de error de bit. Puede funcionar conjuntamente con la placa DDS como fuente de bits a transmitir, o utilizarse como sistema aislado independiente. Tipos de secuencias generadas: 1. Modo pseudoaleatorio: 23 secuencias diferentes resumidas en la tabla 5.1. La longitud de la secuencia m´as larga es 232 − 1. 2. Modo repetitivo: Cualquier secuencia programable de hasta 32 bits de longitud. Se han predefinido 10 que se muestran en la tabla 5.2. Control Puerto Paralelo est´ andar PC en modo compatible Programa de Control mediBER para los sistemas operativos Windows 98 y NT. Caracter´ısticas de Entrada Salida Formato de se˜ nales digitales: TTL NRZ. Velocidad m´ axima de transmisi´on y recepci´on: 52 Mhz. Modos de trabajo: 1. Modo continuo. Conectando los pines 3 y 5 (RDIS y TDIS) del conector de transmisi´ on/recepci´ on a masa. 2. Modo r´ afagas. Gobernado por los hilos RDIS y TDIS del conector de transmisi´ on/recepci´ on. Alimentaci´ on Tensi´ on exterior: 12 voltios DC. Consumo: 85 mA Software de control. Programa mediBER Duraci´ on de los test programable hasta en un mes.

˜ o hardware de la placa BER 5.3 Disen

123

Selecci´ on de la secuencia digital de prueba de entre 33 predefinidas. Tambi´en est´a disponible la opci´ on de generar una secuencia repetitiva de hasta 32 bits. Inserci´ on manual y autom´ atica de errores en la secuencia transmitida. Las tasas de error que se pueden generar autom´aticamente son 10−1 , 10−2 , 10−3 , 10−4 , 10−5 , 10−6 y 10−7 . Indicaci´ on en la ventana de la aplicaci´on de los principales par´ametros de inter´es: 1. Tiempo de test y tiempo de disponibilidad. 2. N´ umero total de bits recibidos y n´ umero de errores. 3. Indicaci´ on de las tasas de ES, SES, DM y BER. (Segundos err´oneos, segundos severamente err´ oneos, minutos degradados y tasa de error de bit). Indicaci´ on gr´ afica del estado de sincronismo entre la secuencia transmitida y recibida. Indicaciones adicionales auxiliares para cuando se reciben las se˜ nales de error “todo unos” y “todo ceros”. Grabaci´ on del resultado de los test en fichero de texto con los par´ametros m´ as importantes de la prueba realizada.

5.3.

Dise˜ no hardware de la placa BER

Dado que el principal bloque constitutivo de esta placa es el integrado DS2172 de Dallas, lo primero que debemos determinar claramente es su funci´on: El chip DS2172 est´a pensado para analizar y comprobar la calidad de los sistemas digitales por medio de la generaci´ on y detecci´ on de patrones digitales binarios. Tambi´en enumeramos sus principales caracter´ısticas, muchas de las cuales son las responsables de las especificaciones que se acaban de enunciar en el apartado anterior. Generaci´ on de secuencias aleatorias a partir de un registro de desplazamiento de hasta 32 etapas con un punto de realimentaci´on intermedio programable. Esto permite generar cualquier secuencia, bien sea de longitud m´ axima o no, cuyo polinomio generador sea del tipo: g(x) = 1 + xB + xA

(5.1)

teniendo A una gama de valores de 1 a 32 (determina la cantidad de etapas utilizadas en la generaci´ on de la secuencia), y B tambi´en una gama de 1 hasta A (determina la posici´ on del punto intermedio de realimentaci´on). En realidad existe libertad a la hora de programar los dos valores, y B puede valer tambi´en de 1 a 32, lo que se desconoce es el efecto de programar un valor de realimentaci´on intermedio B mayor de la longitud total del banco de etapas A. Las hojas caracter´ısticas del fabricante contienen la informaci´on concreta para la programaci´ on de las secuencias pseudoaleatorias est´andar utilizadas en la industria, pero se han hecho pruebas de generaci´on de otras secuencias diferentes sin haber encontrado ning´ un tipo de problema.

˜ o hardware de la placa BER 5.3 Disen

124

Tambi´en dispone de la posibilidad de generar secuencias repetitivas de hasta 32 bits, incluyendo cualquier patr´ on decidido por el usuario. Los registros se cargan con el valor programado y sus contenidos son desplazados a la salida de forma peri´odica sin alteraci´ on de los mismos. Tanto trabajando en modo repetitivo como en modo pseudoaleatorio, la parte de recepci´ on dispone de un autosincronizador que busca la coincidencia entre la trama que est´ a generando y la que recibe. De este modo, si se encuentra una comparaci´ on positiva entre las dos secuencias, se activa el mecanismo de conteo de errores, con lo que se pueden obtener par´ ametros de funcionamiento de un enlace digital. El dispositivo es capaz de detectar mediante este procedimiento tasas de error de hasta 10−2 . Inserci´ on de errores tanto de forma autom´atica como manual. De forma autom´atica se puede programar para generar las tasas de BER desde 10−7 hasta 10−1 , en 6 pasos de un orden de magnitud cada uno. Velocidades de operaci´ on desde DC hasta 52 Mhz. Esto nos permite generar una amplia gama de velocidades de transmisi´on. En la pr´actica esta ventaja no se explota en su totalidad dado que el reloj maestro del sistema realizado es 27 Mhz, y por construcci´ on pr´ actica de la placa DDS la m´axima velocidad de datos que se puede conseguir es 27/2 = 13,5 Mbps. Si se utiliza la placa de BER por separado esta limitaci´ on no existe, siempre suministrando la se˜ nal de reloj de forma externa. Puerto paralelo de control de 8 bits. Factor importante que hace que el puerto paralelo del PC se convierta en una interface casi directa con el chip. Se requiere una peque˜ na variaci´ on hardware si, como en nuestro caso, se quiere utilizar el puerto paralelo en modo compatible.

5.3.1.

Composici´ on interna del DS2172

En esta secci´ on profundizaremos en el esquema de bloques del DS2172 con el objetivo de clarificar su funcionamiento interno, de forma que al lector le resultar´a m´as f´acil entender su operaci´ on. El diagrama general del integrado se representa en la figura 5.1. Dentro del mismo podemos distinguir los siguientes bloques: Puerto de control: Est´ a constituido por un bus multiplexado de direcciones y datos que puede funcionar en dos configuraciones de protocolo que se selecciona mediante el pin BTS: el modo Intel (BT S = 0) o el modo Motorola (BT S = 1). Cada modo tiene su forma particular de funcionar, pero ambos utilizan la premisa de primero colocar la direcci´ on del registro al que se quiere acceder, tanto para leer como para escribir, y en u ´ltimo lugar el dato. La informaci´on concreta de diagramas de tiempo se encuentra en las hojas del fabricante [?] Generador de secuencias patr´ on: Forman parte de este bloque funcional los registros PSR, Pattern Set Register ´o Registro de Configuraci´on de Patr´on, PLR, Pattern Length Register ´ o Registro de Longitud de Patr´on, y el PTR, Pattern Tap Register ´ o Registro de Etapa de Patr´on. Su funci´on conjunta es la de determinar la

˜ o hardware de la placa BER 5.3 Disen

125

Figura 5.1: Diagrama de bloques del integrado medidor de BER DS2172

secuencia generada, y est´ a relacionada con la configuraci´on del registro de desplazamiento que la crea. Este bloque se estudia con mayor profundidad en el siguiente apartado. Bloque de inserci´ on de errores: Est´a encargado de la producci´on de errores en la secuencia generada, invirti´endola instant´aneamente. Los errores generados pueden ser autom´ aticos, en cuyo caso este bloque se encarga de generar una tasa determinada de error, o bien manuales, insert´andose entonces a petici´on desde el puerto de control. Detector de Patr´ on: Es un bloque en el que se realiza la comparaci´on entre el patr´ on de secuencia transmitida y lo que se recibe en el bloque de recepci´on. Su funci´ on es la de detectar la “coincidencia” o estado de sincronizaci´ on entre ambas secuencias. Se puede configurar para que trabaje de modo autom´atico ante la p´erdida del sincronismo o bien para que sea el usuario el que comande el momento de empezar el proceso de sincronizaci´ on, (bits SYNCE y RESYNC del registro PCR, Registro de Control). Bloque de control de Transmisi´ on: Controla la salida de los bits generados al exterior. Es el encargado de la temporizaci´on de transmisi´on. Bloque de control de Recepci´ on: Controla la entrada de datos desde el exterior. Recibe el reloj con el que se temporiza toda la parte de recepci´on. Multiplexaci´ on de Bucle: Determina la trama de entrada hacia los subsistemas de recepci´ on, bien la secuencia de entrada desde el bloque de recepci´on (funcionamiento normal), o por el contrario la secuencia que se genera en los bloques de transmisi´on, u ´til en la realizaci´ on de un bucle interno. Su funcionamiento se gobierna mediante el bit LPBK del registro de control, PCR.

˜ o hardware de la placa BER 5.3 Disen

126

Bloque de recepci´ on: Es el bloque donde se ubican los bits recibidos desde el bloque de multiplexaci´ on y desde el que se alimenta el detector de secuencias o sincronizador. Tambi´en se puede leer su contenido desde el puerto de control. En este caso, se debe de acceder al registro PRR, Pattern Receive Register, Registro de patr´ on de recepci´ on Contadores de Errores y de Bits: Son dos registros donde el sincronizador anota el resultado de estas dos cuentas, por lo tanto son dos registros claves para la obtenci´ on de tasas de BER. Totalmente controlables desde el puerto de control, sus nombres son BECR, Bit Error Count Register, y BCR, Bit Count Register. Quedar´ıan por mencionar el registro de estado, SR, Status Register, y el registro de m´ ascara de interrupciones, IMR, Interrupt Mask Register, desde donde se conocen en tiempo real las circunstancias de operaci´on del sistema, y se gobierna la activaci´ on del pin externo IN T de interrupci´on. 5.3.1.1.

Configuraci´ on del registro de desplazamiento

En nuestro conocido integrado medidor de BER se utiliza la t´ecnica descrita en el cap´ıtulo 2 para generar secuencias de test. Se trata de un registro de desplazamiento al cual se le puede programar la realimentaci´on dependiendo del polinomio generador de la secuencia elegida. No obstante, existen una serie de limitaciones impuestas por las caracter´ısticas del hardware, que a˜ naden una serie de condiciones a la hora de seleccionar la secuencia a generar. Se impone por tanto una revisi´on interna del registro de desplazamiento. Su representaci´ on esquem´ atica se muestra en la figura 5.2, donde se pueden observar varios aspectos destacables:

Figura 5.2: Esquema del registro de desplazamiento para generaci´on de secuencias en el DS2172

Modo pseudoaleatorio Por un lado, lo referente a la naturaleza de la secuencia pseudoaleatoria generada. Su descripci´ on matem´ atica, y por tanto su longitud y patr´on vienen determinados por dos par´ametros:

˜ o hardware de la placa BER 5.3 Disen

127

1. La cantidad de etapas utilizadas del registro de desplazamiento (como m´aximo 32). Esto determina directamente el grado del polinomio generador de la secuencia. Es lo que en la figura viene indicado como “toma de realimentaci´on A”, Tap A Feedback. El registro interno determinante de esta longitud es el Pattern Length Register, PLR, y se encuentra en la direcci´on hexadecimal 04H . 2. El punto intermedio de realimentaci´on. Esto determina el termino de menor grado del polinomio generador, (ver la ecuaci´on 5.1). Aqu´ı el t´ermino de menor grado viene indicado por xB . El valor de la “toma de realimentaci´on B” se configura mediante el registro Polynomial Tap Register, PTR, de direcci´on 05H . Otro de los aspectos destacables de la figura 5.2 es la puerta and incluida en la toma de realimentaci´ on B. El terminal PCR.5 es el que la habilita: Un uno permite que los valores que se desplazan por el registro de desplazamiento se realimenten a la puerta xor de entrada, por tanto modificando las caracter´ısticas de la secuencia de salida, siempre dependiendo del polinomio generador elegido. Por el contrario, un cero en el terminal PCR.5 anula la realimentaci´on a la entrada del registro de desplazamiento de los valores que se propagan a su trav´es, resultando una secuencia peri´ odica o repetitiva, igual al valor inicial cargado en los flip-flops tipo D que conforman el registro. De este an´ alisis podemos concluir que es el terminal PCR.5 el que determina el modo de trabajo del generador de secuencias patr´on, bien en el modo pseudoaleatorio, bien en modo repetitivo. El terminal EIR.5 realiza la inversi´on de los bits transmitidos. Esta inversi´on se puede configurar de forma permanente desde el controlador, aunque como su nombre sugiere: EIR, Error Insert Register, forma parte de la circuiter´ıa de inserci´on de errores y por eso est´ a situado en el camino de la trama de salida. ¿Cu´ antas secuencias pseudoaleatorias se pueden generar con esta topolog´ıa del registro de desplazamiento?. La respuesta m´as inmediata es ¡muchas!. Obviamente, aunque no vamos a poder determinar su n´ umero exacto, ahora estamos en condiciones de decir algo m´ as gracias al cap´ıtulo 2. La ecuaci´ on 2.16 calculaba el n´ umero de polinomios primitivos de un grado determinado, de forma que estamos en condiciones de determinar el n´ umero de polinomios primitivos que existen desde grado 2, (1 + x + x2 ser´ıa la primera secuencia de longitud m´axima generable), hasta grado 32: N P Ptot =

r=32 X r=2

λ2 (r) =

r=32 X r=2

φ(2r − 1) r

(5.2)

siendo λ2 (r) el n´ umero total de polinomios primitivos de grado r, y φ(n) la funci´ on de Euler. Este valor se puede calcular, y es del orden de millones, aunque afortunadamente el problema se simplifica enormemente. Para cada grado r de polinomio generador, s´olo tenemos que comprobar si los r − 1 polinomios generadores que existen de la forma 1 + xB + xr , con B desde 1 hasta r − 1 son primitivos. El n´ umero total de polinomios existentes de este tipo es:

˜ o hardware de la placa BER 5.3 Disen

N P 3tot =

128

r=32 X

(r − 1) = 496

(5.3)

r=2

Estos 496 polinomios representan otras tantas secuencias, y todas se pueden generar con nuestro medidor de BER, incluso aquellas que no son de longitud m´axima (primitivos). Aunque no hemos resuelto el problema, quedar´ıa ahora por averiguar utilizando t´ecnicas computacionales, cu´ ales de esos 496 polinomios son primitivos realmente. Con la intenci´ on de retornar al mundo pr´actico se incluye la tabla 5.1 enumerando las secuencias recomendadas por el fabricante, y aunque, se podr´ıa programar cualquiera de la forma 1 + xB + xA , no todo es perfecto y no se ha previsto esa posibilidad en la aplicaci´ on de control. Solamente se realizaron diversas pruebas satisfactorias durante la fase de desarrollo. Secuencia

Polinomio generador

23 − 1

1 + x + x3

24 − 1

1 + x + x4

25 − 1

1 + x2 + x5

26 − 1

1 + x5 + x6

27 − 1

1 + x + x7

27 − 1

1 + x4 + x7

LB T1

27 − 1

1 + x4 + x7

LB T1 Invertida

29

−1

210 211 215 217 218

−1 −1 −1 −1 −1

1+

x5

+

x9

1+

x3

+

x10

1+

x9

+ x11

1+

x14

1+

x3

+

1+

x7

+ x18

+

x15

Observaciones

Recomendaci´on O.153 Recomendaci´on O.152 y O.153 Recomendaci´on O.151

x17

220 − 1

1 + x3 + x20

Recomendaci´on O.153

220 − 1

1 + x17 + x20

Recomendaci´on O.151, QRSS

221

−1

1+

222

−1

1 + x + x22

223 − 1 225 228

−1 −1

x2

+

x21

1 + x18 + x23 1+

x3

+

1+

x3

+ x28

Recomendaci´on O.151

x25

229 − 1

1 + x2 + x29

231 − 1

1 + x3 + x31

232 − 1

1 + x17 + x32

Cuadro 5.1: Descripci´on matem´atica de las secuencias pseudoaleatorias programadas en la placa de BER. Se puede apreciar c´omo los polinomios generadores siempre tienen 3 t´erminos a causa del dise˜ no interno del DS2172

˜ o hardware de la placa BER 5.3 Disen

129

Modo repetitivo Las secuencias repetitivas que se permite configurar tienen como m´aximo una longitud de 32 bits. Este l´ımite viene impuesto por el hardware del integrado, ya que es ´este el n´ umero de etapas que posee el registro de desplazamiento. La verdad es que en este aspecto notamos una cierta limitaci´on de prestaciones, pues se echa de menos el poder generar secuencias repetitivas de mayor longitud; al menos esa es una de las pocas diferencias que se han encontrado con respecto a otros equipos comerciales comparados [?]. Por ejemplo, con 256 bits de longitud se podr´ıa simular una trama E1 de 2048 kbits/s repetitiva, jerarqu´ıa primaria en Europa. De cualquier forma, en la tabla 5.2 se reflejan las secuencias repetitivas recomendadas por el fabricante que son las que se han predefinido en la aplicaci´on de control. Para poder programar cualquier otra secuencia, esta vez si que se ha dispuesto de una opci´on en la pantalla principal de la aplicaci´ on de control. Secuencia

Patr´on

Observaciones

Todo unos

. . . 11111 . . .

Todo ceros

. . . 00000 . . .

Unos y ceros alternativos

. . . 10101 . . .

Unos y ceros dobles alternados

. . . 1100110011 . . .

3 unos en 24 bits

. . . 001000000000000000100010 . . .

1 uno en 16 bits

. . . 1000000000000000 . . .

1 uno en 8 bits

. . . 1000000010000000 . . .

1 uno en 4 bits

. . . 10001000 . . .

Bucle D4 activado

. . . 1000010000 . . .

1 uno en 5 bits

Bucle D4 desactivado

. . . 100100 . . .

1 uno en 3 bits

Cuadro 5.2: Descripci´ on de las secuencias repetitivas programadas en la placa de BER.

5.3.2.

Bloques funcionales de la placa de BER

La placa de BER est´ a concebida para “acomodar” al principal bloque funcional de misma, el medidor de tasa de BER DS2172. En la secci´on anterior se analizaron en profundidad sus prestaciones; ahora que ya tenemos un conocimiento m´as preciso de las mismas y sabemos los tipos de secuencias que podemos generar, es el momento de describir el funcionamiento global de la placa y ver c´omo el resto de bloques da soporte a las tareas de intercambio de datos entre el programa de control y el DS2172. En figura 5.3 se presenta el diagrama de bloques de la placa de BER. En ella podemos distinguir los siguientes elementos: 1. Puerto paralelo de control 2. Buffer de control 3. Buffer de datos

˜ o hardware de la placa BER 5.3 Disen

130

Figura 5.3: Diagrama de bloques de la placa de BER

4. Medidor de BER 5. Conector de transmisi´ on/recepci´on El puerto paralelo y el bloque de entrada/salida son los puntos de acceso a la placa desde el exterior. El primero permite la comunicaci´on de datos entre el PC donde reside la aplicaci´ on de control y los recursos hardware de la placa de BER, representados principalmente por el medidor de BER, o lo que es lo mismo, el circuito integrado de Dallas DS2172. El bloque de entrada/salida es el punto de acceso a las tramas de test generadas por el medidor de BER, y tambi´en por donde entran las secuencias recibidas en las pruebas de tasa de errores. Los dos bloques que act´ uan como buffers canalizan el flujo de se˜ nales de control y de informaci´ on entre el medidor de BER y el PC que lo controla. 5.3.2.1.

Puerto paralelo de control

Al igual que en la placa DDS, el interface de control de la tarjeta es un conector plano de 26 pines en el que se acomodan las se˜ nales del puerto paralelo. El conexionado con el exterior se realiza por medio de un cable plano hasta un conector DB-25 (el u ´ltimo hilo de masa se queda sin conectar), que se encuentra montado en el chasis que contiene al sistema completo. Desde ah´ı hasta el puerto del PC ya es cuesti´on de que el usuario compre un cable paralelo corriente. En la tabla 5.3 se recogen los hilos del puerto paralelo que se utilizan en la placa as´ı como su funci´ on.

˜ o hardware de la placa BER 5.3 Disen

Pin

Nombre

1

LATCH0

2

D0

LSB del Bus de datos

3

D1

Bus de datos

4

D2



5

D3



6

D4



7

D5



8

D6



9

D7

10

OD6

Bit del nibble de lectura de estado desde placa BER

11

OD7

MSB del nibble de estado (invertido hardware)

12

OD5

Bit del nibble de estado

13

OD4

LSB del nibble de estado

16

LATCH2

LSB de Selecci´ on de Registro en placas DDS y BER

17

LATCH3

MSB de Selecci´ on de Registro en placas DDS y BER

18 a 26

GND

131

Funci´on en la placa BER Strobe de carga del bus de datos en placa BER

MSB del Bus de datos

Masa

Cuadro 5.3: Interface entre la placa BER y el puerto paralelo del PC.

5.3.2.2.

Buffer de control

Este bloque es el encargado de demultiplexar los comandos que llegan desde el PC por el bus de datos del puerto paralelo y convertirlos en se˜ nales v´alidas de control hardware.

Figura 5.4: Buffer de control de la placa de BER

Tal y como se ve en la figura 5.4, est´a constituido por los siguientes componentes: U10, 74HC139. Es un demultiplexor dos a cuatro que genera las se˜ nales de “enable” de activaci´ on de los drivers que retienen la informaci´on enviada desde el PC a trav´es del bus de datos del puerto paralelo (D0 a D7). Los hilos de selecci´on son los terminales LATCH2 y LATCH3 del puerto de control del PC, y su validaci´on tambi´en llega directamente desde el puerto paralelo a trav´es de la se˜ nal de control LATCH0.

˜ o hardware de la placa BER 5.3 Disen

132

Su funcionamiento es id´entico a su componente hom´ologo de la placa DDS, salvo por la se˜ nal de control que lo activa, en aquel caso LATCH1. En este caso, la l´ınea CHIP0 se emplea para demultiplexar las se˜ nales de control hardware de la placa, y por otro lado CHIP1 se utiliza para cargar el bus del puerto paralelo en el bus interno de datos. U5, 74HC574. Es uno de los dos buffers del circuito, y su funci´on es la de fijar todos los comandos de control recibidos por el bus de datos. Sus hilos de salida reflejan el valor l´ ogico presente en las entradas justo en el flanco de subida de su se˜ nal de enable CHIP0, que es proporcionada por U10. Aunque este circuito es un buffer triestado, esta posibilidad no se utiliza en este caso al realizar funciones de transceptor de control. Por eso el hilo OC est´a directamente conectado a masa. Podemos decir que este integrado gobierna el funcionamiento del resto de recursos hardware de la placa de BER. Es importante que el programa de control realize la secuencia de operaciones correctas con el fin de que los datos se carguen en el registro adecuado. En el caso concreto de un comando de control, esta secuencia debe ser la siguiente: 1. Colocar el dato de control a cargar en el bus de datos. 2. Seleccionar el driver en el que se quiere escribir el valor mediante los hilos de selecci´ on LATCH2 y LATCH3 (concretamente CHIP0). 3. Activar el hilo de strobe correspondiente poni´endolo a nivel l´ogico bajo. En este caso LATCH0 para la placa de BER. Esto produce que se active el hilo de enable espec´ıfico del driver direccionado, como ya se ha dicho en el ejemplo, CHIP0. 4. Desactivar el hilo LATCH0 anterior. Esto provoca que el hilo enable del buffer se desactive subiendo a nivel l´ogico alto, y como consecuencia de ello, el dato se fije a la salida del mismo. 5.3.2.3.

Buffer de datos

Este bloque es el equivalente al anterior en lo que se refiere a datos de configuraci´on. Su funci´ on es la de demultiplexar los datos de configuraci´on que se env´ıan por el bus del PC, actuando de puente entre este bus y el bus de datos interno de la placa de BER. Es necesario precisar que el bus interno es bidireccional porque est´a directamente conectado al puerto de control del DS2172. Ya se habl´o en la secci´on A.1 de las distintas modalidades de funcionamiento del puerto paralelo del PC y, aunque en los PC modernos el hardware permite transmisiones bidireccionales por el bus de datos, se quer´ıa mantener la compatibilidad con el bus original, y por eso se dise˜ n´o el hardware pensando en enviar datos hacia el PC utilizando los hilos de estado. Con esta premisa se ha dise˜ nado el buffer de datos, de forma que, dependiendo de la direcci´ on de la informaci´ on, se habilitar´a uno u otro de los transceptores de que consta el bloque, tal y como se refleja en la figura 5.5. A continuaci´on se comenta el funcionamiento de cada uno de ellos: U3, 74HC574. Es el buffer que da paso a los datos desde el puerto paralelo. Su activaci´ on se realiza mediante la selecci´on de la direcci´on CHIP1 en el bloque de

˜ o hardware de la placa BER 5.3 Disen

133

Figura 5.5: Buffer de datos de la placa de BER

control y su funcionamiento es an´alogo a U5 del mismo bloque. En este caso, sin embargo, si que se debe prestar atenci´on a la direcci´on de la informaci´on puesto que cuando se quiere enviar alg´ un dato hacia el PC se deben de poner las salidas de U3 en alta impedancia para no interferir en el bus interno AD0 − AD7. U4, 74LS241. Es el transceptor encargado de multiplexar el bus interno hacia los hilos de estado del puerto paralelo, cumpliendo con la funci´on de env´ıo de datos en la direcci´ on de salida. En la figura se se˜ nala c´omo se utilizan en el sentido de lectura cuatro hilos de estado, OD7 a OD4, del puerto paralelo. El bus interno es de ocho bits; por ello es necesario multiplexarlo y realizar la lectura en dos operaciones seguidas. El integrado tiene dos secciones de cuatro bits cada una, con habilitaci´on independiente, aunque curiosamente las se˜ nales de enable son invertidas. Da la sensaci´on de que el dise˜ nador pens´ o en una utilizaci´on de este estilo. Todas las operaciones est´ an gobernadas mediante hilos del bloque de control, por lo que toda transferencia de datos hacia el PC estar´a precedida de los correspondientes env´ıos de comandos de control hacia la placa de BER. 5.3.2.4.

Medidor de BER DS2172

Es el bloque principal y ya conocemos sus caracter´ısticas m´as importantes, pues est´a constituido ´ıntegramente por el circuito DS2172. En este apartado comentamos la figura 5.6, donde podemos observar el conexionado particular del mismo en nuestra aplicaci´on. El puerto de control AD0 a AD7 est´a conectado al bus de datos interno de la placa. Existe un grupo de hilos de control que gobiernan la temporizaci´on de los intercambios de datos tanto de entrada como de salida. Todos estos hilos llegan desde el bloque “buffer de control” comentado hace unos p´arrafos en el apartado 5.3.2.2. Se admiten dos tipos de temporizaciones para los mismos terminales de control dependiendo del estado l´ogico

˜ o hardware de la placa BER 5.3 Disen

134

Figura 5.6: El DS2172 y su conexionado en la placa de BER

del pin BTS, Bus Type Select: Si esta se˜ nal est´a a nivel alto, el bus funciona seg´ un la temporizaci´ on est´ andar de Motorola, mientras que si su valor l´ogico es bajo, el tipo de temporizaci´ on que se emplea es la de Intel. Dependiendo de ello, el funcionamiento de los pines 15, 17 y 18 difiere. En nuestro dise˜ no se ha escogido arbitrariamente la temporizaci´on del tipo Intel, ya que no exist´ıa ning´ un motivo coercitivo que nos obligara a escoger un tipo determinado en concreto. Realizada esta elecci´ on, la funci´on de los terminales de control se puede resumir del siguiente modo: Pin 16 Chip Select, CS. Activo a nivel bajo sirve para indicarle al DS2172 que debe prestar atenci´ on al bus, bien para leer o escribir en ´el. Pin 17 Address Latch Enable, ALE. Es el terminal que sirve para demultiplexar las direcciones del bus de datos interno. Los datos de direcci´on se cargan en el integrado en el flanco de bajada de este terminal, siempre y cuando est´e habilitado el hilo de Chip Select. Pin 15 Read, RD. Hilo de lectura de datos desde el registro previamente seleccionado. El chip pone el dato en el bus en el flanco de bajada del terminal. En este caso habr´ a que tener la precauci´on de poner el buffer de datos a alta impedancia previamente. Pin 18 Write, W R. Hilo de escritura activo a nivel bajo. El integrado carga en el registro previamente seleccionado, el dato presente en el bus justamente en el flanco de subida de esta se˜ nal. Existen otros tres pines externos de control que no utilizamos puesto que tienen su hom´ologo en un bit de los registros de control, y resulta muy f´acil acceder a ellos mediante

˜ o hardware de la placa BER 5.3 Disen

135

software. Para inhabilitar los terminales se han conectado a masa. De todas maneras, los enumeramos a˜ nadiendo un comentario explicativo de su funci´on. Terminal RL, Receive Load. Un flanco de subida en este pin carga los u ´ltimos 32 bits recibidos en los registros PRR, registros de recepci´on de secuencia patr´on. Su valor l´ ogico est´ a combinado mediante puerta OR con el valor del bit PCR.3 del registro de control PCR. Terminal LC, Load Count. Una transici´on de bajo a alto carga los contadores de bits recibidos y errores detectados en los registros accesibles al usuario BCR y BECR, y resetea la cuenta de los registros internos. Se combina mediante puerta OR con el valor del bit PCR.4 del registro de control de patr´on. Terminal TL, Transmit Load. Es el terminal dual a RL, esta vez referido al generador de secuencia patr´ on: El valor de los registros de configuraci´on de patr´on PSR se carga en el registro de desplazamiento que genera la secuencia a transmitir en el flanco de subida de este terminal. Su valor tambi´en est´a combinado con el bit PCR.7 mediante un operador OR l´ogico. Otro terminal que no se utiliza, esta vez no de control sino de estado, es el terminal RLOS, que es un indicador hardware de sincronizaci´on. Como la misma indicaci´on se puede leer del bit SR.4 del registro de estado, en el montaje este pin se queda sin conexi´on. Nosotros utilizaremos en nuestra aplicaci´on la lectura de ese registro para determinar el correcto “enganche” del medidor a la secuencia recibida. Aparte de los terminales de alimentaci´on nos queda el bloque de pines de transmisi´on-recepci´ on, que se comentan en el siguiente apartado. 5.3.2.5.

Conector de transmisi´ on-recepci´ on

La conexi´ on al exterior de los terminales de transmisi´on y recepci´on del m´odulo de BER se realiza mediante el conector dibujado en el esquema de la figura 5.7. Es el conector de diez terminales plano que aparece en la parte lateral inferior del chasis que contiene todo el montaje. Su fotograf´ıa se incluye en el ap´endice A.

Figura 5.7: Entrada y salida de se˜ nales en la placa de BER

˜ o hardware de la placa BER 5.3 Disen

136

Es importante precisar la funci´on concreta de cada uno de los terminales para poder trabajar adecuadamente con la placa de BER; a continuaci´on los enumeramos y damos una descripci´ on de los mismos. TCLK Transmission Clock. Reloj de transmisi´on con un margen de frecuencias v´alidas desde 0 hasta 52 MHz. No tiene porqu´e tener un factor de forma del 50 %, ni tampoco necesita ser is´ ocrono. Es usual en medidas de test pr´acticas que las secuencias de prueba est´en sincronizadas con el resto del sistema. Pensando en esta raz´on no se incluy´o un oscilador interno que aplicado a este pin permitiera al dise˜ no funcionar independientemente. Ahora pensamos que no hubiese estado de m´as incluirlo, aunque s´olo hubiera sido un z´ ocalo para insertar el cristal a la frecuencia necesaria. S´olo se pens´o en que para cualquier aplicaci´ on que se utilizara, se necesitar´ıa ese sincronismo que obligar´ıa a la generaci´ on del reloj de transmisi´on en el circuito a probar. Ello nos plantea la necesidad de suministrar la se˜ nal de reloj de transmisi´on desde el exterior en cualquier tipo de prueba. Con todo, no creemos que sea una desventaja muy significativa. Siempre se puede utilizar cualquier fuente de se˜ nal TTL que act´ ue de reloj de transmisi´ on. TDAT Transmit Data. Hilo de transmisi´on donde aparece la secuencia generada en forma de trama de datos serie NRZ (unipolar no retorno a cero). Los datos tienen sus transiciones en el flanco de subida de TCLK. TDIS Transmit Disable. A nivel alto deshabilita el reloj de transmisi´on, por lo que la secuencia de salida en el pin TDAT se detiene. A nivel bajo permite que la se˜ nal de reloj de bit que llega por TCLK alcance la circuiter´ıa de transmisi´on y as´ı pueda continuar la secuencia de salida. Este terminal es u ´til para aplicaciones donde se necesite que la secuencia de test se transmita en modo de r´ afagas (burst). Continuamos con la parte de recepci´on. RCLK Receive Clock. Reloj de recepci´on con el mismo margen operativo que el de transmisi´ on. Es totalmente independiente del reloj de transmisi´on pero tiene sus mismas caracter´ısticas en lo que se refiere a factor de forma y sincronismo. En este caso s´ı que no ocurre como en el parte de transmisi´on. Aqu´ı s´ı que es forzoso el suministro de la se˜ nal de reloj desde el exterior. RDAT Receive Data. Hilo de recepci´on donde se muestrean los datos recibidos en el flanco de subida de RCLK. Los datos han de recibirse en formato NRZ como en el caso de su hom´ ologo de transmisi´on. RDIS Receive Disable. A nivel alto impide que los datos recibidos en RDAT se muestreen. A nivel bajo permite que la se˜ nal de reloj de bit recibida entre en la circuiter´ıa interna permitiendo que funcione el bloque de recepci´on. Es el terminal dual de TDIS, u ´til tambi´en en aplicaciones en modo burst.

5.4 Software de control

137

Figura 5.8: Regulador de alimentaci´on de la placa de BER

5.3.2.6.

Alimentaci´ on

El m´ odulo de alimentaci´ on est´a constituido simplemente por un regulador 78LS05 que baja la tensi´ on de alimentaci´on exterior de 12 voltios a la tensi´on nominal TTL de 5. Por destacar alguna caracter´ıstica en particular, se incluye una inductancia de protecci´ on EMI.

5.4.

Software de control

La aplicaci´ on de control de la placa de BER est´a constituida por dos ficheros fuente. Al igual que en la placa DDS, se han separado por un lado las tareas relacionadas directamente con el hardware particular del dise˜ no, y por otro lo que tiene que ver con el entorno gr´afico de usuario y la medida de tasas de bits err´oneos.

Figura 5.9: Entorno gr´afico de la aplicaci´on de control mediBER

Del fichero principal ber.c comentaremos u ´nicamente la funci´on bucle, que es una funci´on lanzada por el temporizador autom´atico de Labwindows cada intervalo de 1 se-

5.4 Software de control

138

gundo, y es la encargada de realizar todos los c´alculos a la hora de ejecutar una prueba de medida de tasa de error de bit. Para ello utiliza los servicios que prestan las funciones de bajo nivel contenidas en el otro fichero fuente ber hard.c. Tambi´en se encarga de la presentaci´ on de los resultados en pantalla. El fichero auxiliar de funciones hardware ber hard.c es el encargado de canalizar las instrucciones de control por el puerto paralelo hacia los registros de la placa de BER, cargando los datos precisos en funci´on de los comandos enviados desde el m´odulo principal. En este caso, podemos comentar el funcionamiento de las instrucciones particulares de lectura y escritura de datos en la placa de BER lee par bert y escribe par bert, as´ı como la funci´ on aplicacion bert, que es la encargada de informar al m´odulo principal del estado de sincronismo de la placa. El resto de las funciones resultan un poco tediosas puesto que se trata u ´nicamente de funciones reiterativas, cuyo trabajo consiste en ir enviando el grupo de valores concretos a los registros determinados dependiendo de la funci´on en particular de que se trate, y la verdad, su exposici´on no aporta mucho, puesto que son c´ odigos que aparecen en las hojas del fabricante. En el ap´endice C se presentan los listados completos de la aplicaci´on mediBER.

5.4.1.

M´ odulo principal ber.c

Este es, sobre todo, el m´ odulo de la presentaci´on gr´afica de usuario. Aqu´ı es donde se soportan de forma sencilla todas las funciones activadas con el rat´on desde la ventana de la aplicaci´ on. De lo depurado de este m´odulo depende lo aparente de la presentaci´on. Aqu´ı se ha intentado presentar un frontal de un equipo virtual de medida de BER, pero tambi´en intentando sacar el m´ aximo de provecho a las prestaciones que nos ofrece el montaje pr´ actico. Su aspecto se presenta en la figura 5.9. Tambi´en se han trabajado los c´alculos que mantienen una presentaci´on actualizada del m´aximo n´ umero de par´ ametros de inter´es mientras se realizan las medidas de BER. La funci´ on responsable de estos c´alculos es la funci´on bucle. 5.4.1.1.

Funci´ on principal bucle

Esta funci´ on se considera como la principal de la aplicaci´on porque es la encargada de realizar los c´ alculos de tasa de BER en caso de estar activadas las medidas. La verdad es que si no se activa la prueba de BER, la funci´on no hace gran cosa, y se limita a buscar en el puerto paralelo del PC la conexi´on correcta de la placa, informando al usuario en caso contrario y deshabilitando los controles principales de la ventana de la aplicaci´on. El nombre de la funci´ on viene motivado porque est´a asociada a una temporizaci´ on autom´ atica en Labwindows que la ejecuta autom´ aticamente cada segundo. Si suponemos que se est´ a realizando una prueba de BER, bien porque realmente estemos interesados en realizarla, o como puede darse el caso, si lo que queremos es que el circuito se ponga a transmitir datos pseudoaleatorios, es entonces cuando la funci´on bucle realiza su trabajo m´ as importante. Lo primero que hace la funci´on es leer el registro de estado y los registros contadores de bits recibidos y de errores detectados por el medidor de BER. Para ello llama a la funci´ on aplicaci´ on bert que comentaremos en el apartado siguiente. Como esta actualizaci´on se realiza peri´ odicamente, podemos conocer con una demora de un segundo el estado en tiempo real del medidor de tasas de error DS2172. El resultado de esta consulta ser´a: Informaci´ on actualizada sobre el estado de sincronismo del circuito.

5.4 Software de control

139

Actualizaci´ on de los valores que se necesitan para calcular la tasa de BER instant´ anea del segundo transcurrido desde la u ´ltima ejecuci´on de esta funci´on. A rengl´ on seguido y disponiendo de la tasa de BER instant´anea se determina si el segundo que acaba de finalizar ha sido un segundo severamente err´oneo, ses instant´ aneo, ´o simplemente un segundo con errores, es instant´ aneo. Estos valores se almacenan en una especie de buffer din´ amico donde se guardan los resultados de los u ´ltimos diez segundos a modo de memoria FIFO, con lo que siempre se tiene actualizado el contenido de los diez segundos m´ as recientes. El objetivo es detectar el paso de disponibilidad a no disponibilidad, y eso ocurre seg´ un la recomendaci´on G.821 cuando se producen diez o m´as segundos seguidos con alarma o con una tasa de error peor de 10−3 . Al contrario sucede cuando se dan diez segundos seguidos sin alarmas y con una tasa de error mejor de 10−3 . Estos enunciados dados por la UIT se vieron ya en el cap´ıtulo 3. Despu´es de realizarse el an´alisis global de los u ´ltimos diez segundos, se determina el paso a situaci´ on de disponibilidad, ´o por el contrario a la de no disponibilidad. En caso de que se produzcan transiciones de una situaci´on a la opuesta, se deben de a˜ nadir/descontar seg´ un proceda, los valores de bits recibidos y errores detectados correspondientes a estos diez segundos. Estando en situaci´ on de disponibilidad se mantiene adem´as otro buffer, en este caso con los valores correspondiente a los sesenta segundos u ´ltimos excluyendo aquellos en los que se produjeron errores severos: Vemos en este caso que no tienen por qu´e ser los u ´ltimos sesenta los segundos que est´en almacenados. Los valores de bits recibidos y errores detectados se almacenan en ese caso para determinar el porcentaje de minutos degradados, donde lo que se debe de calcular es la tasa de error en bloques de sesenta segundos en tiempo de disponibilidad excluyendo los segundos severamente err´oneos, ver la secci´on 3.1. Obviamente no pueden dejarse de actualizar los valores de bits recibidos y bits err´oneos totales durante el tiempo de disponibilidad del test, ya que son los par´ametros principales que nos determinar´ an la tasa de BER final de la prueba. Tambi´en se lleva el control sobre el tiempo de duraci´on del test y el tiempo de disponibilidad, imprescindibles el primero para saber cu´ando debe de terminar la prueba, y el segundo necesario en el c´ alculo de las tasas globales de BER. El trabajo de esta funci´ on termina manteniendo actualizados los indicadores correspondientes de la ventana principal de la aplicaci´on.

5.4.2.

M´ odulo de funciones hardware ber hard.c

Las funciones m´ as importantes de este m´odulo utilizan los servicios de la funci´ on un a las dos de m´as bajo nivel en la aplicaci´ on, la funci´on carga pp. Es una funci´on com´ aplicaciones, y en ella se adapta el protocolo y los niveles del puerto paralelo al hardware particular con que se han desarrollado las interfaces de las dos placas. Su funci´on es escribir en la direcci´ on que se le determine el valor pasado como entrada. Para ello genera la temporizaci´ on adecuada en las l´ıneas de control y datos del puerto paralelo. En su trabajo, esta funci´ on utiliza la librer´ıa externa dlportbc.lib que permite el acceso directo a los puertos de entrada-salida del PC sorteando la barrera de protecci´ on que impone Windows NT para acceder al hardware. La instrucciones m´as importantes utilizadas de esta librer´ıa son DlPortReadPortUchar(direcci´ on io) y DlPortWritePortUchar(direcci´ on io, byte que se escribe). A partir de estas dos se ha creado la funci´on base carga pp.

5.4 Software de control

5.4.2.1.

140

Funci´ on lee par bert

Esta funci´ on es la encargada de leer datos desde la placa de BER. Dicho as´ı parece que debe de ser una funci´ on simple de muy bajo nivel; sin embargo, dado que la construcci´on hardware de dicha placa es bastante peculiar, resulta un poco complicada pues se han tenido en cuenta todas las variantes operativas. Recordemos que la placa tiene un bus de datos interno paralelo bidireccional, separado del puerto paralelo por un buffer de datos. Se dan por tanto dos posibilidades de funcionamiento dependiendo de la variable de entrada dir: 1. Lectura del dato que se acaba de escribir en la placa desde el puerto paralelo. Es decir, se puede acceder, porque nos interese en un momento determinado, al bus interno de la placa para comprobar o leer el dato que acabamos de escribir en ´el utilizando una funci´ on de escritura. Es el caso de una funci´on que se ejecuta peri´odicamente para comprobar la correcta conexi´on de la tarjeta al puerto. 2. Lectura de datos puestos en el bus interno de la placa al leer desde los registros ´ internos del circuito DS2172. Esta es la utilizaci´on corriente de la funci´on. En este segundo caso, la funci´on realiza autom´aticamente una lectura secuencial si lo que se quiere es acceder a un conjunto grande de registros del generador de BER. El gobierno de esta caracter´ıstica lo proporcionan las variables de entrada reg ini y nro reg. Probablemente ya se habr´ a intuido la funci´on de cada uno de ellas: reg ini es la direcci´ on hardware del primer registro del cual se desea leer el contenido. nro reg es un ´ındice que controla el n´ umero de registros que se leen en las direcciones siguientes a la indicada por la variable reg ini. Si la opci´ on de operaci´ on que se seleccion´o fue la de lectura simple del bus interno (la opci´ on primera), no tiene sentido el contenido de estas dos variables. La funci´ on almacena el resultado en el array global de caracteres reservado al efecto control bert[nro registro]. El prop´osito es disponer de un “reflejo” en la memoria de la aplicaci´ on que contenga los contenidos de los registros hardware. Aqu´ı acceden las funciones de alto nivel cuando necesitan conocer estos contenidos. Recordemos tambi´en que la lectura de los datos desde el circuito BER, se realiza en este caso nibble a nibble, dado que tenemos 4 hilos de lectura de datos hacia el PC. El hardware del buffer de datos se encarga de multiplexar el bus interno de 8 bits hacia estos 4 hilos del puerto paralelo, y es entonces esta funci´on la que se encarga de ir enviando a la placa BER los comandos de control necesarios para canalizar el flujo de informaci´on hacia el PC. 5.4.2.2.

Funci´ on escribe par bert

En este caso no se dan las dos posibilidades anteriores, puesto que para escribir directamente sobre el bus interno se utiliza la funci´on carga pp en su utilidad b´asica. El trabajo de la funci´ on que nos ocupa, por tanto, es el dual del realizado generalmente por la funci´ on lee par bert, y cuya descripci´on acabamos de terminar. Nos referimos a la carga de datos desde las aplicaciones de alto nivel a los registros hardware internos del circuito DS2172. Para ello se utiliza la memoria reservada al efecto

5.4 Software de control

141

en forma de array global control bert[nro registro]. Si una aplicaci´on quiere programar alg´ un par´ ametro determinado del medidor de BER, lo que hace es escribir el dato en esta memoria y llamar a la funci´ on escribe par bert que se encarga del resto. Tendremos entonces los par´ametros de entrada reg ini y nro reg, que le indican a la funci´ on desde donde empezar a copiar y cu´antas veces tiene que reiterar el bucle de copiado. Faltar´ıa por recordar que durante las escrituras y lecturas en el circuito DS2172, estas dos funciones han de ejecutar la secuencia de activaci´on de se˜ nales de control seg´ un el protocolo de Intel seleccionado arbitrariamente al construir la placa de BER. 5.4.2.3.

Funci´ on aplicacion bert

Mediante esta funci´ on se informa a la aplicaci´on principal del estado operativo del circuito DS2172. ¿Qu´e queremos decir con esto? Esto quiere decir que la funci´on se encarga de leer el registro de estado y la m´ascara de interrupciones del integrado (aunque no se emplee en nuestra aplicaci´ on es necesario limpiarla peri´odicamente), para detectar el estado de operaci´ on en que se encuentra e informar a la aplicaci´on de usuario. La funci´on analiza los valores obtenidos y como resultado decide si el medidor de BER est´a sincronizado o no. El medidor de BER estar´ a sincronizado cuando la secuencia que est´a transmitiendo y la que recibe coinciden. El registro de estado se almacena en un par´ametro de entrada a la funci´on pasado por referencia que se llama t datos *ptd. El tipo t datos es la estructura siguiente: struct datos { char todo_1, todo_0, busca_sincro, error_dec, con_ovf, con_err_ovf, sincro; double bits_rx, bits_err; };

Aqu´ı se almacena tambi´en la cuenta de bits recibidos y n´ umero de bits err´oneos. Vemos que se ha reservado un lugar especial a cada uno de los bits del registro de estado: todo 1: Activo cuando la secuencia que se recibe es siempre 1. todo 0: Activo cuando la secuencia que se recibe es siempre 0. busca sincro: Se activa cada vez que el integrado pierde el sincronismo. error dec: Se activa cuando se detectan errores estando sincronizado. con ovf: Indica desbordamiento en el contador de bits recibidos. con err ovf: Indica desbordamiento en el contador de errores. sincro: Estado del sincronizador. Se activa cuando se reciben las secuencias continuas de 1 ´ o 0. A consecuencia de esta “desviaci´on” de lo que uno puede entender como estar sincronizado, fue preciso a˜ nadirle a esta funci´on otro par´ametro m´as de entrada, secuencia, que no es ni mas ni menos que el c´odigo de secuencia seleccionada en la aplicaci´on de control. De este modo se puede decidir de manera fiable sobre el estado de sincronismo del circuito. En este sentido, la verdad es que la funci´on se acerca bastante a la aplicaci´ on de usuario. La funci´ on considera que el circuito est´a sincronizado en los siguientes casos:

´ cticos 5.5 Resultados pra

142

1. El integrado informa que est´a sincronizado y no se est´an recibiendo ceros continuos ni unos continuos. 2. Se reciben ceros constantemente y se ha seleccionado como secuencia de prueba la de “todo ceros”. 3. Se reciben unos constantemente y se ha seleccionado como secuencia de prueba la de “todo unos”. Adem´ as de informar a la aplicaci´on de usuario del estado de sincronismo, la funci´ on accede a los contadores de bits recibidos y errores detectados para actualizar su contenido en la memoria de la aplicaci´ on. Tambi´en resetea los contadores evitando as´ı su desbordamiento. Estos valores son clave en caso de existir sincronizaci´on, puesto que son los que se utilizan para calcular la tasa de error en la aplicaci´on de usuario. Los valores adquiridos se guardan en este caso en las variables bits rx y bits err del par´ametro t datos *ptd de entrada, donde quedan accesibles a la aplicaci´on principal.

5.5.

Resultados pr´ acticos

Para finalizar con el cap´ıtulo, en esta secci´on se presenta un ejemplo donde se muestran los resultados pr´ acticos de funcionamiento individual de la placa de BER. Recordemos que el sistema puede trabajar de forma independiente con la ya comentada restricci´on de la necesidad de fuentes externas de reloj. Para emular este caso, las medidas se han realizado simulando una prueba real.

Figura 5.10: Conexi´ on de la placa de BER para la simulaci´on de una medida pr´ actica de tasa de error

Para preparar la prueba se ha puenteado el terminal de salida de datos con el de recepci´ on, (es decir, se ha realizado un bucle local hardware), y como reloj de transmisi´ on y recepci´ on se ha utilizado el reloj de bit generado en la placa DDS. Esta situaci´on se asemeja en gran medida al conexionado necesario para el uso normal del montaje, puesto que para trabajar conjuntamente con la placa DDS se precisa el concurso del reloj de bit generado en la misma. Es la parte de recepci´on la que se ha simulado con el bucle local al no disponerse de demodulador digital con el que poder “recibir” la se˜ nal de FI (frecuencia intermedia) creada por la placa DDS. En la figura 5.11, podemos observar las capturas obtenidas con el osciloscopio para los dos modos de trabajo de la placa de BER.

´ cticos 5.5 Resultados pra

143

(a)

(b)

Figura 5.11: Diagramas de se˜ nal para diversos tipos de secuencias generadas en la placa de BER (a) Ejemplo de secuencia pseudoaleatoria (b) Ejemplo de secuencia repetitiva.

5.6 Mejoras futuras

144

Para poder guardar los resultados de la prueba que se est´e realizando, la aplicaci´ on permite generar un fichero de texto con los resultados. Los datos que incluye este fichero se van a ver a continuaci´ on, y podemos decir que lo que contienen principalmente es lo que se puede ver en la pantalla principal. Un ejemplo de fichero de resultados ser´ıa el que se gener´ o al final del test en la figura 5.9: RESULTADOS DE LA PRUEBA DE MEDIDA DE TASA DE BER

Fecha del test (mes-d´ ıa-a~ no): Hora del test:

09-05-2000 21:26:47

Tipo de secuencia utilizada: Tiempo de duraci´ on programada del test: Inserci´ on de errores autom´ aticos:

2^21 - 1 5 min Ninguno

Secuencia de usuario programada: Errores insertados manualmente:

8CEF0FF0 1

Tiempo Tiempo N´ umero N´ umero

0d 0h 5m 0d 0h 5m 4048702109 1316

de duraci´ on real del test: de disponibilidad durante test: total de bits recibidos: total de bits err´ oneos:

N´ umero de segundos err´ oneos (ES): % de segundos err´ oneos (ES): N´ umero de segundos severamente err´ oneos (SES): % de segundos severamente err´ oneos (SES): N´ umero de minutos degradados (DM): % de minutos degradados (DM):

6.60 2.20 % 0 0.00 % 1 20.00 %

Tasa de bits err´ oneos (BER):

3.2504e-07

5.6.

0s 0s

Mejoras futuras

Como siempre se suele decir, una aplicaci´on nunca est´a totalmente terminada, pues seguro que se puede mejorar en un sentido u otro. En este caso podr´ıamos acometer estas mejoras tanto a nivel hardware como de programa de control, puesto que las aplicaciones y posibilidades del sistema son muy amplias. En cualquier caso, para competir con los dispositivos comerciales en el mercado se deber´ıa aumentar la flexibilidad del sistema, pues aunque puede parecer que las prestaciones son bastante amplias, los equipos comerciales tienen alguna prestaci´on a˜ nadida que les hacen ganar en utilidad. Por comentar algunas, se podr´ıan enumerar las siguientes: Generador de reloj interno. Esto hace que el equipo se pueda utilizar por s´ı solo, en vez de necesitar una fuente de reloj externa. Incluir el divisor de reloj y mejorarlo. Nos referimos al generador de reloj de bit que en nuestro dise˜ no se ha implementado dentro de la placa DDS. A su vez, mejorarlo para que permita no s´ olo la generaci´on de secuencias en modo continuo, sino que, aprovechando los hilos de control de los bloques de transmisi´on y recepci´on del DS2172, tambi´en se puedan generar secuencias aleatorias en modo r´ afaga.

5.6 Mejoras futuras

145

Esta peque˜ na modificaci´ on del sistema permitir´ıa, por ejemplo, la realizaci´on de medidas de BER en un u ´nico slot de tiempo de una trama digital de 2.048 Mbps de la jerarqu´ıa primaria europea, (se las denomina tramas E1 en la literatura t´ecnica). Por u ´ltimo, como posible mejora del programa de control mediBER, podr´ıa proponerse la configuraci´ on exterior mediante fichero y la grabaci´on autom´atica de la u ´ltima configuraci´ on antes de abandonar el programa. En este caso, no se perder´ıan los datos de configuraci´ on de la u ´ltima prueba realizada.

Ap´ endice A

El puerto paralelo del PC Dado que el m´etodo de control utilizado para gobernar todo el sistema es el puerto paralelo del PC, se realiza a continuaci´on una breve introducci´on al mismo, con el objetivo de conocer su funcionamiento y los registros de que consta, pues ser´an importantes a la hora de confeccionar las aplicaciones de control.

A.1.

Generalidades

El puerto paralelo del PC se conoce normalmente con el nombre de Centronics 1 . Aunque la idea para la que se concibi´o originalmente fue la de comunicaci´on con la impresora, las evoluciones posteriores del citado bus han ampliado su rango de aplicaci´on, y actualmente el puerto paralelo es un puerto ampliamente usado como interfaz de todo tipo de perif´ericos como scaners de sobremesa, dispositivos de backup, grabadoras de CD externas, etc. El puerto est´ a compuesto de 4 l´ıneas de control, 5 l´ıneas de estado y 8 l´ıneas de datos. Se encuentra normalmente en la parte trasera del PC con un tipo de conector hembra D25. Aunque tambi´en puede existir otro conector D25 macho, ´este ser´a un puerto serie RS-232 y por tanto, es totalmente incompatible con el primero. La tendencia actual es la de usar conectores D9 macho para los puertos serie, por lo que resulta dif´ıcil la confusi´on. Como consecuencia de la evoluci´on en el puerto paralelo se hizo necesaria una estandarizaci´ on del mismo, y as´ı se public´o la norma IEEE 1284 del a˜ no 1994, donde se definen 5 modos de operaci´ on, que son los siguientes: 1. Modo compatible 2. Modo nibble (un nibble es medio byte, 4 bits) 3. Modo byte. 4. Modo mejorado, EPP (Enhanced Paralell Port) 5. Modo extendido, ECP (Extended Capabilities Port) El objetivo era desarrollar drivers y dispositivos nuevos que fueran compatibles entre ellos y tambi´en hacia atr´ as con el Puerto Paralelo Est´andar (Standart Paralell Port). Los modos compatible, nibble y byte utilizan el hardware est´andar disponible en las tarjetas de 1

Centronics era el nombre de un fabricante de impresoras

146

A.1 Generalidades

147

puerto paralelo original, mientras que los modos EPP y ECP requieren hardware espec´ıfico que pueda correr a velocidades m´as r´apidas, siendo tambi´en compatibles hacia atr´as con el Puerto Paralelo Est´ andar SPP. El modo compatible o “modo Centronics”, como se conoce normalmente, se dise˜ n´o para enviar datos en direcci´ on de salida a una velocidad t´ıpica de 50 Kbytes por segundo, pudiendo llegar hasta los 150 Kbytes. Para recibir datos, se debe cambiar a modo nibble o modo byte. El modo nibble puede leer un nibble (4 bits) en la direcci´on inversa, es decir desde el perif´erico hacia el ordenador. El modo byte utiliza la caracter´ıstica que s´olo se encuentra en las tarjetas m´ as modernas en las que el puerto paralelo es bidireccional, de manera que se puede leer directamente un byte en la direcci´on inversa.

(a)

(b)

Figura A.1: Conexionado externo para lectura de datos en el puerto paralelo del PC (a) Conexi´on externa para lectura de datos en modo nibble (b) Conexi´on externa para lectura de datos en modo compatible.

Los otros dos modos mas avanzados, EPP y ECP, utilizan hardware adicional para generar y gestionar el protocolo de intercambio de comandos entre el PC y los perif´ericos conectados. Normalmente para enviar un byte a una impresora u otro dispositivo en el modo compatible, el software debe: 1. Escribir el dato en el puerto. 2. Comprobar si la impresora est´a ocupada. Si la impresora est´a ocupada, ´esta no aceptar´ a ning´ un dato y por tanto, cualquier dato escrito en el puerto se perder´ıa. 3. Activar el hilo de Strobe (hilo 1) a nivel bajo. Esto le indica a la impresora que hay un dato correcto en las l´ıneas de datos. (hilos 2-9). 4. Poner la l´ınea de Strobe en alto despu´es de esperar aproximadamente 5 microsegundos tras haber puesto la l´ınea de Strobe a bajo. Esto limita la velocidad a la que el puerto puede funcionar. Los puertos EPP y ECP solventan esta limitaci´on dejando al hardware chequear y ver si la impresora est´ a ocupada, generar el strobe y realizar el resto de operaciones de

A.2 Propiedades de la interfaz f´ısica

148

intercambio de protocolo adecuado, incrementando de ese modo la velocidad de transferencia. Estos puertos pueden funcionar a unas velocidades entre 1 y 2 Mbytes por segundo. El puerto ECP tambi´en tiene la ventaja de utilizar canales DMA y buffers de tipo FIFO, con lo cual los datos se pueden enviar y recibir sin utilizar instrucciones de entrada/salida.

A.2.

Propiedades de la interfaz f´ısica

En la tabla A.1 se representan los hilos del conector tipo D25 y del conector de 34 pines Centronics. El conector D25 es el conector m´as com´ un en el puerto paralelo del ordenador, mientras que el conector Centronics es el que tienen todas las impresoras. El est´andar IEEE 1284 especifica tres tipos de conectores para utilizar en el puerto paralelo. El primero, 1284 tipo A, es el conector D25 de la trasera de la mayor´ıa de los ordenadores. El segundo es el 1284 tipo B y es el conector Centronics que se encuentra en la mayor´ıa de las impresoras. El IEEE 1284 tipo C, es un conector de 36 contactos como el Centronics, pero m´as peque˜ no. Se dice de este conector que tiene mejor enganche, mejores caracter´ısticas el´ectricas y m´ as facilidad de montaje. Tiene dos pines m´as que se pueden utilizar para ver si el otro dispositivo conectado tiene alimentaci´on. Este nuevo conector se recomienda para nuevos dise˜ nos, y ser´ a cuesti´ on de esperar un tiempo para observar su grado de aceptaci´ on por parte de los fabricantes. DB 25

Centronics

Se˜ nal SPP

Direcci´on

Registro

1

1

#Strobe

Ent/Sal

Control

2

2

Datos 0

Salida

Datos

3

3

Datos 1

Salida

Datos

4

4

Datos 2

Salida

Datos

5

5

Datos 3

Salida

Datos

6

6

Datos 4

Salida

Datos

7

7

Datos 5

Salida

Datos

8

8

Datos 6

Salida

Datos

9

9

Datos 7

Salida

Datos

10

10

#Ack

Entrada

Estado

11

11

Busy

Entrada

Estado

12

12

Paper Out

Entrada

Estado

13

13

Select

Entrada

Estado

14

14

#Auto Line Feed

Ent/Sal

Control

15

32

#Error

Entrada

Estado

16

31

#Initialize

Ent/Sal

Control

17

36

#Select Printer

Ent/Sal

Control

18-25

19-30

Ground

Gnd

3

Cuadro A.1: Hilos del puerto paralelo del PC

Inv. Hardware Si

Si

Si

Si

2

A.3 Direcciones del puerto paralelo

A.3.

149

Direcciones del puerto paralelo

El puerto paralelo utiliza normalmente tres direcciones. La direcci´on base 3BCh se introdujo originalmente para puertos paralelo incorporados en las primeras tarjetas de v´ıdeo. Posteriormente desapareci´o cuando se separaron los circuitos hardware. Actualmente ha vuelto a aparecer como opci´on en los puertos paralelo integrados en las placas madre de los PC, en las que se puede cambiar su configuraci´on a trav´es de la BIOS. Normalmente LPT1 est´ a asignado a la direcci´on base 378h, mientras que LPT2 est´a asignado a la 278h. Sin embargo este puede no ser siempre el caso. Cuando el ordenador arranca, la BIOS (Basic Input/Output System) determina el n´ umero de puertos disponibles y les asigna los nombres LPT1, LPT2 . . . La BIOS busca en primer lugar en la direcci´ on 3BCh. Si ah´ı encuentra un puerto paralelo le asignar´a el nombre LPT1, y despu´es busca en la posici´ on 378h. Si tambi´en ah´ı encuentra otro puerto paralelo le asignar´a el siguiente nombre en la secuencia. Este nombre ser´a LPT1 si no se encontr´o nada en 3BCh, o LPT2 si ya se encontr´ o un puerto en la primera posici´on. Por u ´ltimo, la BIOS busca otro puerto paralelo en la direcci´on 278h siguiendo el mismo procedimiento anterior. Por lo tanto, es posible tener un LPT2 que est´e situado en la posici´on de memoria 378h y no en la 278h como se podr´ıa esperar en un primer momento. Todav´ıa se puede dar una situaci´on a´ un mas confusa, puesto que hay placas con puertos paralelo con direcciones seleccionables mediante puentes que permiten configurarlos como LPT1, LPT2, o LPT3. Entonces, ¿cu´al es la direcci´on de LPT1? Normalmente, LPT1 es la 378h, y LPT2 est´ a en la direcci´on 278h. En cualquier caso, si se quiere saber en qu´e direcci´ on de entrada-salida tiene situados la BIOS los puertos paralelo LPT1, LPT2, etc, existe una tabla donde se almacena su direcci´on, esta vez en posiciones espec´ıficas de la memoria. Estos datos se recogen en la tabla A.2. Direcci´ on Inicial

Funci´on

0000:0408

Direcci´on base de LPT1

0000:040A

Direcci´on base de LPT2

0000:040C

Direcci´on base de LPT3

0000:040E

Direcci´on base de LPT4

4

Cuadro A.2: Posiciones de la BIOS que almacenan las direcciones de I/O de LPTs

A.4.

Registros software

En la tabla A.3 se representa el puerto o registro de datos. La direcci´on base se utiliza para obtener datos de las l´ıneas de datos del puerto paralelo (hilos 2-9). Este registro es normalmente un registro de s´ olo escritura. Si se lee el registro, se deber´a obtener el u ´ltimo dato enviado. Sin embargo, los nuevos dise˜ nos hardware consiguen que este puerto sea bidireccional, pudi´endose recibir datos en direcci´on de entrada al PC. 2

Inversi´ on realizada por el hardware # Indica se˜ nal activa a nivel bajo 4 La direcci´ on 0000:040E del a ´rea de datos de las BIOS puede ser usada como a ´rea de datos de Bios extendida en las nuevas Bios 3

A.4 Registros software

150

El puerto de estado (direcci´on base +1), es un puerto de s´olo lectura. Cualquier dato que se escriba en este puerto ser´a ignorado. El puerto de estado consta de 5 l´ıneas de entrada (hilos 10, 11, 12, 13 y 15), un bit de IRQ del registro de estado, y dos bits reservados. Obs´ervese que el bit 7 (Busy) tiene inversi´on hardware. Esto quiere decir que si se lee un cero, entonces existe un nivel l´ogico alto de +5v en el pin 11. El bit #IRQ es activo a nivel bajo. Por tanto, si se lee un 1, entonces no ha ocurrido una interrupci´on.

Offset

Nombre

Base + 0

Puerto de Datos

Direcci´on Escritura

5

Bit #

Propiedades

Bit 7

Datos 7

Bit 6

Datos 6

Bit 5

Datos 5

Bit 4

Datos 4

Bit 3

Datos 3

Bit 2

Datos 2

Bit 1

Datos 1

Bit 0

Datos 0

Cuadro A.3: Puerto de datos

Offset

Nombre

Direcci´on

Bit #

Propiedades

Base + 1

Puerto de Estado

Lectura

Bit 7

Busy

Bit 6

#Ack

Bit 5

Paper Out

Bit 4

Select In

Bit 3

Error

Bit 2

IRQ (Inv. Hard.)

Bit 1

Reservado

Bit 0

Reservado

Cuadro A.4: Puerto de estado

El puerto de control (direcci´on base + 2) es un puerto pensado para ser utilizado como de s´ olo escritura. Sin embargo, s´ı que se puede utilizar como entrada. El hardware de salida de estos pines utiliza l´ ogica en “open colector”, y la mayor´ıa de las tarjetas con puertos paralelo llevan integradas las resistencias de pull-up. No obstante, es una buena medida a˜ nadir resistencias externas para asegurarnos del buen funcionamiento del puerto. Los puertos paralelo bidireccionales utilizan el pin 5 del puerto de control para habilitar-inhabilitar los drivers de salida. Un posible esquema se muestra en la figura A.2. Cuando este bit se pone a uno, los pines 2 a 9 cambian a estado de alta impedancia. Una vez en este estado, se pueden leer datos de estas l´ıneas y recuperarlas en el registro 5

Si el puerto es bidireccional, entonces se pueden realizar operaciones de lectura y escritura en el puerto de datos

A.4 Registros software

151

Offset

Nombre

Direcci´on

Bit #

Propiedades

Base + 2

Puerto de Control

Lec/Escr

Bit 7

Sin uso

Bit 6

Sin uso

Bit 5

Ena. bidir. port

Bit 4

Ena. IRQ via ACK

Bit 3

#Select Printer

Bit 2

#Initialize

Bit 1

#Auto Linefeed

Bit 0

#Strobe

Cuadro A.5: Puerto de control

de datos (direcci´ on base). En estas condiciones, cualquier dato escrito en el puerto de datos ser´ a almacenado, pero no estar´a disponible en los pines de salida. Para inhabilitar el modo bidireccional, se conecta el bit 5 del puerto de control a cero. Esta caracter´ıstica est´a u ´nicamente disponible en los puertos bidireccionales. Sin embargo, no todos los puertos paralelo se comportan de la misma manera. Otros puertos pueden requerir la activaci´on del bit 6 del puerto de control para habilitar el modo bidireccional y el bit 5 para inhibirlo. Diferentes fabricantes implementan el puerto paralelo de forma diferente. Si se quiere profundizar m´as sobre el funcionamiento del puerto paralelo del PC, existen varias p´aginas en internet con bastante informaci´on al respecto [?].

Figura A.2: Hardware interno del PC en puertos bidireccionales

´ n particular en la aplicacio ´n A.5 Utilizacio

A.5.

152

Utilizaci´ on particular en la aplicaci´ on

Precisamente para no tener problemas de compatibilidad en la interface de nuestra aplicaci´ on, se decidi´ o utilizar el puerto paralelo en el modo est´andar. En este modo, las ocho l´ıneas del bus de datos se emplean en modo escritura para colocar los datos de salida del PC, el puerto de estado en modo lectura para la adquisici´on de datos desde el exterior, y los terminales del puerto de control en modo de salida para demultiplexar los datos que se escriban en el bus. En la tabla A.6 se resumen las conexiones del puerto paralelo en nuestro sistema. Pin DB-25

Se˜ nal SPP Original

Aplicaci´on

Sentido

Registro

2

Datos 0

Datos 0

Salida

Datos

3

Datos 1

Datos 1

Salida

Datos

4

Datos 2

Datos 2

Salida

Datos

5

Datos 3

Datos 3

Salida

Datos

6

Datos 4

Datos 4

Salida

Datos

7

Datos 5

Datos 5

Salida

Datos

8

Datos 6

Datos 6

Salida

Datos

9

Datos 7

Datos 7

Salida

Datos

11

Busy

OD7

Entrada

Estado

10

#Ack

OD6

Entrada

Estado

12

Paper Out

OD5

Entrada

Estado

13

Select

OD4

Entrada

Estado

15

#Error

OD3

Entrada

Estado

17

#Select Printer

LATCH3

Salida

Control

16

#Inicialize

LATCH2

Salida

Control

14

#Auto Line Feed

LATCH1

Salida

Control

Si

LATCH0

Salida

Control

Si

Gnd

Gnd

1 18-25

#Strobe Ground

7

Inv. Hardware

6

Si

Si

Cuadro A.6: Puerto paralelo en la aplicaci´on

Los ocho hilos de datos constituyen el bus de salida desde el PC. En ellos se colocan datos v´ alidos que se cargar´ an en los diferentes registros de las placas de la aplicaci´on. Los hilos del registro de estado aqu´ı los denominaremos como OD7 a OD3, y se utilizan para la lectura de datos desde las tarjetas del montaje. Los hilos OD7 a OD4 se emplean en la tarjeta de BER para leer los bytes nibble a nibble (de cuatro en cuatro bits). El hilo OD3 se utiliza con la placa de modulaci´on DDS, ley´endose desde esa tarjeta los datos de entrada bit a bit. Esta selecci´ on no se ha hecho de forma caprichosa, sino que, como se ha podido comprobar, ha venido impuesta por la construcci´on hardware de los integrados utilizados en la pr´ actica. 6 7

Invertida por el hardware Se˜ nal activa a nivel bajo

´ n particular en la aplicacio ´n A.5 Utilizacio

153

Para terminar, los hilos de control son cuatro, LATH3 a LATH0, y se emplean en la carga y demultiplexaci´ on de los hilos de datos. LATCH3 y LATCH2 son los hilos de selecci´ on de registro dentro de cada tarjeta. LATCH1 carga el contenido del bus de datos en el registro seleccionado de la placa DDS, y LATCH0 realiza la misma funci´on pero en este caso con la tarjeta de BER. Estos dos u ´ltimos hilos realizan la funci´on de terminales de selecci´ on de tarjeta. En la figura A.3 se representa esquem´aticamente la conexi´on del puerto paralelo en nuestra aplicaci´on.

Figura A.3: Utilizaci´ on particular del puerto paralelo en nuestra aplicaci´on

Ap´ endice B

Fotograf´ıas del montaje Hasta aqu´ı hemos hablado de la composici´on interna de las placas de modulaci´ on DDS y de la placa BER de generaci´on de secuencias pseudoaleatorias. Nos falta mostrar el soporte necesario que hace que todo el conjunto sea manejable. Ambos circuitos impresos se han montado conjuntamente en un chasis de aluminio que se puede ver en la figura B.1 donde se han mecanizado todos los conectores de acceso a los circuitos. La figura B.2 es una vista interior. La placa DDS va montada sobre la placa de BER, pero en la fotograf´ıa se ha colocado fuera para poder observar el aspecto de ambas. Tambi´en se ha indicado en las figuras B.3 y B.4 la funci´on de los diferentes conectores accesibles al usuario.

154

155

Figura B.1: Vista general del montaje que contiene las placas DDS y BER

Figura B.2: Vista interior donde se pueden distinguir las dos placas

156

Figura B.3: Lateral del chasis donde se pueden observar el conector de salida de IF y los interfaces de datos de las dos placas

Pin 1

Funci´ on

Pin

Sin conexi´ on

6

Funci´on Entrada externa de habilitaci´on de transmisi´on

2

Entrada serie de datos

7

Sin conexi´on

3

Masa

8

Salida de reloj de bit interno

4

Entrada de OL externo

9

Masa

5

Masa

10

Salida de Reset

Cuadro B.1: Conector de interface de la placa DDS

Pin

Funci´ on

Pin

Funci´on

1

Entrada de datos Rx

6

Sin conexi´on

2

Salida de datos Tx

7

Entrada de reloj de recepci´on

3

Entrada de se˜ nal de inhabilitaci´on

8

Entrada de reloj de transmisi´on

de recepci´ on 4

Sin conexi´ on

9

Masa

5

Entrada de se˜ nal de inhabilitaci´on

10

Sin conexi´on

de transmisi´ on Cuadro B.2: Conector de interface de la placa BER

157

Figura B.4: Lateral del chasis que contiene los conectores de control y alimentaci´on

Pin DB-25

Se˜ nal SPP Original

Aplicaci´on

Sentido

Registro

2

Datos 0

Datos 0

Salida

Datos

3

Datos 1

Datos 1

Salida

Datos

4

Datos 2

Datos 2

Salida

Datos

5

Datos 3

Datos 3

Salida

Datos

6

Datos 4

Datos 4

Salida

Datos

7

Datos 5

Datos 5

Salida

Datos

8

Datos 6

Datos 6

Salida

Datos

9

Datos 7

Datos 7

Salida

Datos

11

Busy

OD7

Entrada

Estado

10

#Ack

OD6

Entrada

Estado

12

Paper Out

OD5

Entrada

Estado

13

Select

OD4

Entrada

Estado

15

#Error

OD3

Entrada

Estado

17

#Select Printer

LATCH3

Salida

Control

16

#Inicialize

LATCH2

Salida

Control

14

#Auto Line Feed

LATCH1

Salida

Control

Si

LATCH0

Salida

Control

Si

Gnd

Gnd

1 18-25

#Strobe

2

Ground

Cuadro B.3: Pines del conector al puerto paralelo

Pin

Funci´on

Tip

+12 voltios DC

Ring

Masa

Cuadro B.4: Conector de alimentaci´on

Inv. Hardware

Si

Si

1

Ap´ endice C

Listados fuente En este apartado se incluyen los listados fuentes de las dos aplicaci´on de control desarrolladas, modulAD para la placa de modulaci´on DDS y mediBER para la placa de BER, junto con los ficheros de comandos de Matlab utilizados en la simulaci´on de los distintos bloques del modulador DDS AD9853.

C.1.

Aplicaci´ on modulAD

Ficheros mod.c y mod hard.c /**************************************************************************** MODULO: Aplicacion principal de control de placa del MODULADOR AD9853 FICHERO: mod.c VERSION: 1.0 ----------------------------------------------------------------------------AUTOR: Juan Luis [email protected] FECHA: Abril-2000 ----------------------------------------------------------------------------DESCRIPCION: ****************************************************************************/ #include // Needed if linking in external compiler; harmless //otherwise #include <userint.h> #include #include #include #include "mod_def.h" // Defines para todo el proyecto #include "mod.h" // Controles del panel #include "dlportio.h" // Interfaz para acceder al hardware desde windows #include "mod_hard.h" // Contiene las funciones hardware para programar // la placa del modulador AD9853 mediante el puerto // paralelo

//DEFINICIONES DE TIPOS //DECLARACION DE FUNCIONES void inicializa(int inic); //VARIABLES GLOBALES // Del m´ odulo de funciones hardware extern double esc, esc_old; // Propias // Gestion de paneles static int panel_conf, panel_fir, panel_frec, panel_principal, panel_scr, panel_vel, err; char puerto_control; // caracteres reservados para el env´ ıo de par´ ametros a los registros del modem

158

´ n modulAD C.1 Aplicacio

unsigned char control_modem[74]; unsigned char inicio; // registros del puerto paralelo unsigned long pp_datos; //Normalmente s´ olo escritura unsigned long pp_estado; //lectura unsigned long pp_control; //lectura y escritura con lineas f´ ısicas en "open colector" // Bytes utilizados para la comunicaci´ on con el modulador. Se especifican como // global al tenerlos que utilizar para la programaci´ on del generador de // reloj de bit, as´ ı como para controlar el modulador unsigned char byte_bajo, byte_alto; // Comprobaci´ on de la existencia f´ ısica de la placa char hay_placa_mod, primer_bucle; int main (int argc, char *argv[]) { /* Needed if linking in external compiler; harmless otherwise */ if (InitCVIRTE (0, argv, 0) == 0) return -1; /* out of memory */ // Inicializaci´ on de las variables de control del modem byte_bajo = 0x0; byte_alto = 0xE8; // Carga de paneles previa a la inicializaci´ on de variables if ((panel_principal = LoadPanel (0, "mod.uir", PANEL_MOD)) < 0) return -1; if ((panel_conf = LoadPanel (0, "mod.uir", PANEL_CONF)) < 0) return -1; if ((panel_frec = LoadPanel (0, "mod.uir", PANEL_FREC)) < 0) return -1; if ((panel_vel = LoadPanel (0, "mod.uir", PANEL_VEL)) < 0) return -1; if ((panel_scr = LoadPanel (0, "mod.uir", PANEL_SCR)) < 0) return -1; if ((panel_fir = LoadPanel (0, "mod.uir", PANEL_FIR)) < 0) return -1; // Consideramos que la placa est´ a correctamente conectada en principio hay_placa_mod = SI; primer_bucle = SI; // Inicializaci´ on inicio = SI; // Utilizamos el puerto paralelo LPT1 puerto_control = 1; inicializa(SI); inicio = NO; // Arranque de la presentaci´ on DisplayPanel (panel_principal); RunUserInterface (); // Puerto paralelo a alta impedancia si es bidireccional inicio=DlPortReadPortUchar(pp_control); inicio = inicio | 0x20; DlPortWritePortUchar(pp_control, inicio); return 0; } /**************************************************************************** DESCRIPCION DE LAS FUNCIONES ****************************************************************************/ /**************************************************************************** FUNCION: inicializa DESCRIPCION: Realiza la secuencia de inicializaci´ on de la aplicaci´ on

159

´ n modulAD C.1 Aplicacio

160

PARAMETROS DE ENTRADA: PARAMETROS DE SALIDA: RESULTADO Y ERRORES: OBSERVACIONES: ****************************************************************************/ void inicializa(int inic) { unsigned short byte; // Selecci´ on del puerto paralelo de control if (puerto_control==1) { //pp_datos==LPT1; err = ReadFromPhysicalMemory (0x00000408, &pp_datos, err = ReadFromPhysicalMemory (0x00000409, &byte, 1); byte= byte << 8; pp_datos = pp_datos | byte; } else if (puerto_control==2) { //pp_datos==LPT2; err = ReadFromPhysicalMemory (0x0000040A, &pp_datos, err = ReadFromPhysicalMemory (0x0000040B, &byte, 1); byte= byte << 8; pp_datos = pp_datos | byte; } else if (puerto_control==3) { //pp_datos==LPT3; err = ReadFromPhysicalMemory (0x0000040C, &pp_datos, err = ReadFromPhysicalMemory (0x0000040D, &byte, 1); byte= byte << 8; pp_datos = pp_datos | byte; } else if (puerto_control==4) { //pp_datos==LPT4; err = ReadFromPhysicalMemory (0x0000040E, &pp_datos, err = ReadFromPhysicalMemory (0x0000040F, &byte, 1); byte= byte << 8; pp_datos = pp_datos | byte; } pp_estado=pp_datos+1; pp_control=pp_datos+2;

1);

1);

1);

1);

// Inicializaci´ on del puerto paralelo // Modificaci´ on para funcionamiento con puertos bidireccionales byte=0x0; byte=DlPortReadPortUchar(pp_control); byte = byte & 0xDF; DlPortWritePortUchar(pp_control, byte); byte=0x0; DlPortWritePortUchar(pp_datos, byte); byte=DlPortReadPortUchar(pp_estado); byte=DlPortReadPortUchar(pp_control); //byte=byte & 0xF0; byte=byte & 0xD0; byte=byte | 0x8; DlPortWritePortUchar(pp_control, byte); // Inicializaci´ on de variables inicia_hard(); // Inicializaci´ on de par´ ametro de escalado en modulador esc = 1; // Programaci´ on del harware. // Se sigue la secuencia de inicializaci´ on indicada en el manual del integrado // AD9853 pag. 14 desactiva_txe(); reset_9853(); // Entorno y env´ ıo de comandos de programaci´ on al modem PulsaMod (panel_principal, PANEL_MOD_PULSA_MOD, EVENT_COMMIT, 0, 0, 0); TipoScrambler (panel_conf, PANEL_CONF_TIPO_SCRAMBLER, EVENT_COMMIT, 0, 0, 0); SwitchSpectrum (panel_conf, PANEL_CONF_SWITCH_SPECTRUM, EVENT_COMMIT, 0, 0, 0); if (inic) SwitchDac (panel_conf, PANEL_CONF_SWITCH_DAC, EVENT_COMMIT, 0, 0, 0); // Esta incluye a las dos siguientes que se han anulado

´ n modulAD C.1 Aplicacio

// // //

//

ValorFrecRef (panel_conf, PANEL_CONF_VALOR_FREC_REF, EVENT_COMMIT, 0, 0, 0); ValorFrecMarca (panel_frec, PANEL_CONF_VALOR_FREC_MARCA, EVENT_COMMIT, 0, 0, 0); ValorFrec (panel_frec, PANEL_FREC_VALOR_FREC, EVENT_COMMIT, 0, 0, 0); // La siguiente funci´ on anulada est´ a inclu´ ıda en PulsaMod PulsaCodDif (panel_scr, PANEL_SCR_PULSA_COD_DIF, EVENT_COMMIT, 0, 0, 0); PulsaScr (panel_scr, PANEL_SCR_PULSA_SCR, EVENT_COMMIT, 0, 0, 0); ValorDiv (panel_vel, PANEL_VEL_VALOR_DIV, EVENT_COMMIT, 0, 0, 0); // El efecto de la siguiente en la inicializaci´ on se consigue con la anterior PulDiv2 (panel_vel, PANEL_VEL_PUL_DIV_2, EVENT_COMMIT, 0, 0, 0); ValorFirA0(panel_fir, PANEL_FIR_VALOR_FIR_A0, EVENT_COMMIT, 0, 0, 0); ValorFirA1(panel_fir, PANEL_FIR_VALOR_FIR_A1, EVENT_COMMIT, 0, 0, 0); ValorFirA2(panel_fir, PANEL_FIR_VALOR_FIR_A2, EVENT_COMMIT, 0, 0, 0); ValorFirA3(panel_fir, PANEL_FIR_VALOR_FIR_A3, EVENT_COMMIT, 0, 0, 0); ValorFirA4(panel_fir, PANEL_FIR_VALOR_FIR_A4, EVENT_COMMIT, 0, 0, 0); ValorFirA5(panel_fir, PANEL_FIR_VALOR_FIR_A5, EVENT_COMMIT, 0, 0, 0); ValorFirA6(panel_fir, PANEL_FIR_VALOR_FIR_A6, EVENT_COMMIT, 0, 0, 0); ValorFirA7(panel_fir, PANEL_FIR_VALOR_FIR_A7, EVENT_COMMIT, 0, 0, 0); ValorFirA8(panel_fir, PANEL_FIR_VALOR_FIR_A8, EVENT_COMMIT, 0, 0, 0); ValorFirA9(panel_fir, PANEL_FIR_VALOR_FIR_A9, EVENT_COMMIT, 0, 0, 0); ValorFirA10(panel_fir, PANEL_FIR_VALOR_FIR_A10, EVENT_COMMIT, 0, 0, 0); ValorFirA11(panel_fir, PANEL_FIR_VALOR_FIR_A11, EVENT_COMMIT, 0, 0, 0); ValorFirA12(panel_fir, PANEL_FIR_VALOR_FIR_A12, EVENT_COMMIT, 0, 0, 0); ValorFirA13(panel_fir, PANEL_FIR_VALOR_FIR_A13, EVENT_COMMIT, 0, 0, 0); ValorFirA14(panel_fir, PANEL_FIR_VALOR_FIR_A14, EVENT_COMMIT, 0, 0, 0); ValorFirA15(panel_fir, PANEL_FIR_VALOR_FIR_A15, EVENT_COMMIT, 0, 0, 0); ValorFirA16(panel_fir, PANEL_FIR_VALOR_FIR_A16, EVENT_COMMIT, 0, 0, 0); ValorFirA17(panel_fir, PANEL_FIR_VALOR_FIR_A17, EVENT_COMMIT, 0, 0, 0); ValorFirA18(panel_fir, PANEL_FIR_VALOR_FIR_A18, EVENT_COMMIT, 0, 0, 0); ValorFirA19(panel_fir, PANEL_FIR_VALOR_FIR_A19, EVENT_COMMIT, 0, 0, 0); ValorFirA20(panel_fir, PANEL_FIR_VALOR_FIR_A20, EVENT_COMMIT, 0, 0, 0); reset_9853(); prog_hard(CONF, 1); reset_9853(); prog_hard(RS_k, 0x49); // Incluye CONF prog_hard(GCB, 1); // Se activa el funcionamiento activa_txe();

}

/**************************************************************************** FUNCIONES CVICALLBACK ****************************************************************************/ /**************************************************************************** FUNCION: PulsaFrec DESCRIPCION: Muestra el panel donde se programa la frecuencia de salida del modulador PARAMETROS DE ENTRADA: Los usuales en una funci´ on callback PARAMETROS DE SALIDA: RESULTADO Y ERRORES: Entero 0, todo OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK PulsaFrec (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static char panel_visible; switch (event) { case EVENT_COMMIT: if (panel_visible) { HidePanel(panel_frec); panel_visible = NO; } else { DisplayPanel (panel_frec); panel_visible = SI; } break;

161

´ n modulAD C.1 Aplicacio

case EVENT_RIGHT_CLICK: break; } return 0; } /**************************************************************************** FUNCION: PulsaFec DESCRIPCION: Muestra el panel donde se programan la habilitaci´ on o no del aleatorizador y del codificador diferencial del modulador PARAMETROS DE ENTRADA: Los usuales en una funci´ on callback PARAMETROS DE SALIDA: RESULTADO Y ERRORES: Entero 0, todo OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK PulsaFec (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static char panel_visible; switch (event) { case EVENT_COMMIT: if (panel_visible) { HidePanel(panel_scr); panel_visible = NO; } else { DisplayPanel (panel_scr); panel_visible = SI; } break; case EVENT_RIGHT_CLICK: break; } return 0; } /**************************************************************************** FUNCION: PulsaVel DESCRIPCION: Muestra el panel donde se programa el reloj de bit PARAMETROS DE ENTRADA: Los t´ ıpicos de las funciones callback PARAMETROS DE SALIDA: RESULTADO Y ERRORES: Entero 0, todo OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK PulsaVel (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static char panel_visible; switch (event) { case EVENT_COMMIT: if (panel_visible) { HidePanel(panel_vel); panel_visible = NO; } else { DisplayPanel (panel_vel); panel_visible = SI; } break; case EVENT_RIGHT_CLICK: break; } return 0; } /****************************************************************************

162

´ n modulAD C.1 Aplicacio

FUNCION: PulsaFir DESCRIPCION: Ense~ na la pantalla donde se programan los coeficientes del filtro FIR integrado dentro del modulador PARAMETROS DE ENTRADA: Es una funci´ on callback PARAMETROS DE SALIDA: RESULTADO Y ERRORES: Entero 0, todo OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK PulsaFir (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static char panel_visible; switch (event) { case EVENT_COMMIT: if (panel_visible) { HidePanel(panel_fir); panel_visible = NO; } else { DisplayPanel (panel_fir); panel_visible = SI; } break; case EVENT_RIGHT_CLICK: break; } return 0; } /**************************************************************************** FUNCION: PulsaConf DESCRIPCION: Activa el panel donde se cambian otros par´ ametros de configuraci´ on. PARAMETROS DE ENTRADA: Los de las funciones callback PARAMETROS DE SALIDA: RESULTADO Y ERRORES: Entero 0, todo OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK PulsaConf (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static char panel_visible; switch (event) { case EVENT_COMMIT: if (panel_visible) { HidePanel(panel_conf); panel_visible = NO; } else { DisplayPanel (panel_conf); panel_visible = SI; } break; case EVENT_RIGHT_CLICK: MessagePopup ("Otros par´ ametros de Configuraci´ on", "Provoca la visualizaci´ on de otra pantalla donde cambiar \n" " la configuraci´ on de otros par´ ametros del modem."); break; } return 0; } /**************************************************************************** FUNCION: Salida DESCRIPCION: Cierra la aplicaci´ on PARAMETROS DE ENTRADA: Funci´ on callback

163

´ n modulAD C.1 Aplicacio

PARAMETROS DE SALIDA: RESULTADO Y ERRORES: Entero 0, todo OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK Salida (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: QuitUserInterface (0); break; case EVENT_RIGHT_CLICK: MessagePopup ("Bot´ on \"SALIDA\"", " Salida del programa."); break; } return 0; } /**************************************************************************** FUNCION: PulsaMod DESCRIPCION: Cambia el tipo de modulaci´ on con el que se modulan los datos de entrada. Los tipos de modulaci´ on implementados en el modulador AD9853 son FSK, QPSK y 16QAM. PARAMETROS DE ENTRADA: T´ ıpicos de funciones callback PARAMETROS DE SALIDA: RESULTADO Y ERRORES: Entero 0, todo OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK PulsaMod (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static int div_var, div_fijo, tipo_mod, factor_div, overfl; static char txt_modo[7], modulacion, cod_dif; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_principal, PANEL_MOD_PULSA_MOD, &tipo_mod); err = GetCtrlVal (panel_vel, PANEL_VEL_VALOR_DIV, &div_var); err = GetCtrlVal (panel_vel, PANEL_VEL_PUL_DIV_2, &div_fijo); // C´ alculo del factor de divisi´ on total if (div_fijo==SI) factor_div=div_var * 2; else factor_div=div_var; overfl=NO; switch (tipo_mod) { case 0: //FSK strcpy(txt_modo, "FSK"); modulacion = FSK; // control_modem[MODO_MOD] = 0x80; control_modem[MODO_MOD] = control_modem[MODO_MOD] & 0x3F; control_modem[MODO_MOD] = control_modem[MODO_MOD] | 0x80; err = SetCtrlAttribute (panel_vel, PANEL_VEL_VALOR_DIV, ATTR_MAX_VALUE, 2047); break; case 1: //QPSK strcpy(txt_modo, "QPSK"); modulacion = QPSK; control_modem[MODO_MOD] = control_modem[MODO_MOD] & 0x3F; // Control de que no nos pasamos de factor de divisi´ on if (factor_div > 651 ) { if (div_fijo) err = SetCtrlVal (panel_vel, PANEL_VEL_VALOR_DIV, 325); else err = SetCtrlVal (panel_vel, PANEL_VEL_VALOR_DIV, 651); err = GetCtrlVal (panel_vel, PANEL_VEL_VALOR_DIV, &div_var); overfl=SI; } err = SetCtrlAttribute (panel_vel, PANEL_VEL_VALOR_DIV,

164

´ n modulAD C.1 Aplicacio

ATTR_MAX_VALUE, 651); break; case 3: //16QAM strcpy(txt_modo, "16QAM"); modulacion = _16QAM; control_modem[MODO_MOD] = control_modem[MODO_MOD] & 0x3F; control_modem[MODO_MOD] = control_modem[MODO_MOD] | 0x40; // Control de que no nos pasamos de factor de divisi´ on if (factor_div > 325 ) { if (div_fijo) err = SetCtrlVal (panel_vel, PANEL_VEL_VALOR_DIV, 162); else err = SetCtrlVal (panel_vel, PANEL_VEL_VALOR_DIV, 325); err = GetCtrlVal (panel_vel, PANEL_VEL_VALOR_DIV, &div_var); overfl=SI; } err = SetCtrlAttribute (panel_vel, PANEL_VEL_VALOR_DIV, ATTR_MAX_VALUE, 325); break; } // Se ha de actualizar el registro dependiendo de la codificaci´ on diferencial PulsaCodDif (panel_scr, PANEL_SCR_PULSA_COD_DIF, EVENT_COMMIT, 0, 0, 0); if (overfl) { switch (tipo_mod) { case 1: MessagePopup ("Error al cambiar el tipo de modulaci´ on", "Se super´ o el valor m´ aximo de divisi´ on en QPSK.\n" "Ajustado el divisor variable al m´ aximo valor permitido."); break; case 3: MessagePopup ("Error al cambiar el tipo de modulaci´ on", "Se super´ o el valor m´ aximo de divisi´ on en 16QAM.\n" "Ajustado el divisor variable al m´ aximo valor permitido."); break; default: break; } } // Si se di´ o error con el factor de divisi´ on, se cambia el valor del divisor // ahora se ejecuta en el hardware ValorDiv (panel_vel, PANEL_VEL_VALOR_DIV, EVENT_COMMIT, 0, 0, 0); // Programaci´ on del hardware prog_hard(MODO_MOD, 1); // Entorno gr´ afico err = SetCtrlVal (panel_principal, PANEL_MOD_TEXT_MOD_VAL, txt_modo); break; case EVENT_RIGHT_CLICK: break; } return 0; } /**************************************************************************** FUNCION: TipoScrambler DESCRIPCION: Permite la selecci´ on del tipo de aleatorizador utilizado, programando a continuaci´ on el registro adecuado PARAMETROS DE ENTRADA: Los t´ ıpicos de las funciones callback. PARAMETROS DE SALIDA: RESULTADO Y ERRORES: Entero 0, todo OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK TipoScrambler (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { char tipo_scr; switch (event) {

165

´ n modulAD C.1 Aplicacio

case EVENT_COMMIT: err = GetCtrlVal (panel_conf, PANEL_CONF_TIPO_SCRAMBLER, &tipo_scr); switch (tipo_scr) { case 0: control_modem[RS_t] = control_modem[RS_t] & 0xFD; break; case 1: control_modem[RS_t] = control_modem[RS_t] | 0x02; break; } // Programaci´ on del hardware prog_hard(RS_t, 1); break; case EVENT_RIGHT_CLICK: break; } return 0; } /**************************************************************************** FUNCION: SwitchSpectrum DESCRIPCION: Actualiza la variable de selecci´ on del espectro de salida, programando el registro implicado. PARAMETROS DE ENTRADA: Los t´ ıpicos de una callback. PARAMETROS DE SALIDA: RESULTADO Y ERRORES: Entero 0, todo OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK SwitchSpectrum (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static char espectro; switch (event) { case EVENT_COMMIT: // Selecci´ on del espectro de salida err = GetCtrlVal (panel_conf, PANEL_CONF_SWITCH_SPECTRUM, &espectro); if (espectro == NORMAL) control_modem[CONF] = control_modem[CONF] | 0x80; else control_modem[CONF] = control_modem[CONF] & 0x7F; // Programaci´ on del hardware prog_hard(CONF, 1); break; case EVENT_RIGHT_CLICK: MessagePopup ("Espectro de salida", "Selecci´ on del espectro: Normal Icos - Qsen; Invertido Icos + Qsen."); break; } return 0; } /**************************************************************************** FUNCION: SwitchDac DESCRIPCION: Permite activar o poner en modo shutdown el AD9853 PARAMETROS DE ENTRADA: PARAMETROS DE SALIDA: RESULTADO Y ERRORES: Entero 0, todo OK OBSERVACIONES: Ahorra energ´ ıa cuando no se necesita la se~ nal de salida ****************************************************************************/ int CVICALLBACK SwitchDac (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static char rf_sleep; switch (event) { case EVENT_COMMIT: // Modo de funcionamiento del DAC de salida

166

´ n modulAD C.1 Aplicacio

167

err = GetCtrlVal (panel_conf, PANEL_CONF_SWITCH_DAC, &rf_sleep); if (rf_sleep) { control_modem[CONF] = control_modem[CONF] & 0x87; control_modem[CONF] = control_modem[CONF] | 0x58; // Programaci´ on del hardware prog_hard(CONF, 1); } else { control_modem[CONF] = control_modem[CONF] & 0x87; control_modem[CONF] = control_modem[CONF] | 0x20; // Programaci´ on del hardware inicio = SI; inicializa(NO); //El "NO" evita la entrada en bucle inicio = NO; } break; case EVENT_RIGHT_CLICK: break; } return 0; } /**************************************************************************** FUNCION: ValorFrecRef DESCRIPCION: Actualiza la presentaci´ on de la velocidad de datos y de la frecuencia de referencia como consecuencia de una modificaci´ on de esta ´ ultima. PARAMETROS DE ENTRADA: Los corrientes de una funci´ on callback PARAMETROS DE SALIDA: RESULTADO Y ERRORES: 0, OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK ValorFrecRef (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static double frec_ref; switch (event) { case EVENT_COMMIT: // Obtenemos la nueva frecuencia de referencia err = GetCtrlVal (panel_conf, PANEL_CONF_VALOR_FREC_REF, &frec_ref); // Reprogramaci´ on de los registros de frecuencia seg´ un la nueva frecuencia de ref. ValorFrecMarca (panel_frec, PANEL_FREC_VALOR_FREC_MARCA, EVENT_COMMIT, 0, 0, 0); ValorFrec (panel_frec, PANEL_FREC_VALOR_FREC, EVENT_COMMIT, 0, 0, 0); ValorDiv (panel_vel, PANEL_VEL_VALOR_DIV, EVENT_COMMIT, 0, 0, 0); // Entorno gr´ afico en el panel informativo err = SetCtrlVal (panel_vel, PANEL_VEL_VALOR_FREC_REF, frec_ref); break; case EVENT_RIGHT_CLICK: MessagePopup ("Frecuencia de Referencia", "Este valor se debe actualizar adecuadamente cada vez que se cambie\n" "el cristal de referencia de la placa del modem, o se utilize una frecuencia\n" " de referencia externa distinta."); break; } return 0; } /**************************************************************************** FUNCION: ValorFrecMarca DESCRIPCION: Calcula el valor a programar en el registro de frecuencia secundario utilizado en FSK, y carga el registro con el contenido

´ n modulAD C.1 Aplicacio

adecuado. PARAMETROS DE ENTRADA: Los t´ ıpicos de las funciones callback. PARAMETROS DE SALIDA: RESULTADO Y ERRORES: Entero 0, todo OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK ValorFrecMarca (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static double frec_marca, frec_ref; switch (event) { case EVENT_COMMIT: // Obtenemos la nueva frecuencia de referencia err = GetCtrlVal (panel_frec, PANEL_FREC_VALOR_FREC_MARCA, &frec_marca); err = GetCtrlVal (panel_conf, PANEL_CONF_VALOR_FREC_REF, &frec_ref); // Carga del hardware frec_32 (frec_marca, NRO_BITS, F1_0, frec_ref); prog_hard(F1_0, 4); break; case EVENT_RIGHT_CLICK: break; } return 0; } /**************************************************************************** FUNCION: ValorFrec DESCRIPCION: Calcula el valor a programar en el registro de frecuencia y carga el registro con el contenido adecuado. PARAMETROS DE ENTRADA: Los t´ ıpicos de las funciones callback. PARAMETROS DE SALIDA: RESULTADO Y ERRORES: Entero 0, todo OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK ValorFrec (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static double frec_sal, frec_ref; static char txt_frec_sal[50]; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_frec, PANEL_FREC_VALOR_FREC, &frec_sal); err = GetCtrlVal (panel_conf, PANEL_CONF_VALOR_FREC_REF, &frec_ref); // Entorno gr´ afico Fmt (txt_frec_sal, "%s<%f[w14p4]", frec_sal); if (hay_placa_mod) err = SetCtrlVal (panel_principal, PANEL_MOD_TEXT_FREC_VAL, txt_frec_sal); // Carga del hardware frec_32 (frec_sal, NRO_BITS, F0_0, frec_ref); prog_hard(F0_0, 4); break; case EVENT_RIGHT_CLICK: break; } return 0; } /**************************************************************************** FUNCION: PulsaCodDif DESCRIPCION: Permite habilitar / deshabilitar el codificador diferencial PARAMETROS DE ENTRADA: Los t´ ıpicos de las funciones callback. PARAMETROS DE SALIDA: RESULTADO Y ERRORES: Entero 0, todo OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK PulsaCodDif (int panel, int control, int event,

168

´ n modulAD C.1 Aplicacio

169

void *callbackData, int eventData1, int eventData2) { static char txt_cod[4], cod_dif; static int tipo_mod; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_scr, PANEL_SCR_PULSA_COD_DIF, &cod_dif); err = GetCtrlVal (panel_principal, PANEL_MOD_PULSA_MOD, &tipo_mod); switch (cod_dif) { case 0: strcpy(txt_cod, "OFF"); switch (tipo_mod) { case 0: break; //FSK default: control_modem[MODO_MOD] = control_modem[MODO_MOD] & 0xC0; break; //QPSK } break; case 1: strcpy(txt_cod, "ON"); switch (tipo_mod) { case 0: break; //FSK default: control_modem[MODO_MOD] = control_modem[MODO_MOD] | 0x20; break; // DQPSK } break; } // Programaci´ on del hardware prog_hard(MODO_MOD, 1); // Entorno gr´ afico if (hay_placa_mod) err = SetCtrlVal (panel_principal, PANEL_MOD_TEXT_COD_VAL, txt_cod); break; case EVENT_RIGHT_CLICK: break; } return 0; } /**************************************************************************** FUNCION: PulsaScr DESCRIPCION: Permite habilitar / deshabilitar el aleatorizador (scrambler), programando a continuaci´ on el registro del chip implicado PARAMETROS DE ENTRADA: Los t´ ıpicos de las funciones callback. PARAMETROS DE SALIDA: RESULTADO Y ERRORES: Entero 0, todo OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK PulsaScr (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static char txt_scr[4], scr; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_scr, PANEL_SCR_PULSA_SCR, &scr); switch (scr) { case 0: strcpy(txt_scr, "OFF"); control_modem[RS_t] = control_modem[RS_t] | 0x04; break; case 1: strcpy(txt_scr, "ON"); control_modem[RS_t] = control_modem[RS_t] & 0xFB; break; } if (hay_placa_mod) err = SetCtrlVal (panel_principal, PANEL_MOD_TEXT_SCR_VAL, txt_scr); // Programaci´ on del hardware prog_hard(RS_t, 1);

´ n modulAD C.1 Aplicacio

170

break; case EVENT_RIGHT_CLICK: break; } return 0; } /**************************************************************************** FUNCION: ValorDiv DESCRIPCION: Permite cambiar el valor del divisor principal para generar la frecuencia de bit. A continuaci´ on carga en la placa del modulador los datos adecuados. PARAMETROS DE ENTRADA: PARAMETROS DE SALIDA: RESULTADO Y ERRORES: 0, OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK ValorDiv (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static double frec_ref, dato_clock; static int div_var, div_fijo, tipo_mod, factor_I1I2; static char txt_vel_datos[50], modulacion; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_vel, PANEL_VEL_VALOR_DIV, &div_var); // Dem´ as par´ ametros necesarios para configurar el modem a las nuevas condiciones err = GetCtrlVal (panel_conf, PANEL_CONF_VALOR_FREC_REF, &frec_ref); err = GetCtrlVal (panel_vel, PANEL_VEL_PUL_DIV_2, &div_fijo); err = GetCtrlVal (panel_principal, PANEL_MOD_PULSA_MOD, &tipo_mod); switch (tipo_mod) { case 0: modulacion = FSK; case 1: modulacion = QPSK; case 3: modulacion = _16QAM; default: modulacion = FSK; }

break; break; break;

// Al cambiar el reloj de bit, cambia el factor de interpolaci´ on err = interpolador (&div_var, div_fijo, modulacion); SetCtrlVal (panel_vel, PANEL_VEL_VALOR_DIV, div_var); switch (err) { /* -1 N´ umero resultante es primo "para los interpoladores" y por tanto corresponde a un factor de interpolaci´ on total no v´ alido -2 El tipo de modulaci´ on es FSK. En este caso la funci´ on no tiene ning´ un efecto. -3 El tipo de modulaci´ on es QPSK y el valor de divisi´ on total es mayor de 651. -4 El tipo de modulaci´ on es 16QAM y el valor de divisi´ on total es mayor de 325. */ case -1: MessagePopup ("Error al cambiar la velocidad de transmisi´ on", "El comando de divisi´ on es un valor no permitido.\n" "Ajustado el factor de divisi´ on total por defecto."); break; case -3: MessagePopup ("Error al cambiar la velocidad de transmisi´ on", "Se super´ o el valor m´ aximo de divisi´ on permitido en QPSK.\n" "Ajustado el divisor variable al valor m´ aximo permitido."); break; case -4: MessagePopup ("Error al cambiar la velocidad de transmisi´ on", "Se super´ o el valor m´ aximo de divisi´ on permitido en 16QAM.\n" "Ajustado el divisor variable al valor m´ aximo permitido."); break; }

´ n modulAD C.1 Aplicacio

171

// Programaci´ on del generador de reloj de bit dato_clock = gen_bit_clk (div_var, div_fijo, frec_ref); // Al cambiar la interpolaci´ on, tambi´ en lo hace el factor de escalado, // con lo que se vuelven a programar los coeficientes FIR ValorFirA0(panel_fir, PANEL_FIR_VALOR_FIR_A0, EVENT_COMMIT, 0, 0, 0); ValorFirA1(panel_fir, PANEL_FIR_VALOR_FIR_A1, EVENT_COMMIT, 0, 0, 0); ValorFirA2(panel_fir, PANEL_FIR_VALOR_FIR_A2, EVENT_COMMIT, 0, 0, 0); ValorFirA3(panel_fir, PANEL_FIR_VALOR_FIR_A3, EVENT_COMMIT, 0, 0, 0); ValorFirA4(panel_fir, PANEL_FIR_VALOR_FIR_A4, EVENT_COMMIT, 0, 0, 0); ValorFirA5(panel_fir, PANEL_FIR_VALOR_FIR_A5, EVENT_COMMIT, 0, 0, 0); ValorFirA6(panel_fir, PANEL_FIR_VALOR_FIR_A6, EVENT_COMMIT, 0, 0, 0); ValorFirA7(panel_fir, PANEL_FIR_VALOR_FIR_A7, EVENT_COMMIT, 0, 0, 0); ValorFirA8(panel_fir, PANEL_FIR_VALOR_FIR_A8, EVENT_COMMIT, 0, 0, 0); ValorFirA9(panel_fir, PANEL_FIR_VALOR_FIR_A9, EVENT_COMMIT, 0, 0, 0); ValorFirA10(panel_fir, PANEL_FIR_VALOR_FIR_A10, EVENT_COMMIT, 0, 0, 0); ValorFirA11(panel_fir, PANEL_FIR_VALOR_FIR_A11, EVENT_COMMIT, 0, 0, 0); ValorFirA12(panel_fir, PANEL_FIR_VALOR_FIR_A12, EVENT_COMMIT, 0, 0, 0); ValorFirA13(panel_fir, PANEL_FIR_VALOR_FIR_A13, EVENT_COMMIT, 0, 0, 0); ValorFirA14(panel_fir, PANEL_FIR_VALOR_FIR_A14, EVENT_COMMIT, 0, 0, 0); ValorFirA15(panel_fir, PANEL_FIR_VALOR_FIR_A15, EVENT_COMMIT, 0, 0, 0); ValorFirA16(panel_fir, PANEL_FIR_VALOR_FIR_A16, EVENT_COMMIT, 0, 0, 0); ValorFirA17(panel_fir, PANEL_FIR_VALOR_FIR_A17, EVENT_COMMIT, 0, 0, 0); ValorFirA18(panel_fir, PANEL_FIR_VALOR_FIR_A18, EVENT_COMMIT, 0, 0, 0); ValorFirA19(panel_fir, PANEL_FIR_VALOR_FIR_A19, EVENT_COMMIT, 0, 0, 0); ValorFirA20(panel_fir, PANEL_FIR_VALOR_FIR_A20, EVENT_COMMIT, 0, 0, 0); // Programaci´ on del hardware prog_hard(INT1_RATE, 4); prog_hard(CONF, 1); // Entorno gr´ afico if (hay_placa_mod) { err = SetCtrlVal (panel_vel, PANEL_VEL_VALOR_VEL_DAT, dato_clock); Fmt (txt_vel_datos, "%s<%f[w14p4]", dato_clock); err = SetCtrlVal (panel_principal, PANEL_MOD_TEXT_VEL_VAL, txt_vel_datos); } break; case EVENT_RIGHT_CLICK: break; } return 0; } /**************************************************************************** FUNCION: PulDiv2 DESCRIPCION: Pone de manifiesto el efecto producido al activar/desactivar mediante el puente hardware JP2 el divisor adicional por 2 en el generador de reloj de bit. PARAMETROS DE ENTRADA: Es una funci´ on callback PARAMETROS DE SALIDA: RESULTADO Y ERRORES: 0, OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK PulDiv2 (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static double frec_ref, dato_clock; static int div_var, div_fijo, tipo_mod; static char txt_vel_datos[50], modulacion; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_vel, PANEL_VEL_PUL_DIV_2, &div_fijo); // Dem´ as par´ ametros necesarios para configurar el modem a las nuevas condiciones if (div_fijo == 1) { SetCtrlVal (panel_vel, PANEL_VEL_MENSG_2, "JP2

pines

3-4");

´ n modulAD C.1 Aplicacio

SetCtrlAttribute (panel_vel, PANEL_VEL_PUL_DIV_2, ATTR_LABEL_TEXT, "x 2"); } else { //div_fijo == 0 SetCtrlVal (panel_vel, PANEL_VEL_MENSG_2, "JP2 pines 1-2"); SetCtrlAttribute (panel_vel, PANEL_VEL_PUL_DIV_2, ATTR_LABEL_TEXT, "x 1"); } ValorDiv (panel_vel, PANEL_VEL_VALOR_DIV, EVENT_COMMIT, 0, 0, 0); break; case EVENT_RIGHT_CLICK: break; } return 0; } /**************************************************************************** FUNCION: PulsaFrecOk DESCRIPCION: Oculta el panel de la sinton´ ıa de frecuencia PARAMETROS DE ENTRADA: PARAMETROS DE SALIDA: RESULTADO Y ERRORES: 0, ok OBSERVACIONES: ****************************************************************************/ int CVICALLBACK PulsaFrecOk (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: PulsaFrec (panel_principal, PANEL_MOD_PULSA_FREC, EVENT_COMMIT, 0, 0, 0); break; case EVENT_RIGHT_CLICK: break; } return 0; } /**************************************************************************** FUNCION: PulsaOk DESCRIPCION: Oculta el panel de configuraci´ on PARAMETROS DE ENTRADA: PARAMETROS DE SALIDA: RESULTADO Y ERRORES: 0, OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK PulsaOk (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: PulsaConf (panel_principal, PANEL_MOD_PULSA_CONF, EVENT_COMMIT, 0, 0, 0); break; case EVENT_RIGHT_CLICK: break; } return 0; } /**************************************************************************** FUNCION: PulsaFirOk DESCRIPCION: Oculta el panel de programaci´ on de los coeficientes del filtro FIR PARAMETROS DE ENTRADA: PARAMETROS DE SALIDA: RESULTADO Y ERRORES: 0, OK OBSERVACIONES: ****************************************************************************/

172

´ n modulAD C.1 Aplicacio

int CVICALLBACK PulsaFirOk (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: PulsaFir (panel_principal, PANEL_MOD_PULSA_FIR, EVENT_COMMIT, 0, 0, 0); break; case EVENT_RIGHT_CLICK: break; } return 0; } /**************************************************************************** FUNCION: PulsaVelOk DESCRIPCION: Oculta el panel de programaci´ on del generador de reloj de bit PARAMETROS DE ENTRADA: PARAMETROS DE SALIDA: RESULTADO Y ERRORES: 0, OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK PulsaVelOk (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: PulsaVel (panel_principal, PANEL_MOD_PULSA_VEL, EVENT_COMMIT, 0, 0, 0); break; case EVENT_RIGHT_CLICK: break; } return 0; } /**************************************************************************** FUNCION: PulsaScrOk DESCRIPCION: Oculta el panel desde el que se habilitan/deshabilitan el scrambler y el codificador diferencial PARAMETROS DE ENTRADA: PARAMETROS DE SALIDA: RESULTADO Y ERRORES: 0, OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK PulsaScrOk (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: PulsaFec (panel_principal, PANEL_MOD_PULSA_FEC, EVENT_COMMIT, 0, 0, 0); break; case EVENT_RIGHT_CLICK: break; } return 0; } /**************************************************************************** FUNCION: ValorFirAx DESCRIPCION: Modifican el coeficiente x del filtro FIR de que consta el modulador AD9853 PARAMETROS DE ENTRADA: Los t´ ıpicos de las funciones Callback PARAMETROS DE SALIDA: RESULTADO Y ERRORES: OBSERVACIONES: Se "escala" el dato introducido en el panel frontal seg´ un los valores que est´ en programados en los dos interpoladores del integrado ****************************************************************************/ int CVICALLBACK ValorFirA0 (int panel, int control, int event, void *callbackData, int eventData1, int eventData2)

173

´ n modulAD C.1 Aplicacio

{ static short dos_bytes; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_fir, PANEL_FIR_VALOR_FIR_A0, &dos_bytes); // Escalado del valor dos_bytes = dos_bytes / esc_old; dos_bytes = dos_bytes * esc; control_modem[FIR_A00_L] = dos_bytes & 0xFF; dos_bytes = dos_bytes >> 2; control_modem[FIR_A00_H] = dos_bytes & 0xC0; // Programaci´ on del hardware prog_hard(FIR_A00_L, 2); break; case EVENT_RIGHT_CLICK: break; } return 0; } int CVICALLBACK ValorFirA1 (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static short dos_bytes; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_fir, PANEL_FIR_VALOR_FIR_A1, &dos_bytes); // Escalado del valor dos_bytes = dos_bytes / esc_old; dos_bytes = dos_bytes * esc; control_modem[FIR_A01_L] = dos_bytes & 0xFF; dos_bytes = dos_bytes >> 2; control_modem[FIR_A01_H] = dos_bytes & 0xC0; // Programaci´ on del hardware prog_hard(FIR_A01_L, 2); break; case EVENT_RIGHT_CLICK: break; } return 0; } int CVICALLBACK ValorFirA2 (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static short dos_bytes; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_fir, PANEL_FIR_VALOR_FIR_A2, &dos_bytes); // Escalado del valor dos_bytes = dos_bytes / esc_old; dos_bytes = dos_bytes * esc; control_modem[FIR_A02_L] = dos_bytes & 0xFF; dos_bytes = dos_bytes >> 2; control_modem[FIR_A02_H] = dos_bytes & 0xC0; // Programaci´ on del hardware prog_hard(FIR_A02_L, 2); break; case EVENT_RIGHT_CLICK: break; } return 0;

174

´ n modulAD C.1 Aplicacio

} int CVICALLBACK ValorFirA3 (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static short dos_bytes; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_fir, PANEL_FIR_VALOR_FIR_A3, &dos_bytes); // Escalado del valor dos_bytes = dos_bytes / esc_old; dos_bytes = dos_bytes * esc; control_modem[FIR_A03_L] = dos_bytes & 0xFF; dos_bytes = dos_bytes >> 2; control_modem[FIR_A03_H] = dos_bytes & 0xC0; // Programaci´ on del hardware prog_hard(FIR_A03_L, 2); break; case EVENT_RIGHT_CLICK: break; } return 0; } int CVICALLBACK ValorFirA4 (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static short dos_bytes; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_fir, PANEL_FIR_VALOR_FIR_A4, &dos_bytes); // Escalado del valor dos_bytes = dos_bytes / esc_old; dos_bytes = dos_bytes * esc; control_modem[FIR_A04_L] = dos_bytes & 0xFF; dos_bytes = dos_bytes >> 2; control_modem[FIR_A04_H] = dos_bytes & 0xC0; // Programaci´ on del hardware prog_hard(FIR_A04_L, 2); break; case EVENT_RIGHT_CLICK: break; } return 0; } int CVICALLBACK ValorFirA5 (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static short dos_bytes; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_fir, PANEL_FIR_VALOR_FIR_A5, &dos_bytes); // Escalado del valor dos_bytes = dos_bytes / esc_old; dos_bytes = dos_bytes * esc; control_modem[FIR_A05_L] = dos_bytes & 0xFF; dos_bytes = dos_bytes >> 2; control_modem[FIR_A05_H] = dos_bytes & 0xC0; // Programaci´ on del hardware prog_hard(FIR_A05_L, 2); break; case EVENT_RIGHT_CLICK:

175

´ n modulAD C.1 Aplicacio

break; } return 0; } int CVICALLBACK ValorFirA6 (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static short dos_bytes; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_fir, PANEL_FIR_VALOR_FIR_A6, &dos_bytes); // Escalado del valor dos_bytes = dos_bytes / esc_old; dos_bytes = dos_bytes * esc; control_modem[FIR_A06_L] = dos_bytes & 0xFF; dos_bytes = dos_bytes >> 2; control_modem[FIR_A06_H] = dos_bytes & 0xC0; // Programaci´ on del hardware prog_hard(FIR_A06_L, 2); break; case EVENT_RIGHT_CLICK: break; } return 0; } int CVICALLBACK ValorFirA7 (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static short dos_bytes; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_fir, PANEL_FIR_VALOR_FIR_A7, &dos_bytes); // Escalado del valor dos_bytes = dos_bytes / esc_old; dos_bytes = dos_bytes * esc; control_modem[FIR_A07_L] = dos_bytes & 0xFF; dos_bytes = dos_bytes >> 2; control_modem[FIR_A07_H] = dos_bytes & 0xC0; // Programaci´ on del hardware prog_hard(FIR_A07_L, 2); break; case EVENT_RIGHT_CLICK: break; } return 0; } int CVICALLBACK ValorFirA8 (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static short dos_bytes; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_fir, PANEL_FIR_VALOR_FIR_A8, &dos_bytes); // Escalado del valor dos_bytes = dos_bytes / esc_old; dos_bytes = dos_bytes * esc; control_modem[FIR_A08_L] = dos_bytes & 0xFF; dos_bytes = dos_bytes >> 2; control_modem[FIR_A08_H] = dos_bytes & 0xC0;

176

´ n modulAD C.1 Aplicacio

// Programaci´ on del hardware prog_hard(FIR_A08_L, 2); break; case EVENT_RIGHT_CLICK: break; } return 0; } int CVICALLBACK ValorFirA9 (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static short dos_bytes; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_fir, PANEL_FIR_VALOR_FIR_A9, &dos_bytes); // Escalado del valor dos_bytes = dos_bytes / esc_old; dos_bytes = dos_bytes * esc; control_modem[FIR_A09_L] = dos_bytes & 0xFF; dos_bytes = dos_bytes >> 2; control_modem[FIR_A09_H] = dos_bytes & 0xC0; // Programaci´ on del hardware prog_hard(FIR_A09_L, 2); break; case EVENT_RIGHT_CLICK: break; } return 0; } int CVICALLBACK ValorFirA10 (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static short dos_bytes; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_fir, PANEL_FIR_VALOR_FIR_A10, &dos_bytes); // Escalado del valor dos_bytes = dos_bytes / esc_old; dos_bytes = dos_bytes * esc; control_modem[FIR_A10_L] = dos_bytes & 0xFF; dos_bytes = dos_bytes >> 2; control_modem[FIR_A10_H] = dos_bytes & 0xC0; // Programaci´ on del hardware prog_hard(FIR_A10_L, 2); break; case EVENT_RIGHT_CLICK: break; } return 0; } int CVICALLBACK ValorFirA11 (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static short dos_bytes; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_fir, PANEL_FIR_VALOR_FIR_A11, &dos_bytes); // Escalado del valor dos_bytes = dos_bytes / esc_old;

177

´ n modulAD C.1 Aplicacio

dos_bytes = dos_bytes * esc; control_modem[FIR_A11_L] = dos_bytes & 0xFF; dos_bytes = dos_bytes >> 2; control_modem[FIR_A11_H] = dos_bytes & 0xC0; // Programaci´ on del hardware prog_hard(FIR_A11_L, 2); break; case EVENT_RIGHT_CLICK: break; } return 0; } int CVICALLBACK ValorFirA12 (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static short dos_bytes; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_fir, PANEL_FIR_VALOR_FIR_A12, &dos_bytes); // Escalado del valor dos_bytes = dos_bytes / esc_old; dos_bytes = dos_bytes * esc; control_modem[FIR_A12_L] = dos_bytes & 0xFF; dos_bytes = dos_bytes >> 2; control_modem[FIR_A12_H] = dos_bytes & 0xC0; // Programaci´ on del hardware prog_hard(FIR_A12_L, 2); break; case EVENT_RIGHT_CLICK: break; } return 0; } int CVICALLBACK ValorFirA13 (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static short dos_bytes; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_fir, PANEL_FIR_VALOR_FIR_A13, &dos_bytes); // Escalado del valor dos_bytes = dos_bytes / esc_old; dos_bytes = dos_bytes * esc; control_modem[FIR_A13_L] = dos_bytes & 0xFF; dos_bytes = dos_bytes >> 2; control_modem[FIR_A13_H] = dos_bytes & 0xC0; // Programaci´ on del hardware prog_hard(FIR_A13_L, 2); break; case EVENT_RIGHT_CLICK: break; } return 0; } int CVICALLBACK ValorFirA14 (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static short dos_bytes; switch (event) {

178

´ n modulAD C.1 Aplicacio

case EVENT_COMMIT: err = GetCtrlVal (panel_fir, PANEL_FIR_VALOR_FIR_A14, &dos_bytes); // Escalado del valor dos_bytes = dos_bytes / esc_old; dos_bytes = dos_bytes * esc; control_modem[FIR_A14_L] = dos_bytes & 0xFF; dos_bytes = dos_bytes >> 2; control_modem[FIR_A14_H] = dos_bytes & 0xC0; // Programaci´ on del hardware prog_hard(FIR_A14_L, 2); break; case EVENT_RIGHT_CLICK: break; } return 0; } int CVICALLBACK ValorFirA15 (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static short dos_bytes; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_fir, PANEL_FIR_VALOR_FIR_A15, &dos_bytes); // Escalado del valor dos_bytes = dos_bytes / esc_old; dos_bytes = dos_bytes * esc; control_modem[FIR_A15_L] = dos_bytes & 0xFF; dos_bytes = dos_bytes >> 2; control_modem[FIR_A15_H] = dos_bytes & 0xC0; // Programaci´ on del hardware prog_hard(FIR_A15_L, 2); break; case EVENT_RIGHT_CLICK: break; } return 0; } int CVICALLBACK ValorFirA16 (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static short dos_bytes; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_fir, PANEL_FIR_VALOR_FIR_A16, &dos_bytes); // Escalado del valor dos_bytes = dos_bytes / esc_old; dos_bytes = dos_bytes * esc; control_modem[FIR_A16_L] = dos_bytes & 0xFF; dos_bytes = dos_bytes >> 2; control_modem[FIR_A16_H] = dos_bytes & 0xC0; // Programaci´ on del hardware prog_hard(FIR_A16_L, 2); break; case EVENT_RIGHT_CLICK: break; } return 0; } int CVICALLBACK ValorFirA17 (int panel, int control, int event, void *callbackData, int eventData1, int eventData2)

179

´ n modulAD C.1 Aplicacio

{ static short dos_bytes; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_fir, PANEL_FIR_VALOR_FIR_A17, &dos_bytes); // Escalado del valor dos_bytes = dos_bytes / esc_old; dos_bytes = dos_bytes * esc; control_modem[FIR_A17_L] = dos_bytes & 0xFF; dos_bytes = dos_bytes >> 2; control_modem[FIR_A17_H] = dos_bytes & 0xC0; // Programaci´ on del hardware prog_hard(FIR_A17_L, 2); break; case EVENT_RIGHT_CLICK: break; } return 0; } int CVICALLBACK ValorFirA18 (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static short dos_bytes; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_fir, PANEL_FIR_VALOR_FIR_A18, &dos_bytes); // Escalado del valor dos_bytes = dos_bytes / esc_old; dos_bytes = dos_bytes * esc; control_modem[FIR_A18_L] = dos_bytes & 0xFF; dos_bytes = dos_bytes >> 2; control_modem[FIR_A18_H] = dos_bytes & 0xC0; // Programaci´ on del hardware prog_hard(FIR_A18_L, 2); break; case EVENT_RIGHT_CLICK: break; } return 0; } int CVICALLBACK ValorFirA19 (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static short dos_bytes; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_fir, PANEL_FIR_VALOR_FIR_A19, &dos_bytes); // Escalado del valor dos_bytes = dos_bytes / esc_old; dos_bytes = dos_bytes * esc; control_modem[FIR_A19_L] = dos_bytes & 0xFF; dos_bytes = dos_bytes >> 2; control_modem[FIR_A19_H] = dos_bytes & 0xC0; // Programaci´ on del hardware prog_hard(FIR_A19_L, 2); break; case EVENT_RIGHT_CLICK: break; } return 0;

180

´ n modulAD C.1 Aplicacio

181

} int CVICALLBACK ValorFirA20 (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static short dos_bytes; switch (event) { case EVENT_COMMIT: err = GetCtrlVal (panel_fir, PANEL_FIR_VALOR_FIR_A20, &dos_bytes); // Escalado del valor dos_bytes = dos_bytes / esc_old; dos_bytes = dos_bytes * esc; control_modem[FIR_A20_L] = dos_bytes & 0xFF; dos_bytes = dos_bytes >> 2; control_modem[FIR_A20_H] = dos_bytes & 0xC0; // Programaci´ on del hardware prog_hard(FIR_A20_L, 2); break; case EVENT_RIGHT_CLICK: break; } return 0; } /**************************************************************************** FUNCION: Bucle DESCRIPCI´ ON: Realiza el chequeo necesario para determinar la existencia de la placa DDS, actuando en consecuencia sobre la interface de usuario PARAMETROS DE ENTRADA: Funci´ on callback. PARAMETROS DE SALIDA: No hay RESULTADO Y ERRORES: 0 OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK Bucle (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_TIMER_TICK: hay_placa_mod = busca_equipo_mod(); if (!hay_placa_mod) { if (primer_bucle) { primer_bucle = NO; // Control de ejecuci´ on del bucle // Display en la err = SetCtrlVal err = SetCtrlVal err = SetCtrlVal err = SetCtrlVal err = SetCtrlVal err = SetCtrlVal err = SetCtrlVal err = SetCtrlVal err = SetCtrlVal err = SetCtrlVal err = SetCtrlVal err = SetCtrlVal

pantalla de mensajes (panel_principal, PANEL_MOD_TEXT_FREC_2, ""); (panel_principal, PANEL_MOD_TEXT_FREC, ""); (panel_principal, PANEL_MOD_TEXT_MOD, ""); (panel_principal, PANEL_MOD_TEXT_VEL, ""); (panel_principal, PANEL_MOD_TEXT_VEL_2, ""); (panel_principal, PANEL_MOD_TEXT_MOD_VAL, ""); (panel_principal, PANEL_MOD_TEXT_FREC_VAL, ""); (panel_principal, PANEL_MOD_TEXT_VEL_VAL, ""); (panel_principal, PANEL_MOD_TEXT_SCR, ""); (panel_principal, PANEL_MOD_TEXT_SCR_VAL, ""); (panel_principal, PANEL_MOD_TEXT_COD_VAL, ""); (panel_principal, PANEL_MOD_TEXT_COD, "");

// Mensaje de error err = SetCtrlVal (panel_principal, PANEL_MOD_TEXT_FALLO, "Fallo del puerto de control. Imposible controlar el modulador"); // Inhabilitaci´ on de los controles err = SetCtrlAttribute (panel_principal, err = SetCtrlAttribute (panel_principal, err = SetCtrlAttribute (panel_principal, err = SetCtrlAttribute (panel_principal,

PANEL_MOD_PULSA_MOD, ATTR_DIMMED, 1); PANEL_MOD_PULSA_FREC, ATTR_DIMMED, 1); PANEL_MOD_PULSA_FEC, ATTR_DIMMED, 1); PANEL_MOD_PULSA_VEL, ATTR_DIMMED, 1);

´ n modulAD C.1 Aplicacio

182

err = SetCtrlAttribute (panel_principal, PANEL_MOD_PULSA_FIR, ATTR_DIMMED, 1); err = SetCtrlAttribute (panel_principal, PANEL_MOD_PULSA_CONF, ATTR_DIMMED, 1); // Color de fondo del display err = SetCtrlAttribute (panel_principal, PANEL_MOD_DISPLAY, ATTR_FRAME_COLOR, 0x00FFFFFF); } } else { if (primer_bucle == NO) { primer_bucle = SI;

// Control de ejecuci´ on del bucle

// Color de fondo del display err = SetCtrlAttribute (panel_principal, PANEL_MOD_DISPLAY, ATTR_FRAME_COLOR, 0x0033CC99); // Habilitaci´ on de los controles err = SetCtrlAttribute (panel_principal, PANEL_MOD_PULSA_MOD, ATTR_DIMMED, 0); err = SetCtrlAttribute (panel_principal, PANEL_MOD_PULSA_FREC, ATTR_DIMMED, 0); err = SetCtrlAttribute (panel_principal, PANEL_MOD_PULSA_FEC, ATTR_DIMMED, 0); err = SetCtrlAttribute (panel_principal, PANEL_MOD_PULSA_VEL, ATTR_DIMMED, 0); err = SetCtrlAttribute (panel_principal, PANEL_MOD_PULSA_FIR, ATTR_DIMMED, 0); err = SetCtrlAttribute (panel_principal, PANEL_MOD_PULSA_CONF, ATTR_DIMMED, 0); // Se limpia el mensaje de error err = SetCtrlVal (panel_principal, PANEL_MOD_TEXT_FALLO, ""); // Display err = DefaultCtrl err = DefaultCtrl err = DefaultCtrl err = DefaultCtrl err = DefaultCtrl err = DefaultCtrl err = DefaultCtrl

(panel_principal, (panel_principal, (panel_principal, (panel_principal, (panel_principal, (panel_principal, (panel_principal,

PANEL_MOD_TEXT_FREC_2); PANEL_MOD_TEXT_FREC); PANEL_MOD_TEXT_MOD); PANEL_MOD_TEXT_VEL); PANEL_MOD_TEXT_VEL_2); PANEL_MOD_TEXT_SCR); PANEL_MOD_TEXT_COD);

// Inicializaci´ on para recuperar el marco anterior inicio = SI; puerto_control = 1; inicializa(SI); inicio = NO; } } break; } return 0; }

´ n modulAD C.1 Aplicacio

183

/**************************************************************************** MODULO: Recopilaci´ on de funciones hardware para la aplicacion de control del modulador a partir del integrado AD9853 FICHERO: mod_hard.c VERSION: 1.0 ----------------------------------------------------------------------------AUTOR: Juan Luis T´ ebar FECHA: 27 de Abril del 2000 ----------------------------------------------------------------------------DESCRIPCION: ****************************************************************************/ #include <userint.h> #include #include #include "DLPORTIO.h" #include "mod_def.h" // Defines de todo el proyecto #include "mod_hard_.h" #include "primo_63.h" // Contiene tablas del fabricante // Variables importadas // caracteres reservados para el env´ ıo de par´ ametros a los registros del modem extern unsigned char control_modem[74]; extern unsigned char inicio; // Bytes utilizados para la comunicaci´ on con el modulador. Se especifican como // global al tenerlos que utilizar para la programaci´ on del generador de // reloj de bit, adem´ as de para controlar el modulador extern unsigned char byte_bajo, byte_alto; // registros del extern unsigned extern unsigned extern unsigned

puerto paralelo long pp_datos; long pp_estado; long pp_control;

//Normalmente s´ olo escritura //lectura //lectura y escritura, l´ ıneas f´ ısicas "open colector"

// Variables globales propias double esc, esc_old; // Codificaci´ on de las funciones /**************************************************************************** FUNCION: carga_pp DESCRIPCION: Realiza la escritura de un byte en un registro de los circuitos controlados mediante el puerto paralelo PARAMETROS DE ENTRADA: dato: es el byte que se escribe pcb: se refiere a la tarjeta destino: LATCH0 placa ber, LATCH1 placa mod reg_pcb: registro concreto dentro de cada placa: CHIP0, ... , CHIP3 PARAMETROS DE SALIDA: RESULTADO Y ERRORES: Entero -1 error; 0 todo bien OBSERVACIONES: El puerto paralelo seleccionado para el env´ ıo depende del valor de la variable global "puerto_control". La escritura se realiza de forma que el valor a escribir est´ e en el puerto antes de activar la carga, con el objetivo de no perturbar aquellas salidas que afecten muy directamente al funcionamiento hardware de los circuitos. ****************************************************************************/ int carga_pp (unsigned char dato, char pcb, char reg_pcb) { static unsigned char byte; //Escritura del dato en el puerto paralelo DlPortWritePortUchar(pp_datos, dato); //Selecci´ on del registro dentro de la placa byte=DlPortReadPortUchar(pp_control); byte=byte & 0xF0; switch (reg_pcb) { case CHIP0: byte=byte | 0x8; // Selecci´ on de CHIP0 DlPortWritePortUchar(pp_control, byte); break; case CHIP1: byte=byte | 0xC; // Selecci´ on de CHIP1

´ n modulAD C.1 Aplicacio

DlPortWritePortUchar(pp_control, break; case CHIP2: byte=byte | 0x0; // Selecci´ on DlPortWritePortUchar(pp_control, break; case CHIP3: byte=byte | 0x4; // Selecci´ on DlPortWritePortUchar(pp_control, break; default: break;

184

byte);

de CHIP2 (Ya estaba seleccionado) byte);

de CHIP3 byte);

} // Activaci´ on de la linea chip_select en el registro en cuesti´ on if (pcb==LATCH0) { byte=byte & 0xFC; byte=byte | 0x1; // Selecci´ on de LATCH0 DlPortWritePortUchar(pp_control, byte); } if (pcb==LATCH1) { byte=byte & 0xFC; byte=byte | 0x2; // Selecci´ on de LATCH1 DlPortWritePortUchar(pp_control, byte); } // Dejamos el registro de control con los cuatro bits a 1 // ESTE ES EL MOMENTO EN QUE VERDADERAMENTE SE GRABA EL DATO DENTRO // DE LOS REGISTROS, PUES SE CARGAN EN EL FLANCO DE SUBIDA byte=byte & 0xFC; // valor final de reposo DlPortWritePortUchar(pp_control, byte); // Queda direccionado un registro inexistente byte=byte & 0xF0; byte=byte | 0x4; // Selecci´ on de CHIP3 DlPortWritePortUchar(pp_control, byte); return 0; } /**************************************************************************** FUNCION: carga_reg_ser DESCRIPCION:Realiza la secuencia de selecci´ on de registro dentro del integrado AD9853 para posteriormente escribir o leer datos del mismo. PARAMETROS DE ENTRADA: reg: Registro al que se desea acceder a continuaci´ on. PARAMETROS DE SALIDA: No hay RESULTADO Y ERRORES: Entero -1 error, esclavo no contesta; 0 todo bien OBSERVACIONES: En esta funci´ on se ejecuta la parte com´ un de los ciclos de lectura y escritura del chip AD9853 tal y como se describe en la p´ agina 13 de las hojas de datos del fabricante ****************************************************************************/ int carga_reg_ser(char reg) { unsigned char un_byte, byte_s; int n; // Start. // linea de reloj a alto byte_alto = byte_alto | 0x80; carga_pp(byte_alto, LATCH1, CHIP1); // linea de datos a bajo byte_alto = byte_alto & 0xBF; //Datos a uno byte_alto = byte_alto & 0xDF; //Desactivaci´ on de tri-state carga_pp(byte_alto, LATCH1, CHIP1); byte_alto = byte_alto | 0x40; //Datos a cero (invierte el hardware) carga_pp(byte_alto, LATCH1, CHIP1); // linea de reloj a bajo byte_alto = byte_alto & 0x7F; carga_pp(byte_alto, LATCH1, CHIP1);

´ n modulAD C.1 Aplicacio

// Device Address 00000100, escritura un_byte = 0x4; for (n=0; n<8; n++) { // datos, empezando por el bit mas significativo if ((un_byte & 0x80)== NO) byte_alto = byte_alto | 0x40;// cero else byte_alto = byte_alto & 0xBF; // uno carga_pp(byte_alto, LATCH1, CHIP1); un_byte = un_byte << 1; // Desplazamiento a la izquierda // linea de reloj a alto byte_alto = byte_alto | 0x80; carga_pp(byte_alto, LATCH1, CHIP1); // linea de reloj a bajo byte_alto = byte_alto & 0x7F; carga_pp(byte_alto, LATCH1, CHIP1); } // Recepci´ on del acknowledge desde el modem esclavo // linea de datos a alta impedancia byte_alto = byte_alto | 0x20; //Activaci´ on de tri-state carga_pp(byte_alto, LATCH1, CHIP1); // reloj a alto byte_alto = byte_alto | 0x80; carga_pp(byte_alto, LATCH1, CHIP1); // lectura de la linea de datos byte_s=DlPortReadPortUchar(pp_estado); // reloj a bajo byte_alto = byte_alto & 0x7F; carga_pp(byte_alto, LATCH1, CHIP1); if (byte_s & 0x8) return -1; // esclavo no envi´ o acknowledge // Env´ ıo del c´ odigo de direccion del registro un_byte = reg; byte_alto = byte_alto & 0xDF; //Desactivaci´ on de tri-state carga_pp(byte_alto, LATCH1, CHIP1); for (n=0; n<8; n++) { // datos, empezando por el bit mas significativo if ((un_byte & 0x80)== NO) byte_alto = byte_alto | 0x40;// cero else byte_alto = byte_alto & 0xBF; // uno carga_pp(byte_alto, LATCH1, CHIP1); un_byte = un_byte << 1; //* 0x2; // Desplazamiento a la izquierda // linea de reloj a alto byte_alto = byte_alto | 0x80; carga_pp(byte_alto, LATCH1, CHIP1); // linea de reloj a bajo byte_alto = byte_alto & 0x7F; carga_pp(byte_alto, LATCH1, CHIP1); } // Recepci´ on del acknowledge desde el modem esclavo // linea de datos a alta impedancia byte_alto = byte_alto | 0x20; //Activaci´ on de tri-state carga_pp(byte_alto, LATCH1, CHIP1); // reloj a alto byte_alto = byte_alto | 0x80; carga_pp(byte_alto, LATCH1, CHIP1); // lectura de la linea de datos byte_s=DlPortReadPortUchar(pp_estado); // reloj a bajo byte_alto = byte_alto & 0x7F; carga_pp(byte_alto, LATCH1, CHIP1); if (byte_s & 0x8) return -1; // esclavo no envi´ o acknowledge return 0; } /**************************************************************************** FUNCION: lee_ser

185

´ n modulAD C.1 Aplicacio

DESCRIPCION: Realiza la secuencia de leer datos a partir del registro seleccionado previamente con la funci´ on carga_reg_ser, una cantidad de registros igual al n´ umero de entrada PARAMETROS DE ENTRADA: reg_ini: registro del que se va a obtener el primer byte le´ ıdo. nro_reg: N´ umero de registros a leer a partir del cargado como direcci´ on en la ejecuci´ on obligatoria anterior de la funci´ on carga_reg_ser. PARAMETROS DE SALIDA: No hay RESULTADO Y ERRORES: Entero -1 error; 0 todo bien OBSERVACIONES: Los valores le´ ıdos se cargan en el array de caracteres global control_modem[], con ı ´ndice igual al del registro le´ ıdo. ****************************************************************************/ int lee_ser(char reg_ini, char nro_reg) { unsigned char un_byte, byte_s; int n; char m; // Start. // linea de reloj a alto byte_alto = byte_alto | 0x80; carga_pp(byte_alto, LATCH1, CHIP1); // linea de datos a bajo byte_alto = byte_alto & 0xBF; //Datos a uno byte_alto = byte_alto & 0xDF; //Desactivaci´ on de tri-state carga_pp(byte_alto, LATCH1, CHIP1); byte_alto = byte_alto | 0x40; //Datos a cero (invierte el hardware) carga_pp(byte_alto, LATCH1, CHIP1); // linea de reloj a bajo byte_alto = byte_alto & 0x7F; carga_pp(byte_alto, LATCH1, CHIP1); // Device Address 00000101, lectura un_byte = 0x5; for (n=0; n<8; n++) { // datos, empezando por el bit mas significativo if ((un_byte & 0x80)== NO) byte_alto = byte_alto | 0x40;// cero else byte_alto = byte_alto & 0xBF; // uno carga_pp(byte_alto, LATCH1, CHIP1); un_byte = un_byte << 1; //* 0x2; // Desplazamiento a la izquierda // linea de reloj a alto byte_alto = byte_alto | 0x80; carga_pp(byte_alto, LATCH1, CHIP1); // linea de reloj a bajo byte_alto = byte_alto & 0x7F; carga_pp(byte_alto, LATCH1, CHIP1); } // Recepci´ on del acknowledge desde el modem esclavo // linea de datos a alta impedancia byte_alto = byte_alto | 0x20; //Activaci´ on de tri-state carga_pp(byte_alto, LATCH1, CHIP1); // reloj a alto byte_alto = byte_alto | 0x80; carga_pp(byte_alto, LATCH1, CHIP1); // lectura de la linea de datos byte_s=DlPortReadPortUchar(pp_estado); // reloj a bajo byte_alto = byte_alto & 0x7F; carga_pp(byte_alto, LATCH1, CHIP1); if (byte_s & 0x8) return -1; // esclavo no envi´ o acknowledge // Inicio del bucle de lectura que se repite tantas veces como registros // se van a leer, y viene indicado en el par´ ametro de entrada nro_reg un_byte = 0x0; for (m = reg_ini; m < (reg_ini + nro_reg); m++) { // Puesto que seguimos leyendo datos desde el slave, la l´ ınea debe de // seguir en alta impedancia // lectura de un byte

186

´ n modulAD C.1 Aplicacio

for (n=0; n<8; n++) { // reloj a alto byte_alto = byte_alto | 0x80; carga_pp(byte_alto, LATCH1, CHIP1); // lectura de la linea de datos, empezando por el bit mas significativo byte_s=DlPortReadPortUchar(pp_estado); // reloj a bajo byte_alto = byte_alto & 0x7F; carga_pp(byte_alto, LATCH1, CHIP1); // formateo de los bits recibidos un_byte = (byte_s & 0x8)? un_byte | 0x1 : un_byte & 0xFE; // evitamos el ´ ultimo desplazamiento if (n == 7) break; un_byte = un_byte << 1; //* 0x2; } control_modem[m] = un_byte; un_byte = 0x0; // anulaci´ on del ´ ultimo acknowledge if (m == (reg_ini + nro_reg - 1)) break; // Generaci´ on del acknowledge desde el control byte_alto = byte_alto & 0xDF; //Desactivaci´ on de tri-state carga_pp(byte_alto, LATCH1, CHIP1); // linea de datos a bajo byte_alto = byte_alto | 0x40; //Datos a cero (invierte el hardware) carga_pp(byte_alto, LATCH1, CHIP1); // reloj a alto byte_alto = byte_alto | 0x80; carga_pp(byte_alto, LATCH1, CHIP1); // linea de reloj a bajo byte_alto = byte_alto & 0x7F; carga_pp(byte_alto, LATCH1, CHIP1); // linea de datos a alta impedancia byte_alto = byte_alto | 0x20; //Activaci´ on de tri-state carga_pp(byte_alto, LATCH1, CHIP1); } // No acknowledge desde el master para provocar que el modem salga del // modo lectura byte_alto = byte_alto & 0xDF; //Desactivaci´ on de tri-state carga_pp(byte_alto, LATCH1, CHIP1); // linea de datos a alto byte_alto = byte_alto & 0xBF; //Datos a uno (invierte el hardware) carga_pp(byte_alto, LATCH1, CHIP1); // reloj a alto byte_alto = byte_alto | 0x80; carga_pp(byte_alto, LATCH1, CHIP1); // linea de reloj a bajo byte_alto = byte_alto & 0x7F; carga_pp(byte_alto, LATCH1, CHIP1); // Stop // linea de datos a bajo byte_alto = byte_alto | 0x40; //Datos a cero (invierte el hardware) carga_pp(byte_alto, LATCH1, CHIP1); // reloj a alto byte_alto = byte_alto | 0x80; carga_pp(byte_alto, LATCH1, CHIP1); // linea de datos a alto, condici´ on de STOP byte_alto = byte_alto & 0xBF; //Datos a uno (invierte el hardware) carga_pp(byte_alto, LATCH1, CHIP1); // reloj a bajo byte_alto = byte_alto & 0x7F; carga_pp(byte_alto, LATCH1, CHIP1); // linea de datos a alta impedancia byte_alto = byte_alto | 0x20; //Activaci´ on de tri-state carga_pp(byte_alto, LATCH1, CHIP1);

187

´ n modulAD C.1 Aplicacio

return 0; } /**************************************************************************** FUNCION: escribe_ser DESCRIPCION: Realiza la secuencia de escribir datos en los registros del modulador AD9853 a partir del registro seleccionado previamente con la funci´ on carga_reg_ser. PARAMETROS DE ENTRADA: reg_ini: registro donde se va a escribir el primer byte. nro_reg: N´ umero de registros a escribir a partir del cargado como direcci´ on en la ejecuci´ on obligatoria anterior de la funci´ on carga_reg_ser. PARAMETROS DE SALIDA: No hay RESULTADO Y ERRORES: Entero -1 error; 0 todo bien OBSERVACIONES: Los valores a escribir son los contenidos en el array de caracteres global control_modem[], con ı ´ndice igual al del registro escrito. ****************************************************************************/ int escribe_ser(char reg_ini, char nro_reg) { unsigned char un_byte, byte_s; int n; char m; // Inicio del bucle de escritura que se repite tantas veces como registros // se van a escribir, y viene indicado en el par´ ametro de entrada nro_reg for (m = reg_ini; m < (reg_ini + nro_reg); m++) { un_byte = control_modem[m]; //Desactivaci´ on de tri-state byte_alto = byte_alto & 0xDF; carga_pp(byte_alto, LATCH1, CHIP1); for (n=0; n<8; n++) { // datos, empezando por el bit mas significativo if ((un_byte & 0x80)== NO) byte_alto = byte_alto | 0x40;// cero else byte_alto = byte_alto & 0xBF; // uno carga_pp(byte_alto, LATCH1, CHIP1); un_byte = un_byte * 0x2; // Desplazamiento a la derecha // linea de reloj a alto byte_alto = byte_alto | 0x80; carga_pp(byte_alto, LATCH1, CHIP1); // linea de reloj a bajo byte_alto = byte_alto & 0x7F; carga_pp(byte_alto, LATCH1, CHIP1); } // Recepci´ on del acknowledge desde el modem esclavo // linea de datos a alta impedancia byte_alto = byte_alto | 0x20; //Activaci´ on de tri-state carga_pp(byte_alto, LATCH1, CHIP1); // reloj a alto byte_alto = byte_alto | 0x80; carga_pp(byte_alto, LATCH1, CHIP1); // lectura de la linea de datos byte_s=DlPortReadPortUchar(pp_estado); // reloj a bajo byte_alto = byte_alto & 0x7F; carga_pp(byte_alto, LATCH1, CHIP1); if (byte_s & 0x8) return -1; // esclavo no envi´ o acknowledge } //Desactivaci´ on de tri-state byte_alto = byte_alto & 0xDF; carga_pp(byte_alto, LATCH1, CHIP1); // Stop // linea de datos a bajo byte_alto = byte_alto | 0x40; //Datos a cero (invierte el hardware) carga_pp(byte_alto, LATCH1, CHIP1); // reloj a alto

188

´ n modulAD C.1 Aplicacio

byte_alto = byte_alto | 0x80; carga_pp(byte_alto, LATCH1, CHIP1); // linea de datos a alto, condici´ on de STOP byte_alto = byte_alto & 0xBF; //Datos a uno (invierte el hardware) carga_pp(byte_alto, LATCH1, CHIP1); // reloj a bajo byte_alto = byte_alto & 0x7F; carga_pp(byte_alto, LATCH1, CHIP1); // linea de datos a alta impedancia byte_alto = byte_alto | 0x20; //Activaci´ on de tri-state carga_pp(byte_alto, LATCH1, CHIP1); return 0; } /**************************************************************************** FUNCION: activa_txe DESCRIPCION: Realiza la secuencia de activaci´ on (puesta a uno) de la l´ ınea TXE del modulador AD9853. Se debe ejecutar una vez terminados de programar los registros del integrado para habilitar el funcionamiento del mismo PARAMETROS DE ENTRADA: PARAMETROS DE SALIDA: No hay RESULTADO Y ERRORES: Entero -1 error; 0 todo bien OBSERVACIONES: ****************************************************************************/ int activa_txe (void) { byte_alto = byte_alto | 0x10; carga_pp(byte_alto, LATCH1, CHIP1); return 0; } /**************************************************************************** FUNCION: desactiva_txe DESCRIPCION: Realiza la desactivaci´ on (puesta a cero) de la linea TXE de control del modulador AD9853. Es condici´ on para programar los registros del chip PARAMETROS DE ENTRADA: PARAMETROS DE SALIDA: No hay RESULTADO Y ERRORES: Entero -1 error; 0 todo bien OBSERVACIONES: ****************************************************************************/ int desactiva_txe (void) { byte_alto = byte_alto & 0xEF; carga_pp(byte_alto, LATCH1, CHIP1); return 0; } /**************************************************************************** FUNCION: reset_9853 DESCRIPCION: Realiza la secuencia de activar-desactivar la linea de reset del modulador, como punto de partida para programar todos sus registros a las condiciones de trabajo que se deseen PARAMETROS DE ENTRADA: PARAMETROS DE SALIDA: No hay RESULTADO Y ERRORES: Entero -1 error; 0 todo bien OBSERVACIONES: ****************************************************************************/ int reset_9853(void) { byte_alto = byte_alto & 0xF7; carga_pp(byte_alto, LATCH1, CHIP1); Delay(0); // Regula la duraci´ on del pulso byte_alto = byte_alto | 0x8; carga_pp(byte_alto, LATCH1, CHIP1); return 0; } /**************************************************************************** FUNCION: prog_hard DESCRIPCION: Funci´ on base para la programaci´ on de los registros del integrado

189

´ n modulAD C.1 Aplicacio

190

PARAMETROS DE ENTRADA: reg_ini, primer registro a partir del cual se cargar´ an datos en el chip. char nro_reg, indica la cantidad de registros que se van a programar a partir del primero, que se inicializa mediante la variable anterior. PARAMETROS DE SALIDA: RESULTADO Y ERRORES: OBSERVACIONES: Se incluye una construcci´ on "if" para diferenciar la carga durante la primera inicializaci´ on, y los sucesivos cambios en la programaci´ on del chip. ****************************************************************************/ int prog_hard(char reg_ini, char nro_reg) { // Programaci´ on del hardware if (inicio) { carga_reg_ser(reg_ini); escribe_ser(reg_ini, nro_reg); } else { desactiva_txe(); carga_reg_ser(reg_ini); escribe_ser(reg_ini, nro_reg); activa_txe(); } return 0; } /**************************************************************************** FUNCION: inicia_hard DESCRIPCION: Inicializaci´ on de valores que no se modifican a lo largo de la aplicaci´ on por ning´ un otra funci´ on, pero que son necesarios de cargar a los registros del AD9853. PARAMETROS DE ENTRADA: PARAMETROS DE SALIDA: RESULTADO Y ERRORES: OBSERVACIONES: ****************************************************************************/ void inicia_hard() { // Inicializaci´ on de la memoria de configuraci´ on control_modem[RS_k]=0xFF; control_modem[RS_t]=0x02; //RS OFF, Scrambler de 15 bits ON control_modem[RAND_L]=0xFF; //Valores de inicio del scrambler todo unos control_modem[RAND_H]=0xFF; control_modem[LONG_PRE]=0x08; //Pre´ ambulo de 4 bits control_modem[PRE_0]=0xAA; //10101010 control_modem[PRE_1]=0xAA; //10101010 control_modem[PRE_2]=0xAA; //10101010 control_modem[PRE_3]=0xAA; //10101010 control_modem[PRE_4]=0xAA; //10101010 control_modem[PRE_5]=0xAA; //10101010 control_modem[PRE_6]=0xAA; //10101010 control_modem[PRE_7]=0xAA; //10101010 control_modem[PRE_8]=0xAA; //10101010 control_modem[PRE_9]=0xAA; //10101010 control_modem[PRE_A]=0xAA; //10101010 control_modem[PRE_B]=0x0A; //00001010 control_modem[CONF]=0x27; control_modem[GCB]=0xAA;

// Campo clave determinante del modo de funcionamiento

} /**************************************************************************** FUNCION: frec_32 DESCRIPCION: Realiza el c´ alculo del valor a cargar en el registro de frecuencia PARAMETROS DE ENTRADA: val_frec: Es el valor en Hz de la frecuencia a programar n_bits: N´ umero de bits del registro donde se cargar´ a el valor. reg: Registro donde cargar el valor calculado. Se necesita la direcci´ on

´ n modulAD C.1 Aplicacio

"primera" del registro, es decir, la que corresponde a los bits menos significativos: 0x16 para F0 y 0x1A para F1; frec_ref: Valor en Hz de la frecuencia de reloj de referencia de la placa PARAMETROS DE SALIDA: El valor calculado se graba en el array global control_modem, que se utiliza como memoria intermedia entre las funciones que calculan los valores y la funci´ on programa_hard, que es la que realmente carga los datos en el integrado AD9853. RESULTADO Y ERRORES: Ninguno OBSERVACIONES: Esta funci´ on est´ a dise~ nada para utilizarse en las direcciones de los registros de frecuencia del chip. Si se ejecuta sobre otro registro el resultado es imprevisible, ya que se carga el valor calculado sobre ese registro. Las direcciones de los registros de frecuencia del integrado AD9853 son: F0: Direcciones 0x16 (lsb) hasta 0x19 (msb) F1: Direcciones 0x1A (lsb) hasta 0x1D (msb) ****************************************************************************/ void frec_32(double val_frec, int n_bits, char reg, double frec_ref) { static unsigned int valor; static char byte, m, n; // C´ alculo del valor a programar en el registro valor=(unsigned int)(val_frec * (pow (2.0, (double)n_bits))/(6.0 * frec_ref)); // Actualizaci´ on de la memoria intermedia m = reg; for (n=0; n<4; n++, m++) { byte = valor & 0xFF; control_modem[m] = byte; valor = valor >> 8; //Desplazamiento a la derecha un byte } } /**************************************************************************** FUNCION: gen_bit_clk DESCRIPCION: Realiza la programaci´ on del divisor que crea el reloj de bit a partir de la frecuencia de referencia existente en la placa del modulador PARAMETROS DE ENTRADA: . div_1: n´ umero a programar en los divisores del oscilador de referencia div_2: ´ util para calcular la velocidad de bit, ya que con e ´l se incluye el efecto de activar mediante el puente hardware JP3 3-4 la divisi´ on adicional por dos que introduce U7A. frec_ref: double conteniendo la frecuencia de referencia utilizada PARAMETROS DE SALIDA: RESULTADO Y ERRORES: double con el valor final de reloj de bit programado. OBSERVACIONES: ****************************************************************************/ double gen_bit_clk (int div_1, int div_2, double frec_ref) { static unsigned short dos_bytes; static unsigned char un_byte; static int factor_div, n; static double clk_bit; // C´ alculo del valor del reloj de bit if (div_2==SI) n=2; else n=1; //div_2==0 factor_div = div_1 * n; clk_bit = frec_ref / (double)factor_div; // Formateo para correcto funcionamiento del hardware dos_bytes = (unsigned short)div_1; dos_bytes = (dos_bytes ^ 0x7FF ) + 0x1; //Complemento a 2 // Primero se carga el byte menos significativo byte_bajo= (unsigned char)(dos_bytes & 0xFF); carga_pp(byte_bajo, LATCH1, CHIP0); Delay(0.002);

191

´ n modulAD C.1 Aplicacio

// Despu´ es los ´ ultimos 3 bits m´ as significativos un_byte = (unsigned char)(dos_bytes >> 8) & 0x7; byte_alto = byte_alto & 0xF8; byte_alto = byte_alto | un_byte; carga_pp(byte_alto, LATCH1, CHIP1); return clk_bit; } /**************************************************************************** FUNCION: busca_esc DESCRIPCION: Realiza una tarea de b´ usqueda de los par´ ametros de escalado de la ganancia de cada etapa de interpolaci´ on en funci´ on del valor de programaci´ on (sobremuestreo) de las mismas. PARAMETROS DE ENTRADA: int I1, int I2, valor de la interpolaci´ on realizada en cada una de las etapas. PARAMETROS DE SALIDA: RESULTADO Y ERRORES: Devuelve el valor resultante de ganancia parcial correspondiente a los dos valores calculados. Se actualiza el valor de las variables globales control_modem[INT1_SCALE] y control_modem[INT2_SCALE], que sirven para programar la ganancia de los interpoladores. OBSERVACIONES: La carga del valor al que se actualizan las dos variables globales dentro de los registros del AD9853 es responsabilidad de la aplicaci´ on de usuario ****************************************************************************/ double busca_esc(int I1, int I2) { static double gain_tot, gain_1; static char int1, int2; gain_tot = tabla_I1[I1].nom_gain * tabla_I2[I2].nom_gain; if (gain_tot == 1.0) { int1 = tabla_I1[I1].nominal; int2 = tabla_I2[I2].nominal; } else { gain_tot = tabla_I1[I1].alt_gain * tabla_I2[I2].nom_gain; gain_1 = tabla_I1[I1].nom_gain * tabla_I2[I2].alt_gain; if ((gain_tot < 1.0) && (gain_1 < 1.0)) { gain_tot = tabla_I1[I1].nom_gain * tabla_I2[I2].nom_gain; int1 = tabla_I1[I1].nominal; int2 = tabla_I2[I2].nominal; } else if ((gain_tot > 1.0) && (gain_1 > 1.0)) { if (gain_tot < gain_1) { int1 = tabla_I1[I1].alt; int2 = tabla_I2[I2].nominal; } else { int1 = tabla_I1[I1].nominal; int2 = tabla_I2[I2].alt; gain_tot = gain_1; } } else { if (gain_tot > 1.0) { int1 = tabla_I1[I1].alt; int2 = tabla_I2[I2].nominal; } else { int1 = tabla_I1[I1].nominal; int2 = tabla_I2[I2].alt; gain_tot = gain_1; } } }

192

´ n modulAD C.1 Aplicacio

193

control_modem[INT1_SCALE] = int1 << 3; control_modem[INT2_SCALE] = int2 << 2; return gain_tot; } /**************************************************************************** FUNCION: interpolador DESCRIPCION: Calcula el valor de interpolaci´ on de cada etapa para sobremuestreo de los datos hasta acomodarlos a la frecuencia de reloj del sistema dentro del AD9853 PARAMETROS DE ENTRADA: int div_1, int div_2, valores seleccionados en los divisores. int modulacion, tipo de modulaci´ on seleccionada PARAMETROS DE SALIDA: RESULTADO Y ERRORES: 0 No se produjo error -1 N´ umero resultante es primo "para los interpoladores" y por tanto corresponde a un factor de interpolaci´ on total no v´ alido -2 El tipo de modulaci´ on es FSK. En este caso la funci´ on no tiene ning´ un efecto. -3 El tipo de modulaci´ on es QPSK y el valor de divisi´ on total es mayor de 651. -4 El tipo de modulaci´ on es 16QAM y el valor de divisi´ on total es mayor de 325. El valor calculado de factor de interpolaci´ on de cada etapa se queda almacenado en las variables globales control_modem[INT1_RATE] y control_modem[INT2_RATE]. La carga de estos dos valores dentro de los registros del AD9853 es responsabilidad de la aplicaci´ on de usuario OBSERVACIONES: Se actualizan las variables globales esc y esc_old de escalado de la cadena de filtro de datos, u ´tiles para reescalar los coefificentes de la etapa FIR y compensar de este modo el camino completo para que la ganancia total sea 1. ****************************************************************************/ int interpolador (int *div_1, int div_2, int modulacion) { static int factor_I1I2, factor_I1, factor_I2; static int n, hecho, correccion; static short dos_bytes; if (modulacion == FSK) return -2; //La funci´ on no tiene efecto hecho=NO; correccion=NO; do { // C´ alculo del factor de interpolaci´ on global if (div_2==SI) factor_I1I2 = *div_1 * 2; else factor_I1I2 = *div_1; // Divisi´ on total realizada en generador de reloj de bit if (modulacion == QPSK) { factor_I1I2 = factor_I1I2 * 3; if (factor_I1I2 > 1953) { if (div_2==SI) *div_1=325; else *div_1=651; correccion=33; } } else { factor_I1I2 = factor_I1I2 * 6; if (factor_I1I2 > 1953) { if (div_2==SI) *div_1=162; else *div_1=325; correccion=66; } }

//QPSK

//16QAM

// Comprobaci´ on de que el valor no es "primo" para los interpoladores

´ n modulAD C.1 Aplicacio

for (n=0; n<229; n++) { if ((primo_63[n] < factor_I1I2)&&( factor_I1I2 < primo_63[n+1])) { hecho=SI; break; } else if ((primo_63[n] == factor_I1I2)||(primo_63[n+1] == factor_I1I2)) { correccion=SI; *div_1= *div_1 - 1; break; } else if (factor_I1I2>647) { correccion=SI; *div_1= *div_1 - 1; break; } } } while (!hecho); // C´ alculo de los factores espec´ ıficos factor_I1 = sqrt(factor_I1I2) + 1; if (factor_I1 > 31) factor_I1 = 31; for (;;factor_I1--) { factor_I2 = factor_I1I2 / factor_I1; if ((factor_I1 * factor_I2 == factor_I1I2) || (factor_I2 > 63)) break; factor_I2++; if ((factor_I1 * factor_I2 == factor_I1I2) || (factor_I2 > 63)) break; } if (factor_I2 > 63) factor_I2 = 63; // Aunque no est´ e bi´ en calculado, el valor se actualiza siempre control_modem[INT1_RATE] = factor_I1 << 2; control_modem[INT2_RATE] = factor_I2 << 1; // C´ alculo de los dos factores de escala. El valor se almacena en la memoria de // configuraci´ on esc_old = 1 / esc; esc = busca_esc(factor_I1, factor_I2); // Falta escalar los 40 coeficientes del filtro FIR esc = 1 / esc; //

if (factor_I1 * factor_I2 != factor_I1I2) return -1; if (correccion) return -1; else if (correccion==33) return -3; else if (correccion==66) return -4; else return 0;

} /**************************************************************************** FUNCION: busca_equipo_mod DESCRIPCION: Funci´ on que se ejecuta u ´nicamente para comprobar la correcta conexi´ on de la placa de medici´ on de BER PARAMETROS DE ENTRADA: PARAMETROS DE SALIDA: RESULTADO Y ERRORES: int 1 si la placa funciona correctamente, 0 si no se encuentra (porque no est´ a alimentada, o no conectada al puerto paralelo) OBSERVACIONES: ****************************************************************************/ int busca_equipo_mod(void) { static unsigned char byte_s, cero, uno; //Reescritura del byte_bajo //carga_pp(byte_bajo, LATCH1, CHIP0); //Escribimos cero byte_alto = byte_alto & 0xDF; //Desactivaci´ on de tri-state carga_pp(byte_alto, LATCH1, CHIP1); byte_alto = byte_alto | 0x40; // cero carga_pp(byte_alto, LATCH1, CHIP1);

194

´ n modulAD C.1 Aplicacio

// lectura de la linea de datos byte_s=DlPortReadPortUchar(pp_estado); // linea de datos a alta impedancia byte_alto = byte_alto | 0x20; //Activaci´ on de tri-state carga_pp(byte_alto, LATCH1, CHIP1); if (byte_s & 0x8) cero = MAL; else cero = BIEN; // Escribimos uno byte_alto = byte_alto & 0xDF; //Desactivaci´ on de tri-state carga_pp(byte_alto, LATCH1, CHIP1); byte_alto = byte_alto & 0xBF; // uno carga_pp(byte_alto, LATCH1, CHIP1); // lectura de la linea de datos byte_s=DlPortReadPortUchar(pp_estado); // linea de datos a alta impedancia byte_alto = byte_alto | 0x20; //Activaci´ on de tri-state carga_pp(byte_alto, LATCH1, CHIP1); if (byte_s & 0x8) uno = BIEN; else uno = MAL; if ((cero == MAL) || (uno == MAL)) return NO; else return SI; }

195

´ n mediBER C.2 Aplicacio

C.2.

Aplicaci´ on mediBER

Ficheros ber.c y ber hard.c /**************************************************************************** INTERFAZ: Fichero fuente principal de la aplicaci´ on. FICHERO: ber.c VERSION: 1.0 ----------------------------------------------------------------------------AUTOR: Juan Luis T´ ebar FECHA: 22 Marzo del 2000 ----------------------------------------------------------------------------DESCRIPCION: Programa de control de la place de generaci´ on de secuencias pseudoaleatorias y medida de tasa de BER. El control se realiza a trav´ es del puerto paralelo del PC. ****************************************************************************/ #include #include #include #include <userint.h> #include #include "dlportio.h" // Interfaz para acceder al hardware desde windows #include "ber_def.h" #include "ber.h" #include "ber_hard.h"

//DECLARACION DE FUNCIONES void inicializa(void); //VARIABLES GLOBALES static int panel_ber, panel_sec, err; char puerto_control; double tiempo_fin_test, tiempo_test; // Env´ ıo de par´ ametros a los registros del chip DS2172 unsigned char control_bert[29]; // Bytes utilizados para la comunicaci´ on con la placa de BERT. unsigned char byte_control, byte_datos; // registros del puerto paralelo unsigned long pp_datos; //Normalmente s´ olo escritura unsigned long pp_estado; //lectura unsigned long pp_control; //lectura y escritura // Variables de ajuste dentro del bucle peri´ odico. Se hacen globales para poder // controlar el punto de ejecuci´ on al seleccionar algunas opciones de operacion char hay_test, cambio_sec, primer_seg; // Variables pasadas a globales para la generaci´ on del fichero de report int err_ins; double es, ses, dm, ber, esr, sesr, dmr, n_canales; double bits_rx_total, bits_err_total, vel_datos; // Paso de la secuencia de usuario al m´ odulo hardware unsigned long sec_usuario; // Comprobaci´ on de la existencia f´ ısica de la placa char hay_placa_ber, primer_bucle; int main (int argc, char *argv[]) { // Inicio est´ andar de Labwindows y carga de los paneles de la aplicaci´ on if (InitCVIRTE (0, argv, 0) == 0) return -1; /* out of memory */ if ((panel_ber = LoadPanel (0, "ber.uir", BER)) < 0) return -1; if ((panel_sec = LoadPanel (0, "ber.uir", SEC)) < 0) return -1;

196

´ n mediBER C.2 Aplicacio

// Utilizamos el puerto paralelo LPT1 puerto_control = 1; inicializa(); // Consideramos que la placa est´ a correctamente conectada en principio hay_placa_ber = SI; primer_bucle = SI; // Inicio y actualizaci´ on de las variables del entorno gr´ afico hay_test = NO; cambio_sec = NO; TipoSecuencia(panel_ber, BER_TIPO_SECUENCIA, EVENT_COMMIT, 0, 0, 0); DuracionTest(panel_ber, BER_DURACION_TEST, EVENT_COMMIT, 0, 0, 0); ErrorAuto(panel_ber, BER_ERROR_AUTO, EVENT_COMMIT, 0, 0, 0); StringSec(panel_ber, BER_TIPO_SECUENCIA, EVENT_COMMIT, 0, 0, 0); // Arranque del entorno DisplayPanel (panel_ber); RunUserInterface (); return 0; } /**************************************************************************** DESCRIPCION DE LAS FUNCIONES ****************************************************************************/ /**************************************************************************** FUNCION: inicializa DESCRIPCION: Realiza la secuencia de inicializaci´ on de la aplicaci´ on PARAMETROS DE ENTRADA: No PARAMETROS DE SALIDA: No RESULTADO Y ERRORES: Ninguno OBSERVACIONES: ****************************************************************************/ void inicializa(void) { unsigned char byte, n; // Selecci´ on del puerto paralelo de control if (puerto_control==1) pp_datos=LPT1; else pp_datos=LPT2; pp_estado=pp_datos+1; pp_control=pp_datos+2; // Inicializaci´ on del puerto paralelo byte=0x0; DlPortWritePortUchar(pp_datos, byte); byte=DlPortReadPortUchar(pp_estado); byte=DlPortReadPortUchar(pp_control); byte=byte & 0xF0; byte=byte | 0x8; DlPortWritePortUchar(pp_control, byte); // Arranque inicial del bert. Para que se cargen los par´ ametros por defecto inicia_hard_bert(); } /**************************************************************************** DESCRIPCION DE FUNCIONES CVICALLBACK ****************************************************************************/ /**************************************************************************** FUNCION: TipoSecuencia DESCRIPCION: Selector de la secuencia utilizada al realizar el test de BER PARAMETROS DE ENTRADA: Los t´ ıpicos de las funciones callback de Labwindows PARAMETROS DE SALIDA: RESULTADO Y ERRORES: 0 todo OK OBSERVACIONES: Si se cambia de secuencia mientras el test est´ a arrancado, ´ este se vuelve a reiniciar. ****************************************************************************/

197

´ n mediBER C.2 Aplicacio

int CVICALLBACK TipoSecuencia (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static int secuencia, habia_test; if (hay_test) habia_test=SI; else habia_test=NO; switch (event) { case EVENT_COMMIT: // Cambio de variable para mensajes cambio_sec = SI; // Se detiene el test para reprogramar StopTest(panel_ber, BER_STOP_TEST, EVENT_COMMIT, 0, 0, 0); // Actualizaci´ on de la configuraci´ on del bert err = GetCtrlVal(panel_ber, BER_TIPO_SECUENCIA, &secuencia); prog_sec(secuencia, sec_usuario); // Si el test estaba corriendo se reinicia if (habia_test) IniciaTest(panel_ber, BER_RUN_TEST, EVENT_COMMIT, 0, 0, 0); // Cambio de variable para mensajes cambio_sec = NO; break; case EVENT_RIGHT_CLICK: MessagePopup ("Selector de \"Secuencia patr´ on\"", "Permite la selecci´ on de la secuencia pseudoaleatoria o repetitiva\n" "con la que se trabajar´ a al realizar el tests."); break; } return 0; } /**************************************************************************** FUNCION: DuracionTest DESCRIPCION: Selecci´ on de la duraci´ on del test PARAMETROS DE ENTRADA: Los t´ ıpicos de las funciones callback de Labwindows PARAMETROS DE SALIDA: RESULTADO Y ERRORES: 0 todo OK OBSERVACIONES: Actualizaci´ on de la variable global que gobierna la duraci´ on de los test "tiempo_fin_test" ****************************************************************************/ int CVICALLBACK DuracionTest (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static int min_test; switch (event) { case EVENT_COMMIT: // Lectura del valor seleccionado. err = GetCtrlVal(panel_ber, BER_DURACION_TEST, &min_test); // Actualizaci´ on de la variable global (representa el tiempo en // segundos) tiempo_fin_test = 60.0 * min_test; break; case EVENT_RIGHT_CLICK: MessagePopup ("Selector de \"Duraci´ on del test\"", "Selecci´ on del tiempo durante el que se realiza la prueba\n" "de BER de entre unos per´ ıodos determinados."); break; } return 0; } /**************************************************************************** FUNCION: ErrorAuto DESCRIPCION: Activa en el DS2172 la inserci´ on autom´ atica de errores para obtener una tasa de BER determinada PARAMETROS DE ENTRADA: Los t´ ıpicos de las funciones callback de Labwindows PARAMETROS DE SALIDA:

198

´ n mediBER C.2 Aplicacio

RESULTADO Y ERRORES: 0 todo OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK ErrorAuto (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static unsigned char valor_err_auto; switch (event) { case EVENT_COMMIT: // Lectura del valor seleccionado. err = GetCtrlVal(panel_ber, BER_ERROR_AUTO, &valor_err_auto); error_auto(valor_err_auto); break; case EVENT_RIGHT_CLICK: MessagePopup ("Selector de \"Errores autom´ aticos\"", "Producci´ on autom´ atica de errores hasta " "conseguir la tasa de BER indicada."); break; } return 0; } /**************************************************************************** FUNCION: SecUser DESCRIPCION: Hace visible u oculta el panel donde se programa la secuencia repetitiva de usuario. PARAMETROS DE ENTRADA: Los t´ ıpicos de las funciones callback de Labwindows PARAMETROS DE SALIDA: RESULTADO Y ERRORES: 0 todo OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK SecUser (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static char panel_visible; switch (event) { case EVENT_COMMIT: if (panel_visible) { HidePanel(panel_sec); panel_visible = NO; } else { DisplayPanel (panel_sec); panel_visible = SI; } break; case EVENT_RIGHT_CLICK: MessagePopup ("Pulsador \"Secuencia usuario\"", "Hace visible u oculta el panel de selecci´ on de la secuencia " "repetitiva de usuario."); break; } return 0; } /**************************************************************************** FUNCION: InsertaError DESCRIPCION: Provoca la inserci´ on o transmisi´ on intencionada de un ´ unico error en la secuencia de salida. PARAMETROS DE ENTRADA: Los t´ ıpicos de las funciones callback de Labwindows PARAMETROS DE SALIDA: RESULTADO Y ERRORES: 0 todo OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK InsertaError (int panel, int control, int event, void *callbackData, int eventData1, int eventData2)

199

´ n mediBER C.2 Aplicacio

{ switch (event) { case EVENT_COMMIT: if (hay_test) { inserta_error(); err_ins++; //Contador para informes SetCtrlVal (panel_ber, BER_EVENTOS, "\nError insertado por el usuario"); } break; case EVENT_RIGHT_CLICK: MessagePopup ("Pulsador \"Insertar error\"", "Inserci´ on manual de un error en la secuencia de salida."); break; } return 0; } /**************************************************************************** FUNCION: GrabaRes DESCRIPCION: Genera un fichero de texto a modo de informe con los resultados que actualente presentan los indicadores de la aplicaci´ on. PARAMETROS DE ENTRADA: Funci´ on callback PARAMETROS DE SALIDA: RESULTADO Y ERRORES: 0 todo OK OBSERVACIONES: El fichero generado se crea en modo escritura, de modo que si existe un fichero anterior con el mismo nombre se perder´ a este ´ ultimo. ****************************************************************************/ int CVICALLBACK GrabaRes (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static char nombre_file[MAX_PATHNAME_LEN], proj_dir[MAX_PATHNAME_LEN]; static int pfile; static char aux[MAX_LONG_STRING]; static int index; switch (event) { case EVENT_COMMIT: GetProjectDir (proj_dir); if (FileSelectPopup (proj_dir, "*.txt", "*.txt", "Nombre del Fichero de Informe", VAL_OK_BUTTON, 0, 1, 1, 0, nombre_file) > 0) { // Abrimos el fichero donde se grabar´ an los resultados del test pfile = OpenFile(nombre_file, VAL_READ_WRITE, VAL_TRUNCATE, VAL_ASCII); // Texto del fichero de resultados del test FmtFile (pfile, "%s", "\tRESULTADOS DE LA PRUEBA DE MEDIDA DE TASA DE BER\n\n\n"); FmtFile (pfile, "%s<%s%s%s", "Fecha del test (mes-d´ ıa-a~ no):\t\t\t", DateStr (), "\n"); FmtFile (pfile, "%s<%s%s%s", "Hora del test:\t\t\t\t\t", TimeStr (), "\n\n"); // Valores programados err = GetCtrlIndex (panel_ber, BER_TIPO_SECUENCIA, &index); err = GetLabelFromIndex (panel_ber, BER_TIPO_SECUENCIA, index, aux); FmtFile (pfile, "%s<%s%s%s", "Tipo de secuencia utilizada:\t\t\t", aux, "\n"); err = GetCtrlIndex (panel_ber, BER_DURACION_TEST, &index); err = GetLabelFromIndex (panel_ber, BER_DURACION_TEST, index, aux); FmtFile (pfile, "%s<%s%s%s", "Tiempo de duraci´ on programada del test:\t\t", aux, "\n"); err = GetCtrlIndex (panel_ber, BER_ERROR_AUTO, &index); err = GetLabelFromIndex (panel_ber, BER_ERROR_AUTO, index, aux); FmtFile (pfile, "%s<%s%s%s", "Inserci´ on de errores autom´ aticos:\t\t", aux, "\n\n");

200

´ n mediBER C.2 Aplicacio

// Datos de inter´ es err = GetCtrlVal (panel_sec, SEC_STRING_SEC, aux); FmtFile (pfile, "%s<%s%s%s", "Secuencia de usuario programada:\t\t", aux, "\n"); Fmt (aux, "%s<%d", err_ins); FmtFile (pfile, "%s<%s%s%s", "Errores insertados manualmente:\t\t\t", aux, "\n\n"); // Valores resultantes err = GetCtrlVal (panel_ber, BER_IND_TIEMPO_TEST, aux); FmtFile (pfile, "%s<%s%s%s", "Tiempo de duraci´ on real del test:\t\t", aux, "\n"); err = GetCtrlVal (panel_ber, BER_IND_TIEMPO_DISPON, aux); FmtFile (pfile, "%s<%s%s%s", "Tiempo de disponibilidad durante test:\t\t", aux, "\n"); // // //

Fmt (aux, "%s<%f[p1]", vel_datos); FmtFile (pfile, "%s<%s%s%s%s", "Velocidad estimada de transmisi´ on de datos:\t", aux, " bps", "\n"); Fmt (aux, "%s<%f[p0]", bits_rx_total); FmtFile (pfile, "%s<%s%s%s", "N´ umero total de bits recibidos:\t\t\t", aux, "\n"); Fmt (aux, "%s<%f[p0]", bits_err_total); FmtFile (pfile, "%s<%s%s%s", "N´ umero total de bits err´ oneos:\t\t\t", aux, "\n\n"); Fmt (aux, "%s<%f[p2]", es); FmtFile (pfile, "%s<%s%s%s", "N´ umero de seg´ undos err´ oneos (ES):\t\t", aux, "\n"); Fmt (aux, "%s<%f[b4p2r]%s", esr, " %"); FmtFile (pfile, "%s<%s%s%s", "% de segundos err´ oneos (ES):\t\t\t", aux, "\n"); Fmt (aux, "%s<%f[p0]", ses); FmtFile (pfile, "%s<%s%s%s", "N´ umero de seg´ undos severamente err´ oneos (SES):\t", aux, "\n"); Fmt (aux, "%s<%f[b4p2r]%s", sesr, " %"); FmtFile (pfile, "%s<%s%s%s", "% de segundos severamente err´ oneos (SES):\t", aux, "\n"); Fmt (aux, "%s<%f[p0]", dm); FmtFile (pfile, "%s<%s%s%s", "N´ umero de minutos degradados (DM):\t\t", aux, "\n"); Fmt (aux, "%s<%f[b4p2r]%s", dmr, " %"); FmtFile (pfile, "%s<%s%s%s", "% de minutos degradados (DM):\t\t\t", aux, "\n\n"); Fmt (aux, "%s<%f[b4p4e2]", ber); FmtFile (pfile, "%s<%s%s%s", "Tasa de bits err´ oneos (BER):\t\t\t", aux, "\n"); err = CloseFile (pfile); } break; case EVENT_RIGHT_CLICK: MessagePopup ("Pulsador \"Grabar resultados\"", "Generaci´ on de un fichero de texto con los resultados del test."); break; } return 0;

201

´ n mediBER C.2 Aplicacio

} /**************************************************************************** FUNCION: IniciaTest DESCRIPCION: Activaci´ on de las medidas. PARAMETROS DE ENTRADA: Los t´ ıpicos de las funciones callback de Labwindows PARAMETROS DE SALIDA: RESULTADO Y ERRORES: 0 todo OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK IniciaTest (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: // Actualizaci´ on de variables del entorno hay_test = SI; primer_seg = SI; // Inicio del contador de errores manuales para report err_ins = 0; // Detalles del entorno gr´ afico if (cambio_sec == NO) { ResetTextBox (panel_ber, BER_EVENTOS, ""); SetCtrlVal (panel_ber, BER_EVENTOS, "Test iniciado por el usuario\n"); } if (cambio_sec == SI) { ResetTextBox (panel_ber, BER_EVENTOS, ""); SetCtrlVal (panel_ber, BER_EVENTOS, "Test iniciado por cambio en la secuencia utilizada\n"); } DefaultCtrl (panel_ber, BER_IND_TIEMPO_TEST); DefaultCtrl (panel_ber, BER_IND_TIEMPO_DISPON); DefaultCtrl (panel_ber, BER_IND_NRO_BITS); DefaultCtrl (panel_ber, BER_IND_NRO_BITS_ERR); DefaultCtrl (panel_ber, BER_IND_ES); DefaultCtrl (panel_ber, BER_IND_SES); DefaultCtrl (panel_ber, BER_IND_DM); DefaultCtrl (panel_ber, BER_IND_BER); // Cambios hardware para activar el test inicia_test(); // Se resetea el temporizador ResetTimer (panel_ber, BER_TIMER); break; case EVENT_RIGHT_CLICK: MessagePopup ("Pulsador \"Iniciar Test\"", "Activaci´ on de la secuencia de salida e inicio de las medidas."); break; } return 0; } /**************************************************************************** FUNCION: StopTest DESCRIPCION: Finalizaci´ on de las medidas. PARAMETROS DE ENTRADA: Los t´ ıpicos de las funciones callback de Labwindows PARAMETROS DE SALIDA: RESULTADO Y ERRORES: 0 todo OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK StopTest (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: // Cambios hardware para detener el test stop_test();

202

´ n mediBER C.2 Aplicacio

// Control de los mensajes if (hay_test) { if (tiempo_test < tiempo_fin_test) { if (cambio_sec == NO) SetCtrlVal (panel_ber, BER_EVENTOS, "\nTest detenido por el usuario"); } } // Actualizaci´ on de variables del entorno hay_test = NO; break; case EVENT_RIGHT_CLICK: MessagePopup ("Pulsador \"Detener Test\"", "Desactivaci´ on de la secuencia de salida y fin de las medidas."); break; } return 0; } /**************************************************************************** FUNCION: Salida DESCRIPCION: Finaliza la aplicaci´ on PARAMETROS DE ENTRADA: Los t´ ıpicos de las funciones callback de Labwindows PARAMETROS DE SALIDA: RESULTADO Y ERRORES: 0 todo OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK Salida (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: QuitUserInterface (0); break; case EVENT_RIGHT_CLICK: MessagePopup ("Pulsador \"Salida Programa\"", "Fin de aplicaci´ on y cierre del entorno gr´ afico."); break; } return 0; } /**************************************************************************** FUNCION: StringSec DESCRIPCION: Entrada de la secuencia arbitraria de ususario PARAMETROS DE ENTRADA: Los t´ ıpicos de las funciones callback de Labwindows PARAMETROS DE SALIDA: RESULTADO Y ERRORES: 0 todo OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK StringSec (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static char sec[9], mensaje[80], *fin; static double valor; static int secuencia; switch (event) { case EVENT_COMMIT: err = GetCtrlVal(panel_sec, SEC_STRING_SEC, sec); sec_usuario = strtoul (sec, &fin, 16); if (*fin != NULL) { sprintf(mensaje, "El valor %s no se puede convertir a n´ umero hexadecimal", fin); MessagePopup ("¡ Error al convertir la secuencia !", mensaje); DefaultCtrl (panel_sec, SEC_STRING_SEC); } err = GetCtrlVal(panel_ber, BER_TIPO_SECUENCIA, &secuencia); if (secuencia == 34) TipoSecuencia(panel_ber,

203

´ n mediBER C.2 Aplicacio

BER_TIPO_SECUENCIA, EVENT_COMMIT, 0, 0, 0); break; case EVENT_RIGHT_CLICK: MessagePopup ("Selector de \"Secuencia de usuario\"", "Permite la introducci´ on de la secuencia repetitiva que se " "usa al seleccionar \nel \"Patr´ on de usuario\" en el selector " "de secuencia patr´ on."); break; } return 0; } /**************************************************************************** FUNCION: PulsaSecOk DESCRIPCION: Cierra el panel de selecci´ on de la secuencia de usuario PARAMETROS DE ENTRADA: Los t´ ıpicos de las funciones callback de Labwindows PARAMETROS DE SALIDA: RESULTADO Y ERRORES: 0 todo OK OBSERVACIONES: ****************************************************************************/ int CVICALLBACK PulsaSecOk (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: SecUser (panel_ber, BER_PUL_SEC_USER, EVENT_COMMIT, 0, 0, 0); break; case EVENT_RIGHT_CLICK: MessagePopup ("Pulsador \"CERRAR\"", "Cierre del panel de selecci´ on de la secuencia de usuario."); break; } return 0; } /**************************************************************************** FUNCION: Bucle DESCRIPCION: Funci´ on principal de la aplicaci´ on. Se ejecuta autom´ aticamente cada segundo, y en ella se realizan varias tareas importantes como la medici´ on de bits y errores recibidos para calcular todos los indicadores del test, as´ ı como la vigilancia para determinar si la placa de hardware est´ a correctamente controlada PARAMETROS DE ENTRADA: Los t´ ıpicos de las funciones callback de Labwindows PARAMETROS DE SALIDA: RESULTADO Y ERRORES: 0 todo OK OBSERVACIONES: Si se determina que la placa no se puede controlar, se detiene el test y se inhabilitan los controles del entorno gr´ afico. Los resultados calculados de tasa de BER y dem´ as inicadores se almacenan en variables globales para poder ser recuperadas al generar el fichero de informe. ****************************************************************************/ int CVICALLBACK Bucle (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static double seg, min_t, min, horas_t, horas, dias; static double tiempo_dis; static double seg_dis, min_t_dis, min_dis, horas_t_dis, horas_dis, dias_dis;

//

static char txt_tiempo_test[40], txt_tiempo_dis[40], txt_bits_rx[40], txt_bits_err[40]; static char txt_es[40], txt_ses[40], txt_dm[40], txt_ber[40]; //Se hacen globales para poder generar el fichero de report static double es, ses, dm, ber, esr, sesr, dmr; static int secuencia; static t_datos datos_estado; static double bits_rx_dis[10], bits_err_dis[10], bits_rx_dm[60], bits_err_dm[60];

204

´ n mediBER C.2 Aplicacio

//

205

//Se hacen globales para generar el fichero de report static double bits_rx_total, bits_err_total; static double ber_i, bits_rx_acumul, bits_err_acumul, es_acumul, es_mx[10]; static char es_i, ses_i, ses_acumul, ses_mx[10], n, index_dm; static char alarma, disponibilidad, cambio_periodo, periodo_anterior; static double ber_60, bits_rx_60, bits_err_60; // Adaptaci´ on de la aplicaci´ on a velocidades de transmisi´ on mayores de 64 kbps static double es_i_0; if (event == EVENT_TIMER_TICK) { hay_placa_ber = busca_equipo_ber(); if (hay_placa_ber) { if (primer_bucle == NO) { primer_bucle = SI;

// Control de ejecuci´ on del bucle

// Display en la pantalla de mensajes SetCtrlVal (panel_ber, BER_EVENTOS, "\nRecuperado el control de la placa de BER\n\n"); // Habilitaci´ on de los err = SetCtrlAttribute err = SetCtrlAttribute err = SetCtrlAttribute err = SetCtrlAttribute err = SetCtrlAttribute err = SetCtrlAttribute err = SetCtrlAttribute err = SetCtrlAttribute err = SetCtrlAttribute err = SetCtrlAttribute

controles (panel_ber, (panel_ber, (panel_ber, (panel_ber, (panel_ber, (panel_ber, (panel_ber, (panel_ber, (panel_ber, (panel_ber,

BER_TIPO_SECUENCIA, ATTR_DIMMED, 0); BER_DURACION_TEST, ATTR_DIMMED, 0); BER_ERROR_AUTO, ATTR_DIMMED, 0); BER_RUN_TEST, ATTR_DIMMED, 0); BER_STOP_TEST, ATTR_DIMMED, 0); BER_PUL_INSERT_ERR, ATTR_DIMMED, 0); BER_PUL_SEC_USER, ATTR_DIMMED, 0); BER_LED_SINCRO, ATTR_DIMMED, 0); BER_LED_UNOS, ATTR_DIMMED, 0); BER_LED_CEROS, ATTR_DIMMED, 0);

} switch (hay_test) { case SI: tiempo_test++; GetCtrlVal(panel_ber, BER_TIPO_SECUENCIA, &secuencia); // Deshecho de la primera lectura de informaci´ on desde el chip if (primer_seg) { primer_seg = NO; cambio_periodo = NO; // Limpiamos los registros del integrado aplicacion_bert(&datos_estado, secuencia); // Inicializamos las variables de estad´ ıstica tiempo_test = tiempo_dis = 0.0; datos_estado.bits_rx = 0.0; datos_estado.bits_err = 0.0; es = ses = dm = ber = bits_rx_total = bits_err_total = 0.0; ber_i = ber_60 = 0.0; disponibilidad = SI; // Indica estado de disponibilidad del segundo anterior periodo_anterior = DISPONIBLE; for (n=0; n<10; n++) { ses_mx[n] = 0; es_mx[n] = 0; bits_rx_dis[n] = 0.0; bits_err_dis[n] = 0.0; } // Inicializaci´ on del almacenamiento de datos para determinaci´ on //de la proporci´ on de minutos degradados index_dm = 0; n_canales = 1; // Evita fallo al inicio del test break; } // Resto del tiempo del test // Lectura de registros del hardware

´ n mediBER C.2 Aplicacio

alarma = !aplicacion_bert(&datos_estado, secuencia); // Calculo del par´ ametros instant´ aneos ber_i = datos_estado.bits_err / datos_estado.bits_rx; ses_i = (alarma || (ber_i > 0.001))? 1 : 0; es_i = (datos_estado.bits_err > 0.0)? 1 : 0; // Se pondera para velocidades de transmisi´ on altas es_i_0 = datos_estado.bits_err / n_canales; es_i_0 = (es_i_0 > 1.0 )? 1.0 : es_i_0; // Almacenamiento de datos para posterior procesado en estad´ ısticas for (n=8, ses_acumul=0, es_acumul=0, bits_rx_acumul=0.0, bits_err_acumul=0.0 ; n>=0; n--) { ses_mx[n+1] = ses_mx[n]; ses_acumul = ses_acumul + ses_mx[n]; es_mx[n+1] = es_mx[n]; es_acumul = es_acumul + es_mx[n]; bits_rx_dis[n+1] = bits_rx_dis[n]; bits_rx_acumul = bits_rx_acumul + bits_rx_dis[n]; bits_err_dis[n+1] = bits_err_dis[n]; bits_err_acumul = bits_err_acumul + bits_err_dis[n]; } ses_mx[0] = ses_i; ses_acumul = ses_acumul + ses_mx[0]; es_mx[0] = es_i_0; //es_i; es_acumul = es_acumul + es_mx[0]; bits_rx_dis[0] = datos_estado.bits_rx; bits_rx_acumul = bits_rx_acumul + bits_rx_dis[0]; bits_err_dis[0] = datos_estado.bits_err; bits_err_acumul = bits_err_acumul + bits_err_dis[0]; // Determinaci´ on de la disponibilidad del enlace if (disponibilidad) disponibilidad = (ses_acumul >= 10)? NO : SI; else disponibilidad = (ses_acumul == 0)? SI : NO; if (disponibilidad) { switch (periodo_anterior) { case DISPONIBLE: tiempo_dis++; es = es + es_i_0; //(double)es_i; ses = ses + (double)ses_i; // C´ alculo del ber bits_rx_total = bits_rx_total + datos_estado.bits_rx; bits_err_total = bits_err_total + datos_estado.bits_err; ber = bits_err_total / bits_rx_total; // Almacenamiento para tasa de DM if (!ses_i) { bits_rx_dm[index_dm] = datos_estado.bits_rx; bits_err_dm[index_dm] = datos_estado.bits_err; index_dm++; if (index_dm == 59) { index_dm = 0; for ( n=0, bits_rx_60=0.0, bits_err_60=0.0; n<60; n++) { bits_rx_60 = bits_rx_60 + bits_rx_dm[n]; bits_err_60 = bits_err_60 + bits_err_dm[n]; } ber_60 = bits_err_60 / bits_rx_60; if (ber_60 > 0.000001) dm = dm + 1.0; } } break; case NO_DISPONIBLE: // Los 10 segundos anteriores se suman a las estad´ ısticas tiempo_dis = tiempo_dis + 10.0; es = es + es_acumul; ses = ses + (double)ses_acumul; //ses_acumul debe ser cero // C´ alculo del ber bits_rx_total = bits_rx_total + bits_rx_acumul;

206

´ n mediBER C.2 Aplicacio

207

bits_err_total = bits_err_total + bits_err_acumul; ber = bits_err_total / bits_rx_total; // Datos para la tasa de DM, contando los 10 seg anteriores for ( n=0; n<10; n++) { bits_rx_dm[index_dm] = bits_rx_dis[n]; bits_err_dm[index_dm] = bits_err_dis[n]; index_dm++; if (index_dm == 59) { index_dm = 0; for ( n=0, bits_rx_60=0.0, bits_err_60=0.0; n<60; n++) { bits_rx_60 = bits_rx_60 + bits_rx_dm[n]; bits_err_60 = bits_err_60 + bits_err_dm[n]; } ber_60 = bits_err_60 / bits_rx_60; if (ber_60 > 0.000001) dm = dm + 1.0; } } break; } periodo_anterior = DISPONIBLE; // Display en la pantalla de mensajes SetCtrlVal (panel_ber, BER_EVENTOS, " * "); } else { // No hay disponibilidad switch (periodo_anterior) { case DISPONIBLE: // Los 10 segundos anteriores se eliminan de las estad´ ısticas tiempo_dis = tiempo_dis - 9.0; es = es + es_i_0 - es_acumul;//(double)es_i; ses = ses + (double)ses_i - (double)ses_acumul; // C´ alculo del ber bits_rx_total = bits_rx_total + datos_estado.bits_rx - bits_rx_acumul; bits_err_total = bits_err_total + datos_estado.bits_err - bits_err_acumul; ber = bits_err_total / bits_rx_total; break; case NO_DISPONIBLE: // Todo sigue igual break; } periodo_anterior = NO_DISPONIBLE; // Display en la pantalla de mensajes SetCtrlVal (panel_ber, BER_EVENTOS, "\nEsperando disponibilidad"); } // Colores de leds alarma ? SetCtrlVal (panel_ber, BER_LED_SINCRO, OFF) : SetCtrlVal (panel_ber, BER_LED_SINCRO, ON); datos_estado.todo_1 ? SetCtrlVal (panel_ber, BER_LED_UNOS, ON) : SetCtrlVal (panel_ber, BER_LED_UNOS, OFF); datos_estado.todo_0 ? SetCtrlVal (panel_ber, BER_LED_CEROS, ON) : SetCtrlVal (panel_ber, BER_LED_CEROS, OFF); // Calculo del tiempo de test en dias, horas, minutos y segundos seg = fmod (tiempo_test, 60.0); min_t = (tiempo_test - seg ) / 60.0; min = fmod (min_t, 60.0); horas_t = (min_t - min) / 60.0; horas = fmod (horas_t , 24.0); dias = (horas_t - horas) / 24.0; // Presentaci´ on de tiempo de duraci´ on del test DefaultCtrl (panel_ber, BER_IND_TIEMPO_TEST); Fmt (txt_tiempo_test, "%s<%f[w1p0]%s%f[w2p0]%s%f[w2p0]%s%f[w2p0]%s", dias, "d ", horas, "h ", min, "m ", seg, "s"); err = SetCtrlVal (panel_ber, BER_IND_TIEMPO_TEST, txt_tiempo_test); // Si se alcanza el tiempo final, el test se para

´ n mediBER C.2 Aplicacio

208

if (tiempo_test >= tiempo_fin_test) { StopTest(panel_ber, BER_STOP_TEST, EVENT_COMMIT, 0, 0, 0); SetCtrlVal (panel_ber, BER_EVENTOS, "\nTest finalizado"); } // Lo mismo para el tiempo de disponibilidad seg_dis = fmod (tiempo_dis, 60.0); min_t_dis = (tiempo_dis - seg_dis ) / 60.0; min_dis = fmod (min_t_dis, 60.0); horas_t_dis = (min_t_dis - min_dis) / 60.0; horas_dis = fmod (horas_t_dis , 24.0); dias_dis = (horas_t_dis - horas_dis) / 24.0; // Presentaci´ on de tiempo de disponibilidad durante el test DefaultCtrl (panel_ber, BER_IND_TIEMPO_DISPON); Fmt (txt_tiempo_dis, "%s<%f[w1p0]%s%f[w2p0]%s%f[w2p0]%s%f[w2p0]%s", dias_dis, "d ", horas_dis, "h ", min_dis, "m ", seg_dis, "s"); err = SetCtrlVal (panel_ber, BER_IND_TIEMPO_DISPON, txt_tiempo_dis); // TASA ESR, SESR y DMR esr = (es * 100) / tiempo_dis; sesr =(ses * 100) / tiempo_dis; dmr =(dm * 100) / (tiempo_dis / 60.0); // C´ alculo de la velocidad de transmisi´ on vel_datos = bits_rx_total / tiempo_dis; n_canales = vel_datos / 64000.0; // Entorno gr´ afico DefaultCtrl (panel_ber, BER_IND_NRO_BITS); Fmt (txt_bits_rx, "%s<%f[b4p6e2]", bits_rx_total); err = SetCtrlVal (panel_ber, BER_IND_NRO_BITS, txt_bits_rx); DefaultCtrl (panel_ber, BER_IND_NRO_BITS_ERR); Fmt (txt_bits_err, "%s<%f[b4p6e2]", bits_err_total); err = SetCtrlVal (panel_ber, BER_IND_NRO_BITS_ERR, txt_bits_err); DefaultCtrl (panel_ber, BER_IND_ES); Fmt (txt_es, "%s<%f[p1e1]%s%f[b4p2r]%s", es, " ", esr, "%"); err = SetCtrlVal (panel_ber, BER_IND_ES, txt_es); DefaultCtrl (panel_ber, BER_IND_SES); Fmt (txt_ses, "%s<%f[p1e1]%s%f[b4p3r]%s", ses, " ", sesr, "%"); err = SetCtrlVal (panel_ber, BER_IND_SES, txt_ses); DefaultCtrl (panel_ber, BER_IND_DM); Fmt (txt_dm, "%s<%f[p1e1]%s%f[b4p2r]%s", dm, " ", dmr, "%"); err = SetCtrlVal (panel_ber, BER_IND_DM, txt_dm); DefaultCtrl (panel_ber, BER_IND_BER); Fmt (txt_ber, "%s<%f[b4p4e2]", ber); err = SetCtrlVal (panel_ber, BER_IND_BER, txt_ber); break; case NO: // No hay test // Colores de leds SetCtrlVal (panel_ber, BER_LED_SINCRO, OFF); SetCtrlVal (panel_ber, BER_LED_UNOS, OFF); SetCtrlVal (panel_ber, BER_LED_CEROS, OFF); break; } } else { // !hay_placa_ber if (primer_bucle) { primer_bucle = NO;

// Control de ejecuci´ on del bucle

// Display en la pantalla de mensajes ResetTextBox (panel_ber, BER_EVENTOS, ""); SetCtrlVal (panel_ber, BER_EVENTOS, "Fallo del puerto de control.\nImposible controlar la placa de BER\n");

´ n mediBER C.2 Aplicacio

// Inhabilitaci´ on de los controles err = SetCtrlAttribute (panel_ber, err = SetCtrlAttribute (panel_ber, err = SetCtrlAttribute (panel_ber, err = SetCtrlAttribute (panel_ber, err = SetCtrlAttribute (panel_ber, err = SetCtrlAttribute (panel_ber, err = SetCtrlAttribute (panel_ber, err = SetCtrlAttribute (panel_ber, err = SetCtrlAttribute (panel_ber, err = SetCtrlAttribute (panel_ber, } } } return 0; }

209

BER_TIPO_SECUENCIA, ATTR_DIMMED, 1); BER_DURACION_TEST, ATTR_DIMMED, 1); BER_ERROR_AUTO, ATTR_DIMMED, 1); BER_RUN_TEST, ATTR_DIMMED, 1); BER_STOP_TEST, ATTR_DIMMED, 1); BER_PUL_INSERT_ERR, ATTR_DIMMED, 1); BER_PUL_SEC_USER, ATTR_DIMMED, 1); BER_LED_SINCRO, ATTR_DIMMED, 1); BER_LED_UNOS, ATTR_DIMMED, 1); BER_LED_CEROS, ATTR_DIMMED, 1);

´ n mediBER C.2 Aplicacio

210

/**************************************************************************** MODULO: Recopilaci´ on de funciones hardware para la aplicacion de control del generador de secuencias pseudoaleatorias a partir del DS2172 FICHERO: ber_hard.c VERSION: 1.0 ----------------------------------------------------------------------------AUTOR: Juan Luis T´ ebar Garc´ ıa [email protected] FECHA: 27 de Abril del 2000 ----------------------------------------------------------------------------DESCRIPCION: ****************************************************************************/ #include <userint.h> #include #include #include "dlportio.h" #include "ber_def.h" // Defines de todo el proyecto #include "ber_hard.h" // Variables importadas del m´ odulo principal // Caracteres reservados para el env´ ıo de par´ ametros a los registros del chip DS2172 extern unsigned char control_bert[29]; // Bytes utilizados para la comunicaci´ on con el modulador. Se especifican como // global al tenerlos que utilizar para la programaci´ on del generador de // reloj de bit, adem´ as de para controlar el modulador extern unsigned char byte_control, byte_datos; // registros del extern unsigned extern unsigned extern unsigned

puerto paralelo long pp_datos; long pp_estado; long pp_control;

//Normalmente s´ olo escritura //lectura //lectura y escritura

// Codificaci´ on de las funciones /**************************************************************************** FUNCION: carga_pp DESCRIPCION: Realiza la escritura de un byte en un registro de los circuitos controlados mediante el puerto paralelo PARAMETROS DE ENTRADA: dato: es el byte que se escribe pcb: se refiere a la tarjeta destino: LATCH0 placa ber, LATCH1 placa mod reg_pcb: registro concreto dentro de cada placa: CHIP0, ... , CHIP3 PARAMETROS DE SALIDA: RESULTADO Y ERRORES: Entero -1 error; 0 todo bien OBSERVACIONES: El puerto paralelo seleccionado para el env´ ıo depende del valor de la variable global "puerto_control". La escritura se realiza de forma que el valor a escribir est´ e en el puerto antes de activar la carga, con el objetivo de no perturbar aquellas salidas que afecten muy directamente al funcionamiento hardware de los circuitos. ****************************************************************************/ int carga_pp (unsigned char dato, char pcb, char reg_pcb) { static unsigned char byte; //Escritura del dato en el puerto paralelo DlPortWritePortUchar(pp_datos, dato); //Selecci´ on del registro dentro de la placa byte=DlPortReadPortUchar(pp_control); byte=byte & 0xF0; switch (reg_pcb) { case CHIP0: byte=byte | 0x8; // Selecci´ on de CHIP0 DlPortWritePortUchar(pp_control, byte); break; case CHIP1: byte=byte | 0xC; // Selecci´ on de CHIP1 DlPortWritePortUchar(pp_control, byte); break; case CHIP2:

´ n mediBER C.2 Aplicacio

211

byte=byte | 0x0; // Selecci´ on DlPortWritePortUchar(pp_control, break; case CHIP3: byte=byte | 0x4; // Selecci´ on DlPortWritePortUchar(pp_control, break; default: break;

de CHIP2 (Ya estaba seleccionado) byte);

de CHIP3 byte);

} // Activaci´ on de la linea chip_select en el registro en cuesti´ on if (pcb==LATCH0) { byte=byte & 0xFC; byte=byte | 0x1; // Selecci´ on de LATCH0 DlPortWritePortUchar(pp_control, byte); } if (pcb==LATCH1) { byte=byte & 0xFC; byte=byte | 0x2; // Selecci´ on de LATCH1 DlPortWritePortUchar(pp_control, byte); } // Dejamos el registro de control con los cuatro bits a 1 // ESTE ES EL MOMENTO EN QUE VERDADERAMENTE SE GRABA EL DATO DENTRO // DE LOS REGISTROS, PUES SE CARGAN EN EL FLANCO DE SUBIDA byte=byte & 0xFC; // valor final de reposo DlPortWritePortUchar(pp_control, byte); // Queda direccionado un registro inexistente byte=byte & 0xF0; byte=byte | 0x4; // Selecci´ on de CHIP3 DlPortWritePortUchar(pp_control, byte); return 0; } /**************************************************************************** FUNCION: lee_par_bert DESCRIPCION: Realiza la secuencia de leer datos a trav´ es del puerto paralelo, a partir del registro seleccionado. Las instrucciones est´ an adaptadas al hardware de la placa de ber. Los datos se leen a trav´ es del puerto de estado. PARAMETROS DE ENTRADA: dir: sirve para indicar la "direcci´ on" desde donde se leen los datos, si desde el bus de datos (sentido desde el pc de control), o desde el punto de vista de la respuesta del DS2172. BUS, 1 - se lee el dato puesto en el bus desde el pc de control DS2172, 0 - se lee el dato puesto en el bus por el integrado DS2172. reg_ini: registro del que se va a obtener el primer byte le´ ıdo. nro_reg: N´ umero de registros a leer a partir del valor reg_ini. PARAMETROS DE SALIDA: No hay RESULTADO Y ERRORES: OBSERVACIONES: Los par´ ametros de entrada reg_ini y nro_reg s´ olo tienen valor en el caso de estarse leyendo registros del integrado. Si lo que se lee es el valor del bus, u ´nicamente se leer´ a un valor, y ´ este es justo el que hay en el bus de datos. El byte(s) le´ ıdo se almacena siempre en la variable global byte_datos, y adem´ as, si la lectura se realiza sobre los registros del DS2172, sobre el array, tambi´ en global, donde se guardan los valores de los contenidos de los registros control_bert[reg_ini], y superiores si la lectura se realiza sobre varios registros. En este caso, al final de la funci´ on, la variable byte_datos contendr´ a el u ´ltimo valor le´ ıdo ****************************************************************************/ int lee_par_bert(char dir, char reg_ini, char nro_reg) { unsigned char byte_m, byte_l, m; switch (dir) { case DS2172:

//datos desde DS2172

´ n mediBER C.2 Aplicacio

212

// Estado inicial. Bus en Tri-state y se anulan #CS, #WR, #RD, y ALE byte_control = byte_control | 0x17; byte_control = byte_control & 0xF7; carga_pp (byte_control, LATCH0, CHIP0); // Inicio del bucle de lectura, que se repite tantas veces como registros // se van a leer, y viene indicado en el par´ ametro de entrada nro_reg for (m = (unsigned)reg_ini; m < (reg_ini + nro_reg); m++) { // Activaci´ on de ALE byte_control = byte_control | 0x08; carga_pp (byte_control, LATCH0, CHIP0); // Bus transceiver activado. (carga de la direcci´ on a leer) byte_control = byte_control & 0xEF; //Tristate a cero carga_pp (byte_control, LATCH0, CHIP0); // Carga de la direcci´ on en el DS2172 carga_pp (m, LATCH0, CHIP1); // Activaci´ on del #CS byte_control = byte_control & 0xFE; carga_pp (byte_control, LATCH0, CHIP0); // Carga de la direcci´ on. ALE a bajo byte_control = byte_control & 0xF7; carga_pp (byte_control, LATCH0, CHIP0); // Bus transceiver desactivado. byte_control = byte_control | 0x10; //Tristate a uno carga_pp (byte_control, LATCH0, CHIP0); // Activaci´ on de la linea #RD //(aqu´ ı es cuando se pone el dato en el bus) byte_control = byte_control & 0xFB; carga_pp (byte_control, LATCH0, CHIP0); // Lectura del dato del bus //Lectura del nibble mas significativo byte_control = byte_control | 0x20; carga_pp (byte_control, LATCH0, CHIP0); byte_m = DlPortReadPortUchar(pp_estado); byte_m = byte_m ^ 0x80; //Lectura del nibble menos significativo byte_control = byte_control & 0xDF; carga_pp (byte_control, LATCH0, CHIP0); byte_l = DlPortReadPortUchar(pp_estado); byte_l = byte_l ^ 0x80; //Arreglos para byte_l = byte_l byte_m = byte_m byte_m = byte_m

presentar el resultado >> 4; & 0xF0; | byte_l;

byte_datos = byte_m; control_bert[m] = byte_m; // Desactivaci´ on de la linea #RD byte_control = byte_control | 0x04; carga_pp (byte_control, LATCH0, CHIP0); // Desactivaci´ on de #CS byte_control = byte_control | 0x1; carga_pp (byte_control, LATCH0, CHIP0); } break; case BUS:

//datos desde el bus de datos

´ n mediBER C.2 Aplicacio

//Triestate en la parte del DS2172 y habilitaci´ on de salida en U4 byte_control = byte_control | 0x27; byte_control = byte_control & 0xEF; carga_pp (byte_control, LATCH0, CHIP0); //Lectura del nibble mas significativo byte_control = byte_control | 0x20; carga_pp (byte_control, LATCH0, CHIP0); byte_m = DlPortReadPortUchar(pp_estado); byte_m = byte_m ^ 0x80; //Lectura del nibble menos significativo byte_control = byte_control & 0xDF; carga_pp (byte_control, LATCH0, CHIP0); byte_l = DlPortReadPortUchar(pp_estado); byte_l = byte_l ^ 0x80; //Arreglos para byte_l = byte_l byte_m = byte_m byte_m = byte_m

presentar el resultado >> 4; & 0xF0; | byte_l;

byte_datos = byte_m; } return 0; } /**************************************************************************** FUNCION: escribe_par_bert DESCRIPCION: Realiza la secuencia de escribir datos a partir del registro seleccionado, una cantidad de registros igual al n´ umero de entrada PARAMETROS DE ENTRADA: reg_ini: registro donde se va a escribir el primer byte. nro_reg: N´ umero de registros a escribir a partir del valor reg_ini. PARAMETROS DE SALIDA: No hay RESULTADO Y ERRORES: Entero -1 error; 0 todo bien OBSERVACIONES: Los valores a escribir son los contenidos en el array de caracteres global control_bert[], con ı ´ndice igual al del registro escrito. ****************************************************************************/ int escribe_par_bert(char reg_ini, char nro_reg) { unsigned char un_byte, m; int n; // Estado inicial. Se anulan #CS, #WR, #RD, y ALE byte_control = byte_control | 0x7; byte_control = byte_control & 0xF7; carga_pp (byte_control, LATCH0, CHIP0); // Bus transceiver activado. (vamos a escribir en el DS2172) byte_control = byte_control & 0xEF; //Tristate a cero carga_pp (byte_control, LATCH0, CHIP0); // Inicio del bucle de escritura que se repite tantas veces como registros // se van a escribir, y viene indicado en el par´ ametro de entrada nro_reg for (m = (unsigned)reg_ini; m < (reg_ini + nro_reg); m++) { // Activaci´ on de ALE byte_control = byte_control | 0x08; carga_pp (byte_control, LATCH0, CHIP0); // Carga de la direcci´ on en el DS2172 carga_pp (m, LATCH0, CHIP1); // Activaci´ on del #CS byte_control = byte_control & 0xFE; carga_pp (byte_control, LATCH0, CHIP0);

213

´ n mediBER C.2 Aplicacio

214

// Carga de la direcci´ on. ALE a bajo byte_control = byte_control & 0xF7; carga_pp (byte_control, LATCH0, CHIP0); // Escritura en el bus del dato a cargar un_byte = control_bert[m]; carga_pp (un_byte, LATCH0, CHIP1); // Activaci´ on de la linea #WR byte_control = byte_control & 0xFD; carga_pp (byte_control, LATCH0, CHIP0); // Desactivaci´ on de la linea #WR (aqu´ ı es cuando se escribe el dato) byte_control = byte_control | 0x02; carga_pp (byte_control, LATCH0, CHIP0); // Desactivaci´ on de #CS byte_control = byte_control | 0x1; carga_pp (byte_control, LATCH0, CHIP0); } return 0; } /**************************************************************************** FUNCION: inicia_hard_bert DESCRIPCION: Carga inicial de los registros del integrado PARAMETROS DE ENTRADA: Ninguno PARAMETROS DE SALIDA: Ninguno RESULTADO Y ERRORES: 0, todo OK OBSERVACIONES: Necesaria en la inicializaci´ on de la aplicaci´ on. Posteriormente el resto de funciones actualiza los registros del integrado ****************************************************************************/ int inicia_hard_bert(void) { char n; // Inicializaci´ on de la memoria de configuraci´ on // Secuencia inicial 2^21 - 1 control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0x14; control_bert[POLYNOMIAL_TAB] = 0x01; // Configuraci´ on de partida control_bert[PATTERN_CONTROL] = 0x20; // No se insertan errores control_bert[ERROR_INSERT] = 0x00; // Se inicializa la cuenta de bits a cero control_bert[BIT_COUNT_3] = 0x00; control_bert[BIT_COUNT_2] = 0x00; control_bert[BIT_COUNT_1] = 0x00; control_bert[BIT_COUNT_0] = 0x00; control_bert[BIT_ERR_COUNT_3] control_bert[BIT_ERR_COUNT_2] control_bert[BIT_ERR_COUNT_1] control_bert[BIT_ERR_COUNT_0] control_bert[PATTERN_RX_3] control_bert[PATTERN_RX_2] control_bert[PATTERN_RX_1] control_bert[PATTERN_RX_0]

= = = =

= = = =

0x00; 0x00; 0x00; 0x00;

0x00; 0x00; 0x00; 0x00;

// Suponemos que todo est´ a bien

´ n mediBER C.2 Aplicacio

215

control_bert[STATUS] = 0x00; // Inhabilitamos la generaci´ on de interrupciones control_bert[INT_MASK] = 0x00; control_bert[TEST] = 0x00; // Carga de los registros del integrado for (n=PATTERN_3; n<=INT_MASK; n++) escribe_par_bert(n, 1); escribe_par_bert(TEST, 1); return 0; } /**************************************************************************** FUNCION: prog_sec DESCRIPCION: Cambios en los registros internos del chip para modificar la secuencia con la que se realizar´ a el test de BER PARAMETROS DE ENTRADA: int secuencia: C´ odigo de secuencia utilizada unsigned long _4_bytes: valor de la secuencia repetitiva cuando se selecciona la secuencia arbitraria de usuario. PARAMETROS DE SALIDA: RESULTADO Y ERRORES: 0, OK OBSERVACIONES: Si la secuencia seleccionada no es la de usuario, el par´ ametro de entrada _4_bytes es indiferente ****************************************************************************/ int prog_sec (int secuencia, unsigned long _4_bytes) { static char longitud; static unsigned long mas_bytes; switch (secuencia) { case 1: // Secuencia 2^3 - 1 control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0x2; control_bert[POLYNOMIAL_TAB] = 0x0; // QRSS=0 y PATTERN SELECT=1 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 2: // Secuencia 2^4 - 1 control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0x3; control_bert[POLYNOMIAL_TAB] = 0x0; // QRSS=0 y PATTERN SELECT=1 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 3: // Secuencia 2^5 - 1 control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0x4; control_bert[POLYNOMIAL_TAB] = 0x1; // QRSS=0 y PATTERN SELECT=1

0xBF; 0x20;

0xBF; 0x20;

´ n mediBER C.2 Aplicacio

control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & 0xBF; control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | 0x20; escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 4: // Secuencia 2^6 - 1 control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0x5; control_bert[POLYNOMIAL_TAB] = 0x4; // QRSS=0 y PATTERN SELECT=1 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & 0xBF; control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | 0x20; escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 5: // Secuencia 2^7 - 1 control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0x6; control_bert[POLYNOMIAL_TAB] = 0x0; // QRSS=0 y PATTERN SELECT=1 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & 0xBF; control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | 0x20; escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 6: // Secuencia 2^7 - 1 Fractional T1 LB Activate control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0x6; control_bert[POLYNOMIAL_TAB] = 0x3; // QRSS=0 y PATTERN SELECT=1 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & 0xBF; control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | 0x20; escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 7: // Secuencia 2^7 - 1 Fractional T1 LB Deactivate control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0x6; control_bert[POLYNOMIAL_TAB] = 0x3; // QRSS=0 y PATTERN SELECT=1 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & 0xBF; control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | 0x20; escribe_par_bert(PATTERN_3, 7); //TINV=RINV=1 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] | 0x30; escribe_par_bert(ERROR_INSERT, 1); break; case 8: // Secuencia 2^9 - 1 O.153 (tipo 511)

216

´ n mediBER C.2 Aplicacio

control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0x8; control_bert[POLYNOMIAL_TAB] = 0x4; // QRSS=0 y PATTERN SELECT=1 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & 0xBF; control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | 0x20; escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 9: // Secuencia 2^10 - 1 control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0x9; control_bert[POLYNOMIAL_TAB] = 0x2; // QRSS=0 y PATTERN SELECT=1 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & 0xBF; control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | 0x20; escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 10: // Secuencia 2^11 - 1 O.152 y O.153 (tipo 2047) control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0xA; control_bert[POLYNOMIAL_TAB] = 0x8; // QRSS=0 y PATTERN SELECT=1 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & 0xBF; control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | 0x20; escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 11: // Secuencia 2^15 - 1 O.151 control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0xE; control_bert[POLYNOMIAL_TAB] = 0xD; // QRSS=0 y PATTERN SELECT=1 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & 0xBF; control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | 0x20; escribe_par_bert(PATTERN_3, 7); //TINV=RINV=1 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] | 0x30; escribe_par_bert(ERROR_INSERT, 1); break; case 12: // Secuencia 2^17 - 1 control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0x10; control_bert[POLYNOMIAL_TAB] = 0x2; // QRSS=0 y PATTERN SELECT=1 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & 0xBF;

217

´ n mediBER C.2 Aplicacio

control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 13: // Secuencia 2^18 - 1 control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0x11; control_bert[POLYNOMIAL_TAB] = 0x6; // QRSS=0 y PATTERN SELECT=1 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 14: // Secuencia 2^20 - 1 O.153 control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0x13; control_bert[POLYNOMIAL_TAB] = 0x2; // QRSS=0 y PATTERN SELECT=1 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 15: // Secuencia 2^20 - 1 O.151 QRSS control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0x13; control_bert[POLYNOMIAL_TAB] = 0x10; // QRSS=1 y PATTERN SELECT=1 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 16: // Secuencia 2^21 - 1 control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0x14; control_bert[POLYNOMIAL_TAB] = 0x1; // QRSS=0 y PATTERN SELECT=1 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 17: // Secuencia 2^22 - 1 control_bert[PATTERN_3] = 0xFF;

218

0x20;

0xBF; 0x20;

0xBF; 0x20;

0x40; 0x20;

0xBF; 0x20;

´ n mediBER C.2 Aplicacio

control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0x15; control_bert[POLYNOMIAL_TAB] = 0x0; // QRSS=0 y PATTERN SELECT=1 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 18: // Secuencia 2^23 - 1 O.151 control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0x16; control_bert[POLYNOMIAL_TAB] = 0x11; // QRSS=0 y PATTERN SELECT=1 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | escribe_par_bert(PATTERN_3, 7); //TINV=RINV=1 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x3F; control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] | 0x30; escribe_par_bert(ERROR_INSERT, 1); break; case 19: // Secuencia 2^25 - 1 control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0x18; control_bert[POLYNOMIAL_TAB] = 0x2; // QRSS=0 y PATTERN SELECT=1 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 20: // Secuencia 2^28 - 1 control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0x1B; control_bert[POLYNOMIAL_TAB] = 0x2; // QRSS=0 y PATTERN SELECT=1 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 21: // Secuencia 2^29 - 1 control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0x1C; control_bert[POLYNOMIAL_TAB] = 0x01; // QRSS=0 y PATTERN SELECT=1 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] &

219

0xBF; 0x20;

0xBF; 0x20;

0xBF; 0x20;

0xBF; 0x20;

0xBF;

´ n mediBER C.2 Aplicacio

control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 22: // Secuencia 2^31 - 1 control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0x1E; control_bert[POLYNOMIAL_TAB] = 0x02; // QRSS=0 y PATTERN SELECT=1 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 23: // Secuencia 2^32 - 1 control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0x1F; control_bert[POLYNOMIAL_TAB] = 0x10; // QRSS=0 y PATTERN SELECT=1 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 24: // Secuencia de todo unos control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFF; control_bert[PATTERN_LENGTH] = 0x00; control_bert[POLYNOMIAL_TAB] = 0x00; //QRSS=PATTERN SELECT=0 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 25: // Secuencia de todo ceros control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFE; control_bert[PATTERN_LENGTH] = 0x00; control_bert[POLYNOMIAL_TAB] = 0x00; //QRSS=PATTERN SELECT=0 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 26: // Secuencia alternada de unos y ceros control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF;

220

0x20;

0xBF; 0x20;

0xBF; 0x20;

0x9F;

0x9F;

´ n mediBER C.2 Aplicacio

control_bert[PATTERN_0] = 0xFE; control_bert[PATTERN_LENGTH] = 0x01; control_bert[POLYNOMIAL_TAB] = 0x00; //QRSS=PATTERN SELECT=0 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 27: // Secuencia doble alternada de unos y ceros control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFC; control_bert[PATTERN_LENGTH] = 0x03; control_bert[POLYNOMIAL_TAB] = 0x00; //QRSS=PATTERN SELECT=0 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 28: // Secuencia de 3 unos en 24 ceros control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0x20; control_bert[PATTERN_1] = 0x00; control_bert[PATTERN_0] = 0x22; control_bert[PATTERN_LENGTH] = 0x17; control_bert[POLYNOMIAL_TAB] = 0x00; //QRSS=PATTERN SELECT=0 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 29: // Secuencia de 1 uno en 16 ceros control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0x00; control_bert[PATTERN_0] = 0x01; control_bert[PATTERN_LENGTH] = 0x0F; control_bert[POLYNOMIAL_TAB] = 0x00; //QRSS=PATTERN SELECT=0 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 30: // Secuencia de 1 uno en 18 ceros control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0x01; control_bert[PATTERN_LENGTH] = 0x07; control_bert[POLYNOMIAL_TAB] = 0x00; //QRSS=PATTERN SELECT=0 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 31: // Secuencia de 1 uno en 4 ceros control_bert[PATTERN_3] = 0xFF;

221

0x9F;

0x9F;

0x9F;

0x9F;

0x9F;

´ n mediBER C.2 Aplicacio

control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xF1; control_bert[PATTERN_LENGTH] = 0x03; control_bert[POLYNOMIAL_TAB] = 0x00; //QRSS=PATTERN SELECT=0 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 32: // Secuencia D4 bucle activado control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xF0; control_bert[PATTERN_LENGTH] = 0x04; control_bert[POLYNOMIAL_TAB] = 0x00; //QRSS=PATTERN SELECT=0 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 33: // Secuencia D4 bucle desactivado control_bert[PATTERN_3] = 0xFF; control_bert[PATTERN_2] = 0xFF; control_bert[PATTERN_1] = 0xFF; control_bert[PATTERN_0] = 0xFC; control_bert[PATTERN_LENGTH] = 0x02; control_bert[POLYNOMIAL_TAB] = 0x00; //QRSS=PATTERN SELECT=0 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; case 34: // Definida por el usuario mas_bytes = _4_bytes; // Determinaci´ on de la longitud de la secuencia de usuario for (longitud = 31; ((!(mas_bytes & 0x80000000)) && (longitud > mas_bytes = mas_bytes << 1; control_bert[PATTERN_LENGTH] = longitud; control_bert[PATTERN_0] = _4_bytes & 0xFF; _4_bytes = _4_bytes >> 8; control_bert[PATTERN_1] = _4_bytes & 0xFF; _4_bytes = _4_bytes >> 8; control_bert[PATTERN_2] = _4_bytes & 0xFF; _4_bytes = _4_bytes >> 8; control_bert[PATTERN_3] = _4_bytes & 0xFF;

222

0x9F;

0x9F;

0x9F;

0)); longitud--)

control_bert[POLYNOMIAL_TAB] = 0x00; //QRSS=PATTERN SELECT=0 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & 0x9F; escribe_par_bert(PATTERN_3, 7); //TINV=RINV=0 control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0x0F; escribe_par_bert(ERROR_INSERT, 1); break; } return 0; } /**************************************************************************** FUNCION: inserta_error

´ n mediBER C.2 Aplicacio

DESCRIPCION: Cambios en los registros internos para la inserci´ on de un error intencionadamente PARAMETROS DE ENTRADA: Ninguno PARAMETROS DE SALIDA: Ninguno RESULTADO Y ERRORES: 0, OK OBSERVACIONES: ****************************************************************************/ int inserta_error(void) { // Modificamos el registro implicado control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] | 0x8; escribe_par_bert(ERROR_INSERT, 1); control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0xF7; escribe_par_bert(ERROR_INSERT, 1); return 0; } /**************************************************************************** FUNCION: inicia_test DESCRIPCION: Cambios en los registros internos para la activaci´ on de la secuencia de salida y el conteo de bits recibidos y bits err´ oneos PARAMETROS DE ENTRADA: Ninguno PARAMETROS DE SALIDA: Ninguno RESULTADO Y ERRORES: 0, OK OBSERVACIONES: ****************************************************************************/ int inicia_test(void) { static int n; // Carga del contenido del registro de pattern en el generador de pattern // Tambi´ en reseteo de los registros BIT_COUNT y BIT_ERR_COUNT para poder realizar // correctamente los c´ alculos de BER y dem´ as indicaciones. control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & 0x6F; //TL=0, LC=0; escribe_par_bert(PATTERN_CONTROL, 1); control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | 0x90; //TL=1, LC=1; escribe_par_bert(PATTERN_CONTROL, 1); // Lectura de los valores de BIT_COUNT y BIT_ERR_COUNT que ten´ ıa //almacenados el integrado lee_par_bert(DS2172, BIT_COUNT_3, 8); // Como el valor no nos interesa lo borramos. for (n=BIT_COUNT_3; n<(BIT_COUNT_3+8); n++) control_bert[n] = 0x00; // Desactivaci´ on de las l´ ıneas TDIS y RDIS para habilitar el test byte_control = byte_control & 0x3F; carga_pp (byte_control, LATCH0, CHIP0); return 0; } /**************************************************************************** FUNCION: stop_test DESCRIPCION: Cambios en los registros internos para la desactivaci´ on de la secuencia de salida. PARAMETROS DE ENTRADA: Ninguno PARAMETROS DE SALIDA: Ninguno RESULTADO Y ERRORES: 0, OK OBSERVACIONES: ****************************************************************************/ int stop_test(void) { // Se detiene la operaci´ on del chip. TDIS y RDIS a uno byte_control = byte_control | 0xC0; carga_pp (byte_control, LATCH0, CHIP0); return 0; } /****************************************************************************

223

´ n mediBER C.2 Aplicacio

FUNCION: error_auto DESCRIPCION: Cambios en el registro interno del DS2172 para que inserte errores autom´ aticamente de forma que se obtenga una tasa de error arbitraria PARAMETROS DE ENTRADA: char valor, con la tasa de BER artificial codificada PARAMETROS DE SALIDA: No RESULTADO Y ERRORES: 0, todo OK OBSERVACIONES: ****************************************************************************/ int error_auto(unsigned char valor) { // Nos aseguramos de que el par´ ametro de entrada no interfiere valor = valor & 0x7; // Modificamos el registro implicado control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] & 0xF8; control_bert[ERROR_INSERT] = control_bert[ERROR_INSERT] | valor; escribe_par_bert(ERROR_INSERT, 1); return 0; } /**************************************************************************** FUNCION: aplicacion_bert DESCRIPCION: Lectura del registro de estado y de los contadores de bits recibidos y err´ oneos para realimentar a la aplicaci´ on principal. PARAMETROS DE ENTRADA: int secuencia: c´ odigo de la secuencia utilizada. PARAMETROS DE SALIDA: ptd, puntero a estructura t_datos, donde se guardan todos los resultados RESULTADO Y ERRORES: char SI, si se determina que el chip est´ a sincronizado en funci´ on de las alarmas le´ ıdas en el registro de estado, NO en caso contrario. Depende de la secuencia que se est´ e utilizando. OBSERVACIONES: La funci´ on determina sincronismo si se reciben todo unos, pero la secuencia utilizada es esa misma, y tambien si se reciben todo ceros, y la secuencia es de ceros. En caso contrario, estas dos circustancias son consideradas como an´ omalas y producen que el resultado de la funci´ on sea negativo. ****************************************************************************/ char aplicacion_bert(t_datos *ptd, int secuencia) { char hay_sincronismo; // Lectura del registro de estado lee_par_bert(DS2172, STATUS, 2); control_bert[INT_MASK] = 0x00; escribe_par_bert(INT_MASK, 1); // Actualiza las variables ptd->todo_1 = control_bert[STATUS] & 0x40; ptd->todo_0 = control_bert[STATUS] & 0x20; ptd->busca_sincro = control_bert[STATUS] & 0x10; ptd->error_dec = control_bert[STATUS] & 0x08; ptd->con_ovf = control_bert[STATUS] & 0x04; ptd->con_err_ovf = control_bert[STATUS] & 0x02; ptd->sincro = control_bert[STATUS] & 0x01; // Determinaci´ on del sincronismo del sistema hay_sincronismo = ((ptd->sincro && !(ptd->todo_0) && !(ptd->todo_1)) || (ptd->todo_0 && (secuencia == 25)) || (ptd->todo_1 && (secuencia == 24))); // El chip se ha sincronizado if (hay_sincronismo) { // Reseteo de los contadores control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & 0xEF; escribe_par_bert(PATTERN_CONTROL, 1); // LATCH COUNT = 0 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | 0x10; escribe_par_bert(PATTERN_CONTROL, 1); // LATCH COUNT = 1 // Lectura de los registros que alimentan a los indicadores lee_par_bert(DS2172, BIT_COUNT_3, 12);

224

´ n mediBER C.2 Aplicacio

// Actualizaci´ on de variables ptd->bits_rx = (control_bert[BIT_COUNT_3] * 16777216.0) + (control_bert[BIT_COUNT_2] * 65536.0) + (control_bert[BIT_COUNT_1] * 256.0) + (control_bert[BIT_COUNT_0] * 1.0); ptd->bits_err= (control_bert[BIT_ERR_COUNT_3] * 16777216.0) + (control_bert[BIT_ERR_COUNT_2] * 65536.0) + (control_bert[BIT_ERR_COUNT_1] * 256.0) + (control_bert[BIT_ERR_COUNT_0] * 1.0); return SI; } // No hay sincronismo else { // Reseteo de los contadores control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] & 0xEF; escribe_par_bert(PATTERN_CONTROL, 1); // LATCH COUNT = 0 control_bert[PATTERN_CONTROL] = control_bert[PATTERN_CONTROL] | 0x10; escribe_par_bert(PATTERN_CONTROL, 1); // LATCH COUNT = 1 return NO; } } /**************************************************************************** FUNCION: busca_equipo_ber DESCRIPCION: Funci´ on que se ejecuta u ´nicamente para comprobar la correcta conexi´ on de la placa de medici´ on de BER PARAMETROS DE ENTRADA: No PARAMETROS DE SALIDA: No RESULTADO Y ERRORES: int 1 si la placa funciona correctamente, 0 si no se encuentra (porque no est´ a alimentada, o no conectada al puerto paralelo) OBSERVACIONES: ****************************************************************************/ int busca_equipo_ber(void) { // Escritura en el bus del dato a cargar // byte_datos = 0x80; byte_datos = 0xA5; carga_pp (byte_datos, LATCH0, CHIP1); // Lectura del valor que se acaba de escribir en la tarjeta de BER lee_par_bert(BUS, 0, 0); //

}

if (byte_datos == 0x80) return SI; if (byte_datos == 0xA5) return SI; else return NO;

225

C.3 Ficheros de Matlab

C.3.

Ficheros de Matlab

Fichero ad9853 srrc.m % FICHERO DE SIMULACI´ ON DE FILTRO FIR EN COSENO ALZADO EN EL AD9853 clear % CAMBIO AL DIRECTORIO cd d:\mis_documentos_d\matlab\pfc % Definimos las constantes alfa = 0.5; BW = 0.5*(1+alfa); PROC_GAIN=1; SCALE = 511; TAPS = 41; FreqScale = 4; stopband = 0.5*(1+alfa); passband = 0.5*(1-alfa); % Para plotear la funcion SRRC freq_pts = 250; df = stopband /(freq_pts - 1); n = [0 : freq_pts-1]; fn = df*n; % Definimos el eje Ttap tap =[0 : TAPS-1]; t_taps= (1/FreqScale)*(tap - (TAPS-1)/2); % Dividimos el eje de frecuencias entre 0 y BW en ’TAPS’ puntos f = linspace (0,BW,TAPS); %Calculo de la respuesta impulsiva h(t) for i = 1 : TAPS % El resultado es un resultado h(t), luego el array debe de ser de tiempo % fn es un array de [0:stopband], que son los valores para los que la integral no es nula for m = 1 : freq_pts array_1(m)= SRRCpos(fn(m), passband, stopband, alfa); array_2(m)= cos( t_taps(i)*2*pi .*fn(m)); end Array_temp = array_1 .* array_2; h(i) = trapz(Array_temp); end % Borramos algunas variables temporales clear Array_temp array_1 array_2 m i htap = round (h .* (SCALE*PROC_GAIN/max(h))); plot (tap,htap) grid % Rotulamos la grafica xlabel(’TAP’); ylabel(’htap’); title(’ RESPUESTA IMPULSIVA SCCR ’); % Escalamos la grafica axis([0 40 min(htap)-10 max(htap)+10]); % Calculo de respuesta en frecuencia % Hacemos la fft % Como tenemos 250 puntos en frecuencia calculamos la fft para 250 puntos HTap = fft(htap,250); % Calculamos el modulo Modulo_H = abs(HTap(1:126)); %Modulo_H = abs(HTap(1:250)); % NOTA : se calcula el modulo solo de la mitad de los % puntos, ya que el espectro es simetrico

226

C.3 Ficheros de Matlab

% Normalizamos (dividimos por el maximo) Modulo_H = Modulo_H / max(Modulo_H); % Pasamos a logaritmico Modulo_H_dB = 20 * log10(Modulo_H); % nueva figura para representar el espectro figure(2) % Escalamos el eje de frecuencia %f = fn(1:250)* (FreqScale / stopband); f = fn(1:126)* (FreqScale / stopband); plot(f,Modulo_H_dB) grid % Rotulamos la grafica xlabel(’FREQUENCIA (fn)’); ylabel(’Hn (dB)’); title(’ RESPUESTA EN FRECUENCIA NORMALIZADA SCCR ’); % Escalamos la grafica axis([0 max(f) -65 max(Modulo_H_dB)+5]); % Escalamos la grafica para detalle %axis([0 1 -6 max(Modulo_H_dB)]);

227

C.3 Ficheros de Matlab

Fichero cic.m % FICHERO DE SIMULACI´ ON DE FILTRO FIR EN COSENO ALZADO COMPENSANDO % LA CAIDA DE LAS ETAPAS CIC clear % Definimos las constantes alfa = 0.5; BW = 0.5*(1+alfa); PROC_GAIN=1; SCALE = 511; TAPS = 41; FreqScale = 4; % Factor de interpolaci´ on R = 6; % Detalles de construcci´ on interna del filtro CIC N = 4; M = 1; % Par´ ametro de ajuste beta = 0.90; stopband = 0.5*(1+alfa); passband = 0.5*(1-alfa); % Para plotear la funcion SRRC freq_pts = 250; df = stopband /(freq_pts - 1); n = [0 : freq_pts-1]; fn = df*n; % Definimos el eje Ttap tap =[0 : TAPS-1]; t_taps= (1/FreqScale)*(tap - (TAPS-1)/2); % Dividimos el eje de frecuencias entre 0 y BW en ’TAPS’ puntos f = linspace (0,BW,TAPS); %Calculo de la respuesta impulsiva h(t) for i = 1 : TAPS % El resultado es un resultado h(t), luego el array debe de ser de tiempo % fn es un array de [0:stopband], que son los valores para los que la integral no es nula for m = 1 : freq_pts array_1(m)= SRRCpos(fn(m), passband, stopband, alfa); array_2(m)= cos( t_taps(i)*2*pi .*fn(m)); end Array_temp = array_1 .* array_2; h(i) = trapz(Array_temp); end % Borramos algunas variables temporales clear Array_temp array_1 array_2 m i htap = round (h .* (SCALE*PROC_GAIN/max(h))); figure(1) plot (tap,htap) grid % Escalamos la grafica axis([0 40 min(htap)-10 max(htap)+10]); % Rotulamos la grafica xlabel(’TAP’); ylabel(’htap’); title(’ RESPUESTA IMPULSIVA SCCR’); % Escalamos la grafica axis([0 40 min(htap)-10 max(htap)+10]); % Calculo de respuesta en frecuencia % Hacemos la fft % Como tenemos 250 puntos en frecuencia calculamos la fft para 250 puntos HTap = fft(htap,250);

228

C.3 Ficheros de Matlab

% Calculamos el modulo Modulo_H = abs(HTap(1:126)); %Modulo_H = abs(HTap(1:250)); % NOTA : se calcula el modulo solo de la mitad de los % puntos, ya que el espectro es simetrico % Normalizamos (dividimos por el maximo) Modulo_H = Modulo_H / max(Modulo_H); % Pasamos a logaritmico Modulo_H_dB = 20 * log10(Modulo_H); % nueva figura para representar el espectro figure(2) % Escalamos el eje de frecuencia %f = fn(1:250)* (FreqScale / stopband); f = fn(1:126)* (FreqScale / stopband); plot(f,Modulo_H_dB) grid % Rotulamos la grafica xlabel(’FREQUENCIA (fn)’); ylabel(’Hn (dB)’); title(’ RESPUESTA EN FRECUENCIA NORMALIZADA SCCR ’); % Escalamos la grafica axis([0 max(f) -65 max(Modulo_H_dB)+5]); % Escalamos la grafica para detalle %axis([0 1 -6 max(Modulo_H_dB)]);

%%%%%%%%%%%%%%%%%Nuevos c´ alculos incluyendo compensaci´ on%%%%%%%%%%%%%%%%%%%% %Calculo de la respuesta impulsiva h1(t); for i = 1 : TAPS % El resultado es un resultado h(t), luego el array debe de ser de tiempo % fn es un array de [0:stopband], que son los valores para los que la integral no es nula for m = 1 : freq_pts if fn(m)<(beta*BW) si(m) = abs( hcic( 0, R, M, N ) / hcic( fn(m)/FreqScale, R, M, N )); else si(m) = 1; end array_1(m)= SRRCpos(fn(m), passband, stopband, alfa)*si(m); array_2(m)= cos( t_taps(i)*2*pi .*fn(m)); end Array_temp = array_1 .* array_2; h1(i) = trapz(Array_temp); end % nueva figura para representar el espectro figure(3) h1tap = round (h1 .* (SCALE*PROC_GAIN/max(h1))); plot (tap,h1tap) grid % Rotulamos la grafica xlabel(’TAP’); ylabel(’h1tap’); title(’ RESPUESTA IMPULSIVA SCCR COMPENSADA’); % Escalamos la grafica axis([0 40 min(h1tap)-10 max(h1tap)+10]);

229

C.3 Ficheros de Matlab

% Calculo de respuesta en frecuencia de la RESPUESTA COMPENSADA % Hacemos la fft % Como tenemos 250 puntos en frecuencia calculamos la fft para 250 puntos HTap_cic = fft(h1tap,250); % Calculamos el modulo Modulo_H_cic = abs(HTap_cic(1:126)); % Normalizamos (dividimos por el maximo) Modulo_H_cic = Modulo_H_cic / max(Modulo_H_cic); % Pasamos a logaritmico Modulo_H_cic_dB = 20 * log10(Modulo_H_cic); % nueva figura para representar el espectro figure(4) % Escalamos el eje de frecuencia f_cic = fn(1:126)* (FreqScale / stopband); plot(f_cic,Modulo_H_cic_dB) grid % Rotulamos la grafica xlabel(’FREQUENCIA (fn)’); ylabel(’Hn (dB)’); title(’ RESPUESTA EN FRECUENCIA COMPENSADA SCCR ’); % Escalamos la grafica axis([0 max(f_cic) -65 max(Modulo_H_cic_dB)+5]); % Escalamos la grafica para detalle

%%%%%%%%%%%%%%%%%%%%%%%%% Todo en la misma gr´ afica%%%%%%%%%%%%%%%%%%%%%% figure (5) plot (tap,htap,tap,h1tap,’r’) grid % Rotulamos la grafica xlabel(’TAP’); ylabel(’htap , h1tap’); title(’ RESPUESTA IMPULSIVA Y MODIFICADA SCCR ’); % Escalamos la grafica axis([0 40 min(htap)-10 max(htap)+10]); figure(6) plot(f,Modulo_H_dB,f,Modulo_H_cic_dB,’r’) grid % Rotulamos la grafica xlabel(’FREQUENCIA (fn)’); ylabel(’H (dB) , H precom (dB)’); title(’ RESPUESTA EN FRECUENCIA NORMALIZADA Y MODIFICADA SCCR ’); % Escalamos la grafica axis([0 max(f) -65 max(Modulo_H_dB)+5]);

230

Related Documents

Pfc
November 2019 13
Pfc
August 2019 24
Modulador Fm
June 2020 1
Pfc Converter
April 2020 16
M-pfc
May 2020 12

More Documents from ""