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

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

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

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

После описания примеров использования самое время перейти к созданию тестового проекта ПЛИС с использованием 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).

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

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

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

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

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



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


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

В завершении необходимо скомпилировать прошивку и загрузить её в ПЛИС.
Подключение к ПЛИС с помощью 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/ .

После успешного запуска окна 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).

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

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

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