Освоение Xilinx Vivado: Integrated Logic Analyzer (ILA) и Virtual Input/Output (VIO) для отладки
Это руководство проведет вас через использование ядер Integrated Logic Analyzer (ILA) и Virtual Input/Output (VIO) в Xilinx Vivado для отладки и мониторинга VHDL-проектов на кристалле. К концу вы научитесь вставлять пробники, настраивать триггеры и захватывать точное поведение сигналов без внешнего оборудования.
Обзор
Во всей статье мы будем ссылаться на скриншоты Vivado. Нажмите на каждое изображение, чтобы увеличить. Используйте боковую панель или мобильную навигацию для быстрого доступа.
ILA и VIO
IP-ядро ILA позволяет пробовать внутренние сигналы FPGA в реальном времени, а IP-ядро VIO дает возможность управлять внутренними сигналами из Vivado. Оба ядра бесплатны, высоконастраиваемы и бесшовно интегрируются в рабочий процесс Vivado.
- Xilinx IP: Integrated Logic Analyzer (ILA)
- Xilinx IP: Virtual Input/Output (VIO)
Требования
- Плата разработки на базе FPGA Xilinx
- Vivado Design Suite (версия 2020.2 или новее)
- Базовые знания VHDL
В примерах используется комплект оценки Kintex‑7 KC705, но шаги применимы к любой современной FPGA Xilinx.
Загрузка примера проекта
Скачайте ZIP-архив с примером проекта и VHDL-файлами. Откройте ila_tutorial.xpr в Vivado для изучения проекта или читайте дальше, чтобы создать его с нуля.
Создание проекта в Vivado
Запустите Vivado и нажмите Create Project на приветственном экране.
Пройдите через мастер: назовите проект ila_tutorial (без пробелов), выберите RTL Project, добавьте исходники counter.vhdl и counter_top.vhdl. Включите Copy sources into project и продолжите.
Добавьте файл ограничений top.xdc, скопировав его в проект. Настройте выводы тактового сигнала и светодиодов под вашу плату и задайте правильный период такта.
Выберите вашу плату из списка и нажмите Finish, чтобы открыть проект.
Обзор примера проекта
Пример состоит из двух 4-битных счетчиков, соединенных в цепочку. counter.vhdl реализует счетчик, который инкрементируется при включении и выдает 1-битный сигнал trigger между значениями 12 и 15.
Объявление сущности:
---------------------------------------------------------------------------- -- ОБЪЯВЛЕНИЕ СУЩНОСТИ. ---------------------------------------------------------------------------- ENTITY counter IS PORT(clk : IN STD_LOGIC; -- Основной такт reset : IN STD_LOGIC; -- Сброс, активный высокий уровень enable : IN STD_LOGIC; -- Включение следующего счетчика trigger : OUT STD_LOGIC -- Триггер для следующего счетчика ); END ENTITY;
Внутренние сигналы:
count– значение 4-битного счетчика.trigger_o– промежуточный сигнал, соединенный с выходомtrigger.
Использование атрибутов (будет объяснено позже):
ATTRIBUTE MARK_DEBUG : STRING; ATTRIBUTE MARK_DEBUG OF count : SIGNAL IS "true";
Последовательная логика:
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 инстанцирует два счетчика. counter_1_inst всегда включен и тактирует counter_2_inst через свой выход trigger. Следовательно, counter_2_inst инкрементируется только четыре раза за 16-цикловой период counter_1_inst.
Создание ядра VIO для RESET
Мы сгенерируем VIO, который управляет входом reset проекта, позволяя переключать его вручную из Vivado.
Откройте IP Catalog, найдите VIO, дважды кликните по VIO (Virtual Input/Output) и переименуйте в vio_reset. Установите Input Probe Count в 0 и Output Probe Count в 1.
Настройте выходной пробник: ширина = 1, начальное значение = 0x1, затем нажмите OK и Generate.
После синтеза объявите компонент в counter_top.vhdl и инстанцируйте его. Не забудьте установить flatten_hierarchy в None перед повторным синтезом.
COMPONENT vio_reset PORT( clk : IN STD_LOGIC; probe_out0 : OUT STD_LOGIC_VECTOR(0 DOWNTO 0) ); END COMPONENT;
Вставка отладочных пробников
Сигналы можно пробовать тремя способами:
- Из VHDL-источника (через атрибуты
MARK_DEBUG). - Из нетлиста или схемы (правый клик → Mark Debug).
- Из XDC/TCL-файла (не рассматривается здесь).
Вставка из VHDL-файла
Объявите атрибут MARK_DEBUG один раз на файл, затем примените его к нужным сигналам:
ATTRIBUTE MARK_DEBUG : STRING; ATTRIBUTE MARK_DEBUG OF count : SIGNAL IS "true";
В синтезированном проекте count появится в разделе Unassigned Debug Nets с иконкой жука.
Вставка из нетлиста
Перейдите в Netlist или Schematic, найдите сеть trigger, кликните правой кнопкой и выберите Mark Debug для обоих счетчиков.
Создание отладочного ядра ILA
Откройте Set Up Debug из IP Catalog. Vivado покажет все отладочные сети и их тактовые домены. Оставьте все четыре сигнала для этого руководства.
Настройте глубину FIFO ILA (1024 достаточно) и включите Capture control. Завершите мастер; Vivado сгенерирует ядро ILA и файл ограничений.
Сохраните ограничения как ila_core.xdc. Этот файл применяет атрибуты отладки, создает ядро ILA, настраивает каждый пробник и инстанцирует dbg_hub, соединяющий ядро с Vivado. Обновите частоту такта хаба под ваш проект.
Повторно запустите синтез, затем реализацию, и сгенерируйте битстрим. Откройте Hardware Manager, выполните автоподключение и запрограммируйте устройство вместе с .ltx файлом пробников.
Настройка триггеров ILA
После программирования появится панель ILA. Включите вкладку VIO и удалите лишние окна. Добавьте пробник reset в VIO, чтобы переключать его во время захвата.
Настройте триггер на counter_1_inst/trigger с условием по фронту и окном предтриггера 32 отсчета.
Запуск ILA с одним триггером
Подготовьте триггер (статус переключится на waiting for trigger) и установите reset в 0. Когда триггер сработает, ILA запишет 32 отсчета до события и продолжит до заполнения FIFO.
При увеличении масштаба видно поведение counter_2_inst.
Запуск ILA с несколькими триггерами
Для сложных сценариев объединяйте несколько триггеров. Например, триггерьте при counter_1_inst/count == 9 И counter_2_inst/count > 2, разделяя FIFO на четыре окна.
Режим Auto Re‑Trigger
Включите Auto re‑trigger для захвата случайных или высокочастотных событий. Настройте один триггер, задайте глубину FIFO и подготовьте ядро.
Режим Capture Mode
Capture mode записывает только отсчеты, удовлетворяющие глобальному условию. Например, захват когда counter_1_inst/trigger == 1 И counter_2_inst/trigger == 0 одновременно.
Заключение
ILA и VIO — мощные бесплатные инструменты для накристальной отладки. Используя пробники, множественные триггеры и режимы захвата, можно точно наблюдать и управлять сложными FPGA-проектами прямо из Vivado.
VHDL
- Мастерство VHDL и Verilog: написание чистой комбинационной и последовательной логики
- Расширение облачных горизонтов: новые зоны, контейнеры и мультиоблачные стратегии
- Основы ввода-вывода в C#: Console.WriteLine, ReadLine и форматирование
- Освоение ввода и вывода в C++: практическое руководство
- Ввод-вывод в C: scanf() и printf() — подробное руководство
- Мастерство ввода-вывода и импорта модулей в Python: Практическое руководство
- Ввод и вывод в Java: печать, чтение и форматирование данных
- D-защелки: проектирование, принцип работы и ключевые отличия от триггеров
- Ввод-вывод в C: stdio.h, потоки stdin/stdout/stderr, функции getchar/putchar, gets/puts, scanf/printf
- RightHand Robotics и Element Logic представили интегрированную роботизированную систему поштучной комплектации