Наш цикл про ПЛИС Lattice ECP5 растянулся уже на шесть статей. Мы уже научились не только создавать простые проекты для них, но набили руку в разработке сложных систем на базе кроссплатформенной открытой среды LiteX. В целом, я уже набрал материалов, чтобы выдать инструкцию, как подключится к шине Wishbone в роли активного устройства (Master), но перед публикацией хочется провести ряд проверок, чтобы не наболтать не того.

С другой стороны, ещё в первой статье цикла я обещал, как будет формализована методика сборки синтезатора Yosys и разводчика NextPNR под Windows, рассказать, как это сделать, так как на тот момент у меня процесс сборки прошёл в режиме «неделю промучился, как-то сделал, повторить не смогу». Мой коллега систематизировал все те наброски, и теперь я могу поделиться итогами с общественностью. Так что, кто дружит с Linux, сегодня вряд ли узнает что-то интересное, а вот любители Windows – получат сведения, как начать работать с ПЛИС Lattice в этой ОС. Приступаем.

Предыдущие статьи цикла.

Собираем Yosys

Начнём с простого. Со сборки синтезатора Yosys. Его исходники можно взять тут: GitHub - YosysHQ/yosys: Yosys Open SYnthesis Suite

Итак, клонируем репозиторий к себе на диск (да хоть просто скачав архив). Чтобы собрать исходный код, нам понадобится скачать и установить среду Cygwin. Причём при установке можно выбирать компоненты вручную (чем больше, тем лучше, но и ставиться это будет дольше), а можно – воспользоваться подсказкой со страницы проекта. Там говорят, что минимально необходимый набор устанавливается следующей командой:

setup-x86_64.exe -q --packages=bison,flex,gcc-core,gcc-g++,git,libffi-devel,libreadline-devel,make,pkg-config,python3,tcl-devel,boost-build,zlib-devel

Итак, Cygwin мы установили, что дальше? А дальше начинается интересное. Если просто начать процесс сборки – полезет масса ошибок. Чтобы избежать этого, нам придётся немного поправить makefile проекта. Мы сейчас, ни много ни мало, поменяем тип компилятора!

Вот самое начало makefile:

Строчку clang надо закомментировать, а gcc – наоборот раскомментировать.

Теперь находим строку:

CXXSTD ?= c++11

И меняем её на:

CXXSTD ?= gnu++11

Всё. Теперь можно собирать! Открываем консоль Cygwin, идём в каталог проекта и даём три команды:

$make config-gcc
$make
$make install

В результате, у нас появятся вот такие файлы в каталоге C:\cygwin64\usr\local\bin:

Правда, работать это будет, только если система видит сам Cygwin (то есть его надо будет включить в Path), но это не так страшно. Мы это сделаем в практической части. А пока – обратим внимание, что кроме каталога с исполняемым файлами появится и библиотечный каталог C:\cygwin64\usr\local\share\yosys:

С синтезатором покончено. Мы размялись, мы поняли, что всё не так страшно, так что приступаем к сборке трассировщика NextPNR. Правда, там всё будет несколько веселей.

Собираем проект PrjTrellis

Если синтезатор – штука довольно универсальная, то трассировщик – более специфичен. Даже под разные Латтисы надо собирать всё несколько по-разному. Не будем пытаться объять необъятное, соберём только под ECP5. Я до конца не могу сформулировать в научных терминах, но если на пальцах, то проект, который стыкует NextPNR с ECP5 (описывающий блоки, характерные для этого чипа) называется Trellis. Почему так, что там в конкретике – да какая разница? Надо собрать Trellis! И это поможет только для ECP5! Это – точно. Приступаем!

Сам проект расположен тут: GitHub - YosysHQ/prjtrellis: Documenting the Lattice ECP5 bit-stream format.

Его придётся собирать при помощи Visual Studio. И перед тем, как мы этим займёмся, установим такую замечательную утилиту, как vcpkg.

Утилита vcpkg и что мы через неё делаем

Вообще, эта утилита заслуживает отдельной статьи… Но на самом деле, такие статьи уже давно написаны. В своё время я через Гугль их много находил. Поэтому сегодня мы будем просто ею пользоваться.  Если коротко, то это менеджер библиотек. Раньше надо было мучиться, скачивать библиотеки, от которых зависит тот или иной проект… Потом – библиотеки, от которых зависят скачанные библиотеки… Потом… Ну, в общем, итераций могло быть много. Потом надо было в проекте прописать пути к ним… Сейчас же в Студии всё стало так же просто, как при работе в Линуксе. Мы просим у vcpkg библиотеку. Она сама находит все зависимости, сама всё скачивает, сама располагает так, что все новые проекты будут автоматически иметь к ним доступ. Мечта! И эта мечта сбылась.

Утилита живёт тут GitHub - microsoft/vcpkg: C++ Library Manager for Windows, Linux, and MacOS

Важно запомнить, что, когда мы скачиваем библиотеки просто по имени, нам будут тянуть 32-битные версии. Чтобы стянуть 64-битные, к имени обязательно надо добавлять суффикс «:x64-windows».

Итак, если Студия у нас уже стоит (а нет – сначала ставим её), качаем vcpkg, исполняем входящий в комплект файл bootstrap-vcpkg.bat. Потом для подключения к Visual Studio подаём команду

vcpkg integrate install

У кого не стоит Питон – установите и его. Но у меня он встал вместе с Visual Studio.

Теперь ставим пакеты. Вообще, перечень пакетов указан в описании к самому NextPNR, а не к Треллису. Но коллега, который делал формальное описание процесса, велит ставить их сразу. Вот так гласит инструкция из readme.md:

vcpkg install boost-filesystem:x64-windows boost-program-options:x64-windows boost-thread:x64-windows eigen3:x64-windows

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

Создание и сборка проекта в Visual Studio

Вот мы установили эти пакеты, что дальше? Надо открыть каталог проекта в Visual Studio. Можно это сделать через саму среду разработки, но коллега подсказал убойный вариант. Идём в каталог с PrjTrellis средствами Windows и нажимает в нём правую кнопку. Не на каком-то конкретном файле, а просто в окне с папкой. После этого, надо выбрать пункт меню «Открыть в Visual Studio».  Обратите внимание, что мы открываем не просто PrjTrellis, а вложенный в него libtrellis!!!

Студия открылась, проект создался…

Но собирать этот проект рано. Дело в том, что у нас имеется только одна конфигурация – Debug:

А я помню, как отладочная сборка одной моей программы с STL работала две минуты, а Release – несколько секунд. Поэтому нам и тут лучше добавить боевую сборку. Для этого  идём в управление конфигурациями (пункт меню сразу под X64-Debug на предыдущем рисунке), нажимаем на плюсик

И в появившемся окне выбираем x64 Release (обратите внимание, скроллер сдвинут, исходно эту конфигурацию было не видно)

Устраняем пару ошибок

Сохраняем файлы, выбираем вновь появившуюся конфигурацию, собираем проект…Получаем ошибки… В частности:

D:\src\Database.cpp(8): fatal error C1083: Не удается открыть файл включение: boost/property_tree/ptree.hpp: No such file or directory,

D:\lattice\prjtrellis-master\libtrellis\include\DatabasePath.hpp(18): fatal error C1083: Не удается открыть файл включение: boost/dll/runtime_symbol_info.hpp: No such file or directory,

А я говорил, что не все библиотеки были установлены! Ну что ж, хороший повод показать, как это выявляется и устраняется. Для начала спросим у vcpkg, может ли он нам добыть библиотеки с таким именем.

vcpkg search property_tree

В ответ нам сообщают:

boost-property-tree      1.78.0           Boost property_tree module

Ну прекрасно! Говорим:

vcpkg install boost-property-tree:x64-windows

Первая недостача устранена. Теперь вторая. С нею было не так просто. Но через час пыток Гугля, я нашёл вот такое утверждение:

Очень часто фигурирует слово dll. И в имени модуля оно есть, и в названии пространства имён… А нет ли чего-то подобного среди библиотек? Сейчас спросим у vcpkg:

vcpkg search dll

Прекрасно! Что делать – мы уже знаем:

vcpkg install boost-dll:x64-windows

Прогоняем сборку…

Ура! Ошибок нет!

Предпоследний шаг

Кроме исполняемых файлов, нужны базы данных. Можно их сгенерить, но можно и просто скачать. Для наших целей хватит простого скачивания. В инструкции сказано, что это делается так:

git clone --recursive https://github.com/YosysHQ/prjtrellis

Последний штрих

После сборки надо сделать развёртывание проекта. В англоязычной Студии для этого есть пункт меню Build->Install. В русскоязычном варианте это Сборка->Установить. Только давайте чуть-чуть упростим себе жизнь. Укажем каталог установки попроще. Для этого откроем свойства конфигурации и промотаем чуть-чуть вниз, до списка параметров. А сам список – до этого параметра:

Я впишу путь покороче: D:/Lattice/Trellis

Всё. Можно выполнять установку:

Вот они, наши файлы:

Чем короче пути, тем меньше потом в path вписывать…

Собираем NextPNR

Уффф. Нам остался последний шаг. Но чем дальше мы идём, тем больше подготовительных действий нам надо совершить. Студия, vcpkg и все требуемые библиотеки у нас уже стоят. При сборке этого проекта нам дополнительно потребуется прописать одну строчку. Дело в том, что если всё собирать так, как есть – будет много ошибок. Для их устранения в опциях компилятора надо объявить два макроса NOMINMAX  и BOOST_CORE_USE_GENERIC_CMATH. Вся проблема в том, что коллега, который во всём этом разбирался, не нашёл, как их добавить к переменной CMAKE_PREFIX_PATH. Только взять готовую и вписать её с дополнением. Это очень плохая идея. Да, он выяснил текущее значение, но завтра оно может измениться. Если кто знает решение лучше – буду рад разъяснениям в комментариях. А пока – давайте делать так, как не совсем хорошо, но точно работает.

Итак. Скачиваем проект отсюда GitHub - YosysHQ/nextpnr: nextpnr portable FPGA place and route tool , идём в его каталог, открываем его в Студии уже привычным движением, а именно – нажав правую кнопку и выбрав пункт меню «Открыть в Visual Studio».

При открытии будут ошибки. Их надо стойко проигнорировать. Теперь привычным движением руки, как это было на предыдущем шаге, добавляем конфигурацию x64-Release. Но если в прошлый раз мы её добавили и всё, то сейчас мы будем её настраивать. Вот так выглядит окно сразу после добавления:

А мы сейчас добавим строку «Аргументы команды CMake». Начало взято из инструкции в readme.md (туда надо в несколько мест вписать пути к разным участкам Trellis), а концовка – как раз добавляет опции для компилятора. Для моего каталога, куда я установил Trellis и компилятора Microsoft, эта строка будет выглядеть так:

cmake . -DARCH=ecp5 -DTRELLIS_LIBDIR=D:/lattice/Trellis/lib/trellis -DTRELLIS_INSTALL_PREFIX=D:/lattice/Trellis -DCMAKE_PREFIX_PATH=D:/lattice/Trellis -DCMAKE_CXX_FLAGS="/DWIN32 /D_WINDOWS /W3 /GR /EHsc -DNOMINMAX -DBOOST_CORE_USE_GENERIC_CMATH"

Проверяем:

Кому больше нравится CLang, те могут использовать такой вариант строки (отличается, начиная с -DCMAKE_CXX_FLAGS):

cmake . -DARCH=ecp5 -DTRELLIS_LIBDIR=D:/lattice/Trellis/lib/trellis -DTRELLIS_INSTALL_PREFIX=D:/lattice/Trellis -DCMAKE_PREFIX_PATH=D:/lattice/Trellis -DCMAKE_CXX_FLAGS="-m64 -fdiagnostics-absolute-paths  /DWIN32 /D_WINDOWS /W3 /GR /EHsc -DNOMINMAX -DBOOST_CORE_USE_GENERIC_CMATH"

Теперь находим очень полезную ссылку (она чуть ниже на той странице в настройках конфигурации, надо будет проскроллировать) называется «Сохранить и создать кэш CMake для загрузки переменных». Щёлкаем по этой ссылке. Иначе переменные не обновятся.

Не забываем переключиться на конфигурацию X64-Release:

Ну, здрасьте, приехали:

Очередная библиотека, которую забыли внести в требования в readme.md на github. Ну, хорошо-хорошо…

vcpkg install boost-iostreams:x64-windows

Что теперь?

Ура!

Ура! Всё собралось! Как и в случае с Trellis, я прописываю путь установки покороче:

И выполняю Сборка->Установка

Как скучно! Всего один файл! Ну ладно…

Скрытый шаг

А, нет, не скучно. Этот файл – хороший, но его мало. Это я уже при испытаниях выяснил. Надо найти каталог, откуда он скопировался, и оттуда же скопировать все DLL-ки:

Немного перфекционизма

Чтобы не плодить каталоги,  я слил каталоги Trellis и NextPNR вместе. И положил рядом с исполняемыми файлами все получившиеся DLL-ки от Boost из обоих проектов. Получилось так

Дальше – любой любитель Windows разберётся :).

Для Yosys, кроме каталога с EXE-шниками, нужен ещё каталог share.

Получившуюся пару каталогов (Yosys и, как у меня случайно получилось, Trellis) можно перекидывать между машинами. Правда, где запускаем Yosys, там должен жить Cygwin, а NextPNR очень хочет присутствия Питона именно той версии, под которой он был собран. Но это – не очень страшно, это можно обеспечить. А так – всё работает!

Испытания

Ну что. Давайте испытаем всё в бою. Качаем следующий проект:

GitHub - kholia/Colorlight-5A-75B: Notes for Colorlight-5A-75B.

Идём в каталог, где есть makefile:

Надо бы запустить make, но у нас не прописаны пути. Можно их все прописать в системе… И желающие пусть так и сделают… Но я профессиональный программист. У меня такой зоопарк из средств разработки на машине – мама не горюй! Если все они будут прописаны в Path, начнётся драка… Если точнее, то уже были прецеденты. Поэтому я сейчас создам пакетный файл, в первую строку которого помещу команду setlocal. Благодаря ей все изменения в системе, сделанные за время выполнения пакетного файла, будут забыты при окончании работы с ним. Вот так будет выглядеть мой файл build.bat:

setlocal
PATH=C:\cygwin64\bin;%PATH%
PATH=D:\LATICE\Yosys;%PATH%
PATH=D:\LATICE\Trellis\bin;%PATH%
PATH=<тут длинный путь к Питону Студии>;%PATH%
PATH=D:\LATICE\OpenOCD-20210729-0.11.0\bin;%PATH%
set PYTHONHOME=<тут длинный путь к Питону Студии>
make %1

Я писал ещё в первой статье цикла, что в makefile у автора есть опечатка. На старом Yosys это не вызывало проблем, сейчас я попробовал – уже вызывает. Надо поправить одну строку. Было:

yosys -p "synth_ecp5 -json $@" $(OBJS)

Стало:

Прогоняем пакетный файл, получаем:

Всё! Задача сборки проекта под Windows решена.

Заключение

Мы получили синтезатор Yosys, а также трассировщик NextPNR, работающие с ПЛИС семейства ECP5 фирмы Lattice. Собранные инструменты предназначены для запуска в ОС Windows. А как залить готовый проект в ПЛИС, описано в самой первой статье цикла. Вообще, Остап Бендер знал 400 способов сравнительно честного отъёма денег у населения и полтораста рецептов самогона. Я уже знаю четыре способа залить проект в ПЛИС Lattice. И каждый из них имеет свои достоинства и недостатки. Но об этом, если надо, можно написать отдельную статью. А пока – пользуемся базовым методом, через FT232H и OpenOCD.

В целом, не зря я собрал новую версию инструментов. Одни и те же Верилоговские исходники, собранные сентябрьским комплектом среды разработки и свежим, дают разные значения Fmax. У прогнанных через свежий комплект, этот параметр лучше. На какую величину – вопрос сложный. Зависит от проекта. И всё равно сильно плавает от минимальных правок. Но, при одних и тех же условиях, новая версия компилятора всегда даёт этот параметр чуть выше. И это верно  для всех имеющихся у меня проектов.

Ну вот, дух я перевёл, теперь можно вернуться к Lattice и подключить активное устройство к шине Wishbone.

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


  1. nckma
    08.02.2022 16:17

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


    1. EasyLy Автор
      08.02.2022 16:40
      +1

      Понимаете. Сначала я работал в RT-11. Потом - в MS DOS и оболочке Dos Navigator. Дальше были Win3.1, Win95, NT4.0 и далее по нарастающей. Я уже привык к файловой иерархии такого вида. Мне не комфортно в Линуксе. Я там нервничаю. А как можно писать нормальный код, когда нервничаешь? Тем более, нервничаешь от того, чего можно избежать?

      При работе в Windows через FAR, я чувствую себя комфортно и думаю только о коде. Я стар. Переучиваться бесполезно. MC меня выбешивает своими особенностями, если что. Дерево файлов - тоже выбешивает. Это не лечится. Это надо принять.

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


      1. nckma
        08.02.2022 16:54
        +1

        Дело ваше.

        Мое мнение: Linux это именно среда для разработчиков. В том числе и для разработчиков ПЛИС.

        В Linux сразу из коробки и Icarus Verilog и Verilator - не знаю есть ли способ вести симуляцию проектов быстрее, чем с Verilator.

        Если в ПЛИС проекте будет нужен софт-процессор - к нему какой компилятор? Ну линусковый gcc же!

        И т. д.

        А не пробовали в Linux файловый менеджер mc? Отличная штука.

        Ну и кстати и FAR есть под линукс.


      1. longtolik
        09.02.2022 12:54

        Здорово! Я тоже работал в RT-11 (ФОДОС, так сказать), c MS-DOS и её INT 21h и BIOS INT 10h. Тоже постоянно с FAR. И с Linux некомфортно.

        Когда дошёл до тренировки моделей ML, то столкнулся с тем, что под Windows и macOS они тренируются нормально, но не работают. А если работать в подсистеме Linux для Windows, то всё работает. Кстати, при этом работал в FARе, то есть, в своем комфортном окружении. (Есть еще вариант - использовать драйверы от Parallels). Позже где-то читал, что Python может давать разные результаты в зависимости от OS, вроде там разные форматы чисел с плавающей запятой...

        Хотел сказать про EmBitz IDE, я ее настраивал и для ARM, и для RISC-V, возможно, ее можно настроить и для ПЛИС. Работать очень комфортно и быстро. Сам настроить не смогу, так как мой опыт ограничился миганием светодиода на Arduino Vidor 4000, в которой стоит Intel (Altera) Cyclon 10.


  1. d1024
    08.02.2022 16:49
    +1

    Есть ли необходимость возиться со сборкой Yosys, если собранное под виндовс уже есть в OSS CAD Suite?


    1. EasyLy Автор
      08.02.2022 16:52

      Посмотрел, что это такое. Наконец-то версия под Windows свежая. Всё, что я раньше находил, было древним, либо содержало только сборки под Linux. Возможно, тогда Вы и правы. Надо будет изучить.


      1. d1024
        08.02.2022 17:11

        И все равно хорошо, что Вы разобрались. Может пригодиться. Я слежу за статьями по Litex тематике. И жду обещанного про HDMI.


        1. EasyLy Автор
          09.02.2022 00:22

          К HDMI я пока не знаю, с какой стороны лучше зайти. Поэтому давайте покажу текущие мысли. Может мы даже чего-то вместе придумаем, куда лучше двигаться.

          С одной стороны, было бы здорово рассказать, как выводить свою картинку через HDMI, но это будет пересказ ряда уже существующих статей. Неплохая статья уже есть на сайте Марсоход. Реализация HDMI в ПЛИС (marsohod.org) . В ней некоторые вещи не очень раскрыты, так как автор считает их само собой разумеющимися. Их бы раскрыть, и... Опять же, эта статья ссылается на fpga4fun.com - HDMI

          Раскрыть опущенные подробности - всегда полезно. А вдохновение по коду для Латтисов можно черпать из вот этого кода, который я собрал и убедился, что он работает: wuxx/Colorlight-FPGA-Projects: current focus on Colorlight i5 series module (github.com) Там - /src/i5/hdmi_test_pattern/.

          Чего оттуда не ясно, можно подглядеть в проекте, который пилил мой начальник atari800-u16/rtl/reverse-u16/hdmi at master · fintros/atari800-u16 · GitHub - там есть скандаблер (это он мне такое неприличное слово сказал) и упаковка звука. А если взять более ранний коммит, то можно найти и стандарт.

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

          Так вот. Самое логичное, что видно при движении в эту сторону - стандартные Litexовские контроллеры алфавитно-цифрового и графического дисплеев. Но там я пока буксую на том, что их надо подключать к Native шине SDRAM, а у неё производительность пока что выходит такая, что страшно её показывать. Документации никакой. Вот, сижу, потихоньку тыкаюсь, чтобы получить все сведения по возможным режимам работы, по настройкам частот, по настройкам режимов и прочему. Чтобы было всё обосновано хотя бы, а не "попробовал, кажется работает". Короче, пока тоже нечего описывать. Что уже могу собрать, то другим советовать стыдно. А остальное - тыкаюсь потихоньку, чтобы освоить.

          Заказчик Латтисовского проекта сказал часы на это не расходовать, делать всё без базовой системы. Так что теперь разбираюсь в свободное время. Набегами. Было бы полезно с кем-то пообщаться, чтобы в диалоге во всём разобраться. А может где есть документация, на которую я до сих пор не смог выйти, как не мог выйти на OSS CAD Suite.


          1. Flammmable
            09.02.2022 13:19
            +1

            Надеюсь, мой комментарий не окажется лишним в этой ветке :)

            Некоторое время назад я, прочитав упомянутую статью на Марсоходе, решил повторить (и превзойти) данный проект HDMI. Однако в ряде источников упоминалось, что линии LVDS слишком слабы по току для полноценного TMDS, используемого в HDMI/DVI-D.

            Тогда я решил поискать трансляторы LVDS->TMDS. В результате я нашел IT6263, на который нет документации и который не продаётся на Маузере. А также SN65CML100 и ADCMP606, которые вроде бы и да, но их цена приблизительно равна трансиверу TFP410 (parallel24bit-to-HDMI), который используется во многих демоплатах с ПЛИС-ом и HDMI-ем.

            Я задал соответствующий вопрос на electronics.stackexchange и мне ответили, что, FullHD/60fps потребляет 1390МБ/с на линию, тогда трансиверы MAX10 (как у марсохода) рассчитаны на 720МБ/с, так что получить FullHD/60fps на MAX10 возможно только при помощи чего-то похожего на TFP410 (который как раз может FullHD/60fps).