Привет, Хабр! Меня зовут Артём Аверченко, я преподаю в ОмГТУ дисциплины, связанные с FPGA. В этой статье я обобщу свой десятилетний опыт проведения лабораторных работ в этой области и опишу ошибки, которые чаще всего совершают начинающие. Разумеется, на исчерпывающий список я не претендую — едва ли его здесь можно составить в одиночку. Но постараюсь дать как можно больше полезной информации.

Выбор отладочной платы

Первые проблемы могут возникнуть уже при выборе отладочной платы. Предварительно стоит изучить документацию выбранной платы и сопоставить ее с требованиями проекта. На начальном этапе обучения важнее наличие светодиодов, переключателей и индикаторов — компонентов, которые выдают информацию прямо на плате. На более поздних этапах возрастает приоритет подключаемой периферии — то есть наличие у платы необходимых коннекторов.

Обратите внимание, есть ли на плате USB Blaster — устройство для подключения ПЛИС к ПК и последующего программирования и конфигурирования. Существуют отладочные платы с установленным USB Blaster, которым требуется только провод USB для подключения к ПК. Но также могут встретиться платы просто с разъемом JTAG, и для них нужно докупать внешний программатор. У обеих реализаций есть свои плюсы и минусы.

На момент написания статьи цены на программаторы в российских магазинах стартуют с 550 рублей. Источник
На момент написания статьи цены на программаторы в российских магазинах стартуют с 550 рублей. Источник

USB Blaster, изображенный на иллюстрации, продается во многих интернет-магазинах, но ни в одной карточке товара вы не увидите, что внутри корпуса. А внутри может быть два разных схемотехнических решения — рабочее из двух микросхем или нерабочее из одной — как минимум для кристалла Altera Cyclone IV. Есть шанс спасти даже одномикросхемный USB Blaster в подобном корпусе с помощью прошивки, но лучше купить более дорогую и точно рабочую модель, например, производства Waveshare.

Заведомо рабочий USB Blaster производства Waveshare. Источник
Заведомо рабочий USB Blaster производства Waveshare. Источник

Для питания важно использовать блок с заданным в спецификации отладочной платы напряжением и током. Иначе плата может выйти из строя. Некоторые отладочные платы, особенно с минимумом возможностей по периферии, могут получать питание по шине USB прямо с разъема программирования. Естественно, подключить к ним требовательную по питанию периферию не получится.

Типичные ошибки на этом этапе и их последствия:

  • Неверный выбор платы — отсутствие нужной в проекте функциональности.

  • Дешевый USB Blaster — плата не подключается к ПК.

  • Неподходящий блок питания — плата может выйти из строя.

  • Питание платы только по USB — требовательную периферию не подключить.

Общие рекомендации в САПР

Для дальнейших примеров я буду использовать САПР Quartus Prime 20.1 Lite Edition, поскольку по работе сталкиваюсь с ней чаще всего. Но на подобные проблемы можно натолкнуться и в других версиях и средах проектирования. При создании нового проекта необходимо указать директорию, в которой будет сохраняться проект. У Quartus здесь по умолчанию всегда находится папка, в которой установлен он сам.

Рабочая директория в САПР Quartus
Рабочая директория в САПР Quartus

Чтобы не забивать основную директорию, здесь стоит прописать иную папку. При этом важно, чтобы во всем пути от корневой директории (диск C, D…) до папки с проектом в имени самого проекта и всех его файлов не было русских символов.

На всякий случай стоит предварительно перевести все не задействованные в проекте ножки ПЛИС в третье состояние с подтяжкой. В Quartus для этого нужно перейти в настройки проекта Assignments/Device и в открывшемся окне на вкладке Device нажать на кнопку Device and Pin Options.

Настройки устройств в САПР Quartus
Настройки устройств в САПР Quartus

На вкладке Unused Pins в списке выберите As input tri-stated with weak pull-up. Это позволит избежать неожиданного короткого замыкания, если на отладочной/макетной плате физически установлены какие-либо элементы, подающие на ПЛИС свои сигналы.

   Третье состояние контактов, с weak pull-up
   Третье состояние контактов, с weak pull-up

Пожалуй, самая распространенная ошибка на начальном этапе — это отсутствие модуля верхнего уровня (top-level).

Ошибка top-level в Quartus
Ошибка top-level в Quartus

Проект для ПЛИС — это иерархическая структура с широчайшими возможностями ветвления. Quartus необходимо «знать» и «находить» модуль, который принимается за начальный: с него начинается компиляция и все ветвление подключений в проекте. Первый раз мы сталкиваемся с этим понятием еще на этапе создания нового проекта, во второй вкладке New Project Wizard.

Настройка top-level в САПР Quartus
Настройка top-level в САПР Quartus

В третьей строке как раз и задается имя модуля, который Quartus будет считать top-level. Эта строка по умолчанию копирует предыдущую, поэтому обычно ее никто не меняет, хотя это возможно, и не обращает на это внимание в методических указаниях. В других САПР бывает возможность указать top-level через контекстное меню (правой кнопки мыши).

Второй раз мы видим отсылку на top-level в окне Project Navigator.

Top-level в Project Navigator САПР Quartus
Top-level в Project Navigator САПР Quartus

Мы разобрались, как Quartus получает ссылку на top-level и как ее можно изменить. Теперь нужно понять, как создается сам top-level. Это зависит от того, какую реализацию вы выбрали — схемную или текстовую. В любом случае придется взаимодействовать с файлами, подключенными к проекту.

В Quartus посмотреть все подключенные к проекту файлы можно в окне Project Navigator, где в открывающемся списке необходимо выбрать Files. Добавить файлы к проекту можно через меню Assignments/Settings../Files или еще на этапе создания проекта в одном из окон New Project Wizard.

При схемной реализации модулем верхнего уровня считается сам файл с расширением .bdf. Согласно примеру на иллюстрации, Quartus будет сканировать папку проекта и искать среди файлов top.bdf. Если найдет, то запустит компиляцию с него. Вообще, некоторые специалисты не советуют пользоваться bdf вовсе. 

При текстовой реализации top-level Quartus будет искать явное описание модуля — причем во всех текстовых файлах, подключенных к проекту. Название самих файлов, в которых описаны модули, не играет важную роль — сканироваться будут все текстовые файлы. Для более удобной работы с проектом стоит организовывать текстовые файлы так, чтобы название текстового файла совпадало с названием описанного в нем модуля и в каждом текстовом файле был только один модуль.

Если описанная выше ошибка с top-level возникает, это значит, что отсутствует либо схемный файл с необходимым именем при схемной реализации, либо текстовое описание модуля в подключенных к проекту текстовых файлах. Для решения проблемы можно добавить или исправить имеющиеся файлы проекта так, как хочет Quartus, или сказать ему, что top-level будет другой — тот, что есть в проекте.

Типичные ошибки на этом этапе и их последствия:

  • Некорректный путь к директории проекта — проблемы с доступом к файлам.

  • Свободные ножки ПЛИС не подтянуты — неожиданные короткие замыкания.

  • Отсутствие или некорректный top-level — неправильное ветвление проекта.

Схемотехнический редактор

При вытаскивании элемента на рабочую область Quartus дает элементам имя inst с индексом на единицу больше последнего имеющегося.

Пример имен элементов в САПР Quartus
Пример имен элементов в САПР Quartus

В проекте могут быть элементы с одинаковыми названиями — как AND4 на иллюстрации. Но не может быть элементов с одинаковыми именами экземпляров (instance name) — на иллюстрации это inst, inst1, inst2. Иногда при копировании элементов САПР начинает дублировать индексы, что приводит к одинаковым именам экземпляров, и в итоге проект не собирается. Вероятность дублирования повышается, если в проекте много объектов. Двойной левый клик на элементе открывает его меню, где можно изменить instance name.

Для рисования проводников предназначен инструмент Node Tool. Соединительные линии стремятся сохранить соединение со своими элементами, даже когда их перемещают. В результате при перетаскивании соединенных элементов проводники часто накладываются друг на друга, особенно если их много. Это приводит к возникновению паразитных замыканий, отыскать которые очень сложно. Поэтому инструментами соединения типа Node Tool нужно пользоваться с осторожностью. 

Пример схемы с соединением через Node Tool
Пример схемы с соединением через Node Tool

Более безопасный способ соединения элементов — это соединения по именам. Принцип здесь таков: если два или более куска проводника имеют одинаковые имена, они автоматически соединяются. Важно отслеживать, чтобы только один из кусков был подключен к выходу элемента, то есть являлся источником сигнала на проводнике.

Аналогичная схема с соединением по именам
Аналогичная схема с соединением по именам

При таком именованном способе соединений элементы можно перемещать по рабочей области, не опасаясь за паразитные связи. Назначить имя проводнику можно через контекстное меню. Или просто выделить проводник и начать писать имя на клавиатуре.

Одиночные проводники и шины рисуются разными, но похожими линиями. Здесь важно внимание, чтобы не перепутать:

Разрядность проводника можно не указывать, если он подключает два элемента с одинаковой разрядностью и не используется именованное подключение. Во всех остальных случаях разрядность проводника указывают в квадратных скобках при его именовании. Разрядность шины в схемном редакторе задается через две точки.

Немало трудностей у начинающих вызывает создание шин и извлечение из них единичных сигналов:

Извлечение единичных сигналов из шин
Извлечение единичных сигналов из шин

На рисунке показаны проводники sk и pl, а также восьмибитная шина с именем sh и индексами от 7 до 0. Чтобы взять один проводок из шины, его нужно нарисовать и назвать так, как указано — sh[5]. Тогда значение с шестого провода шины с индексом 5 будет передано на этот проводник. Чтобы собрать шину нужной разрядности в нужном порядке, необходимо использовать конкатенацию. На рисунке собрана семибитная шина, два старшие сигнала — это сигналы с проводников sk и pl соответственно, а далее идет часть шины sh.

Иногда нужно перенести часть схемы из одного схемного файла в другой, но комбинации Ctrl-C / Ctrl-V не срабатывают. Непонятно, связано ли это с САПР Quartus или ОС Windows. Чтобы копирование удалось, нужно открыть каждый проект в своей оболочке Quartus так, чтобы были видны обе рабочие области, и просто перетащить нужный объект: захватить мышкой в одной области и отпустить в другой.

Типичные ошибки на этом этапе и их последствия:

  • Дублирование имен элементов — проект не собирается.

  • Перетаскивание элементов при соединении через Node Tool — случайные паразитные замыкания.

  • Невнимательность к схеме — путаница в проводниках и шинах.

Создание кода на SystemVerilog

Поскольку код на VHDL/Verilog — это не текст программы, а текстовое описание схемы, то и выполняться он будет не последовательно, как в программах на C, Python или других языках программирования, а параллельно. Поэтому неважно, в какой строке будет описан конкретный модуль — он в любом случае запустится, когда на его входы поступят входные сигналы. Однако здесь действуют требования компилятора и «правила хорошего тона», что позволяют писать код, понятный сторонним разработчикам и самому себе при возвращении к проекту через продолжительное время. В частности, для этих целей рекомендуется не пренебрегать комментариями.

Как и в других языках, здесь важна правильная иерархия сущностей, именование входных и выходных портов каждого модуля. Новым модулям/входам/выходам часто дают случайные названия: sv_5, sv_6, led_15 и тому подобные. Некоторые модули нужно затем подключать в качестве дочерних к модулям более высокого уровня. Так появляются одинаковые названия. Это не ошибка с точки зрения Verilog, но впоследствии становится очень сложно отследить логику работы каждого модуля в отдельности и общего проекта в целом. Также это приводит к непониманию: когда, допустим, сигнал led_15 подключается к сигналу led_15. Приходится возвращаться и восстанавливать логику, давать уже осмысленные имена модулей/входов/выходов.

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

При оперировании шинными сигналами в Verilog стоит учесть, что в отличие от схемного редактора, здесь для определения диапазона (в квадратных скобках) может быть использован символ двоеточия. При определении диапазон может быть как слева, так и справа — это будет, соответственно, unpacked или packed array. Каждая строка заканчивается точкой с запятой — но есть исключения, поскольку не каждая команда является однострочной.

Диапазоны в SystemVerilog
Диапазоны в SystemVerilog

После написания и компиляции кода важно хотя бы в целом убедиться, как Quartus понял вашу задумку. Для этого можно воспользоваться графическим представлением проекта через инструмент RTL Viewer, который вызывается из контекстного меню при клике на название проекта в Project Navigator.

Проверка схемы через RTL Viewer
Проверка схемы через RTL Viewer

Для модуля, представленного на Verilog выше, RTL Viewer выдает схему, полностью соответствующую записанной логике. Но на всякий случай лучше дополнительно перепроверить схему после синтеза.

Примеры нумерации строк в FPGA
Примеры нумерации строк в FPGA

При возникновении ошибок в коде Quartus при попытке компиляции выдаст сообщение с указанием строки кода в специальном окне сообщений. Важно правильно понимать такие сообщения: не «в данной строке ошибка», а «данная строка не может выполнена из-за ошибки». Компиляция — это последовательный процесс, где чтение файла с кодом ведется построчно. Так что ошибку нужно искать не только в «данной строке», но и в строчках выше. Для удобного поиска лучше включить нумерацию строк, как на рисунке выше. В Quartus это делается через галочку напротив Show line numbers в меню Tools/Options../Text Editor.

Когда возникают ошибки, в строке сообщений об ошибках обычно появляется не одиночное сообщение, а довольно много красных строчек. С ходу это может напугать. Но Quartus показывает не только основные, но и все зависимые ошибки. Возможно, что исходная ошибка только одна, а весь ворох проблем тянется уже вслед за ней. Так что без паники находим первую строчку с ошибкой, исправляем ее и запускаем новую компиляцию. Вполне вероятно, что все остальные ошибки тоже исчезнут, если вы верно исправили единственную исходную.

При определении числовых значений с явным указанием разрядности используется апостроф. На клавиатуре обычно есть сразу два подобных символа — на кнопках «Ё» и «Э». Выглядят они чуть по-разному: один как «`», другой как «’». Есть еще более экзотические варианты — например, английская одиночная кавычка «‘», — но сейчас мы их опустим. Знание различий в доступных типографских знаках поможет найти и исправить досадную ошибку. 

Типичные ошибки на этом этапе и их последствия:

  • Бездумное именование элементов — потеря логики при выходе на новые уровни подключения.

  • Неправильное определение диапазонов — некорректное поведение шинных сигналов.

  • Не проверили итоговый код «в графике» — логика проекта не соответствует задумке.

  • Анализируете лишь строку с ошибкой — проблема с компиляцией так и не решится.

  • Путаете апостроф с другими типографскими знаками — ошибки на компиляции.

Аппаратная реализация

Работая с отладочными платами, легко упустить основы физики. Светодиоды на платах могут быть подключены к соответствующим ножкам ПЛИС двумя способами — анод к ПЛИС и катод на земляной полигон или катод к ПЛИС и анод на полигон питания.

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

Токоограничивающие резисторы
Токоограничивающие резисторы

В варианте подключения А светодиод будет светиться при подаче логической единицы. В варианте Б — при подаче нуля. Чтобы получить именно ожидаемый результат, нужно подключать внимательно. Эти же проблемы возникают и при подключении одиночных семисегментных индикаторов. 

Они состоят из семи светодиодов, расположенных в корпусе определенным образом. Внутреннюю схему семисегментных индикаторов реализуют с общим катодом или анодом. Соответственно, индикатор подключается по логике, описанной выше, либо к земле, либо к питанию.

Несколько сложнее управлять семисегментными индикаторами с более чем одним разрядом в одном корпусе. 

Четырехразрядный семисегментный индикатор
Четырехразрядный семисегментный индикатор

Особенность таких индикаторов — в их матричной структуре. Для физического подключения используется всего 12 контактов.

Схема четырехразрядного индикатора CC56-12SRWA
Схема четырехразрядного индикатора CC56-12SRWA

Здесь необходимо применить принцип динамической индикации. В каждый момент значение отображается только на одном индикаторе. При этом переключение индикаторов происходит достаточно быстро, чтобы глаз не успевал это заметить — то есть как минимум 24 раза в секунду на каждый индикатор.

При четырех индикаторах общая частота переключения колеблется в районе 200 Гц. На отладочных платах обычно устанавливается тактовый генератор с частотой 50 МГц, и напрямую подключать его для переключения разрядов не стоит. При такой частоте физика работы светодиода не позволит что-то увидеть, так что частоту нужно поделить до приемлемых значений. Для этого производители плат могут предоставлять специальный IP-блок — делитель частоты, или PLL. Такие блоки используют для работы специальные ячейки, расположенные на плате.

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

  Кнопка с подтяжкой к напряжению питания
  Кнопка с подтяжкой к напряжению питания

Типичные ошибки на этом этапе и их последствия:

  • Подключение светодиодов без токоограничивающих резисторов — светодиоды перегорят и могут «выжечь» выход микросхемы.

  • Путаница в полярности светодиода — поведение компонента противоположно задуманному.

  • Подключение светодиодов к встроенному высокочастотному генератору — показания физически невозможно отследить.

  • Неверно считанные состояния кнопок — поведение схемы противоположно ожидаемому.

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

Эта статья изначально написана для «Истового инженера» — проекта YADRO, через который мы популяризируем инженерное дело и профессии в области электроники. Оцените и другой материал из нового FPGA-цикла — «ПЛИС для начинающих: что нужно знать FPGA-инженеру».

FPGA — далеко не единственная тема «Истового инженера». Чтобы узнать больше и точно не пропустить новые статьи, подписывайтесь на канал проекта в Telegram. Если ссылка не срабатывает, канал легко найти по запросу «Истовый инженер».

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


  1. Strijar
    02.04.2026 07:51

    Наверное самым первым пунктом (нулевым ;) должнен быть выбор производителя FPGA (коих уже даже больше 3). Ну не Альтерой же единой (;


    1. HardWrMan
      02.04.2026 07:51

      А в свете событий последних нескольких лет вполне себе актуальны GoWin. Их IDE только-только выходит из зачаточного состояния, но скорость сборки сложного проекта - моё почтение.


      1. DmitryZlobec
        02.04.2026 07:51

        Tang Nano 9k так себе плата для обучения. Она медленней плат с CycloneV, Fmax на ней раза в два меньше, на аналогичных дизайнах, всего два PLL, и совершенно странная тактовая частота 27МГц (такое ощущение, что они раньше CB-радиостанции делали, ну или склад с этими радиостанциями разграбили). И Gowin LUT4, а не LUT6 (вроде бы). Но ценник приятный, не поспоришь. А среда у них вполне нормальная, если только собирать ей, все равно код в VS-code пишется ну и альтернатива в виде Yosys есть.

        Но у Quartus плюс в том что он бесплатно качался по прямой ссылке и регистрации не требовал. В отличии от Gowin которые требуют регистрацию (вроде бы).


        1. HardWrMan
          02.04.2026 07:51

          Ну, например, я использую GW1N-UV2QN48C7/I6, получаю:

          Да, это не 1ГГц у моей Arria2GX, но всё равно, работать можно. И при этом действительно дёшево.

          Но ценник приятный, не поспоришь.

          Не только это сейчас решает. Тупо доступность. Кабельки их тоже достаточно доступны. Не за 3 копейки, которые сделаны для Альтер, но всё же заметно дешевле, чем для Xilinx. У меня их два (присмотритесь к распиновке JTAG):

          А среда у них вполне нормальная, если только собирать ей, все равно код в VS-code пишется ну и альтернатива в виде Yosys есть.

          Я начинал давно. И с каждым обновлением результат сборки был кардинально лучше. Вот ещё бы RTL доработали, было бы вообще конфетка. Кактус меня разбаловал, я то помню, как оно развивалось в Q9-Q13-Q15: в 9 каша на 100500 листов, в Q13 каша на одном листе а вот уже в Q15 нормальная схема со свёрстыванием.

          Но у Quartus плюс в том что он бесплатно качался по прямой ссылке и регистрации не требовал. В отличии от Gowin которые требуют регистрацию (вроде бы).

          Кактус только Web не требует реги (спойлер: требует, но она учебная и идёт сразу в комплекте) и сильно зарезан. Я их всегда ломал через кигены. Иначе IP не даёт полноценно юзать да и есть ограничения на устройства и сложность проекта. А вот GoWin требует лицензию всегда, но она полноценная без ограничений и бесплатная. Её один раз заказал, рядом положил с дистром и всё.


          1. DmitryZlobec
            02.04.2026 07:51

            Вот частоты
            Вот частоты

            GW1NR-LV9QN88PC6/I5
            Вот я делал HDMI из https://www.fpga4fun.com/HDMI.html 250Мгц вообще не пахнет, как работает непонятно(стремно работает, если честно).

            PS: Мы же про отладки(платы) говорим , а не про чипы, платы с GOWIN больше выглядят как заготовки под что-то более серьезное(в чем их своя прелесть).


            1. HardWrMan
              02.04.2026 07:51

              PS: Мы же про отладки(платы) говорим , а не про чипы, платы с GOWIN больше выглядят как заготовки под что-то более серьезное(в чем их своя прелесть).

              Там мне нравятся варианты где FPGA на миниплатке, как модуль. И можно как в предлагаемый хост её воткнуть, так и в свой. Всё от того же SiPEED'а:

              GW1NR-LV9QN88PC6/I5

              Грейд то самый стрёмный. У GoWin всё наоборот по сравнению с Altera: больше число - быстрее чип. Причём у одного и того же чипа он разный для разного класса: C6/I5 означает Consumer 6/Industrial 5.

              А ещё чем меня порадовал вышеупомянутый GW1N-UV2QN48C7/I6: у него 48 ног, юзерских понятное дело меньше. Так вот, если ему задать режим конфигурации SSPI (Slave SPI), а в проекте эти ноги использовать для SPI интерфейса, то можно через один и тот же SPI загружать конфиг и потом работать. Потом специальной ногой обнулять, опять прогружать и опять работать. У меня оно в паре с ATmega как раз так и работает.


  1. BloodHunterD
    02.04.2026 07:51

    Я думаю человек перестает быть новичком в FPGA когда понимает что нужно скачать Vivado. Я два года в институте программировал в quartus и использовал их симулятор modulsim altera. Это странный способ стать безумным. Да в vivado нет cyclone или Gawin но можно написать и просимулировать в vivado а потом просто залить этот код через другую программу. Vivado весит около 100гб это не приятно, но это все ещё лучьше чем quartus.


    1. PeeWeee
      02.04.2026 07:51

      (заговорщеским шепотом) Потроллить зажравшихся крудошлёпов укротителей фон-неймановских архитектур несомненно дело богоугодное, но Вы, и автор статьи, не переигрываете ли? /s


  1. yamifa_1234
    02.04.2026 07:51

    Я сталкивался с разными отладками. И они бывают разные... Больше всех мне понравилась kc705, от xilinx. На ней делал достаточно разнообразные проекты, и во всех случаях получалось отладку использовать по назначению, все было удобно.

    Конечно алтрера и говин выигрывают ценой, но vivado хоть и тяжёлая но приятная в использовании.

    P.S. моей ошибкой в отладках было то что я поверил в то что смогу подключить любой модуль к пинам Плис... Но оказалось что видеть эту паутину проводов не хочется. Лучше брать отладку на которой как можно больше различных интерфейсов и модулей.


  1. mozg37
    02.04.2026 07:51

    Тут уже есть комменты с Gowin, но я добавлю. На платах с gw5 и "юсб бластер", и uart встроены прямо в плату. То есть воткнул шнурок к компу и получил и возможность прошивать/отлаживать, и uart прямо к ногам плис. Отладка в gao немного непривычная после квартуса, но стоит начать разбираться - и квартус покажется медленным и устаревшим.

    Также, на мой взгляд, надо вообще убирать схемотехнические квадратики из процесса, только hdl. И связано это с уровнями сложности в реальных проектах - никакими кубиками из and /not/or/ff это не сделать.


    1. PeeWeee
      02.04.2026 07:51

      Да, те картинки из схематика и особенно

      Типичные ошибки на этом этапе и их последствия:

      Дублирование имен элементов — проект не собирается. Перетаскивание элементов при соединении через Node Tool — случайные паразитные замыкания. Невнимательность к схеме — путаница в проводниках и шинах.

      вызвали воспоминания четвертьвековой(!) давности, когда я от этого сбежал в несильно тогда еще распространенный vhdl. Вот именно от этих “уроков рисования” (время, и хуже формализация, хотя бы в плане локализовать изменения в конкретном файле) и глюков (вот как перечислено в цитате, причем в >80% это вина не юзера, а баги среды или ее хреновый UI). Как представил какого этот, прости господи, экспиренс черпать ложкой в наше время - воображение нарисовало сверкающие пятки разбегающихся студентов.

      НО, тогда встает вопрос - как научить осваивающих hdl видеть разложение кода на схемотехнические квадратики. Не обязательно до уровня и-не, или-не, но до уровня основных блоков плис - lut, регистр, сумматор, mux, умножитель, lutram, bram. Те, кто приходил из околопрограммирования (например выпускники 01.03.02 “Прикладная математика и информатика”, у которых был какой-то курс hdl), не имели, или с трудом осваивали, такое видения. А те, кто был из околожелязичников, наоборот, слишком цеплялись за схемотехнические квадратики, и с напрягом осваивали околопрограммисткие абстракции hdl (которых на порядок меньше чем в программистских ЯВУ).

      Да, оптимисты скажут что есть же какие-то HLS, на которых вроде как у кого-то там что-то где-то иногда даже получается. Но таким разговорам уже 30 лет, а в описаниях вакансий HLS встречается на порядок реже чем SystemVerilog. Да и то, только в доп разделах “неплохо бы уметь” - я читаю это как быть готовым все критичное, и все незапустившееся, переписать на том или ином hdl. И мы возвращаемся к “видению схемотехнических квадратиков”. Да, даже в hdl можно (НЕ равно нужно и правильно) в 80% забить когда ошибся в их кол-ве в разы, но в 80% очень чревато когда не “видишь” разбиение уровней комбинационной логики по стадиям вычислительного конвеера.


      1. HardWrMan
        02.04.2026 07:51

        НО, тогда встает вопрос - как научить осваивающих hdl видеть разложение кода на схемотехнические квадратики. Не обязательно до уровня и-не, или-не, но до уровня основных блоков плис - lut, регистр, сумматор, mux, умножитель, lutram, bram. Те, кто приходил из околопрограммирования (например выпускники 01.03.02 “Прикладная математика и информатика”, у которых был какой-то курс hdl), не имели, или с трудом осваивали, такое видения. А те, кто был из околожелязичников, наоборот, слишком цеплялись за схемотехнические квадратики, и с напрягом осваивали околопрограммисткие абстракции hdl (которых на порядок меньше чем в программистских ЯВУ).

        Когда конфигурируешь FPGA ты просто обязан знать базовые логические элементы и их производные. Потому что FPGA не программируют. Его конфигурируют, соединяя имеющиеся элементы доступными интерконнектами. Это как бредборда с уже воткнутыми микросхемами логики разной сложности. Ошибка чисто текстовиков в том, что они зачастую допускают что это обычное программирование с линейным выполнением, а всякие термины "блокирующее" или "не блокирующее" только сбивают с толку. Я тоже начинал со схемного ввода и в полной мере вкусил все его недостатки. Но и достоинства у него тоже есть.

        Я не препод, я железячник-программист. Инженегр цифровых устройств разной сложности. И с моего боевого дивана процесс обучения конфигураторов FPGA должен происходить так. Сначала учить булевой алгебре на базовых логических элементах. Затем надо научить, как из этих элементов складываются функциональные макроблоки. Следующий шаг это практика на схемном вводе. А уже потом выбираем требуемый xHDL и начинаем штудировать конструкции. При этом надо сразу же приучать к RTL, чтобы пишущий контроллировал, насколько точно он смог выразить свою мысль и как точно его при этом понял синтезатор. Именно для этого и нужно сначала выучить схемную логику. Последним шагом будет уже обучение работе с фиттером и, собственно, просмотр и редактирование распределения физических ресурсов FPGA (LE, LAB, LUT, SLICE etc.) для достижения установленных требований к проекту как по ресурсам так и по скорости/частоте.


        1. PeeWeee
          02.04.2026 07:51

          Так-то да, в целом все верно, со всем согласен, НО :)

          То, что Вы описали, логично, правильно и реализуемо для ситуации, когда в вузе осмысленно готовят плисодела, а если точнее (и в чем-то шире) RTL программиста. Но направление очень-очень нишевое. Даже если такие группы сейчас где-то и есть, шансы что их выпускники:

          1. получат актуальные знания

          2. смогут оценить их необходимость лично для себя

          3. попадут на работу туда где эти знания пригодятся

          4. будут получать там достаточную зп, чтобы не сбежать оттуда через пару лет в абсолютно рандомные околопрограммеры или курьеры

          околонулевые.

          Поэтому, по-факту, те, кого жизнь занесла в плисоделы, буду или неустроившееся (особенно сейчас актуально) околопрограммисты или какие-нибудь радиотехники, которым перепало в вузе 1-2 семестра околоплисовых курсов, или они это осваивают (почти)самостоятельно, если попали туда где это востребовано. И в том, и в другом варианте время (и тем более энтузиазм) об этот замшелый схематик из прошлого тысячелетия убивать не просто жалко, а почти преступно.


          1. HardWrMan
            02.04.2026 07:51

            И в том, и в другом варианте время (и тем более энтузиазм) об этот замшелый схематик из прошлого тысячелетия убивать не просто жалко, а почти преступно.

            Схематик можно пропустить же. Я его указал просто как практическое занятие. Не хочешь схематик - покрути logisim, например. Там вообще схема интерактивна и можно прямо пальцем мышкой потыкать сигналы и посмотреть отклики. Суть этого шага в том, чтобы был навык чтения логической схемы и её функции. Когда ты понимаешь, какую схему хочешь собрать, то сразу видно насколько ясно ты выразился в коде и что из сказанного понял синтезатор правильно.

            А вообще, это же ещё надо учить концепции синхронного дизайна и отучать от сложной комбинаторики. И всё это плотно завязано на конкретный чип конкретного семейства ибо ресурс это не только LE/LUT или триггер, это ещё и PIA, о котором забывают даже подготовленные плисоводы.


            1. PeeWeee
              02.04.2026 07:51

              плотно завязано на конкретный чип конкретного семейства ибо ресурс это не только LE/LUT или триггер, это ещё и PIA, о котором забывают даже подготовленные плисоводы

              Ну вот здесь, по-моему, не зря забивают. Учет PIA уже что-то вроде низкоуровневой оптимизации в программировании - только если уверен, что тебе это действительно надо, например, ультрабюджетная плис, или относительно большой, для плис, тираж.


              1. HardWrMan
                02.04.2026 07:51

                Если у тебя вектора 128+ бит и их десяток штук (что вполне норма для всяких математических функций) то знание ресурса интерконнектов уже играет значение, даже на жирных плисинах. Ну а для проектов уровня ZX Spectrum или там Atari / Dendy да, можно полностью забить, ориентируясь лишь на Fmax.


                1. PeeWeee
                  02.04.2026 07:51

                  Ну значит или я еще не дорос, или уже врос и оно само выходит, или у Xilinx хорошие интерконнекты, чтобы о них особо не вспоминать :)