Вступление

Привет, Хабр! Меня зовут Роман Вернин, я разработчик систем на кристалле в компании Аквариус. Вместе с коллегами мы разрабатываем микросхемы ASIC. В этой статье я хотел бы поделиться опытом, как можно использовать отладочное средство ПЛИС от фирмы Intel для тестирования, настройки или исследования устройств и стендовых систем.

Для кого эта статья

Несколько раз за свою профессиональную деятельность я сталкивался с ситуацией, когда было необходимо из приложения на персональном компьютере писать в регистры или читать из регистров ПЛИС для отладки какого-нибудь устройства, но прикрутить процессор для организации связи с ПК было либо невозможно, либо долго, плюс дополнительно вставал вопрос с самим приложением на ПК для обмена данными с ПЛИС — ведь программисты всегда в дефиците. Но оказывается для этих целей хорошо подходит инструмент отладки System Console для ПЛИС фирмы Intel, который можно использовать не только как средство отладки ПЛИС, но и как средство для отладки плат, приборов или целых тестовых стендов. Далее я расскажу о примерах из своей практики, если у Вас возникали схожие ситуации, то System Console это то, что Вам нужно.

  1. Впервые я применил данное отладочное средство во время «bring up» измерительного модуля на шине PXI. После первичной проверки были обнаружены ошибки в разводке шины PXI при подключении к DSP, связь с ПК через шину была потеряна (Рисунок 1). Чтобы не терять время до выхода второй ревизии платы, необходимо было проверить аналоговую часть, включая сбор данных с АЦП. Для этого отлично подошел System Console, оставив в прошивке штатные регистры, доступ к ним от DSP заменили на обращения из Quartus через System Console по JTAG программатору.

 Рисунок 1. Пример 1: модуль с неработающим dsp.
Рисунок 1. Пример 1: модуль с неработающим dsp.

2. Необходимо было произвести настройку и автономное тестирование модулятора ВЧ передатчика (Рисунок 2), не дожидаясь, когда программисты обновят ПО для тестового стенда. Доступ к регистрам через System Console успешно помог решить эту проблему. При этом процесс редактирования скриптов чтения/записи удобен и прост, что позволило их использовать схемотехнику (Иван, привет, если читаешь это) с минимальным опытом работы с ПЛИС, не привлекая в дальнейшем разработчика прошивки.

 Рисунок 2. Пример 2: управление настройкой ВЧ модулятора.
Рисунок 2. Пример 2: управление настройкой ВЧ модулятора.

3. Для тестового стенда нового ВЧ приемника понадобился аттенюатор с программируемыми значениями снижения мощности. Из наличия была только плата содержащая аттенюатор с spi интерфейсом и ПЛИС (Рисунок 3). С помощью System Console была написана программа для загрузки параметров аттенюатора.

 Рисунок 3. Пример 3: управление программируемым аттенюатором.
Рисунок 3. Пример 3: управление программируемым аттенюатором.

4. В компании Аквариус коллеги при разработке контроллера i2c столкнулись c необходимостью воспроизведения различных помех на шине данного интерфейса. На руках был простенький отладочный набор с ПЛИС Cyclone IV (Рисунок 4). Я посоветовал использовать System Console для задания параметров помех из Quartus. Это позволило решить задачу в короткие сроки.

 Рисунок 4. Пример 4: Стенд для управления помехами в линии интерфейса i2c
Рисунок 4. Пример 4: Стенд для управления помехами в линии интерфейса i2c

После описания примеров использования самое время перейти к созданию тестового проекта ПЛИС с использованием System Console.

Описание тестового проекта

В качестве примера рассмотрим проект управления светодиодами для отладочной платы DE0-Nano на базе ПЛИС Intel семейства Cyclone IV. Порты проекта описаны в таблице.

Название порта

Разрядность

Направление

Описание

clk_i

1

Вх.

Тактовая частота( 20 МГц)

rstn_i

1

Вх.

Сброс по нажатию кнопки на отладочной плате (низкий активный уровень)

pio_o

8

Вых.

Выходы управления светодиодами

Создание проекта

Создание проекта буду приводить на примере Quartus Prime Lite 22.1, для других версий процесс аналогичен. Маршрут рассмотрим достаточно подробно, чтобы для новичков в работе с ПЛИС было меньше белых пятен.

В начале маршрута запускаем Project Wizard : File → New Project Wizard . Окно создания проекта на рисунке (Рисунок 5).

 Рисунок 5. Окно создания проекта.
Рисунок 5. Окно создания проекта.

Далее выбираем папку, где будет находиться проект, имя проекта и имя модуля верхнего уровня (должно совпадать с именем модуля в verilog файле) (Рисунок 6)

 Рисунок 6. Меню выбора директории, имени проекта и имени модуля верхнего уровня.
Рисунок 6. Меню выбора директории, имени проекта и имени модуля верхнего уровня.

Затем выбираем Empty Project (Рисунок 7)

 Рисунок 7. Меню выбора типа проекта.
Рисунок 7. Меню выбора типа проекта.

После этого добавляем в проект файлы описания цифровых схем (*.sv) и файлы временных ограничений (*.sdc) (Рисунок 8).

 Рисунок 8. Добавление файлов в проект.
Рисунок 8. Добавление файлов в проект.

Далее выбираем модель ПЛИС и нажимаем Finish (Рисунок 9).

 Рисунок 9. Выбор модели ПЛИС.
Рисунок 9. Выбор модели ПЛИС.

Теперь нужно открыть Platform Designer (Рисунок 10) и добавить необходимые компоненты — Jtag to Avalon Master Bridge (используется в system console для подключения к ПЛИС) (Рисунок 11) и PIO (добавляет в систему 8 выводов для управления светодиодами) (Рисунок 12), настройки данных компонентов оставляем без изменений.

 Рисунок 10. Меню Platform Designer.
Рисунок 10. Меню Platform Designer.
 Рисунок 11. Добавление компоненента JTAG to Avalon Master Bridge.
Рисунок 11. Добавление компоненента JTAG to Avalon Master Bridge.
 Рисунок 12. Добавление компонента PIO.
Рисунок 12. Добавление компонента PIO.

Далее соединяем компоненты как показано на рисунке (Рисунок 13). Затем двойным щелчком мыши экспортируем Reset Input (необходим для подачи внешнего сброса) и external connection в pio_0 (для подключения выводов к светодиодам). После этого необходимо сохранить проект в Platform Designer и сгенерировать файлы проекта, нажав Generate, при этом указав папку для сгенерированных файлов, рекомендую выделить отдельную папку в директории проекта (Рисунок 14).

 Рисунок 13. Соединение компонентов в Platform Designer.
Рисунок 13. Соединение компонентов в Platform Designer.
 Рисунок 14. Генерация проекта Platform Designer.
Рисунок 14. Генерация проекта Platform Designer.

Для добавления системы, сгенерированной в Platform Designer, в файл верхнего уровня проекта нужно открыть файл jtag_to_pio_inst.v и скопировать оттуда данные для вставки в файл модуля верхнего уровня (Рисунок 15).

 Рисунок 15. Файл для добавления системы Platform Designer в файл модуля верхнего уровня.
Рисунок 15. Файл для добавления системы Platform Designer в файл модуля верхнего уровня.

В завершении необходимо скомпилировать прошивку и загрузить её в ПЛИС.

Подключение к ПЛИС с помощью System Console

Для вызова приложения System Console следует выбрать в главном окне Quartus: Tools → System Debugging Tools → System Console (Рисунок 16). Если у кого то, как у меня в Quartus Prime Lite 22.1, не запускается System Console, то необходимо скопировать файлы msvcp<xxx>.dll и msvcr<xxx>.dll (где <xxx> номер версии) из директории $QUARTUS_ROOTDIR/bin64/jre64/bin/ в директорию $QUARTUS_ROOTDIR/bin64/ .

 Рисунок 16. Меню вызова System Console.
Рисунок 16. Меню вызова System Console.

После успешного запуска окна System Console можно писать/читать в регистровое пространство ПЛИС созданное Platform Designer. В нашем случае, в системе один регистр PIO с базовым адресом 0х0000_0000. Управление осуществляется через скрипты tcl. Рассмотрим из чего состоит простейший скрипт записи.

Сначала необходимо выполнить процедуры поиска устройства JTAG и открытия связи с ним:

#Receive FPGA address
get_service_paths master

#Create FPGA address allias
set my_master [lindex [get_service_paths master] 0]
set c_path [claim_service master $my_master ""]

#Open a channel for performing operations with an internal interface
open_service master $c_path

Далее пишем значение 0х01 в регистр с адресом 0х0000_0000

#Create addres allias
set LED 0x00000000

#The first LED lights up to show successful channel opening
master_write_8 $c_path $LED 0x01

Для запуска скрипта на исполнение есть два способа:

1. Добавить скрипт в папку по умолчанию для приложения System Console по следующему адресу:

Windows: <drive>:\Users\<username>\system_console\scripts\

Linux: <$HOME > system_console/scripts

После этого он отобразится в графическом интерфейсе окна System Console, затем нажать правой кнопкой мыши на файл скрипта и щелкнуть левой кнопкой на Execute script (Рисунок 17).

 Рисунок 17. Исполнение скрипта через графический интерфейс.
Рисунок 17. Исполнение скрипта через графический интерфейс.

2. Запустить скрипт из своей директории, для этого в консольном окне приложения System Console выполнить команды (Рисунок 18):

 cd <my_project_dir>
source <my_script>.tcl
 Рисунок 18: Консоль в графическом окне приложения System Console.
Рисунок 18: Консоль в графическом окне приложения System Console.

После исполнения скрипта на ножке pio_o[0] должен установиться высокий уровень (Рисунок19).

Рисунок 19. Отладочная плата.
Рисунок 19. Отладочная плата.

Заключение

Полностью проект с примером из статьи находится в моем репозитории на github. Подробную информацию о работе с System Console и её командах можно найти в документе Intel® Quartus® Prime Standard Edition User Guide: Debug Tools . Стоит отметить, что у других производителей ПЛИС имеются аналогичные средства отладки, но это уже совсем другая история ...

Комментарии (5)


  1. ValeriyS
    18.09.2024 15:08

    Спасибо за очень подробную и полезную инструкцию как получить доступ к записи в регистры ПЛИС со стороны компьютера через System Console. Это позволяет создавать скрипты для автоматизации операций с регистрами.
    Добавлю лишь, что можно использовать ещё один способ для этой же цели: In-System Sources and Probes. Почти что тоже самое, но в графическом GUI варианте.
    https://www.intel.com/content/www/us/en/docs/programmable/683552/18-1/design-debugging-using-in-system-sources-45607.html


    1. rvvernin Автор
      18.09.2024 15:08

      Спасибо за отзыв и дополнение к статье. От себя еще напомню, что есть отладочное средство In-System Memory Content Editor, которое позволяет читать/ писать в память ПЛИС из Quartus, что иногда очень удобно в отладке. Например, в первом примере из статьи, с помощью этого инструмента мы считывали в компьютер данные из АЦП и потом делали математическую обработку в строннем приложении. Также отмечу, что насколько мне известно, подобного отладочного средства в Vivado нет.


  1. MountainGoat
    18.09.2024 15:08

    Уже фото мужика за ноутбуком найти не могут - генерить пришлось, причём по принципу "и так сойдёт"


  1. VT100
    18.09.2024 15:08

    Опечатка в названии платы, вместо "DeoNANO" надо "DE0-NANO"?


    1. rvvernin Автор
      18.09.2024 15:08

      Спасибо за замечание. Поправил. Если быть совсем точным, то на шелкографии платы название - DE0-Nano.