scieee AI-readable full text Open interactive document viewer

Configuración del RFSoC 4x2 para puesta en marcha del kit de control para instrumentación cuántica QICK

Landa Urrutia, Josu

Abstract

[ES] El presente trabajo describe la implementación, puesta en marcha y validación del Kit de Control de Instrumentación Cuántica QICK sobre la plataforma de desarrollo RFSoC 4x2 para su posterior utilización en experimentos de aplicación en trabajos de investigación. Se describe la arquitectura QICK, que combina un procesador temporal con canales de generación de señales y de lectura controlados a partir de Python/PYNQ a través de Jupyter Notebook. El trabajo documenta un flujo para la instalación de PYNQ y QICK en la RFSoC 4x2, la generación del bitstream mediante Vivado y la ejecución de programas de usuario. Se implementa una configuración loopback que permite generar y adquirir pulsos I/Q, analizar la coherencia de fase y aplicar una calibración de fase dependiente de la frecuencia. Los resultados demuestran la capacidad del sistema para operar con determinismo en tiempo real, reducir latencias y ofrecer un entorno de prototipado rápido.

Full text

Garate Añibarro, Jose Ignacio 1 Resumen Laburpena Abstract El presente trabajo describe la implementación, puesta en marcha y validación del Kit de Control de Instrumentación Cuántica QICK sobre la plataforma de desarrollo RFSoC 4x2 para su posterior utilización en experimentos de aplicación en trabajos de investigación. Se describe la arquitectura QICK, que combina un procesador temporal con canales de generación de señales y de lectura controlados a partir de Python/PYNQ a través de Jupyter Notebook. El trabajo documenta un flujo para la instalación de PYNQ y QICK en la RFSoC 4x2, la generación del bitstream mediante Vivado y la ejecución de programas de usuario. Se implementa una configuración loopback que permite generar y adquirir pulsos I/Q, analizar la coherencia de fase y aplicar una calibración de fase dependiente de la frecuencia. Los resultados demuestran la capacidad del sistema para operar con determinismo en tiempo real, reducir latencias y ofrecer un entorno de prototipado rápido. Palabras Clave: QICK, RFSoC 4x2, Radiofrecuencia, Jupyter Notebook, PYNQ. Lan honek deskribatzen du QICK Instrumentazio Kuantikoaren Kontrol Kita inplementazioa, martxan jartzea eta balidazioa RFSoC 4x2 garapen-plataforman, geroago erabilera egiteko ikerketa-lanetako aplikazio-esperimentuetan. QICKen arkitektura deskribatzen da, denbora-prozesadore bat seinale-sorkuntza eta irakurketa kanalekin konbinatzen duena, guztiak Python/PYNQ-tik kontrolatuak Jupyter Notebook bidez. Lanak dokumentatzen du PYNQ eta QICK RFSoC 4x2-an instalatzeko fluxua, Vivado bidez bitstream sortzea eta erabiltzaile-programen exekuzioa. Loopback konfigurazio bat inplementatzen da, I/Q pultsuak sortu eta eskuratzeko aukera ematen duena, fase-koherentzia aztertzea eta maiztasunaren araberako fase-kalibrazioa aplikatzea. Emaitzek erakusten dute sistemaren gaitasuna denbora errealean determinismoz jarduteko, latentziak murrizteko eta prototipatze azkarreko ingurune bat eskaintzeko. Gako-hitzak: QICK, RFSoC 4x2, Irrati-maiztasuna, Jupyter Notebook, PYNQ. This work describes the implementation, start-up, and validation of the Quantum Instrumentation Control Kit QICK on the RFSoC 4x2 development platform, for its later utilization in application experiments in research works. The QICK architecture is described, which combines a time processor with signal generation and readout channelscontrolledfromPython/PYNQthroughJupyterNotebook.Theworkdocuments a flow for the installation of PYNQ and QICK on the RFSoC 4x2, the generation of the bitstream using Vivado, and the execution of user programs. A loopback configuration is implemented that makes it possible to generate and acquire I/Q pulses, analyze phase coherence, andapplya frequency-dependentphasecalibration.Theresults demonstrate the capacity of the system to operate with determinism in real time, to reduce latencies, and to provide a fast prototyping environment. 0 Keywords: QICK, RFSoC 4x2, Radiofrequency, Jupyter Notebook, PYNQ. 1 Índice Resumen Laburpena Abstract 0 Lista de figuras 4 Lista de tablas 6 Lista de acrónimos 7 1. Introducción 8 2. Contexto 11 3. Objetivos y alcance 12 3.1. Objetivos ........................................ 12 3.2. Alcance ......................................... 13 4. Beneficios 14 4.1. Objetivos de Desarrollo Sostenible . . . . . . . . . . . . . . . . . . . . . . . . . 15 5. Diseño del sistema 16 5.1. Sección lógica programable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 5.1.1. Bloque Time Processor . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 5.1.2. Bloque Signal Generator . . . . . . . . . . . . . . . . . . . . . . . . . . 23 5.1.3. BloqueReadout................................ 24 5.2. SecciónRF ....................................... 25 5.3. ArquitecturaSoftware ................................ 27 5.4. Hardware........................................ 28 6. Pasos para establecer el entorno 30 2 6.1. PYNQ .......................................... 30 6.2. InstalaciónQICK.................................... 33 6.3. Vivado.......................................... 33 6.4. Entorno Jupyter Notebook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 6.5. Programa genérico de QICK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 6.5.1. Inicialización.................................. 37 6.5.2. Programagenérico.............................. 39 7. Descripción de tareas 41 8. Descripción de los resultados 43 8.1. Transmisión y recepción de pulsos . . . . . . . . . . . . . . . . . . . . . . . . . 43 8.2. Calibracióndefase .................................. 46 8.3. Sincronizacióndepulsos............................... 49 8.4. Barridodefrecuencias ................................ 53 9. Descripción del presupuesto 56 10.Conclusiones 58 Bibliografía 59 3 Lista de figuras 1. TarjetaRFSoC4x2,[3]................................. 10 2. Arquitectura del sistema QICK [2] . . . . . . . . . . . . . . . . . . . . . . . . . 17 3. Firmware genérico de QICK [2] . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 4. BloqueTimeProcessor[2].............................. 19 5. InstruccionesI-type[4]................................ 21 6. InstruccionesJ-type[4]................................ 21 7. InstruccionesR-type[4] ............................... 22 8. Bloque Signal Generator [2] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 9. Instrucción procesada por el Signal Generator [4] . . . . . . . . . . . . . . . . 24 10. BloqueReadout[2] .................................. 24 11. ADCs y DACs del RFSoC 4x2 [3] . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 12. Arquitectura Software de PYNQ [2] . . . . . . . . . . . . . . . . . . . . . . . . 27 13. Hardware de la RFSoC 4x2 [3] . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 14. Interruptordearranque ............................... 32 15. InterfazEthernet.................................... 32 16. MainPowerSwitch .................................. 32 17. TerminalTCLdeVivado ............................... 34 18. Entorno Vivado con el firmware de QICK . . . . . . . . . . . . . . . . . . . . . 35 19. Explorador de archivos de Jupyter Notebook . . . . . . . . . . . . . . . . . . . 36 20. Notebooks y terminales ejecutándose . . . . . . . . . . . . . . . . . . . . . . 36 21. RFSoC4x2enloopback................................ 40 22. Diagrama de Gantt del desarrollo del TFM . . . . . . . . . . . . . . . . . . . . 42 23. Pulso esperado de LoopbackProgram . . . . . . . . . . . . . . . . . . . . . . . 45 24. Pulso recibido de LoopbackProgram . . . . . . . . . . . . . . . . . . . . . . . . 46 25. Desfase dependiente de la frecuencia . . . . . . . . . . . . . . . . . . . . . . . 48 4 26. Pulso calibrado de LoopbackProgram . . . . . . . . . . . . . . . . . . . . . . . 49 27. QICK para el experimento de control coherente de centros NV- . . . . . . . 50 28. Secuencia de sincronización . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 29. Salida de pulsos del PMOD sincronizados . . . . . . . . . . . . . . . . . . . . . 52 30. Tiempodesubida................................... 53 31. Espectro de pulso rectangular a 2 GHz . . . . . . . . . . . . . . . . . . . . . . . 54 32. Espectro de pulso rectangular a 2.2 GHz . . . . . . . . . . . . . . . . . . . . . . 54 33. Ejemplo de filtrado analógico para eliminar espurias, [5] . . . . . . . . . . . . 55 34. Espectro de pulso rectangular a 2.6 GHz . . . . . . . . . . . . . . . . . . . . . . 55 5 Lista de tablas 1. VersionesdePYNQ[8] ................................ 31 2. Desfase dependiente de la frecuencia . . . . . . . . . . . . . . . . . . . . . . . 48 3. Presupuesto estimado del sistema . . . . . . . . . . . . . . . . . . . . . . . . . 57 6 Lista de acrónimos DAC Digital Analog Converter ADC Analog Digital Converter PLL Phase-Locked Loop PS Processing System PL Programmable Logic DDS Direct Digital Syntesis NCO Numerically Controlled Oscillators SDR Software Defined Radio AXI Advanced eXtensible Interface IP Intellectual Property QICK Quantum Instrumentation Control Kit RFSoC Radio Frequency System-on-Chip SoC System-on-Chip API Application Programming Interface DMA Direct Memory Access BRAM Block Random Access Memory FIFO First In, First Out DUC Digital Up-Conversion DDC Digital Down-Conversion GSPS Giga Samples Per Second MSPS Mega Samples Per Second SMA SubMiniature version A PMOD Peripheral Module NV– Nitrogen-Vacancy center ODS Objetivos de Desarrollo Sostenible 7 4. Beneficios El sistema QICK es una herramienta muy potente que facilita la generación y lectura de cúbits. Este trabajo contribuye a su comprensión y uso por parte de quienes deseen iniciarse en sistemas de instrumentación cuántica. La elección de la plataforma RFSoC 4x2 es necesaria porque integra en un único chip un SoC de radio avanzado y una FPGA de altas prestaciones, lo que proporciona potencia y flexibilidad únicas frente a otras soluciones. Una alternativa equivalente requeriría combinar un front-end de radio, ADC/DAC externos y una FPGA independiente, con mayor complejidad y coste. Además, esta plataforma está especialmente orientada a la investigación, ya que permite emplearse tanto como elemento de control como de medida y generación de patrones de prueba en un único dispositivo. Se presenta una guía detallada para la configuración y verificación del sistema QICK sobre la plataforma RFSoC 4x2. El uso de esta plataforma monolítica permite reducir latencias, mejorar la sincronización y simplificar la arquitectura general del sistema, evitando la necesidad de múltiples dispositivos y reduciendo tanto el consumo como el coste. Al integrar DACs, ADCs, lógica programable y procesadores embedidos en un chip, se consigue un sistema compacto y de baja latencia capaz de generar y capturar pulsos con resolución del orden de nanosegundos. Además, facilita futuras tareas de investigación y desarrollo. Al tratarse de un sistema de código abierto y completamente modificable, QICK ofrece un ecosistema de instrumentación cuántica más accesible en comparación con soluciones propietarias, que suelen ser costosas y con escasa flexibilidad. Este proyecto tiene un valor formativo, ya que proporciona casos prácticos reales de integración hardware-software en sistemas reconfigurables para instrumentación cuántica. Esto lo convierte en un recurso valioso para estudiantes e ingenieros que quieran aprender sobre FPGAs, SoCs y control de señales mediante software. La posibilidad de modificar el firmware y los controladores del sistema QICK fomenta la capacidad de rediseñar el sistema, permitiendo crear nuevas arquitecturas de control cuántico. Aunque el sistema está orientado a la instrumentación cuántica, su arquitectura y capacidad para generar y adquirir señales con alta precisión lo hacen también aplicable a otros campos que requieren instrumentación de precisión, como radares, comunicaciones de alta frecuencia o control experimental. Este trabajo sienta las bases para futuras ampliaciones del sistema QICK, como la integración de redes deterministas, lo que permitiría realizar experimentos distribuidos y escalables. 14 4.1. Objetivos de Desarrollo Sostenible A continuación, se especifican los Objetivos de Desarrollo Sostenible (ODS) que cumple este trabajo: ODS 4: Educación de calidad Este trabajo explica y facilita el acceso a herramientas avanzadas como QICK, Vivado y RFSoC, contribuyendo a la formación técnica de futuros ingenieros e investigadores. Esto promueve una educación de calidad en áreas emergentes como la computación cuántica y la electrónica reconfigurable. ODS 7: Energía asequible y no contaminante El QICK sobre RFSoC es mucho más eficiente que montar equipos de instrumentación separados. Al integrar todo en un único chip, se reduce el consumo energético global del sistema. Además, el avance en tecnologías cuánticas está muy ligado a la búsqueda de soluciones más eficientes en computación y comunicaciones, que a largo plazo impactan en el uso sostenible de recursos energéticos. ODS 9: Industria, innovación e infraestructura El trabajo contribuye al desarrollo de infraestructura científica mediante el uso de una plataforma abierta y modificable. Esto impulsa la innovación en tecnologías cuánticas y favorece el uso de soluciones eficientes y escalables. ODS 10: Reducción de las desigualdades El uso de un sistema de código abierto y accesible como QICK facilita la participación de instituciones que no pueden permitirse soluciones comerciales propietarias, reduciendo así las barreras de entrada a la investigación en tecnologías avanzadas. ODS 17: Alianzas para lograr los objetivos QICK es un proyecto colaborativo cuya contribución refuerza el ecosistema abierto de desarrollo científico, fomentando la cooperación entre universidades, laboratorios y desarrolladores. 15 5. Diseño del sistema En este apartado se describe el diseño del sistema QICK para implementarlo en la tarjeta RFSoC 4x2. QICK es un sistema de código abierto creado por openquantumhardware, diseñado para controlar y leer sistemas cuánticos, basado en FPGAs RFSoC. El sistema combina firmware especializado para el procesamiento de señales en tiempo real con una interfaz en Python, a través de la plataforma de desarrollo PYNQ. Su capacidad de síntesis digital directa y sus convertidores de alta velocidad integrados permiten la generación y adquisición precisa de señales de microondas con resoluciones temporales del orden de nanosegundos. El sistema de transmisión y recepción de señales de radio está diseñado para ser complementado con electrónica externa, lo que permite trabajar con señales de frecuencias más altas que las que admite de forma nativa. La arquitectura de QICK se organiza en los siguientes niveles según se detalla en [2] y se ilustra en la Figura 2: 1. Nivel de usuario: Es el nivel donde el usuario escribe código Python utilizando las APIs de QICK para definir programas capaces de crear secuencias de pulsos, barridosdeparámetroso adquisiciónde señales.El programa puedeincluir condiciones, buclesylógicapersonalizadaqueseaplicaráalmicrocontroladorcreadoenlaFPGA. 2. Nivel de control: Es el nivel donde las instrucciones del usuario escritas en Python sontraducidasaunlenguajeensambladorqueejecutaelmicrocontroladordeQICK en la FPGA, llamado tProc. El firmware maneja la temporización de forma precisa, el control de los generadores y la adquisición de datos en tiempo real. 3. Nivel de señal: Es el nivel donde los DACs y ADCs integrados se utilizan para generar señales de microondas y adquirir señales provenientes del sistema cuántico. También se realiza la conversión descendente digital para extraer las componentes I/Q. 4. Nivel físico: Es el nivel donde las señales generadas se amplifican y son transmitidasalosdispositivoscuánticos,ylasseñalesderespuestasedigitalizanyseanalizan. 16 Figura 2: Arquitectura del sistema QICK [2] 5.1. Sección lógica programable Esta sección describe el firmware que se ejecuta en la FPGA del sistema RFSoC dentro de la arquitectura QICK, según detalla [2]. Su principal objetivo es proporcionar procesamiento determinista de señales en tiempo real, lo cual es esencial para el control y la lectura de sistemas cuánticos. En la Figura 3 se observa el diseño de la configuración básicade QICK,que sedivideenelsistemade procesamiento(PS)ylalógicaprogramable (PL). El PS es el encargado de controlar el sistema interpretando y enviando las instrucciones del usuario al procesador de tiempo tProc, configurando los bloques lógicos del sistema mediante la interfaz AXI, y recibiendo los datos de adquisición. También facilita la interacción entre el usuario y el sistema mediante código en Python. Esta arquitectura permite separar el control (a cargo del PS) de la ejecución en tiempo real (a cargo del PL), optimizando así el rendimiento del sistema. El PL es altamente reconfigurable mediante bloques IP, lo que ofrece flexibilidad para adaptar el sistema a distintas situaciones. Además, permite la ejecución precisa de secuencias experimentales, garantizando una medición y manipulación fiel de los cúbits. Su estructura se divide en tres bloques principales: Time Processor,Procesador de Tiempos otProc: El tProc es un microprocesadorconfigurabledentrodel sistema QICK queejecuta un conjuntode instrucciones en un lenguaje ensamblador especializado. Este lenguaje permite implementar estructuras de control como bucles, saltos condicionales, acceso a registros, generacióndeseñalesyrecuperacióndedatos,todoellosincronizadoconunrelojmaestro. Cuenta con una alta precisión temporal de hasta 1.8 ns. Signal Generator,Generador de Señales obloque generador: El Signal Generator es el bloque responsable de emitir pulsos digitales que luego son convertidos 17 en señales analógicas. Estos pulsos se generan a partir de formas de onda definidas por el usuario. Readout Block,Bloque de Lectura obloque de lectura: El bloque Readout del sistema QICK se encarga de la adquisición y procesamiento de las señales digitales provenientes del ADC, permitiendo realizar mediciones en tiempo real y con posibilidad de retroalimentación inmediata. La comunicación entre todos los bloques se realiza mediante AXI-Stream para transferir datos de forma eficiente, permitiendo la transmisión de flujos de datos sin direccionamiento. Este protocolo es ideal para la generación y adquisición de señales, garantizando la sincronización y evitando pérdidas. En la Figura 3 se observa el firmware genérico de QICK. Figura 3: Firmware genérico de QICK [2] QICKemplea unsistemade temporizacióndual paragestionar laejecuciónprecisade eventos: la línea de tiempo de tProc y la línea de tiempo del reloj maestro. Línea de tiempo de tProc. Esta línea de tiempo rige la lógica de control y la toma de decisiones. El tProc se sincroniza con el reloj maestro y realiza las siguientes operaciones: Compila y almacena en memoria las instrucciones definidas por el usuario. Decodifica y ejecuta dichas instrucciones de forma secuencial. Puede realizar esperas condicionales, como aguardar la llegada de un evento externo o el resultado de una lectura antes de continuar ejecutando. Línea de tiempo del reloj maestro. Es el sistema de temporización global que sincronizatodaslasoperacionesdehardware.Sufunciónesasegurarlaalineaciónprecisa entre la emisión de pulsos y las operaciones de lectura: Cada Signal Generator mantiene una cola de eventos con marcas temporales, sincronizadas con el reloj maestro. 18 Losgeneradorespuedenemitirpulsosenparaleloo consolapamientostemporales, en distintos canales. Cuando el tProc activa un canal de lectura, este también se sincroniza con el reloj maestro para adquirir la señal en el instante exacto requerido. A continuación, se va a profundizar en los bloques tProc, Signal Generator y Readout. 5.1.1. Bloque Time Processor El Time Processor o tProc es un microcontrolador configurable dentro del sistema QICK que ejecuta un conjunto de instrucciones en un lenguaje ensamblador especializado. Este lenguaje permite implementar estructuras de control como bucles, saltos condicionales, acceso a registros, generación de señales y recuperación de datos, todo ello sincronizado con un reloj maestro. En la Figura 4 se observa el bloque tProc Figura 4: Bloque Time Processor [2] El tProc está sincronizado con un reloj maestro mediante un contador de 48 bits. Este reloj actúa como referencia para la temporización precisa de eventos, contando con una resolución temporal de hasta 1,6 nanosegundos por ciclos de reloj. La decodificación de instrucciones y su ejecución están desacopladas, lo que mejora el rendimiento y permite una ejecución de instrucciones más eficiente. El tProc distingue entre instrucciones no temporizadas, que se ejecutan de forma inmediata, y temporizadas, se colocan en una colaFIFOespecíficadelcanalcorrespondiente,dondesonprogramadasparasuejecución en un tiempo determinado. Si la cola de un canal está llena, el procesador entra en espera hasta que haya espacio disponible, garantizando sincronización sin pérdida de eventos. Las salidas que van hacia el generador de señal son completamente paralelas, permitiendo que diferentes canales ejecuten instrucciones independientes de manera simultánea, disponiendo de 2 DAC integrados para su emisión. Esta arquitectura permite procesar múltiples cúbits y otros eventos. El tProc hace uso de 2 memorias y 4 registros para poder llevar a cabo instrucciones y almacenar datos. A continuación, se describen las siguientes memorias y registros: 19 Memoria de programa: Hasta 8K instrucciones de 64 bits. Almacena las instrucciones que tProc ejecuta. Memoria de datos: Hasta 4096 muestras de 32 bits. Esta memoria es independiente de la memoria de programa del procesador. Se puede acceder a ella desde el sistema de procesamiento, usando lecturas/escrituras simples o por DMA. Stack:Hasta256muestrasde32bits,accesiblemedianteinstruccionespush/pop.El stack puede utilizarse como memoria temporal, para implementar bucles o mover datos entre páginas de memoria. Es responsabilidad del usuario evitar estados de desbordamiento(full)ovaciado(empty),yaqueprovocaránunsaltoaunadirección de error y reinicio del tProc. Register file: Permite leer hasta 7 registros y escribir en uno en un solo ciclo de reloj. RegistrosAXIdecontrol:Sonregistrosespecíficosdentroquepuedenseraccedidos y modificados para seleccionar el funcionamiento del tProc. • Registro 0: selecciona inicio interno (0) o externo (1). • Registro 1: controla el inicio (escribir 1 para arrancar, 0 para reiniciar). • 4 registros adicionales están disponibles para almacenamiento de datos internos o señales auxiliares. Registro offset: Para reducir el número de bits necesarios para codificar instrucciones de tiempo, se inicializa a cero y puede ser manejado mediante instrucciones específicas. Para poder realizar operaciones con las instrucciones que son enviadas, el tProc cuenta con bloques de lógica condicional (Cond. Logic), y para aritmética y lógica se utiliza el bloque aritmético-lógico (Math/Bitwise). El bloque de lógica condicional tiene una latencia de un ciclo y soporta saltos basados en condiciones y puede expandirse para realizar comparaciones más complejas. El bloque aritmético y lógico puede hacer por parte aritmética sumas, restas y multiplicaciones, y por parte de lógica and, or, xor, not y desplazamientos. La memoria del tProc es accesible desde el procesador del sistema utilizando buses AXI o DMA, lo que permite el intercambio de datos con el exterior. La ejecución comienza en la dirección de memoria 0 tras un reinicio o tras recibir una señal de arranque. 5.1.1.1. Instrucciones del lenguaje ensamblador Hay tres tipos de instrucciones para la memoria de instrucciones, según [4], I-type, J-type y R-type. I-types: Este tipo de instrucción se llama instrucción inmediata, representado en la Figura 5. Esta llama a un valor inmediato que será usado para ejecutar una instrucción. Las instrucciones que se implementan son: pushi: Pone un valor en el stack. popi: Saca un valor del stack. 20 mathi: Añade, sustrae o multiplica valores a registro. seti: Establece un puerto de salida. synci: Sincroniza con el tiempo interno offset. waiti: Espera a que el reloj maestro llegue a un tiempo específico. bitwi: Realiza operaciones bit a bit en registro. memri: Lee datos de memoria. memwi: Escribe datos de memoria. regwi: Escribe valores en registros. Formato: Figura 5: Instrucciones I-type [4] opcode: 8 bits de opcode. page: 3 bits de página permitiendo especificar hasta 8 páginas de registro. ch: 3 bits para especificar el canal de salida. oper: 4 bits para especificar la operación. ra, rb, rc: 5 bits para cada dirección de registro permitiendo especificar 32 registros por página. imm: 31 bits para especificar valores inmediatos. J-types: Este tipo de instrucción se llama instrucción de salto, el cual cambia la dirección que contiene el contador de programa, representado en la Figura 6. J-type implementa las siguientes instrucciones: loopnz: salta y decrementa si el registro no está a cero. condj: salta si la condición es verdadera. end: Termina la ejecución y salta al estado final. Formato: Figura 6: Instrucciones J-type [4] 21 opcode: 8 bits de opcode. page: 3 bits de página permitiendo especificar hasta 8 páginas de registro. ch: 3 bits para especificar el canal de salida. oper: 4 bits para especificar la operación. ra, rb, rc: 5 bits para cada dirección de registro permitiendo especificar 32 registros por página. addr: 16 bits para especificar la dirección a la que saltar. R-types: Soninstruccionesbasadasenregistros,dondetrabajaconregistrosynodirectamente con valores, representado en la Figura 7. R-type implementa las siguientes instrucciones: math: Añade, sustrae o multiplica valores de dos registros, escribiendo el resultado en un tercer registro. set: Establece un puerto de salida usando 5 registros como fuente, y otro registro por tiempo. sync: Sincroniza el tiempo interno offset. read: Lee el valor de puerto de entrada en un registro. wait: espera hasta que el reloj maestro llega a un tiempo especificado en registro. bitw: Hace operaciones bit a bit en registro. memr: Lee datos de memoria. memw: Escribe datos de memoria. Formato: Figura 7: Instrucciones R-type [4] opcode: 8 bits de opcode. page: 3 bits de página permitiendo especificar hasta 8 páginas de registro. ch: 3 bits para especificar el canal de salida. oper: 4 bits para especificar la operación. ra, rb,rc,rd,re,rf,rg, rh:5bits paracadadirecciónderegistropermitiendoespecificar 32 registros por página. 22 5.1.2. Bloque Signal Generator El Signal Generator es el bloque, que se muestra en la Figura 8, responsable de emitir pulsos digitales que luego son convertidos en señales analógicas. Estos pulsos son generados a partir de formas de onda definidas por el usuario mediante las APIs de Python. Las formas de onda provienen de una librería de pulsos personalizada, que el usuario define y carga desde Python en la Zynq. Cada señal generada corresponde a una secuencia digital precargada, que puede representar, por ejemplo, un pulso rectangular o un pulso de forma Gaussiana. El bloque opera como un bloque esclavo que permanece siempre listo para recibir instrucciones. Si no recibe ninguna instrucción su salida será cero o la última muestra, dependiendo de la configuración del generador. Figura 8: Bloque Signal Generator [2] La interacción entre el tProc y el Signal Generator se realiza mediante una interfaz AXI Stream, que permite una comunicación eficiente y sincronizada. La ejecución de los pulsos está coordinada por el tProc, que indica el momento que deben reproducirse, asegurando la coherencia de fase y la sincronización entre diferentes canales. Si se especifica un tiempo igual a cero, la señal se reproduce de inmediato. Cuando la cola de eventos del generador está vacía y recibe una nueva instrucción, se introduce una latencia mínima de 20 ciclos de reloj para que el sistema prepare y active el pulso correctamente. El Signal Generator almacena las formas de onda envolvente utilizadas para modular la señal portadora, las cuales deben ser definidas antes de ser ejecutadas. Utiliza una BRAM interna de la FPGA, lo que permite un acceso rápido y eficiente a los datos durante la generación del pulso. Cada muestra I y Q es codificada en palabras de 16 bits, cumpliendo con los requisitos de alta velocidad. Dentro delSignalGenerator,el sintetizadordigitaldirectopermite generarlaportadora digital utilizada en la conversión ascendente digital. Este bloque cuenta con una resolución de 32 bits y se ejecuta en paralelo con la lectura de la memoria de envolventes, lo que le permite operar a la frecuencia máxima del DAC. El DDS ofrece control de frecuencia y fase, manteniendo la coherencia entre pulsos a la misma frecuencia. La forma de onda I/Q almacenada en memoria se multiplica complejamente con la portadora generada por el DDS y, tras esta operación, la señal pasa por un bloque de ganancia que ajusta dinámicamente la amplitud antes de enviarla al DAC. Una única instrucción enviada al Signal Generator puede configurar simultáneamente, según [4] y representado en la Figura 9: La posición en la memoria donde comienza la forma de onda. La frecuencia de la portadora, configurando el DDS. 23 6. Pasosparaestablecerelentorno Para poder operar con el sistema QICK en la placa RFSoC 4x2, hay que instalar y configurar el sistema PYNQ, que cuenta con la aplicación de Jupyter Notebook. Por otro lado, si se quiere hacer alguna modificación del firmware para alguna aplicación específica, es necesario el uso del programa de Vivado. Asimismo, se debe instalar el softwaredeQICK,para poderutilizarlasAPIs yel sistema.Paratodoloanteriorserequiere la placa RFSoC 4x2 y un ordenador para poder utilizar los programas. A continuación, se detalla el proceso para cada uno. 6.1. PYNQ ElsistemaQICKseejecutasobrePYNQ,queesunaplataformadedesarrollobasadaen LinuxconlaslibreríasdePythonnecesarias.Estaplataformapermitecomunicarseconlas IP del bitstream desde código de alto nivel como Python. Se deben seguir los siguientes pasos para poder ejecutar PYNQ: 1. Se descarga la Imagen de PYNQ: Ir a la web oficial de PYNQ www.pynq.io/- boards.html y descargar la versión correspondiente a la RFSoC 4x2. Se recomienda utilizar la versión v3.0.1 que se indica en la Tabla 1. 30 Tabla 1: Versiones de PYNQ [8] 2. Se escribe la Imagen en la Tarjeta microSD: a) Se introduce una tarjeta microSD en un ordenador. b) Se utiliza un software comoWin32DiskImager o balenaEtcher en el ordenador donde se encuentra la microSD para grabar la imagen .img que se ha descargado en la tarjeta microSD. 3. Se arranca la RFSoC 4x2: a) Se introduce la tarjeta microSD recién grabada en la ranura de la RFSoC. b) Se asegura de que los interruptores de arranque estén configurados para iniciar desde la tarjeta SD, como indica la Figura 14. 31 Figura 14: Interruptor de arranque c) Seconectaun cableEthernet desdela placa a un routerdondeesté conectado el ordenador, o conectar directamente la placa al ordenador mediante Ethernet. La Figura 15 indica donde se encuentra. Figura 15: Interfaz Ethernet d) Se conecta el cable de alimentación y encender la placa poniendo el interruptor de encendido general (main power switch) en posición ON. La Figura 16 indica donde se encuentra. Figura 16: Main Power Switch 4. Se obtiene la dirección IP: Conexión por un router: La pantalla integrada en la placa RFSoC mostrará la dirección IP asignada automáticamente a la tarjeta. Conexión directa al ordenador: Si se conectó directamente al ordenador, la dirección IP por defecto será 192.168.2.99. Existen dos métodos principales para comunicarse con la placa: 32 Servidor Jupyter: Es la interfaz principal para ejecutar programas de QICK. 1. Se abre un navegador web (Google Chrome, Firefox o Edge) en el ordenador. 2. Se introduce la dirección IP de la tarjeta en la barra de búsqueda. Ejemplo: http://192.168.2.99. 3. Se introduce el usuario y la contraseña, que por defecto ambos son ”xilinx” SSH y SCP: Útil para poder transferir archivos y acceder a la terminal de Linux para operaciones que no tengan relación con QICK. 1. Seusa un clientecomoPuTTY. Seleccionarel tipo de conexiónSSH eintroduce la dirección IP. 2. El usuario y la contraseña que pedirá son “xilinx”. 6.2. Instalación QICK Una vez que se tenga acceso a la tarjeta y a Jupyter Notebook, se debe transferir e instalar el software QICK. Se clona el repositorio de QICK, https://github.com/openquantumhardware/qick, en la tarjeta. Para ello, se pueden utilizar los siguientes comandos en el terminal de la tarjeta. cd jupyter_notebooks / git clone https :// github .com/ openquantumhardware / qick .git Se instala el software de QICK. Existe un notebook dentro del repositorio de QICK para poder instalar el software de QICK, llamado 000_Install_qick_package.ipynb, que se encuentra en la carpeta qick_demos del repositorio. La celda siguiente instala el software de QICK: !pip3 install -e ../ Este comando instalará la última versión de QICK. Aunque es más recomendable instalar la versión 0.2.317, debido a que tiene mayor compatibilidad con tProc v2. Para ello hay que ejecutar el siguiente comando en vez del anterior: !pip install qick ==0.2.317 6.3. Vivado Para personalizar y compilar el firmware, se necesita el software Xilinx Vivado. 1. Verificar la versión de Vivado: a) Dentro del repositorio de QICK descargado, se debe comprobar la versión que se debe utilizar para la tarjeta y el tProc específico. Para ello hay que navegar a la dirección qick/firmware/projects/. 33 b) Se busca el directorio que corresponda a la tarjeta que se va a utilizar, RFSoC 4x2, y con la versión de tProc que se desea utilizar. Por ejemplo, qick_tprocv2_4x2_standard. c) En la carpeta, se encontrará un archivo tcl que comienza con bd y va seguido de la versión de Vivado que hay que utilizar. Por ejemplo, bd_2023-1.tcl indica que hay que utilizar Vivado 2023.1. Utilizar otra versión diferente puede causar errores. 2. Instalar Vivado: Se descarga e instala la versión correcta de Vivado desde la web de AMD/Xilinx, https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/vivadodesign-tools/archive.html.Durante la instalaciónse debe asegurar incluir el soporte para la familia de dispositivos Zynq UltraScale+ RFSoC. Para seguir estos pasos se debe tener descargado el repositorio de QICK. 3. Crear el proyecto en Vivado: a) Se abre Vivado. b) En la consola TCL, como la que aparece en la Figura 17, se navega hasta el directorio firmware mediante el comando: cd qick / firmware / projects / qick_tprocv2_4x2_standard c) Se ejecuta el siguiente comando para generar el proyecto automáticamente: source ./proj.tcl Figura 17: Terminal TCL de Vivado d) EstescriptcrearáelproyectodeVivadocontodoeldiseñodebloqueslistopara ser modificado, como en la Figura 18. 34 Figura 18: Entorno Vivado con el firmware de QICK 35 4. Generar bitstream Para generar el bitstream hay que pulsar en el gui de Vivado donde pone ”Generate Bitstream”. Esto lanzará la síntesis e implementación del proyecto para generar el bitstream que aparecerá en la carpeta out, junto a la del proyecto. 6.4. Entorno Jupyter Notebook Para controlar el sistema QICK, es necesario acceder a la aplicación Jupyter Notebook en la RFSoC 4x2. Para ello, hay que ingresar la dirección IP que aparece en la tarjeta en el navegador de un ordenador conectado a la misma red local o si está conectado directamente al ordenador, por la dirección http://192.168.2.99. Jupyter Notebook será ejecutado directamente en la propia RFSoC 4x2, la cual actuará como un servidor con interfaz web, a la espera de recibir órdenes desde un ordenador conectado a la misma red. Una vez abierto aparecerá las rutas y los archivos de /jupyter_notebooks/, con una interfaz como la que aparece en la Figura 19. Se trabajará con archivos .ipynb, donde se documentarán los comandos a ejecutar en código Python y se muestran los resultados de cada comando. Figura 19: Explorador de archivos de Jupyter Notebook En la pestaña Running aparecerán los terminales y los notebooks que se están ejecutando, como aparece en la Figura 20. Desde esta pestaña, se pueden detener tanto los terminales como los notebooks haciendo clic en Shutdown. Figura 20: Notebooks y terminales ejecutándose Aparte del programa qick también se van a utilizar otras librerías como: 36 Numpy se utiliza para funciones matemáticas y operación de matrices de alto nivel. Pandas se utiliza para la manipulación de datos y análisis de librería. SciPy contiene varios módulos para realizar cálculos científicos aplicables a disciplinas de ingeniería. MatplotLib sirve para generar gráficos en Python. Plotly provee clases y métodos para crear figuras y gráficos rápidamente. Ipywidgets permite crear interfaces gráficas en software. 6.5. Programa genérico de QICK En este apartado se explica qué pasos hay que tomar para poder ejecutar la mayoría de Notebooks de QICK. 6.5.1. Inicialización El sistema QICK se comunica mediante Python. Una vez instalado QICK utilizando la demo000_Install_qick_package.ipynb,sedebeimportarlalibreríaqickencadanotebook en el que se desee utilizar el sistema QICK: from qick import * Para utilizar el sistema, es necesario cargar el bitstream con el fin de programar la FPGA y configurar el hardware que se utilizará. Esto se logra ejecutando el siguiente comando: soc = QickSoc (' Dirección_del_bitstream . bit ') Para observar un resumen de la configuración y distinguir los canales del hardware: print(soc) Devolviendo la siguiente salida: 37 QICK running on RFSoC4x2, software version 0.2.317 Firmware configuration (built Fri Apr 11 13:17:19 2025): Global clocks (MHz): tProcessor 614.400, RF reference 491.520 2 signal generator channels: 0: axis_signal_gen_v6 - envelope memory 65536 samples (6.667 us) fs=9830.400 MHz, fabric=614.400 MHz, 32-bit DDS, range=9830.400 MHz DAC tile 0, blk 0 is DAC_B 1: axis_signal_gen_v6 - envelope memory 65536 samples (6.667 us) fs=9830.400 MHz, fabric=614.400 MHz, 32-bit DDS, range=9830.400 MHz DAC tile 2, blk 0 is DAC_A 2 readout channels: 0: axis_dyn_readout_v1 - configured by tProc output 2 fs=4423.680 MHz, decimated=552.960 MHz, 32-bit DDS, range=4423.680 MHz axis_avg_buffer v1.1 (has edge counter) maxlen 16384 accumulated, 16384 decimated (29.630 us) triggered by tport 0, pin 0, feedback to tProc input 0 ADC tile 0, blk 0 is ADC_D 1: axis_dyn_readout_v1 - configured by tProc output 3 fs=4423.680 MHz, decimated=552.960 MHz, 32-bit DDS, range=4423.680 MHz axis_avg_buffer v1.1 (has edge counter) maxlen 16384 accumulated, 16384 decimated (29.630 us) triggered by tport 1, pin 0, feedback to tProc input 1 ADC tile 0, blk 2 is ADC_C 8 digital output pins: 0: PMOD0_0 1: PMOD0_1 2: PMOD0_2 3: PMOD0_3 4: PMOD0_4 5: PMOD0_5 6: PMOD0_6 7: PMOD0_7 tProc qick_processor ("v2") rev 21: program memory 4096 words, data memory 16384 words external start pin: None DDR4 memory buffer: 1073741824 samples (1.942 sec), 256 samples/transfer wired to readouts [0, 1] MR buffer: 8192 samples (1.852 us), wired to readouts [0, 1] La celda devolverá todos los detalles del firmware. Por ejemplo, los canales generadores, canales de lectura y los pmods con sus identificadores y con todos los datos, como la tasa de muestreo. También muestra la versión del tProc y su reloj. 38 6.5.2. Programa genérico Para programar con QICK, hay que tener en cuenta qué versión de tProc, si se está usando tProc v1 o tProc v2. En este caso se va a utilizar tProc v2, debido a que automatiza mucho la gestión de registros y permite trabajar con unidades de tiempo en vez de ticks. Para crear un programa genérico, es necesario definir una clase que herede de AveragerProgramV2. Esta clase tomará los siguientes parámetros: La clase QickSoc generada reps: El número de repeticiones que queremos hacer final_delay: El tiempo en microsegundos (µs) que se añade al final de la línea de tiempo de disparo después del último pulso cfg: El diccionario de configuración prog = LoopbackProgram ( soccfg , reps = config [ ' reps '], final_delay = config [ ' final_delay '], cfg = config ) iq_list = prog . acquire_decimated ( soc , config [ ' soft_avg ']) Esta clase debe incluir dos métodos: _initialize y _body. El método _initialize es el método donde se realizan las tareas de inicialización, configurando los canales a utilizar, definiendo los bucles y estableciendo las envolventes que se almacenarán en la memoria de tabla del Signal Generator. El método _body ejecuta las acciones programadas, principalmente la transmisión o recepción de pulsos. Para poder programar con QICK, se recomienda estudiar detalladamente las APIs documentadas en [6]. En la Figura 21 se puede observar la tarjeta en una configuración Loopback, que es la configuración que se utilizará para la mayoría de medidas. El sistema transmitirá pulsos y recibirá los mismos pulsos. 39 Figura 24: Pulso recibido de LoopbackProgram 8.2. Calibración de fase Como se ha visto anteriormente, el desfase aleatorio que introduce el NCO puede resultar un inconveniente, pero se puede solucionar mediante el software de QICK. En el siguientecódigosemuestracómoserealizaunbarridoparaobtenereldesfaseproducido encada frecuenciaque se ejecuta el programa.Luego, se procedea generarnuevamente los pulsos, restándoles el desfase obtenido a la fase aplicada previamente, para que estén en fase. 46 sweep_cfg ={ "start" :500 , "step" :0.0006 , " expts " :40} gpts =( sweep_cfg [" start "] + sweep_cfg [" step "]* np. arange ( sweep_cfg [" expts " ])) resultsi=[] resultsq=[] for gin gpts: time .sleep (0.1) config [" freq "]=g prog = LoopbackProgram ( soccfg , reps=config['reps '], final_delay = config [' final_delay '], cfg = config ) (iq0 ,) = prog. acquire_decimated (soc , progress = False ) di0 = iq0 [:, 0]. mean () dq0 = iq0 [:, 1]. mean () resultsi . append ( di0 ) resultsq . append ( dq0 ) resultsi =np . array ( resultsi ) resultsq =np . array ( resultsq ) sig = resultsi + 1j * resultsq amp_array = np.abs(sig) phase_array = np. angle(sig ,deg= True) phase_array = ( phase_array + 360) % 360 Elarrayde phase_arraycontienelosvaloresde las frecuenciasde gpts,comosepuede ver en la Tabla 2. 47 Figura 25: Desfase dependiente de la frecuencia i gpts (MHz) phase_array (deg) 0 500.000000 114.56 1 500.000600 125.03 2 500.001200 133.25 3 500.001800 142.38 4 500.002400 151.54 5 500.003000 160.90 6 500.003600 170.76 7 500.004200 179.78 8 500.004800 190.11 9 500.005400 199.15 10 500.006000 207.82 11 500.006600 217.15 12 500.007200 226.81 13 500.007800 235.54 14 500.008400 245.65 15 500.009000 254.85 16 500.009600 264.53 17 500.010200 273.96 18 500.010800 283.21 19 500.011400 292.39 20 500.012000 302.09 21 500.012600 311.06 22 500.013200 320.61 23 500.013800 330.06 24 500.014400 339.38 25 500.015000 349.57 26 500.015600 357.85 27 500.016200 7.20 28 500.016800 16.18 29 500.017400 26.88 30 500.018000 35.91 31 500.018600 44.95 32 500.019200 54.48 33 500.019800 63.86 34 500.020400 74.16 35 500.021000 82.12 36 500.021600 91.75 37 500.022200 100.98 38 500.022800 109.67 39 500.023400 119.88 Tabla 2: Desfase dependiente de la frecuencia 48 En la Figura 26 se observa que, al aplicar la corrección de fase calculada, el pulso recibido coincide en fase con el pulso esperado. Figura 26: Pulso calibrado de LoopbackProgram 8.3. Sincronización de pulsos En esta sección se pretende mostrar que el sistema QICK ofrece una alta capacidad de sincronización, y que permite utilizar tanto los PMODs como el sistema RF con una precisión del orden de nanosegundos. Por ejemplo, el control coherente de centros NV–, comosedetallaen[7],esunexperimentodecontroldecúbitsquesedivideendospartes: una electrónica y otra óptica. El objetivo del experimento es inicializar y leer el estado de espín de los centros NV–en diamante, mediante excitación óptica con un láser y control deespínconmicroondas.Paraello,primeroseinicializaelespínmedianteelláser,luegose aplicaun pulso de microondaspara manipularelespín,yfinalmentesevuelve a encender el láser para permitir la lectura. La empresa Quanvia encargó la parte electrónica del experimento para que el experimento pueda ser ejecutado mediante QICK. Se utiliza un Pulse Blaster para controlar un Lock-In Amplifier (encargado de recibir la señal del láser), una High-Speed Current Source para encender el láser, y un Microwave Source & Amplifier para generar el pulso de microondas. En la Figura 27 se propone utilizar QICK para controlar la parte electrónica, pudiendo generar lospulsos microondasy enviarpulsos porlosPMODs de latarjeta RFSoC 4x2 para activar el láser y el Lock-In, centralizando el sistema y sincronizando los pulsos de manera precisa. 49 Figura 27: QICK para el experimento de control coherente de centros NVEn la Figura 28 se muestra cómo debería ser la secuencia temporal para realizar el experimento, donde laser_ini_delay es el tiempo durante el cual se enciende el láser para inicializar los espines, mw_delay es el intervalo en el que se genera el pulso de microondas, y laser_readout_delay es el tiempo en el que se excita nuevamente el láser para permitir su detección mediante el Lock-In Amplifier. Figura 28: Secuencia de sincronización Paraello,sevaautilizarel programaSequenceProgramparaseguirlasecuenciaque se muestra en la Figura 28, permitiendo establecer los tiempos de cada intervalo. 50 class SequenceProgram(AveragerProgramV2): def _initialize(self, cfg): ro_ch = cfg['ro_ch'] gen_ch = cfg['gen_ch'] # Declarar bloque generador self.declare_gen(ch=gen_ch, nqz=1) # Declarar bloque lector self.declare_readout(ch=ro_ch, length=cfg['ro_len']) # Se escribe en la table memory # el pulso constante que se quiere transmitir self.add_pulse( ch=gen_ch, name="mypulse", ro_ch=ro_ch, style="const", length=cfg['length'], freq=cfg['freq'], phase=cfg['phase'], gain=cfg['gain'],) # Se establece la configuración del bloque lector self.add_readoutconfig(ch=ro_ch, name="myro", freq=cfg['freq'], gen_ch=cfg['gen_ch']) self.send_readoutconfig(ch=ro_ch, name='myro', t=0) def _body(self, cfg): # Se activa pmod para el láser #en el instante 0 con duración laser_init_delay self.trigger(pins=[0], t=0, width=cfg['laser_init_delay']) # Pulso de microondas justo después de apagarse el láser self.pulse(ch=cfg['gen_ch'], name='mypulse', t=cfg['laser_init_delay']) # Activar bloque lector para monitorear el pulso generado self.trigger(ros=[cfg['ro_ch']], t=cfg['laser_init_delay']+cfg['trig_time']) # Activar láser y Lock-in cuando acaba el pulso de microondas self.trigger(pins=[0], t=cfg['mw_delay']+cfg['laser_init_delay'], width=cfg['laser_readout_delay']) self.trigger(pins=[1], t=cfg['mw_delay']+cfg['laser_init_delay'], width=cfg['laser_readout_delay']) # Tiempo para que el sistema relaje self.delay(cfg['relax_delay']) # Diccionario de configuración config = { 'ro_ch': 0, # Canal lector 'gen_ch': 0, # Canal generador 'ro_len': ro_len, # Tiempo de lectura 'length': 0.5, # Duración del pulso 'freq': f_start, # Frecuencia portadora 'gain': 1, # Ganancia 'phase': 0, # Fase 'trig_time': trig_time, 'laser_init_delay': 1, 'mw_delay': mw_delay, 'laser_readout_delay': 0.5, 'relax_delay': 1 } 51 En la Figura 29 se puede observar cómo se cumplen los tiempos de los pulsos y la alta precisión con la que se ejecuta en los PMODs. El canal 1 corresponde al pulso de control para el sistema del láser, donde el primer pulso tiene una duración de 1 µs y el segundo de 0.5µs. El canal 2 genera el pulso de activación para el Lock-In Amplifier, el cual se activa simultáneamente con la segunda activación del láser y tiene la misma duración. Figura 29: Salida de pulsos del PMOD sincronizados En la Figura 30 se puede observar que los pulsos presentan un tiempo de subida de aproximadamente74nanosegundos.Estevalorcorrespondealtiempoquetardalaseñal en pasar del nivel bajo al nivel alto en la salida digital del PMOD, y está influenciado por factores como la capacitancia de carga, la impedancia de salida del pin, la longitud del cable y la respuesta del osciloscopio. 52 Figura 30: Tiempo de subida 8.4. Barrido de frecuencias En la Figura 31, la Figura 32 y la Figura 34 se muestran el espectro del barrido de 2 a 4GHz de los pulsos rectangulares que han pasado por el bloque de lectura, correspondientes a las frecuencias portadoras de 2GHz, 2.2GHz y 2.6 GHz, respectivamente. En la figura 31, se observa que la forma del espectro corresponde a la de un pulso rectangular, es decir, un seno cardinal. No se aprecia ninguna componente espuria, ya que todas han sido filtradas correctamente. 53 Figura 31: Espectro de pulso rectangular a 2 GHz En la Figura 32, en cambio, se observa una componente espuria centrada en 24MHz. Esto se debe a que la portadora está muy cerca del límite de la primera zona de Nyquist del ADC, cuya frecuencia de muestreo es de 4423.680 MHz, lo que provoca aliasing, como se ilustra en la Figura 33 de [5]. Endichafigurasemuestracómosepuedenfiltrarfácilmentelaimagen,losarmónicos y las imágenes de los armónicos mediante un filtro paso-banda, dejando solo la señal de interés. El problema surge cuando la imagen está demasiado cerca de dicha señal, en cuyo caso no podrá ser eliminada mediante el convertidor descendente digital. Un caso aún peor sería aquel en el que la componente espuria se superpone exactamente con la señal deseada, haciendo imposible su filtrado. Figura 32: Espectro de pulso rectangular a 2.2 GHz 54 Figura 33: Ejemplo de filtrado analógico para eliminar espurias, [5] En la Figura 34 ocurre algo similar al caso anterior, donde el DAC, con una frecuencia de muestreo de 9830.400MHz, genera un pulso imagen y, al llegar al ADC, se crea otra imagen de la generada por el DAC muy cercana al pulso de interés, lo que impide su filtrado. Figura 34: Espectro de pulso rectangular a 2.6 GHz Para resolver este tipo de problemas, [5] propone utilizar ADCs con una mayor frecuencia de muestreo o realizar una mejor planificación de frecuencias, alejándose lo máximo posible de los límites de las zonas de Nyquist. 55