Xilinx Vivado onder de knie: Integrated Logic Analyzer (ILA) & Virtual Input/Output (VIO) debugging
Deze tutorial begeleidt je door het gebruik van de Integrated Logic Analyzer (ILA) en Virtual Input/Output (VIO) cores van Xilinx Vivado om VHDL-ontwerpen on-chip te debuggen en te monitoren. Aan het einde weet je hoe je probes invoegt, triggers configureert en nauwkeurig signaalgedrag vastlegt zonder externe apparatuur.
Overzicht
In dit artikel verwijzen we naar Vivado-screenshots. Klik op elke afbeelding om te vergroten. Gebruik de zijbalk of de mobiele pop-up navigatie voor snelle toegang.
ILA en VIO
De ILA IP laat je interne FPGA-signalen in realtime proberen, terwijl de VIO IP je in staat stelt om interne signalen vanuit Vivado aan te sturen. Beide zijn gratis, hoog configureerbaar en integreren naadloos in de Vivado-workflow.
- Xilinx IP: Integrated Logic Analyzer (ILA)
- Xilinx IP: Virtual Input/Output (VIO)
Vereisten
- Een Xilinx FPGA-board
- De Vivado Design Suite (2020.2 of nieuwer)
- Basiskennis van VHDL
We gebruiken in de voorbeelden de Kintex‑7 KC705 Evaluation Kit, maar de stappen gelden voor elk moderne Xilinx FPGA.
Download het voorbeeldproject
Download de ZIP met het voorbeeldontwerp en VHDL-bestanden. Open ila_tutorial.xpr in Vivado om het ontwerp te verkennen, of lees verder om het vanaf nul te maken.
Maak een project met Vivado
Start Vivado en klik op Create Project op het welkomstscherm.
Volg de wizard: noem het project ila_tutorial (geen spaties), selecteer RTL Project, en voeg bronnen counter.vhdl en counter_top.vhdl toe. Schakel Copy sources into project in en ga verder.
Voeg het constraint-bestand top.xdc toe, kopieer het in het project. Pas klok- en LED-pinnen aan aan je board, en stel de juiste klokperiode in.
Selecteer je board uit de lijst en klik op Finish om het project te openen.
Overzicht van het ontwerpvoorbeeld
Het voorbeeld bestaat uit twee 4-bit tellers in keten. counter.vhdl implementeert een teller die incrementeert wanneer geactiveerd en een 1-bit trigger uitgang activeert tussen tellerwaarden 12 en 15.
Entiteitsdeclaratie:
---------------------------------------------------------------------------- -- ENTITEITSDECLARATIE. ---------------------------------------------------------------------------- ENTITY counter IS PORT(clk : IN STD_LOGIC; -- Hoofdklok reset : IN STD_LOGIC; -- reset, actief hoog enable : IN STD_LOGIC; -- activeer volgende teller trigger : OUT STD_LOGIC -- trigger volgende teller ); END ENTITY;
Interne signalen:
count– de 4-bit tellerwaarde.trigger_o– intermediair signaal verbonden met detriggeruitgang.
Attribuutgebruik (wordt later uitgelegd):
ATTRIBUTE MARK_DEBUG : STRING; ATTRIBUTE MARK_DEBUG OF count : SIGNAL IS "true";
Sequentiële logica:
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 instantieert twee tellers. counter_1_inst is altijd geactiveerd en klokt counter_2_inst via zijn trigger uitgang. Gevolg: counter_2_inst incrementeert slechts vier keer per 16-cycli cyclus van counter_1_inst.
Maak een VIO-core voor RESET
We genereren een VIO die de reset invoer van het ontwerp aanstuurt, zodat handmatig getoggled kan worden vanuit Vivado.
Open IP Catalog, zoek VIO, dubbelklik VIO (Virtual Input/Output), hernoem naar vio_reset. Zet Input Probe Count op 0 en Output Probe Count op 1.
Configureer de output probe: breedte = 1, beginwaarde = 0x1, klik OK en Generate.
Na synthese, declareer een component in counter_top.vhdl en instantieer het. Vergeet niet flatten_hierarchy op None te zetten voor her-synthese.
COMPONENT vio_reset PORT( clk : IN STD_LOGIC; probe_out0 : OUT STD_LOGIC_VECTOR(0 DOWNTO 0) ); END COMPONENT;
Debug-probes invoegen
Signalen kunnen op drie manieren geprobed worden:
- Vanaf de VHDL-bron (via
MARK_DEBUGattributen). - Vanaf de Netlist of Schematic (rechtsklik Mark Debug).
- Vanaf een XDC/TCL-bestand (niet behandeld hier).
Invoegen vanuit VHDL-bestand
Declareer het MARK_DEBUG attribuut één keer per bestand, pas het toe op gewenste signalen:
ATTRIBUTE MARK_DEBUG : STRING; ATTRIBUTE MARK_DEBUG OF count : SIGNAL IS "true";
In het gesynthetiseerde ontwerp verschijnt count onder Unassigned Debug Nets met een bug-icoon.
Invoegen vanuit Netlist
Navigeer naar Netlist of Schematic, zoek het trigger net, rechtsklik, en kies Mark Debug voor beide tellers.
Maak de ILA debug core
Open Set Up Debug vanuit de IP Catalog. Vivado toont alle debug nets en hun klokdomeinen. Houd alle vier signalen voor deze tutorial.
Configureer de ILA FIFO diepte (1024 is voldoende) en schakel Capture control in. Voltooi de wizard; Vivado genereert een ILA core en een constraint-bestand.
Sla het constraint op als ila_core.xdc. Dit bestand past debug-attributen toe, creëert de ILA core, configureert elke probe, en instantieert een dbg_hub die de core verbindt met Vivado. Werk de hub-klokfrequentie bij aan je ontwerp.
Voer synthese, implementatie en bitstream-generatie opnieuw uit. Open Hardware Manager, auto-connect, en programmeer het apparaat samen met het .ltx probe-bestand.
Configureer ILA triggers
Na programmeren verschijnt het ILA-dashboard. Schakel het VIO-tabblad in en verwijder onnodige vensters. Voeg de reset probe toe aan de VIO zodat je deze tijdens vastleggen kunt togglen.
Stel een trigger in op counter_1_inst/trigger met een stijgende-flank conditie en een pre-trigger venster van 32 samples.
ILA draaien met één trigger
Arm de trigger (status schakelt naar waiting for trigger) en toggle reset naar 0. Zodra de trigger afviert, registreert de ILA 32 samples voor het evenement en gaat door tot de FIFO vol is.
Uitzoomen onthult het gedrag van counter_2_inst ook.
ILA draaien met meerdere triggers
Voor complexe scenario's, koppel meerdere triggers. Bijv. trigger wanneer counter_1_inst/count == 9 EN counter_2_inst/count > 2, de FIFO opgedeeld in vier vensters.
Auto Re-trigger modus
Schakel Auto re-trigger in om sporadisch of met hoge frequentie optredende evenementen vast te leggen. Configureer een enkele trigger, stel FIFO-diepte in, en arm de core.
Capture modus
Capture modus registreert alleen samples die voldoen aan een globale conditie. Bijv. vastleggen wanneer counter_1_inst/trigger == 1 EN counter_2_inst/trigger == 0 gelijktijdig.
Conclusie
ILA en VIO zijn krachtige, gratis tools voor on-chip debugging. Door probes, meerdere triggers en capture modi te benutten, kun je complexe FPGA-ontwerpen precies monitoren en sturen direct vanuit Vivado.
VHDL
- Een externe temperatuursensor bouwen met Raspberry Pi en Python – Stap-voor-stap handleiding
- RightHand Robotics & Element Logic lanceren geïntegreerd robotica piece-picking systeem
- Cloudhorizonten Uitbreiden: Nieuwe Zones, Containers En Multicloud-strategieën
- C# Fundamentals: Invoer en Uitvoer Basis
- C++ input en output: een praktische gids
- C Input en Output (I/O) Beheersen: scanf() en printf() Uitgelegd
- Invoer en uitvoer in C programmeren: Volledige gids
- VHDL & Verilog Meesteren: Schone Combinatoire en Sequentiele Logica Schrijven
- D Latches Onder de Knie: Ontwerp, Werking en Belangrijke Verschillen
- Python I/O en Module Imports onder de knie krijgen: Een praktische gids
- Java Input & Output beheersen: printen, lezen en formatteren