В конце сентября - начале октября в рамках межрегионального форума «ИТ-трансформация 2025: профессионалы цифрового будущего» [https://itforumaltai.ru/2025/], проходившего в г.Барнаул проводился кейс-чемпионат «Код успеха». В номинации «Промышленная разработка» два из тех кейсов были посвящены проектам на ПЛИС:

Кейс 1. Retro Game Console – разработка устройства вывода графики, анимации и текста с интерактивными эффектами

Данный кейс родился спонтанно, под влиянием книг Steven Hugg «Making Games for the NES» и «Designing Video Game Hardware in Verilog», а также ряда дискуссий в чате «Школы синтеза цифровых схем» и от этого кейса ожидались как минимум яркие красивые картинки, да и обычно вывод на дисплей/экран и манипуляции с картинками доставляют яркие и незабываемые эмоции (особенно при отладке, да…)

Кейс 2. «RTL-SoC-challenge» – разработка и прототипирование системы-на-кристалле на базе FPGA

Второй кейс родился по образу и подобию SoC Design Challenge 2025 [https://edu.yadro.com/soc-design-challenge/ https://habr.com/ru/companies/yadro/articles/909410/], но в несколько упрощенном (??ооочень не точно) варианте – только RTL синтез с небольшими включениями тестирования модулей.

В этом кейсе участникам в качестве подопытного кролика был предложен вариант многопоточной архитектуры процессора RISC-V, разработанного для учебного курса [https://riscv-alliance.ru/material/risc-v-dlya-fpga-arhitektura-mikroarhitekturnye-realizaczii/] созданного в рамках выполнения гранта Альянса RISC-V на разработку учебных материалов.
Соревнование собрало команды и индивидуальных участников из АлтГУ, ИТМО, МИЭМ НИУ ВШЭ, РТУ МИРЭА, Санкт-Петербургского политехнического университета. Работы оценивали специалисты компании YADRO (огромное спасибо Юрию Гринишкину и Евгению Максимову за помощь и организацию процесса). В целом инженерами отмечен высокий уровень участников и большой объем работы, проделанный за неполные две недели, отведенные на решение задач.

С ночи 21го сентября и до глубооокой ночи 6го октября командам и одиночным участникам были открыты задания.

Сами задачи, как их увидели участники (перечень ПО и оборудования – приблизительный и рассчитывался на случай массового очного участия на финальных стадиях)) – хорошо или плохо, но этого не произошло)):

Кейс 1. Retro Game Console – разработка устройства вывода графики, анимации и текста с интерактивными эффектами
ПО – Irarus Verilog, GTK Wave, RARS, Quartus Prime (или иное опционально, в зависимости от вендора плат в наличии у участника).
Оборудование  - плата(ы) Omdazz CyclonIV (а также совместимые с ними, или опционально любые из списка плат, адаптированных для «Школы синтеза цифровых схем»), переходник UASRT-USB, PS/2-клавиатура (или иная при наличии – например 16-кнопочная для Arduino-плат).
Вводные данные(легенда) –участникам предлагается разработать демонстрационный вариант игровой консоли в ретро стиле. Комментарий PM: «ASAP! Сделайте так, чтобы все поверили, что она работает! Пусть хотя бы картинку крутит да текст выдаёт!»
Имеется:
- допускается использование готовых блоков с открытым исходным кодом при должном ревью и понимании кода (особенно тогда, когда предполагается работа с  HDMI-выводом);
- при наличии участники могут использовать FPGA-платы отличные, от упомянутых в задании.
Workflow:
1 – реализовать контроллер графического дисплея (VGA – по умолчанию, любого другого в зависимости от желания и/или наличия у участника на заочном этапе – от OLED до HDMI), привести его документированное описание, тестирование, демонстрацию работы/запуска;
2 – разработать пиксельный шрифт для цифр и символов латинского алфавита, знаки препинания (по желанию участника набор символов им может быть расширен), продемонстрировать проект шрифта;
3 – добиться вывода заданного блока текста в определенную область дисплея, привести отчет, исходные тексты, результаты моделирования(если проводилось) и тестирования;
4 – разработать пиксельную картинку (битовое поле/спрайт) в формате данных, приемлемом для созданного/выбранного графического контролера
5 – добиться вывода пиксельной картинки в заданную область дисплея, возможность перемещения картинки будет дополнительно оцениваться
6 – разработать векторную каркасную картинку-чертёж (можно в псевдо 3Д), задаваемую координатами точек в картинной плоскости дисплея
7 – добиться вывода векторной картинки в определенную область дисплея, привести отчет, исходные тексты, результаты моделирования (если проводилось) и тестирования;
8 – используя встроенные кнопки платы, или подключив внешнюю клавиатуру добиться эффекта вращения векторной картинки.
9 - создать финальную/отчетную презентацию проекта, представить доклад .

 Кейс 2. «RTL-SoC-challenge» – разработка и прототипирование системы-на-кристалле на базе FPGA
Вводные данные(легенда) – сторонним разработчиком предоставлено легаси-ПО в виде набора исходных текстов многопоточного 32-битного процессора (IP-ядро софт процессора), совместимого (по заявлению разработчика) с открытой архитектурой RISC-V (поддерживаемый набор команд - I+Zcsr).
Имеется:
- исходные тексты узлов процессора и модуля топ-уровня (самого процессора-заготовки), тестбенчи центрального модуля и отдельных узлов;
- документация – описание многотактной микроархитетуры процессора, описание многопоточного варианта, описание отдельных модулей и принципов их построения; - спецификация архитектуры RISC-V.
Workflow[возможна более детальная разбивка по этапам/работам – каждый «шаг» оценивается в определенное количество баллов, отчетность идет за каждый «шаг», «шаги» 1-6(7) – заочный этап, 8 (возможно 7-8) – очно/онлайн трансляция]:
1 - изучение исходников и «код-ревью» - рассмотреть исходные тексты, дать оценку «качеству» кода (анахронизмы, стиль, наличие неоптимальных/громоздких конструкций, по возможности «подчистить код», привести отчет по внесенным изменениям, дать обоснования);
2 - как было указано в исходной документации и показал (ну сложно это не заметить код-ревью) блок CSR-регистров – фиктивный («заглушка»), следовательно: добавить «живые» регистры специального назначения согласно списка (таймеры, версии архитектуры, указатель потока, состояние потока), разработать тестбенчи и проверить в симуляции работу добавленных регистров и возможность к ним программного доступа;
 3 - добавить в блок CSR-регистров регистры, описанные в документе «harts.pdf» из начальной документации, протестировать их работу(возможность программного чтения-записи);
 4 - добиться управления отдельными потоками программным образом (через биты в соотвествующих регистрах, определенных выше), продемонстрировать работоспособность;
 5 - модифицировать модуль памяти процессора таким образом, чтобы при активном сигнале сброса была возможность загружать/инициализировать память программ процессора при помощи получения байт с UART-интерфейса, продемонстрировать работоспособность;
 6 - синтезировать полученное решение для выбранной/указанной платы FPGA с использованием соответствующей IDE, получить отчеты по задействованным ресурсам, частотным характеристикам работы и тп., изменить настройки оптимизации проекта в среде разработки по одному/ нескольким параметрам – размер/скорость/энергопотребление (можно проработать несколько вариантов и сравнить их между собой);
7 - с учетом интерактивных возможностей отладочной платы разработать демонстрационное приложение, показывающее работу нескольких программных потоков выполнения [очно/онлайн];
 8 - создать финальную/отчетную презентацию проекта, представить доклад

Изначально для удобства выполнения и дальнейшего оценивания работ кейсы были разбиты на несколько этапов.
Однако, по первому кейсу по желанию участников было принято решение, что предлагаемый в задании ход работ — вещь рекомендательная, а не жесткое руководство к действию — и многие с воодушевлением взялись реально за разработку собственных игровых консолей и игр к ним. Требования к «железу» также свели к «что есть под рукой». Конечно, это решение поломало всякие намеки на выстраивание системы оценивания, но….открыло путь к творчеству.

Кейс Retro Game Console ожидаемо стал наиболее популярным среди участников – с ним боролись три «одиночки» и три команды. При этом только двое участников-одиночек пошли по «предписанному» пути решения кейса, остальные – покусились на создание своей игры/консоли. Следует отметить, что все участники подошли к решению задач очень ответственно и комплексно – практически все перед началом воплощения своих идей в HDL коде проводили их программное моделирование – вплоть до создания интерактивных графических приложений.

Алексей Федоров, по видимому, один из самых старших участников – пошел по пути последовательного выполнения заданий кейса, проявив изрядное мастерство и упорство, в итоге таки добившись цели - https://github.com/32FedorovAlexey/retro_game_console - чисто «хардовое» решение в духе аркадных игр.

Скрин игры Алексея Фёдрова
Скрин игры Алексея Фёдрова

Неожиданностью стало получение решения от Стрениной Татьяны – да, 3й курс АлтГУ но непрофильной специальности – Информационная безопасность – вполне достойное выступление. Татьяна также пошла по пути выполнения кейса.

Команда ИМТО (К. А. Котов, А. К. Шереметьев, Д.Л. Симоновский) - ребятами была выбрана амбициозная идея - разработка свой собственной игры.

По изначальному плану игра представляет собой минималистичную сцену, где игрок оказывается в тёмной комнате без границ. В центре пространства парит вращающийся куб, над которым расположен единственный источник света, освещающий только этот объект. Камера всегда зафиксирована на кубе, поэтому куда бы ни двигался игрок, взгляд остаётся направленным в его центр. Задача игрока в каждом раунде заключается в том, чтобы по состоянию сцены определить наличие какого-либо “события” и принять верное решение: приблизиться к кубу (если события нет) или отойти от него (если событие было обнаружено). Управление строится на простых действиях: можно приближаться к кубу, отдаляться от него или двигаться вокруг него по окружности влево и вправо, сохраняя текущую дистанцию. Каждый раунд продолжается до тех пор, пока игрок не достигнет предельно допустимого расстояния, а именно не приблизится слишком близко или отойдет слишком далеко от куба. После этого раунд завершается, персонаж переносится на случайную дистанцию, а таймер обнуляется. Демонстрационная версия изначальной задумки (папка game_python): https://github.com/Otkuda/fpga-game-hack/tree/main/game_python.

"Сталкерский" кубик команды ИТМО
"Сталкерский" кубик команды ИТМО

Отдельно стоит выделить сборную команду Петербурга (Политехнический, МИЭМ НИУ ВШЭ, ИТМО – А.Григорьев, М. Исаева, С.Монастырская, Л. Мирошниченко) – буквально титаническое упорство и нацеленность на результат (и даже после окончания конкурса – «я заставлю это двигаться…»(с) !

И таки оно будет шевелиться! (из хроники битвы петербуржской сборной)
И таки оно будет шевелиться! (из хроники битвы петербуржской сборной)

Павлов Кирилл из РТУ МИРЭА представил элегантный и остроумный проект учебной игровой ретро-приставки «Брус-16» [https://github.com/Papr1ka/brus16].

Основные элементы Брус-16

- 16-битный стековый CPU. Стековая архитектура выбрана для упрощения создания компилятора:
- 16-битная стековая архитектура с фреймами — локальными переменными в памяти данных;
- код (8192 16-битных слова) и данные (8192) разделены;
- два аппаратных стека: операций (32 ячейки) и возвратов (16 ячеек);
- команда фиксированной длины 16 бит;
- адресация только словами;
- четыре регистра: PC, SP, RP, FP;
- только абсолютные переходы.
- GPU на прямоугольниках и без фреймбуфера:
- кадр строится из 64 аппаратных прямоугольников, для которых задаются X, Y, W, H, цвет и признак абсолютных координат, что облегчает процесс создания игр даже для тех, кто не умеет рисовать. (Нет фреймбуфера — меньше аппаратных ресурсов).

Бинарное дерево мультиплексоров для формирования изображения из прямоугольников
Бинарное дерево мультиплексоров для формирования изображения из прямоугольников
Структурная схема процессора "Брус-16"
Структурная схема процессора "Брус-16"
Первая игра
Первая игра

Вэб-демонстрашки игр и анимации можно посмотреть тут: https://true-grue.github.io/Brus-16-Apps/brus16.html. А сам "Брус-16" стал аппаратной частью междисциплинарного проекта выполняемого Кириллом под руководством П.Н. Советова.

Второй кейс мужественно и упорно «грыз» Тимофей Ташевский (ИМиТ АлтГУ) – более десятка исходников на Verilog, простенькие тестбенчи, симуляция работы только по временным диаграммам – всё это было переосмыслено и проанализировано [https://github.com/tashevsky/xmos-mt ]:
- произведён массовый рефакторинг модулей, исправлены присваивания в комбинационной логике;
- модули многопортовых регистровых файлов теперь синтезируются грамотно и задействуют память, а не регистры;
- внедрены дополнительные поддерживающие модули для синтезации на FPGA, а также исправления (особенно в части ROM);
- и… многое другое...

В результате Тимофею удалось добиться того, что «творение сумрачного гения безумного плисовода» начал синтезироваться на Cyclone V (отладочная плата DE0-CV) и даже с приличными ~100МГц…(возможны, конечно нюансы, но...то, что оно в принципе собралось - уже достижение!).

RTL xmos-mt
RTL xmos-mt
xmos-mt в Cyclone V
xmos-mt в Cyclone V

Конечно, решению далеко до продакшн, но….это всего 2 недели, и всего один человек!

В заключение….

Это был мой первый опыт организации подобных конкурсов, по субъективным ощущениям даже не сильно комом (учитывая, что на разработку задач и вообще понятия в каком направлении и что делать также были неполные две недели сентября, да еще совместно со стартовавшим учебным годом)))). Огромное спасибо всем, кто остался неравнодушным, огромное уважение и восхищение участниками и спасибо отделу образовательных инициатив YADRO за информационную и прочую поддержку.

Надеюсь, что проведённое мероприятие и сей опус послужат на благо популяризации и развития ПЛИСоводства и повышения интереса к техническому творчеству в целом.

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


  1. KeisN13
    23.10.2025 09:09

    Балин, круто! Давай еще че нить для конфы плисовой придумаем ) Времени до 29 ноября есть.


    1. forther Автор
      23.10.2025 09:09

      Вождь, ну на ту публику можно вообще почти что угодно))) а особенно, если еще в живую и на платах....

      • инженерный калькулятор;

      • АЛУ на CORDIC-ах;

      • повтор творчества Чака Мура

      • прикрутить векторное расширение к..ну пусть к PicoRV

        Ну это пока так, в "порядке бреда"))


      1. KeisN13
        23.10.2025 09:09

        Всё што угодно без риск-5 xD