
Желание поиграть в проектирование собственного процессора обычно приводит к покупке платы с 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. Был впечатлён, что даже вместе с доставкой это оказалось дешевле, чем пицца из ближайшей пиццерии.

Я конечно надеялся на успех с первой попытки, но все же чувствовал, что замахнулся слишком на многое в новой для себя области и сейчас соберу все возможные грабли. Чтобы кумулятивный эффект от грабель не привел к безысходному "вообще совсем ничего не работает", предпринял некоторые меры:
Программатор (а именно клон 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 вольта) припаян не той стороной.

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

С 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 уже не могут выдавать достаточной мощности, то ли опять же, из за колебаний питания.

А самое главное, спустя полгода оно сломалось. Мемтест стал стабильно фейлиться. Подозреваю что память сгорела от недостаточного внимания к конденсаторам на входах питания. Я еще пытался спасти ситуацию - перепаял микросхему памяти на последнюю из запаса, но хотя память и запустилась, после нагрева феном перестало выдаваться изображение на монитор.
Пришло время проектировать новую плату
Решил не повторять предыдущее, а двигаться дальше. Но чтобы сделать более производительное устройство было уже не обойтись без 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 мм) не хочется. Уместил сколько получилось.

Из прочих нововведений в сравнении с предыдущей платой:
Отдельная микросхема 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.


Комментарии (21)
apcs660
23.05.2025 04:31Вашу бы энергию да в мирное русло... Завидую.
Плюсую конечно.
Давно отстал от темы
жизни на МарсеFPGA, моя паяльная станция давно наскладебалконе лежит. может следующим шагом карту расширения создать, специализированный вычислитель для пс или частоты FPGA сильно отстали для таких идей? Usb4 шустрый, можно внешнее устройство сделать.petrmikheev Автор
23.05.2025 04:31может следующим шагом карту расширения создать, специализированный вычислитель для пс или частоты FPGA сильно отстали для таких идей?
У некоторых серьезных FPGA есть встроенный интерфейс PCIe. Так что теоретически возможно. Но я пожалуй не возьмусь такое дома делать - еще больше выводов у микросхемы, еще больше слоев на плате, на порядок более строгие требования к трассировке.
Используемая у меня Ti60 не умеет выдавать сигнал с частотой более 1.5 GHz. А для PCIe нужно как минимум 2.5 GHz.
apcs660
23.05.2025 04:31Когда то с Xilinx чуть чуть работал.
Еще в TI, Analog devices на шару детальки нужные получал , когда жил в Торонто. Знакомый работал в Research in motion - сбивал меня вернуться в стек "железячника". Он тогда создал небольшой бизнес, делал пинцеты измерители параметров смд элементов. Знакомый проф ему помогал оптимизировать код. Сейчас подобного инструмента много на рынке, 20 лет назад дело было.
Глянул xiling - частоты подросли, но напрямую конечно без обвязки не прицепишь, но FPGA всегда были медленнее, зато можно сделать жирную функцию которая будет быстрее чем программа на компе, особенно в сочетании с CAM, для ускорения работы с несортированными массивами данных.
VladimirFarshatov
23.05.2025 04:31Крутой проект, плюсую. Сам когда-то рисовал в Кикаде свою Ардуинку на базе Атмел 2560 и 520кб оперативы, с подключением картридера как жесткого диска и выводом всех 70 ног Ардуины наружу с питанием до 5А. Третья итерация также прошла Китай и ту же самую JLCPCB и да, комплект на 10 плат оказался дешевле чем поезда на такси в аэропорт.
Конденсаторы возле микросхем: очень важный девайс, при недостатке которого всё глючит нещадно. Вопрос решал подпайкой 3 штук друг на дружку и разными емкостями для разведения ESR на разные частоты и его общего снижения. В итого, получалась емкость х2 от даташита с очень широкой полосой пропускания. Мега2560 показала завидную стабильность в работе и .. небольшое снижение потребления, примерно на 2мА.
infund
23.05.2025 04:31Заказал в JLCPCB.
Поделитесь подробностями, пор фавор. Это опять можно напрямую заказывать/оплачивать или через каких-то посредников?
petrmikheev Автор
23.05.2025 04:31Я просто живу далеко, мне с этими проблемами сталкиваться не пришлось.
fivlabor
23.05.2025 04:31В конце года через посредников на авито заказывал по мелочи. Платил переводом через Сбер, наценка около 20%. Доставка, вроде, СДЭКом была
ponikrf
23.05.2025 04:31Сейчас можно заказывать через nextPCB с оплатой через алик
Вот инструкция официальная! от nextPCB
https://www.nextpcb.com/blog/how-to-pay-by-aliexpress?ysclid=m8ush1w789287986442
Все по чесноку, работает все четко. Думал что будет сложнее все и из-за этого долго не занимался разработкой электроники. Но когда нашел этот вариант - вполне себе вдохновился.
Gudd-Head
23.05.2025 04:31если что-то припаялось не так, это даже увидеть нельзя
Льзя, на рентгене.
В общем, нельзя было под это дело использовать первые попавшиеся пины.
Опять же льзя, надо уметь)
petrmikheev Автор
23.05.2025 04:31Льзя, на рентгене.
Я догадывался что серьезные электронщики с серьезным оборудованием и не такое могут ;)
roma_turkin
23.05.2025 04:31JLCPCB при пайке BGA чипов после изготовления плат высылают имейлом репорт с рентгеновским снимком каждого из спаянных компонентов. это входит в стоимость сборки
checkpoint
23.05.2025 04:31Молодец! То, что не всё получилось - не беда. Дорогу осилит идущий.
На счет USB, хочу предупредить сразу - это не для слабонервных, там процедура инициализации состоит почти из 60-ти транзакций! Я недавно закончил разработку контроллера USB 1.0 (для HID устройств) на SpinalHDL для VexRiscv, сейчас пишу статью на эту тему. Разработка контроллера заняла более полугода регулярных ночных бдений в обнимку с анализаторами. Можете взять мой код и интегрировать в свою СнК. Проект моей СнК KarnixSOC лежит на Github-е.
petrmikheev Автор
23.05.2025 04:31А с USB как раз таки все получилось. Я использую OHCI из репозитория SpinalHDL, реализует USB 1.1 host controller. Мой код инициализации вот тут. Долго не получалось заставить этот код работать, уже от безысходности изучал исходники контроллера, потом оказалось, что
TD
иED
у меня выровнены в памяти по 4 байта, а надо по 16.checkpoint
23.05.2025 04:31Я тоже пробовал OHCI из библиотеки SpinalHDL, но мне он не понравился тем, что требует сериализатор и заставить его синтезироваться для ECP5 я не смог, а может быть не сильно хотел. Мне хотелось разобраться в тонкостях работы USB и я написал свой. ;)
Скажите, какая тактовая частота вычислительного ядра у Вас получилась ?
petrmikheev Автор
23.05.2025 04:31Мне OHCI не очень нравился тем, что там требуется DMA, а это усложняет шину памяти, требует clock domain crossing и использует довольно много логических ячеек. Но у него есть неоспоримое преимущество - работает в линуксе без написания собственного драйвера.
Кстати собственный USB контроллер я тоже пытался делать, давно, когда только познакомился с верилогом. Код здесь, но сейчас даже я сам в нем уже не разберусь.
Скажите, какая тактовая частота вычислительного ядра у Вас получилась ?
220 MHz
Flammmable
23.05.2025 04:31По идеологии похоже на OneChipBook-12.
petrmikheev Автор
23.05.2025 04:31О, действительно похоже! Я планирую как-нибудь для своего устройства тоже корпус сделать. И еще добавить небольшой e-ink дисплей.
KeisN13
Сутенер Интел выгнал Альтеру, а потом продал ее другому сутенеру
Добро пожаловать в увлекательный мир разработки процессоров и понимания зачем нужен в нем этап прототипирования на плисах xD
Блин ну крутой DIY проект, а сколько по итогу ушло суммарно времени на его разработку?
petrmikheev Автор
Я теперь научился записывать сигналы непосредственно с FPGA :-) У Efinix довольно удобный дебаггер. И больше не нужно оставлять iverilog на ночь.
Чуть больше года.
VT100
Справедливости ради - Интел не сутенёр, а Альтерин папа. Доча гуляла 20 лет, вернулась и её кому-то пристроили.