Dominando Xilinx Vivado: Analizador Lógico Integrado (ILA) y Entrada/Salida Virtual (VIO) para Depuración
Este tutorial le guía en el uso de los núcleos Analizador Lógico Integrado (ILA) y Entrada/Salida Virtual (VIO) de Xilinx Vivado para depurar y monitorizar diseños VHDL en el chip. Al final, sabrá cómo insertar sondas, configurar disparadores y capturar el comportamiento preciso de las señales sin necesidad de equipo externo.
Visión general
A lo largo del artículo haremos referencia a capturas de pantalla de Vivado. Haga clic en cada imagen para ampliarla. Utilice la barra lateral o la navegación emergente en dispositivos móviles para un acceso rápido.
ILA y VIO
El IP ILA permite sondear señales internas del FPGA en tiempo real, mientras que el IP VIO permite controlar señales internas desde Vivado. Ambos son gratuitos, altamente configurables y se integran perfectamente en el flujo de trabajo de Vivado.
- IP de Xilinx: Analizador Lógico Integrado (ILA)
- IP de Xilinx: Entrada/Salida Virtual (VIO)
Requisitos
- Una placa FPGA de Xilinx
- Vivado Design Suite (2020.2 o posterior)
- Conocimientos básicos de VHDL
En los ejemplos utilizaremos el Kit de Evaluación Kintex‑7 KC705, pero los pasos son aplicables a cualquier FPGA moderno de Xilinx.
Descargar el proyecto de ejemplo
Descargue el archivo ZIP que contiene el diseño de ejemplo y los archivos VHDL. Abra ila_tutorial.xpr en Vivado para explorar el diseño, o siga leyendo para crearlo desde cero.
Crear un proyecto con Vivado
Inicie Vivado y haga clic en Create Project en la pantalla de bienvenida.
Avance por el asistente: asigne el nombre ila_tutorial (sin espacios), seleccione RTL Project, y añada los fuentes counter.vhdl y counter_top.vhdl. Active Copy sources into project y continúe.
Añada el archivo de restricciones top.xdc, copiándolo al proyecto. Ajuste los pines de reloj y LED para que coincidan con su placa, y establezca el período de reloj correcto.
Seleccione su placa de la lista y haga clic en Finish para abrir el proyecto.
Descripción general del diseño de ejemplo
El ejemplo consta de dos contadores de 4 bits encadenados. counter.vhdl implementa un contador que se incrementa cuando está habilitado y afirma una salida trigger de 1 bit entre las cuentas 12 y 15.
Declaración de entidad:
---------------------------------------------------------------------------- -- DECLARACIÓN DE ENTIDAD. ---------------------------------------------------------------------------- ENTITY counter IS PORT(clk : IN STD_LOGIC; -- Reloj principal reset : IN STD_LOGIC; -- Reset, activo en alto enable : IN STD_LOGIC; -- Habilita el siguiente contador trigger : OUT STD_LOGIC -- Dispara el siguiente contador ); END ENTITY;
Señales internas:
count– valor del contador de 4 bits.trigger_o– señal intermedia conectada a la salidatrigger.
Uso de atributos (se explicará más adelante):
ATTRIBUTE MARK_DEBUG : STRING; ATTRIBUTE MARK_DEBUG OF count : SIGNAL IS "true";
Lógica secuencial:
seq_proc: PROCESS (reset, clk) BEGIN -- for seq_proc IF (reset = '1') THEN count <= (OTHERS => '0'); trigger_o <= '0'; ELSIF rising_edge(clk) THEN IF (enable = '1') THEN count <= count + 1; IF (count > x"B" AND count <= x"F") THEN trigger_o <= '1'; ELSE trigger_o <= '0'; END IF; END IF; END IF; END PROCESS;
counter_top.vhdl instancia dos contadores. counter_1_inst está siempre habilitado y proporciona el reloj a counter_2_inst a través de su salida trigger. Por consiguiente, counter_2_inst se incrementa solo cuatro veces por cada ciclo de 16 ciclos de counter_1_inst.
Crear un núcleo VIO para RESET
Generaremos un VIO que controle la entrada reset del diseño, permitiendo su conmutación manual desde Vivado.
Abra IP Catalog, busque VIO, haga doble clic en VIO (Virtual Input/Output) y cámbiele el nombre a vio_reset. Establezca Input Probe Count a 0 y Output Probe Count a 1.
Configure la sonda de salida: anchura = 1, valor inicial = 0x1, luego haga clic en OK y Generate.
Después de la síntesis, declare un componente en counter_top.vhdl e instancielo. No olvide establecer flatten_hierarchy en None antes de volver a sintetizar.
COMPONENT vio_reset PORT( clk : IN STD_LOGIC; probe_out0 : OUT STD_LOGIC_VECTOR(0 DOWNTO 0) ); END COMPONENT;
Insertar sondas de depuración
Las señales pueden sondearse mediante tres métodos:
- Desde el código VHDL (mediante atributos
MARK_DEBUG). - Desde el Netlist o Esquemático (clic derecho → Mark Debug).
- Desde un archivo XDC/TCL (no se trata aquí).
Inserción desde archivo VHDL
Declare el atributo MARK_DEBUG una vez por archivo y aplíquelo a las señales deseadas:
ATTRIBUTE MARK_DEBUG : STRING; ATTRIBUTE MARK_DEBUG OF count : SIGNAL IS "true";
En el diseño sintetizado, count aparecerá bajo Unassigned Debug Nets con un icono de error.
Inserción desde el Netlist
Navegue a Netlist o Schematic, localice la red trigger, haga clic derecho y elija Mark Debug para ambos contadores.
Crear el núcleo de depuración ILA
Abra Set Up Debug desde el IP Catalog. Vivado listará todas las redes de depuración y sus dominios de reloj. Mantenga las cuatro señales para este tutorial.
Configure la profundidad FIFO del ILA (1024 es suficiente) y active Capture control. Finalice el asistente; Vivado genera un núcleo ILA y un archivo de restricciones.
Guarde la restricción como ila_core.xdc. Este archivo aplica los atributos de depuración, crea el núcleo ILA, configura cada sonda e instancia un dbg_hub que conecta el núcleo con Vivado. Actualice la frecuencia de reloj del hub para que coincida con su diseño.
Vuelva a ejecutar síntesis, luego implementación, y genere el bitstream. Abra el Hardware Manager, conecte automáticamente y programe el dispositivo junto con el archivo de sondas .ltx.
Configurar disparadores del ILA
Tras la programación, aparece el panel de control del ILA. Active la pestaña VIO y elimine ventanas innecesarias. Añada la sonda reset al VIO para poder conmutarla durante la captura.
Configure un disparador en counter_1_inst/trigger con condición de flanco ascendente y una ventana de pre-disparo de 32 muestras.
Ejecutar ILA con un disparador
Arme el disparador (el estado cambia a waiting for trigger) y conmute reset a 0. Una vez que el disparador se activa, el ILA registra 32 muestras antes del evento y continúa hasta llenar el FIFO.
Al alejar el zoom se revela también el comportamiento de counter_2_inst.
Ejecutar ILA con múltiples disparadores
Para escenarios complejos, encadene varios disparadores. Por ejemplo, dispare cuando counter_1_inst/count == 9 y counter_2_inst/count > 2, dividiendo el FIFO en cuatro ventanas.
Modo de rearme automático
Active Auto re‑trigger para capturar eventos esporádicos o de alta frecuencia. Configure un único disparador, establezca la profundidad del FIFO y arme el núcleo.
Modo de captura
El modo de captura registra solo las muestras que cumplen una condición global. Por ejemplo, capture cuando counter_1_inst/trigger == 1 Y counter_2_inst/trigger == 0 simultáneamente.
Conclusión
ILA y VIO son herramientas potentes y gratuitas para la depuración en chip. Aprovechando sondas, múltiples disparadores y modos de captura, puede monitorizar y controlar con precisión diseños FPGA complejos directamente desde Vivado.
VHDL
- Construya un sensor de temperatura remoto con Raspberry Pi y Python – Guía paso a paso
- RightHand Robotics y Element Logic presentan sistema integrado de picking robótico de piezas
- Expandiendo horizontes cloud: Nuevas zonas, contenedores y estrategias multicloud
- Fundamentos de C#: Entrada y salida esenciales
- Dominando la Entrada y Salida en C++: Guía Práctica
- Dominando la entrada/salida en C: scanf() y printf() explicados
- Dominando Entrada y Salida en programación C
- Dominando VHDL y Verilog: Escribiendo lógica combinacional y secuencial limpia
- Dominando Latches D: Diseño, Operación y Diferencias Clave
- Dominando E/S e importación de módulos en Python: Guía práctica
- Dominar Entrada y Salida en Java: Imprimir, Leer y Formatear Datos