Желание поиграть в проектирование собственного процессора обычно приводит к покупке платы с FPGA. Но мне захотелось сделать шаг дальше и начать не с Verilog-а, а с паяльника.

Это статья о том, как я занялся разработкой электроники, не имея почти никакого опыта в этой сфере. Цель - сделать устройство с FPGA на котором можно загрузить Linux, подключить экран и клавиатуру, а потом прямо там писать и компилировать код.

Зачем это нужно? Это хобби. Практической ценности не имеет. Просто я так развлекаюсь. А сейчас у меня, к моему собственному удивлению, все задуманное получилось, и я хочу показать и похвастаться.

Что было сделано

Проект включает в себя:

  • Собственно, сделать девайсину с FPGA и всей нужной периферией. Нарисовал печатную плату в KiCad, заказал в Китае, паял дома.

  • Разработка SoC. Я использовал несколько готовых IP cores (в том числе процессорное ядро VexiiRiscv), но часть компонентов писал сам на Verilog и SpinalHDL.

  • BIOS. Написано с нуля (за исключением интегрированного бенчмарка Dhrystone). Инициализация, мемтест, реализация RISC-V SBI, командная строка, загрузчик Linux.

  • Драйвера Linux для моей периферии.

  • Реализация TTY. То есть программы, которая получает всякие ^[?25l^[5;10H^[32;1m от ncurses и скармливает контроллеру экрана. Поскольку текстовый режим моего контроллера экрана не соответствует никаким стандартам типа SVGA/XGA, обработку escape codes пришлось тоже делать свою.

Весь код, схематика и gerber файлы доступны на github.

Конечно, можно было сделать проще - вместо первого этапа купить готовую плату с FPGA, вместо второго взять LiteX SoC builder, вместо третьего использовать OpenSBI и U-Boot. Но это было бы слишком быстро и скучно.
А можно было сделать сложнее - не использовать готовых IP блоков, писать свою ОС, свой компилятор, и т.д. Но это уже было бы слишком долго и нудно. В общем, я делал самостоятельно те части, которые мне интересны, и использовал готовое там, где посчитал это уместным.

Предыстория

С FPGA я уже был знаком. Лет десять назад купил плату Марсоход2 и пытался сделать свой процессор. Но это за рамками повествования. Текущая история начинается с того, что полтора года назад я наткнулся на этот самый Марсоход2 в ящике стола и в приступе ностальгии решился попробовать что-нибудь еще в том же духе.

Однако в этот раз было принципиально собрать устройство своими руками. Пусть не травить печатную плату самому (ЛУТ-ом затруднительно сделать что-то сложнее однослойной платы с 0.5мм-1мм дорожками), но хотя бы спаять.

Паять я пробовал еще в школе. Верхом достижений были микроконтроллеры в DIP корпусах, а попытка сделать программатор для AVR (кажется, с одной SOIC микросхемой) тогда провалилась. Пожалуй найденный в ящике с инструментами паяльник на 60 ватт плохо подходил для мелкой работы, но в те времена я почему-то не догадался добыть другой.

Первый заход

Планирование

Сначала нужно было определиться со своими возможностями. FPGA в DIP корпусе, увы, не делают. Решил что паять QFP с шагом 0.5мм еще можно рискнуть, а BGA уже за гранью разумного (год спустя я за эту грань все-таки зашел, но в начале работы это казалось недостижимым). Все серьезные микросхемы делают тем не менее именно в BGA корпусе - это когда контакты не в стороны, а под микросхемой, по всей нижней поверхности, и если что-то припаялось не так, это даже увидеть нельзя.

Отказ от BGA в значительной мере определил выбор компонентов. Самые большие по количеству логических элементов не-BGA FPGA - это 10M50SAE144 и 10M50SCE144 (серия MAX10, когда-то Altera, а теперь Intel) с 50К ячеек. Я взял 10M50SAE144C8G. Купил для начала две штуки - догадывался что одной попыткой дело не ограничится. Та же FPGA используется в плате Марсоход3, я надеялся что изучение выложенной на их сайте схемы поможет мне спроектировать свою без критических ошибок.

Для заявленной цели "сделать компьютер" нужны как минимум оперативная память, постоянная память, интерфейсы для подключения экрана и клавиатуры.

  • Клавиатуру решил подключать через USB. PS/2 проще, но слишком уж древний. Полистал главу про физический интерфейс в спецификации USB 1.1 - вроде достаточно подключить 2 линии данных к любым пинам FPGA и повесить 15К резисторы к GND. Решил что с протоколом разберусь уже потом, когда и если осилю пайку.

  • Экран. У Марсоход3 есть HDMI выход и какой-то пример проекта его использующего. Отлично, у меня же будет такая же FPGA, значит должно работать. Читаю описание этого примера и статью про DVI-D. Вроде понятно. В схеме Марсоход3 зачем-то есть резисторы между FPGA и HDMI разъемом, но это увеличивает количество паяния, так что решаю от них отказаться. Просто подключу 8 пинов от HDMI порта напрямую к FPGA... (естественно на практике оказалось не все так просто, но об этом позже).

  • Постоянная память. На fpga4fun.com нашлась схема подключения SD карты к FPGA. Выглядит очень просто, так что резервируем под это 6 IO пинов и идем дальше.

  • Оперативная память. В Марсоход3 стоит SDRAM на 8 MB, но мне этого явно не хватит, я же Linux хочу запускать. Самая большая нашедшаяся не-BGA память - AS4C64M16D1, 128 MB DDR1 в корпусе TSOP66. Как её правильно подключить чтобы все заработало? Ну и 128 MB тоже мало, хочется больше. Вот тут я надолго погрузился в чтение даташитов. Встретил много незнакомых слов, всякие там SSTL2, reference voltage, termination classes. Что такое импеданс к тому моменту так и не понял. Но в конце концов определился, что подключу четыре микросхемы DDR1 параллельно, на одни и те же линии адреса и данных, и буду выбирать нужную через пин Chip Select. Конечно дорожки очень длинные и кривые получаются, но в крайнем случае можно частоту понизить, если на максимальной не заработает... Что я тогда упустил, так это то, что у DDR1 помимо максимальной есть еще и минимальная допустимая частота.

Дополнительно добавил чуть-чуть светодиодов и кнопок, соорудил нечто для вывода звука из DAC с I2C интерфейсом и микросхемы усилителя, и зачем-то прицепил Ethernet разъем 8P8C (который потом даже не пытался использовать, и без этого проблем хватало).

Еще я слышал, что для стабилизации питания нужно ставить конденсаторы между VCC и GND каждого чипа, так что добавил несколько (спойлер: стоило лучше разобраться в вопросе, моя плата уходила в ребут в том числе при подключении/отключении чего-нибудь к USB).

За три недели освоил KiCad и сваял нечто, напоминающее печатную плату. Заказал в JLCPCB. Был впечатлён, что даже вместе с доставкой это оказалось дешевле, чем пицца из ближайшей пиццерии.

Самый первый прототип, 3д модель в KiCad
Самый первый прототип, 3д модель в KiCad

Я конечно надеялся на успех с первой попытки, но все же чувствовал, что замахнулся слишком на многое в новой для себя области и сейчас соберу все возможные грабли. Чтобы кумулятивный эффект от грабель не привел к безысходному "вообще совсем ничего не работает", предпринял некоторые меры:

  • Программатор (а именно клон MBFTDI из все того же проекта Марсоход) сделал на отдельной плате, основываясь на готовой схеме. Таким образом минимизируется риск ошибки проектирования и можно попрактиковаться в обращении с паяльником на более простом устройстве.

  • Все компоненты закупил как минимум в двойном количестве. А платы по пять штук - это минимальный заказ, по одной не делают.

  • Преобразователи напряжения (импульсный 5V -> 3.3V и линейный 3.3V -> 2.5V) соединены со всей остальной схемой съемными перемычками. Таким образом если зафейлить пайку и закоротить питание где-нибудь под FPGA, то можно хотя бы проверить отдельно схему питания. И есть куда тыкать вольтметром/амперметром для отладки.

  • Обязательные светодиоды для отладочного мигания.

А теперь берем свежекупленный паяльный фен и ...

Все слиплось. Видимо слишком много паяльной пасты намазал. Хорошо, что можно потренироваться на программаторе.

Вторая попытка удачнее. Можно подключить к компьютеру и оно даже определяется как FTDI. Успех!

Теперь слиплись выводы уже у FPGA. В том числе GND и VCC где-то соединились. А FPGA довольно дорогая, у меня их всего две запасено. Ну то есть теперь одна осталась. Убрать лишний припой так и не получилось. На этом экземпляре разве что питание от USB можно проверить.

А питание тоже не работало. Как оказалось надо СС1 и СС2 в коннекторе USB-C притянуть к GND через резисторы 5.1К, только после этого зарядка (блок питания от ноутбука) верит что что-то подключилось и выдает 5V в VBUS.

Ожидание: я три недели проектировал схему, сейчас спаяю и оно все заработает.
Реальность: на второй день попыток я научился получать 5V из коннектора usb-c. Ура!

Потом оказалось, что U7 (DC-DC конвертер в 3.3 вольта) припаян не той стороной.

Верх у U7, это где длинная черта, а не где надпись; надпись KiCad развернул, чтобы удобнее читать было
Верх у U7, это где длинная черта, а не где надпись; надпись KiCad развернул, чтобы удобнее читать было

Следующей самостоятельно подложенной себе граблей оказался линейный преобразователь напряжения AP2114H на 2.5 вольта. Полное название микросхемы которую я туда поставил - AP2114HA-2.5TRG1. Ну, думал я, всегда бывает что в конце названия еще какие-то буквы и цифры, которые мало на что влияют. Так оказалось что здесь "A" после "H" означает "альтернативный pinout". Пришлось делать еще один заказ на микросхемы. А заодно на дополнительные жала к паяльнику и лупу.

Вторая попытка припаять FPGA оказалась удачнее. Как минимум питание не замкнулось на землю. Затем день вдумчивого тыканья в каждый из 144 выводов попеременно мультиметром и паяльником, и микросхема начала отвечать программатору по JTAG. А потом (после обнаружения очередного непропаявшегося вывода) даже удалось помигать светодиодом.

Рассматриваю оторванную дорожку после двух итераций припаивания HDMI разъема
Рассматриваю оторванную дорожку после двух итераций припаивания HDMI разъема

С HDMI не получилось. Сначала я припаивал разъем и в очередной раз посадил каплю припоя в 0.25 мм зазор между двумя контактами. Потом отчаянно тыкал в эту каплю разогретым до 400o паяльником и загнал её куда-то внутрь разъема так и не устранив замыкание. Затем отпаивал разъем феном и оторвал дорожку. В конце концов припаял запасной, заменил дорожку проводком и написал на верилоге заготовку видео контроллера.
И тут Quartus и говорит:

В общем, нельзя было под это дело использовать первые попавшиеся пины. По хорошему тестовую прошивку для FPGA стоило сделать еще до того, как проектировать плату.
Припаял еще один проводок, к другому пину выведенному в качестве GPIO. Не работает. Дисплей жалуется на "No signal" и ничего не показывает.

Ах да, еще внезапно оказалось, что подключенный к JTAG программатор физически закрывает разъем и не дает вставить HDMI кабель. Так что в процессе экспериментов я подключал программатор, записывал очередной вариант прошивки во внутреннюю flash память, отключал программатор, подключал дисплей, подключал питание от USB, и только тогда мог удостовериться, что опять "No signal".
Решил в следующем прототипе сделать дорожки до видео разъема как можно короче, прямее, и подальше от всего высокочастотного.

С оперативной памятью тоже не получилось. По совокупности причин. Дорожки слишком разной длины. Некорректная настройка IO constraints. И контроллер памяти я потом в следующем прототипе еще несколько месяцев отлаживал.

А вот чтение с SD карты получилось (всего пару недель возился). Использовал контроллер ZipCPU/sdspi, пришлось только переделать фронтенд с Xilinx на Altera DDR IO примитивы.

Первый прототип в конце своего жизненного пути
Первый прототип в конце своего жизненного пути

Промежуточные итоги

Получилось

  • Заказ платы. Оказалось легко и удобно.

  • USB-C в качестве разъема питания, преобразование 5V в нужные мне 3.3V и 2.5V.

  • Припаять EQFP-144 - реально! Не без проблем, но получилось.

  • Программатор работает, успешно записывается прошивка в FPGA.

  • Светодиоды мигают, кнопочки нажимаются.

  • Опробовал VexRiscv.

  • Сделал свой контроллер UART. Можно было поискать готовое, но хотелось вспомнить как писать на Verilog.

  • Удалось прочитать данные с SD карты.

Не получилось

  • Подключение дисплея.

  • Оперативная память DDR1.

Звук сходу не заработал, но я не слишком разбирался - хотелось уже приступить ко второму прототипу с учетом полученного опыта. Реализацию USB1.1 тоже оставил на будущее.

Вторая версия

Основные изменения:

  • Оставил только одну микросхему памяти. С одной больше шансов получить положительный результат.

  • Поместил FPGA и память на разные стороны платы, так дорожки получается сделать значительно короче. Это я подсмотрел у WangXuan95. И из его же гитхаба взял контроллер DDR1 (потом правда все равно большую часть пришлось переделать).

  • Интегрировал программатор в основную плату, благо уже проверено что работает. Когда все на одной плате - удобнее.

  • Как оказалось в 10M50SAE144 только один PLL, а этого категорически не хватает. Нужны pixel_clock и bit_clock для видео интерфейса, 48 MHz для USB, два тактовых сигнала со сдвигом 90o для контроллера памяти, и еще тактовый сигнал для процессора, который пока еще неизвестно на какой частоте будет работать. Так что добавил две микросхемы Si5351A - это генератор частоты настраиваемый по I2C.

  • Переделал вывод звука. Теперь я намеревался получить стерео 12 бит с частотой до 44.1 KHz и программно настраиваемой громкостью.

  • Иначе расположил HDMI, заранее убедился что на выбранных пинах поддерживается DDR IO.

  • Кнопка питания! Без нее в первом прототипе было неудобно.

Вид сверху
Вид сверху
Вид снизу
Вид снизу

Опыт пайки у меня к этому моменту уже набрался, так что существенных проблем не возникло.

Вид сверху
Вид сверху
Вид снизу
Вид снизу

Дальше шли месяцы медитаций на зеленые линии в gtkwave, неоднократного перечитывания даташита на микросхему памяти, изучения протокола USB, изучения Scala, попыток понять почему не работает реализация OHCI из репозитория SpinalHDL (потому что в контроллере памяти я некорректно обрабатывал unaligned access), и, на поздних этапах, расстановка отладочных printk в ядре Linux.

В процессе переделал свои модули с шины AXI4 на Tilelink и перешел от VexRiscv к более производительному VexiiRiscv. Три месяца искал причину дедлока при запуске gcc на своей плате, пока не удалось ужать всю систему до одного образа initrd на 40MB, сделать упрощенный testbench без периферии и воспроизвести в verilator (11 часов на каждую симуляцию загрузки предельно урезанного ядра линукса). Оказалось, что таки баг в VexiiRiscv (после получения дампа Dolu1990 уже через полчаса закоммитил однострочный фикс).

Сейчас подробно рассказывать не буду, а то я эту статью никогда не допишу. В общем, в конечном итоге почти все получилось. Одноядерный CPU с частотой 60 MHz компилировал даже простейший Hello World порядка десяти секунд, но это все равно было круто!

Все работало за исключением некоторых аспектов:

  • Во первых, нестабильное питание и перезагрузка при подключении клавиатуры.

  • Во вторых, при максимальном (а для этой платы максимальное - 1280x720) разрешении экрана появляются противные зеленые дефекты. То ли IO порты на частоте 742 MHz уже не могут выдавать достаточной мощности, то ли опять же, из за колебаний питания.

При разрешении экрана 1280x720 возникают дефекты
При разрешении экрана 1280x720 возникают дефекты
  • А самое главное, спустя полгода оно сломалось. Мемтест стал стабильно фейлиться. Подозреваю что память сгорела от недостаточного внимания к конденсаторам на входах питания. Я еще пытался спасти ситуацию - перепаял микросхему памяти на последнюю из запаса, но хотя память и запустилась, после нагрева феном перестало выдаваться изображение на монитор.

Пришло время проектировать новую плату

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

А именно, хотелось более продвинутую FPGA (я выбрал Efinix Ti60F256) и более современную память (IM8G16D3FFBG, DDR3L, 1 гигабайт). 256 контактов у первой и 96 у второй, и там и там с шагом 0.8 мм.

BGA-256 выглядит вот так (изображение другой микросхемы, но это не принципиально):

После мучений с DDR1 свой контроллер памяти изобретать не хотелось совершенно. К счастью на сайте Efinix обнаружился IP блок с многообещающим названием "DDR3 Soft Controller Core". А у них на форуме мне дали ссылку на рекомендации по трассировке печатной платы для DDR3.

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

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

На этот раз плата шестислойная
На этот раз плата шестислойная

Изучил рекомендации по количеству и номиналу конденсаторов на входах питания. Впрочем соблюсти их все равно не смог, столько физически не помещается рядом с питанием, а паять элементы меньше чем 0603 (т.е. 0.06" x 0.03" - 1.6x0.8 мм) не хочется. Уместил сколько получилось.

Конденсаторы на обратной стороне платы под FPGA, 3д модель
Конденсаторы на обратной стороне платы под FPGA, 3д модель

Из прочих нововведений в сравнении с предыдущей платой:

  • Отдельная микросхема TMDS serializer (TFP410), во избежание тех зеленых дефектов.

  • Ограничитель тока для подключаемых USB устройств

  • Возможность переключать напряжение линий данных SD карты с 3.3 на 1.8 вольта. Потенциально это дает возможность повысить скорость передачи данных до 104 MB/s (режим UHS-1 SDR104).

  • Часы и батарейка. Чтобы Linux не обнаруживал себя каждый раз в 1970 году.

  • Модуль ESP32. Хочу использовать его для подключения к WiFi.

  • Из опасения, что стандартных 500mA 5V от USB может не хватить, добавил второй USB-C порт и микросхему, умеющую запрашивать от блока питания большее напряжение. По факту оказалось не нужно, видимо в следующей версии уберу.

Как паять BGA

Как оказалось, заказать в JLCPCB шестислойную печатную плату намного дороже двухслойной. В этот раз получилось больше $100, причем от того 5 экземпляров, 10 или 20, цена почти не зависела. А в прошлый заход 5 экземпляров двухслойной сделали за $2.

Печатные платы и маска; справа снизу - предыдущая плата для сравнения
Печатные платы и маска; справа снизу - предыдущая плата для сравнения

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

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

Чтобы аккуратно нанести паяльную пасту нужен трафарет (заказывается вместе с платой). У меня трафарет по ширине в точности совпадает с размером печатной платы. Это довольно существенно - так его удобнее совместить с платой и закрепить скотчем. Паяльную пасту удобно размазывать пластиковой карточкой.

Для нагрева купил специальную штуковину с регулируемой температурой, подписанную на сайте магазина как "Uyue 946 Constant Temperature Heating Station Screen Removal tool". Прежде чем приступать к делу тренируюсь (а печатных плат у меня много) на нескольких специально для этого купленных более дешевых микросхемах памяти. Нагреваю до 221 градуса, наблюдаю как паяльная паста меняет цвет и собирается в шарики.

Тестовый нагрев
Тестовый нагрев

Рассматриваю образовавшиеся шарики на посадочном месте FPGA. Дефектов не видно, значит можно переходить дальше.

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

Как ни странно всё получилось с первой попытки (попытка занимает три дня: верхняя сторона, нижняя сторона, отдельно припаивание разъемов) и обошлось без существенных проблем. В паре мест (по счастью не под BGA чипами) соседние контакты слиплись, но мне удалось их разделить.

System On Chip

Эта статья в основном про хардварную часть. По теме процессоростроения покажу только картинку с общей компоновкой. Для каждого IP блока указано, откуда он взят. Те, где не указано - у меня на гитхабе.

Результаты

  • Процессорное ядро работает на частоте 220 MHz (против 60 MHz на предыдущей плате). Переход на Ti60 явно того стоил.

  • На бенчмарке Dhrystone получилось 495 DMIPS (2.25 DMIPS / MHz) - больше чем у Pentium, но несколько меньше чем у Pentium II.

  • Подключенный дисплей отлично работает с разрешением 1920x1080, 50 герц.

  • Оперативная память (1 гигабайт) работает, но частоту пришлось опустить с проектной 400 MHz до 333 MHz. У меня есть подозрение, что используемая мной микросхема IM8G16D3FFBG не вполне совместима с захардкоженными в контроллере от Efinix таймингами.

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

  • WiFi еще не пробовал подключать.

  • Обе протестированные SD карты хорошо работают в режиме SDR50. В режиме SDR104 на одной почему-то не записываются данные. Так что использую SDR50.

В дальнейших планах - уместить в оставшиеся 10K логических ячеек отдаленное подобие GPU и пытаться запускать DOOM или может быть даже Quake.

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


  1. KeisN13
    23.05.2025 04:31

    Altera, а теперь Intel

    Сутенер Интел выгнал Альтеру, а потом продал ее другому сутенеру

    11 часов на каждую симуляцию загрузки предельно урезанного ядра линукса

    Добро пожаловать в увлекательный мир разработки процессоров и понимания зачем нужен в нем этап прототипирования на плисах xD

    Блин ну крутой DIY проект, а сколько по итогу ушло суммарно времени на его разработку?


    1. petrmikheev Автор
      23.05.2025 04:31

      Добро пожаловать в увлекательный мир разработки процессоров и понимания зачем нужен в нем этап прототипирования на плисах xD

      Я теперь научился записывать сигналы непосредственно с FPGA :-) У Efinix довольно удобный дебаггер. И больше не нужно оставлять iverilog на ночь.

      а сколько по итогу ушло суммарно времени на его разработку?

      Чуть больше года.


      1. AlexanderS
        23.05.2025 04:31

        Чуть больше года.

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


    1. VT100
      23.05.2025 04:31

      Справедливости ради - Интел не сутенёр, а Альтерин папа. Доча гуляла 20 лет, вернулась и её кому-то пристроили.


  1. apcs660
    23.05.2025 04:31

    Вашу бы энергию да в мирное русло... Завидую.

    Плюсую конечно.

    Давно отстал от темы жизни на Марсе FPGA, моя паяльная станция давно на складе балконе лежит. может следующим шагом карту расширения создать, специализированный вычислитель для пс или частоты FPGA сильно отстали для таких идей? Usb4 шустрый, можно внешнее устройство сделать.


    1. petrmikheev Автор
      23.05.2025 04:31

      может следующим шагом карту расширения создать, специализированный вычислитель для пс или частоты FPGA сильно отстали для таких идей?

      У некоторых серьезных FPGA есть встроенный интерфейс PCIe. Так что теоретически возможно. Но я пожалуй не возьмусь такое дома делать - еще больше выводов у микросхемы, еще больше слоев на плате, на порядок более строгие требования к трассировке.

      Используемая у меня Ti60 не умеет выдавать сигнал с частотой более 1.5 GHz. А для PCIe нужно как минимум 2.5 GHz.


      1. apcs660
        23.05.2025 04:31

        Когда то с Xilinx чуть чуть работал.

        Еще в TI, Analog devices на шару детальки нужные получал , когда жил в Торонто. Знакомый работал в Research in motion - сбивал меня вернуться в стек "железячника". Он тогда создал небольшой бизнес, делал пинцеты измерители параметров смд элементов. Знакомый проф ему помогал оптимизировать код. Сейчас подобного инструмента много на рынке, 20 лет назад дело было.

        Глянул xiling - частоты подросли, но напрямую конечно без обвязки не прицепишь, но FPGA всегда были медленнее, зато можно сделать жирную функцию которая будет быстрее чем программа на компе, особенно в сочетании с CAM, для ускорения работы с несортированными массивами данных.


      1. d1mk0
        23.05.2025 04:31

        Интересно, насколько строгие требования к отклонению частоты? Вопрос актуален в контексте реализации serial интерфейсов (sata, pcie, usb) на fpga без аппаратных трансиверов. Встречал мнение, что sata и на 900 Mbit заработает, но слабо в это верю, а заняться самому проверить руки не доходят. Плата с zynq7010 пылится


  1. VladimirFarshatov
    23.05.2025 04:31

    Крутой проект, плюсую. Сам когда-то рисовал в Кикаде свою Ардуинку на базе Атмел 2560 и 520кб оперативы, с подключением картридера как жесткого диска и выводом всех 70 ног Ардуины наружу с питанием до 5А. Третья итерация также прошла Китай и ту же самую JLCPCB и да, комплект на 10 плат оказался дешевле чем поезда на такси в аэропорт.

    Конденсаторы возле микросхем: очень важный девайс, при недостатке которого всё глючит нещадно. Вопрос решал подпайкой 3 штук друг на дружку и разными емкостями для разведения ESR на разные частоты и его общего снижения. В итого, получалась емкость х2 от даташита с очень широкой полосой пропускания. Мега2560 показала завидную стабильность в работе и .. небольшое снижение потребления, примерно на 2мА.


  1. infund
    23.05.2025 04:31

    Заказал в JLCPCB.

    Поделитесь подробностями, пор фавор. Это опять можно напрямую заказывать/оплачивать или через каких-то посредников?


    1. petrmikheev Автор
      23.05.2025 04:31

      Я просто живу далеко, мне с этими проблемами сталкиваться не пришлось.


    1. fivlabor
      23.05.2025 04:31

      В конце года через посредников на авито заказывал по мелочи. Платил переводом через Сбер, наценка около 20%. Доставка, вроде, СДЭКом была


    1. ponikrf
      23.05.2025 04:31

      Сейчас можно заказывать через nextPCB с оплатой через алик

      Вот инструкция официальная! от nextPCB

      https://www.nextpcb.com/blog/how-to-pay-by-aliexpress?ysclid=m8ush1w789287986442

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


    1. Dovgaluk
      23.05.2025 04:31

      PcbWave принимает карты Мир.


  1. noobaitranslator
    23.05.2025 04:31

    Классная статья! :)


  1. Gudd-Head
    23.05.2025 04:31

    если что-то припаялось не так, это даже увидеть нельзя

    Льзя, на рентгене.

    В общем, нельзя было под это дело использовать первые попавшиеся пины.

    Опять же льзя, надо уметь)


    1. petrmikheev Автор
      23.05.2025 04:31

      Льзя, на рентгене.

      Я догадывался что серьезные электронщики с серьезным оборудованием и не такое могут ;)


      1. roma_turkin
        23.05.2025 04:31

        JLCPCB при пайке BGA чипов после изготовления плат высылают имейлом репорт с рентгеновским снимком каждого из спаянных компонентов. это входит в стоимость сборки


    1. DungeonLords
      23.05.2025 04:31

      Вы правы, вот пример


  1. checkpoint
    23.05.2025 04:31

    Молодец! То, что не всё получилось - не беда. Дорогу осилит идущий.

    На счет USB, хочу предупредить сразу - это не для слабонервных, там процедура инициализации состоит почти из 60-ти транзакций! Я недавно закончил разработку контроллера USB 1.0 (для HID устройств) на SpinalHDL для VexRiscv, сейчас пишу статью на эту тему. Разработка контроллера заняла более полугода регулярных ночных бдений в обнимку с анализаторами. Можете взять мой код и интегрировать в свою СнК. Проект моей СнК KarnixSOC лежит на Github-е.


    1. petrmikheev Автор
      23.05.2025 04:31

      А с USB как раз таки все получилось. Я использую OHCI из репозитория SpinalHDL, реализует USB 1.1 host controller. Мой код инициализации вот тут. Долго не получалось заставить этот код работать, уже от безысходности изучал исходники контроллера, потом оказалось, что TD и ED у меня выровнены в памяти по 4 байта, а надо по 16.


      1. checkpoint
        23.05.2025 04:31

        Я тоже пробовал OHCI из библиотеки SpinalHDL, но мне он не понравился тем, что требует сериализатор и заставить его синтезироваться для ECP5 я не смог, а может быть не сильно хотел. Мне хотелось разобраться в тонкостях работы USB и я написал свой. ;)

        Скажите, какая тактовая частота вычислительного ядра у Вас получилась ?


        1. petrmikheev Автор
          23.05.2025 04:31

          Мне OHCI не очень нравился тем, что там требуется DMA, а это усложняет шину памяти, требует clock domain crossing и использует довольно много логических ячеек. Но у него есть неоспоримое преимущество - работает в линуксе без написания собственного драйвера.

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

          Скажите, какая тактовая частота вычислительного ядра у Вас получилась ?

          220 MHz


          1. checkpoint
            23.05.2025 04:31

            Да, DMA тоже нужен, на нём я и запнулся.

            220 MHz

            Не плохо. На сколько я помню, VexiiRiscv это высокопроизводительное out-of-order ядро. Сколько единиц показывает тест Coremark на вашей системе ? На что способен Linux на такой системе ? Графику (X11) пробовали ?

            У меня на Lattice ECP5 c 24К и 6-й грейд частота Fmax получилась 66МГц, стабильно работает на 60 МГц. Использую как замену китайским микроконтроллерам. :-)


            1. petrmikheev Автор
              23.05.2025 04:31

              Coremark пока не пробовал. Dhrystone выдает 495 DMIPS (см. предпоследнюю картинку в статье).
              gcc, g++, python работают, но довольно медленно. Hello world на С компилируется пару секунд. Думаю можно ядро линукса прямо там собрать, но займет много часов.
              Xorg пока не запускается - я что-то не так с драйвером фреймбуфера сделал, но эта проблема определенно решаемая.

              60 MHz у меня получалось на предыдущей плате с Altera MAX10. Efinix Titanium в разы быстрее :)


              1. checkpoint
                23.05.2025 04:31

                Еще вопрос. Чем выполняли синтез под Efinix Ti60 ? Yosys (OSS CAD) или проприетарными тулами ?

                Почитал спецификацию на эти ПЛИСы и что-то мне срочно захотелось их попробовать, но я приемлю только опенсорные решения. :-)


                1. petrmikheev Автор
                  23.05.2025 04:31

                  Efinity - их официальная среда разработки. Бесплатная, но не open source. Мне понравилась. Нативно работает в линуксе, синтезирует быстрее чем Quartus, легко интегрируется с самодельным программатором на ftdi. Удобный дебаггер.


                  1. checkpoint
                    23.05.2025 04:31

                    У меня на рабочих компах стоит ОС FeeBSD, так что проприетарные среды отваливаются сразу. OSS CAD поддерживает ПЛИСы Efinix, но на сколько глубоко - предстоит выяснить. Какую-то простенькую девборду с Ti60 можете присоветовать ?


                    1. petrmikheev Автор
                      23.05.2025 04:31

                      Какую-то простенькую девборду с Ti60 можете присоветовать ?

                      Не, я не в курсе. Я сразу свою стал делать. У них на сайте есть какие-то девборды, но дорогие очень.


                      1. checkpoint
                        23.05.2025 04:31

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


                      1. petrmikheev Автор
                        23.05.2025 04:31

                        Наверное чуть меньше $100.


                      1. petrmikheev Автор
                        23.05.2025 04:31

                        $39 FPGA + $29 память + $8.44 TFP410 (TMDS transiver) + еще десяток компонентов/разъемов по 1-2 $. Остальное дешевое.


  1. Flammmable
    23.05.2025 04:31

    По идеологии похоже на OneChipBook-12.


    1. petrmikheev Автор
      23.05.2025 04:31

      О, действительно похоже! Я планирую как-нибудь для своего устройства тоже корпус сделать. И еще добавить небольшой e-ink дисплей.


  1. Flexits
    23.05.2025 04:31

    Пару советов, если позволите.

    Фен - это демонтажный инструмент. Да, я знаю, многие радиолюбители почему-то привыкли дуть им куда ни попадя, и иногда это даже оправданно (например, если нужно припаять кучку очень мелких SMD-компонентов, или если других вариантов просто нет - корпуса BGA, QFN etc.). Но лучше сразу приучить себя относиться к нему именно в таком качестве.

    Микросхемы с выводными корпусами - QFP, SOP etc. - замечательно паяются обычным паяльником со скошенным жалом. Здесь дело вкуса, многим нравятся жала типа K (сокр. от knife, ножевой тип, хотя у нас обычно говорят "топор"), мне больше по душе тип С (скошенный цилиндр). Секрет пайки - много флюса и мало припоя, а не наоборот. Выводы не паяют по одному, пайка всего ряда (стороны) производится одним движением – касаемся паяльником первого вывода и проводим вдоль до последнего, не останавливаясь. В таком варианте перегрева микросхемы практически невозможен (при пайке воздухом ровно наоборот, детали перегреты практически всегда). Когда набьёте руку, пайка будет практически неотличима от заводской.

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

    Как уже писал, не жалейте флюса. Зона пайки (вывод, контактная площадка, кончик жала и расплавленный припой) должна находиться внутри капли флюса и быть изолирована им от воздуха. Если флюса много, он будет сильно растекаться, больше придётся мыть. Если мало – будут оставаться "сопли" и непропаи, также пайка не будет блестящей и не будет формироваться гладкая сферическая поверхность на застывшей капле припоя. Флюс должен быть более-менее нормальный, как минимум китайский NC-559-ASM или лучше. Опять же, не надо дедовских рецептов из 50-х с вазелином, глицерином, спиртоканифольными растворами и прочим.

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

    Это - 100% брак. Я заставил бы переделывать, работай вы у меня. Удалённо показывать трудно, конечно. Ради интереса, нанесите достаточно флюса и просто проведите по контактам паяльником.


    1. petrmikheev Автор
      23.05.2025 04:31

      Выводы не паяют по одному, пайка всего ряда (стороны) производится одним движением – касаемся паяльником первого вывода и проводим вдоль до последнего, не останавливаясь.

      Я видел такие видео на ютубе... Вжих и все готово. Тоже так хочу. А у меня вжих и капля припоя засела где-нибудь между вторым и третьим пином. Но я надеюсь что тоже когда-нибудь научусь.


      1. Flexits
        23.05.2025 04:31

        Много припоя, скорее всего. Флюс какой используете? Капля "бежит" за жалом или остаётся, где осталась?


        1. petrmikheev Автор
          23.05.2025 04:31

          Спасибо за советы, буду учиться.

          Флюса пробовал два: NC191 и RF800. Проблема, что их куча всяких разных, сложно понять какой нужен. Капля иногда застревала между двумя пинами и было сложно от нее избавиться.


          1. Flexits
            23.05.2025 04:31

            NC191 и RF800

            Я так пониимаю, вы не из России? В этом случае не могу подсказать по конкретным продуктам, доступным у вас. Вообще вам нужен нейтральный безотмывочный флюс из тех, которые называют tacky flux (такой густой и липкий, и чтоб не сильно растекался при нагреве). Указанными марками не пользовался, но по описаниям выглядят вполне подходяще. Возможно, используете слишком мало флюса. Начните с того, что положите из шприца "колбаску" прям на выводы. Потом уже приловчитесь дозировать.

            Если у вас достаточно флюса, жало паяльника облужено, и тепература подходящая, при движении жалом вдоль выводов вы увидите, как капля движется за ним, попутно смачивая выводы. Если она отрывается и липнет, то здесь или недостаточная температура, или недостаточная теплопередача от жала, или, как уже сказал, флюса нет.

            По капле, используйте оплётку. Рекомендую оригинальный Goot Wick, с ним максимально приятно. Но, в принципе, любая пойдёт. Алгоритм следующий: очистите жало паяльника влажной целлюлозной губкой, нанесите каплю флюса на то место, где нужно удалить припой, приложите оплётку и сверху нагрейте паяльником. У вас мелкие горпуса, при должной сноровке хватает буквально одного прикосновения.

            Конечно, удалённо учить таким вещам дело неблагодарное. Как и в любой работе руками, это нужно делать по месту и в real-time. Ну, чем могу, как говорится. Если покажете состояние вашего жала, может ещё что подскажу.


      1. HardWrMan
        23.05.2025 04:31

        Откройте для себя жало типа [микро]волна. И не жалейте флюса, его потом легче смыть чем затраты на перепайку всего чипа.


    1. VladimirFarshatov
      23.05.2025 04:31

      Чем вам спирто-канифольные флюсы не понравились? Атмегу 2560 паял именно им, и точно также кисточкой наносишь много жидкой канифоли и вжик паяльником со скошенным жалом. Где-то затекло (много припоя)? Не беда, накапал кисточкой канифоли и оплеткой всё лишнее всасывается аж на зависть. Всё кругленькое, аккуратное. Просто, дешево и удобно. Канифоль вымывается тем же спиртом, который дальше идет на приготовление флюса добавлением канифоли. Безотходная технология. )


      1. Flexits
        23.05.2025 04:31

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

        Канифоль плоха по эксплуатационным характеристикам, сильно пачкает плату твёрдым нагаром, котоорый тяжело смывается, а смывать надо, потому что остатки гигроскопичны и проводят ток.

        Atmega2560, говорите? Удачи вымыть остатки канифоли из-по выводов и корпуса, не выдувая по пол-баллона Flux-off под каждую микросхему.


    1. kenomimi
      23.05.2025 04:31

      Если капитально залить флюсом - можно и много припоя. Где слиплось - касание оплеткой и разлиплось :) Флюс использую китайский, жирный индикаторный - он не растекается, отлично потом смывается, и даже если где-то остался - не вызывает коррозию. Стоит копейки в ближайшем магазе инструментов для ремонта телефонов.

      Слипание - некоторая боль только для разъемов, так как возможно затекание припоя внутрь по металлическому корпусу. Но тут решает тонкое жало паяльника и аккуратность.

      А для больших многослойных плат высокого класса точности надо иметь нижний подогрев и ИК-станцию, ибо локальный нагрев феном приводит к тому, что плату "ведет", и местами ломает металлизацию тонких переходных отверстий - ищи потом, в чем проблема.


      1. Flexits
        23.05.2025 04:31

        Если капитально залить флюсом - можно и много припоя.

        Конечно можно, но зачем, пустая трата материала же.

        А так да, всё верно говорите, во всём согласен)


  1. DmitryTRP
    23.05.2025 04:31

    Хорошая работа.

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


  1. Dark_Lord_666
    23.05.2025 04:31

    Хорошая статья, недавно начал разбираться в этой тем, а тут свежий материал вышел на Хабре


  1. Forever73
    23.05.2025 04:31

    спасибо! Очень интересно! Техноквест! Не ожидал, что можно развести такую плату без 3-5 лет опыта разводки. Просто открытие для меня...


    1. hw_store
      23.05.2025 04:31

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


      1. HardWrMan
        23.05.2025 04:31

        Да не, САПРы уже давно развились настолько, что автороутер да контроль вполне могут так сделать, как в статье. Если только юзер действительно разобрался в проге.


        1. petrmikheev Автор
          23.05.2025 04:31

          Да не, САПРы уже давно развились настолько

          Разумеется! В KiCad есть продвинутая фича "отрегулировать длину отдельно взятой дорожки", без неё было бы тяжко.


        1. alcotel
          23.05.2025 04:31

          Контроль правил проектирования - да, это, наверное, самое главное, что есть с электронных САПРах. Кроме синхронизации схемы и платы, наверное.

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


          1. HardWrMan
            23.05.2025 04:31

            Я не говорил, что автороутер лучше ручного труда. Я сказал что он развился настолько что собрать подобный проект на автоматике - реально.


    1. VladimirFarshatov
      23.05.2025 04:31

      Вполне можно. Свою дуньку уже не найду, выкладывал где-то на Хабре тоже. Уже 2 харда сменилось, хз где..


  1. j-b
    23.05.2025 04:31

    Вот бы тут прикрутить выход на LVDS матрицу и интерфейс для какой нибудь клавиатуры от ноута... Цены бы ему не было бы ))) На счет видео карты - а нельзя ли использовать сразу две FPGA? одна на CPU, второе на GPU и третий FPGA - на мост между ними всеми )))

    К стати, GoWIN вроде как нормальные fpga делает...


    1. petrmikheev Автор
      23.05.2025 04:31

      Да, можно сразу две или три FPGA. А можно взять одну большую. Например есть Ti180, как раз в три раза больше чем Ti60. Но производительности нормальных процессоров так все равно не достичь, так что нужно хорошо понимать в чем цель. Чем больше доступно ресурсов, тем больше кода на верилоге придется написать, чтобы их все эффективно использовать.


  1. helmm
    23.05.2025 04:31

    Без слота для подключения pci-e устройств не особенно инновационно.


  1. VladimirFarshatov
    23.05.2025 04:31

    Меня FPGA долго интриговали, всё хотелось понять: можно ли на них развести ЦПУ со своей системой команд? Интерпретатор когда-то делал, ещё в 90-х, а вот сваять сам проц .. увы, так и не сподобился. Идей было несколько:

    1. Короткие коды (1 байт) на вызов подпрограммы или функции 32-64шт. С относительной адресацией от спец. регистра по таблице и вообще табличная адресация переходов;

    2. "обратная" запись команды: префикс-операнд (..), .. КОП. От количества операндов меняется арифметика: 1, 2 и 3-х адресная. Называл это "префиксной командой".

    Интересно, можно ли такое сваять на FPGA с регистровым пулом в 64 8-байтных регистра?


    1. HardWrMan
      23.05.2025 04:31

      ФПГА это просто набор вентилей стандартной логики, которые можно соединять в относительно свободном порядке. Почему относительно - количество линий соединения есть ограниченный ресурс. Как и количество логики, регистров и прочее. Такова плата за универсальность и гибкость. И к сложности вашего процессора это не имеет отношения. Если вам не хватит LE/LUT или регистров вы просто берёте FPGA пожирнее. Если вас не устроит скорость, то вы просто перефразируете ваш код для решения констрейнов, чтобы TimeQuest остался доволен, попутно можно взять FPGA грейдом побыстрее. Ну а джитсу 80 лвл это ещё и футплан ручками распилить. Такое вам будет доступно после десятка лет изучения разных архитектур FPGA.


    1. petrmikheev Автор
      23.05.2025 04:31

      Меня FPGA долго интриговали, всё хотелось понять: можно ли на них развести ЦПУ со своей системой команд?

      Можно. Я, кстати, такое тоже пробовал, давал ссылку где-то ближе к началу статьи. Но после изобретения своей системы команд внезапно оказывается что и компиляторы и весь софт приходится писать/портировать самому. А это еще больший объем работы, чем процессор сделать. Энтузиазм быстро заканчивается.
      С этой точки зрения может быть лучше делать собственную реализацию какой-нибудь существующей архитектуры (тот же RISC-V) и, если захочется, добавить туда кастомное расширение со своими командами.


      1. VladimirFarshatov
        23.05.2025 04:31

        Спасибо. Писать компиляторы и прочее не так сложно как страшно за это браться. В свое время писал свою ОС, но бросил. Линус вышел раньше слегка, да и соглашусь, в одиночку это трудно, а поддержать меня никто не поддержал из коллег того времени. Делал подобие РТОС на свою Ардуинку.. вполне зашло, но да - это тоже не быстро, особенно если учесть что это хобби и время выделяется "постольку-поскольку" и при длительном перерыве существенное время тупо вспоминаешь на чем застрял..

        В целом подход прост: пилим кодогенератор к какому-то упрощенному Керниган-ричи Си и компилируем им себя же под новую архитектуру. Далее по нарастающей. Опен сорс с готовыми исходниками на Си - хорошее подспорье.


        1. HardWrMan
          23.05.2025 04:31

          компилируем им себя же под новую архитектуру

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


        1. VladimirFarshatov
          23.05.2025 04:31

          Дополню. Просто тогда (1986?) мне казалось что табличный процессор с заменяемым блоком подпрограмм (от базового адреса) и префиксной регистровой арифметикой, которая легко объединяет в себе стековую, 1-, 2- и 3-х адресные варианты без разрастания КОП и длины команды, совокупно с тремя уровнями регистров для однотактного переключения контекста в прерываниях, и префиксами условий и повторения .. могло быть интересным решением как по размеру кода, так и по скорости его исполнения.

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


    1. ahdenchik
      23.05.2025 04:31

      Можно конечно

      Но: это уже похоже на RISC-V, прыжок по регистру там есть, опкоды небольшие. И в современных RISC не имеет значения в каких битах команды лежит операнд а в каких оператор - всё равно оно разом берётся из памяти


  1. Dark_Purple
    23.05.2025 04:31

    Моё почтнение упорству автора.


  1. andreyiq
    23.05.2025 04:31

    Расскажите поподробнее или где почитать про сборку linux под такие вещи


    1. petrmikheev Автор
      23.05.2025 04:31

      Пожалуй самый простой вариант - buildroot. Набор скриптов, которые автоматически скачивают и собирают все что выбрано при конфигурации. Но там получается система без компилятора. А еще результат сборки "оптимизируется" по размеру - на заключительном этапе пишет "Finalizing root filesystem..." и удаляет нафиг /usr/include, маны, и все статические библиотеки. Мне пришлось отредактировать скрипт чтобы ничего не удалялось.
      Чтобы в системе был компилятор, нужно собрать toolchain отдельно и указать при конфигурации buildroot путь к нему. Для RISC-V я брал toolchain отсюда. Собирал командой make linux-native (почему-то не документирована) - так помимо кросс-компилятора собирается еще нативный компилятор для RISC-V, который можно потом скопировать в целевую систему.

      При желании можно обойтись и без buildroot. Самый минимум - собрать ядро и busybox, уже достаточно чтобы можно было загрузиться и увидеть консольку.