Разработка модуля на NXP iMX8. Особенности переноса трассировки
Приветствую, Хабр!
Некоторое время назад, компания NXP представила линейку процессоров iMX8. Было бы странно упустить возможность и не разработать новый модуль. Кому интересны нюансы, прошу под кат (много легковесных картинок).
Введение (можно пропустить)
Мы давно уже «подсели» на продукцию NXP, в части процессоров, и всегда следим за новинками компании. При выходе нового продукта мы покупаем референс и через дистрибьютеров получаем семплы, чтобы программисты сразу начали освоение чипа, а аппаратчики, по завершении первой итерации, быстро получили макет изделия. Немаловажную роль во всем этом играет техническая поддержка, которая предоставляет SDK и HDK и отвечает на вопросы программистов и аппаратчиков. Пока первые запускают софт и начинают его адаптацию под наши задачи, вторые готовят вторую итерацию платы с исправленными ошибками, если таковые имеются (например, процессорный модуль на чипе iMX7, разработанный под заказчика был сдан с первой итерации, и вторая была чисто косметическая, модуль на iMX6UL/ULL, сначала разработанный под наши проекты, а позже ставший отдельным продуктом, тоже практически не изменился после первого выпуска). При разработке железа мы частично сохраняем схемотехнику референса (при условии, что это не вредит качеству продукта), чтобы стыковка программной и аппаратной частей прошла быстро и безболезненно. Каждая новая итерация ведет к новым тестам, которые не только приходится проходить заново, но и дополнять, с учетом всех изменений. Каждая новая выгрузка герберов из проекта требует проверки (изготовления образцов и их тестирование) перед запуском серии. Обычно разрабатываемый модуль является универсальным решением и используется в различных наших проектах. Также, некоторые заказчики просят кастомизации модуля, например, в части крепежных отверстий, типов разъемов, конфигурации или всего сразу, чтобы использовать в своих дальнейших разработках как готовое изделие.
Это путь, который мы обычно проходим от выхода процессора до появления нового нашего продукта. Иногда он бывает простым и быстрым, но бывает так, что приходится в сжатые сроки делать серьезные доработки, которые всплывают во время тестирования.
С чего начать?
Не буду углубляться в подготовительную работу, которая предшествует началу проекта — это согласование ТЗ, составление план-графика работ, утверждение сметы и т.д. Я расскажу о нескольких первых шагах, которые помогут значительно сократить сроки разработки проектов, на примере iMX8 в Altium Designer. Это не будет что-то сверхъестественное и заумное, думаю так делают многие, но может быть не все.
Самым пугающим, пожалуй, когда я смотрю документацию на процессор или уже готовую схему, является перспектива трассировки оперативной памяти. Рано или поздно всем проходится с этим сталкиваться, но, как говорится, лучше позже, если такая возможность есть. Хорошо, если Вам достаточно использовать одну микросхему в устройстве, тогда бывает проще сделать трассировку самому. Ниже приведен пример трассировки DDR3L для Xilinx (плата на 4-х слоях). Разработана с нуля, нареканий нет.
Рис. 1. Трассировка оперативной памяти DDR3L для Xilinx XC7A35T-1FTG256
А вот когда необходимо 4 планки, да еще и на разных сторонах платы, для уменьшения размеров. Ниже приведен пример модуля на iMX6Q.
Рис. 2. Трассировка 4 микросхем оперативной памяти DDR3 для NXP iMX6Q (2 на top, 2 на bottom — одна под другой)
Это тоже не непосильная задача, но я не вижу в ней смысла (повторюсь, так происходит, к сожалению, не всегда), если можно ее упростить, сохранив качество отлаженного и протестированного продукта (в нашем случае — это референс, который есть можно «пощупать»). На первой итерации главное, чтобы завелся чип и работало как можно больше интерфейсов. Значит у нас, как минимум, работает память, поданы все необходимые питания и правильно выбран стек платы. Дальнейшая работа будет вестись в направлении улучшения параметров платы в части работоспособности периферии. Итак, первоочередной задачей для нас является память (оперативная и энергонезависимая) и питание.
Не для кого не секрет, что на процессор, который выпускается серийно и имеет поддержку от производителя, как правило, можно найти полный комплект документации (исключения составляют продукты под NDA, новинки без поддержки и т.д.). Меня, на первом этапе будет интересовать лишь несколько документов — это даташит, схема и трассировка платы референса. Дальше все зависит от того, в каком виде будет передана данная документация и в каком САПРе Вы работаете. Я работаю только в Altium Designer и поэтому не могу использовать схемы и pcb от производителей, так как они обычно бывают в иных форматах. Еще одной проблемой конвертирования проектов из сторонних программ — это несоответствие полей базы компонентов, а как следствие, невозможность выгрузки перечня элементов. И, что совсем печально — это отсутствие связей между компонентами (не всегда, но чаще всего).
В этой статье я хачу рассказать о том, как можно частично перенести проект в Altium имея конвертированную схему и pcb.
Встроенный пакет Altium Designer, который называется Import Wizard, позволяет выполнять импортирование файлов из других САПР. Лично у меня это сопровождается постоянными танцами с бубном, так как помимо Altium, должен быть установлен, например, Allegro, но об этом я не буду. Этому посвящены отдельные ролики и статьи в интернете. Конвертация, обычно, но не всегда, не позволяет получить рабочий проект, чего мне и не требуется. Для нашей работы нам нужны файл pcb и желательно схематик. Для примера я буду использовать проект референса на iMX8 — «MCIMX8M-EVK-DESIGNFILES».
Рис. 3. Плата референса MCIMX8M-EVK-DESIGNFILES
Так как я планирую разработать модуль, то большинство интерфейсов мне не понадобятся — они будут реализованы на материнской плате. Даже по картинке видно, что придется сильно ужаться при расстановке компонентов и из pcb я смогу взять только трассировку LPDDR4 (MT53B768M32D4NQ-062) и PMIC (контроллер питания для процессора MC34PF4210A1ES). eMMC и SD карта стоят далеко от чипа, их нужно будет трассировать заново, но это не проблема.
Библиотека компонентов
Для своей библиотеки из проекта MCIMX8M-EVK-DESIGNFILES я взял всего несколько компонентов, в их числе процессор, память и PMIC.
Давайте рассмотрим компонент iMX8. Ниже приведен скриншот библиотеки. MIMX8MQ7DVAJZXA имеет 14 частей, объединенных в один компонент. Это разделение позволяет в дальнейшем распределить интерфейсы по разным листам (части схемы, которые объединены в один проект). Например, «PART A» — это все, что касается USB, «PART D» — MIPI DSI, «PART G» — все SAI и т.д. Забегая вперед, скажу, что мой проект имеет всего 12 листов схем, соответственно, некоторые из элементов я объединил для удобства чтения.
Рис. 4. Схематик MIMX8MQ7DVAJZXA
Имея такой компонент после импорта, я избежал его создания с нуля, тем самым значительно уменьшил вероятность ошибок в схеме. Теперь о том, что придется поправить в параметрах компонента.
Рис. 5. Схематик MIMX8MQ7DVAJZXA
Для разных компонентов количество параметров может быть разным, но некоторые поля должны совпадать для того, чтобы потом можно было выгружать перечень компонентов для заказа и сборки. Поля, приведенные слева импортировались из референса. Справа — которые необходимы мне для дальнейшей работы. У резисторов, например, параметров больше, у конденсаторов еще больше и т.д. В моем примере минимально необходимый набор параметров с нужными мне заголовками.
Таким же образом я сконвертировал и подправил оперативку и контроллер питания. Дальше я создаю новый проект (примерно зная какое количество листов у меня будет), переношу туда части схем с обвязкой и заменяю импортированные компоненты своими. В итоге получаются куски схем, очень похожие на оригинал. В этой статье я не буду рассказывать про структуру проекта, связи между листами и т.д., так что идем дальше.
Самая простая часть работы проделана. Теперь можно приступить ко второму этапу — это перенос библиотечного pcb компонента.
Тут почти тоже самое, что было ранее, но вместо параметров — слои. В своих компонентах я использую фиксированный набор слоев. Помимо стандартных «top», «top overlay», «top past» и т.д., например, в «mechanical 1» я рисую контур компонента, его 3D модель и помещаю ».Designator» — это сделано для того, чтобы потом было проще выгрузить сборочный чертеж (и др.). Все лишние поля, которые я не использую — удаляю. Таким образом у меня их осталось около 15, вместо 24, как это было после импорта. Часто для BGA и QFN необходимо менять вскрытие маски контактных площадок, делать другие корректировки под возможности производства и т.д.
Рис. 6. pcb MIMX8MQ7DVAJZXA
Теперь, в свойствах схематика, необходимо связать компонент с pcb. Чтобы лучше понимать все написанное выше можно посмотреть обучающие видео по созданию библиотеки для Altium.
На первых дух подготовительных этапам мне удалось создать библиотечные компоненты, которые теперь можно будет использовать в проекте. Это заняло значительно меньше времени, чем если бы я делал это с нуля.
Перенос трассировки
Третий этап самый сложный — это перенос части трассировки с платы референса в проект. Нужно быть очень внимательным. Обычно при импорте всплывают ошибки переноса (между средами разработки), поэтому «заимствовать» нужно только самое необходимое, то, на что было бы затрачено много времени и сил. Особенно я не рекомендую переносить переходные отверстия, полигоны, вырезы в полигонах и правила для DRC (Design → Rules…).
Трассировка iMX8 выполнена на 10 слоях, соответственно я буду использовать тот же стек с той же очередностью слоев. Для удобства работы с проектом «MCIMX8M-EVK-DESIGNFILES», я скрою все полигоны.
Рис. 7. Плата референса MCIMX8M-EVK-DESIGNFILES. PCB
Выглядит страшно. Очень страшно. Казалось бы, на этом уже можно закрывать Altium и идти плакать. Для удобства можно скрыть ненужные слои совсем, но кардинально это не поможет, а вот по слоям это буде выглядеть более или менее просто. DDR разведена на 4 слоях, но bottom я привел тоже не случайно (об этом ниже).
Рис. 8. Трассировка LPDDR4 MCIMX8M-EVK-DESIGNFILES по слоям
Если в своем проекте Вы дошли до этого места, то половина работы по переносу, а может и по всему проекту уже сделана.
Наверное, Вы уже догадались что нужно сделать дальше? Да, осталось только правильно скопировать слой за слоем. Я расскажу, как это делаю я, чтобы избежать простых ошибок.
Первым делом я открываю плату референса и свою, с загруженными в нее компонентами из схемы на двух мониторах (этот вариант наиболее удобен при разработке). Копирую процессор и память из платы референса к себе (это необходимо для того, чтобы выставить эти компоненты с учетом имеющейся трассировки).
Рис. 9. Взаимное расположение памяти и процессора (слева — референс)
После этого необходимо установить процессор и память нашей платы поверх правильно установленных, а после этого просто удалить скопированные из референса компоненты.
Рис. 10. Правильное расположение процессора и памяти
Лишние линии связи можно временно скрыть и приступать к переносу непосредственно трассировки.
Необходимо будет воспользоваться двумя способами копирования проводников. Первый самый простой и самый долгий — это копирование проводников по одному. Не нужно так копировать все соединения — это займет много времени, но иногда бывает удобным. Для примера возьмем сигналы клоков на падах AE14, AD14, AE12 и AD12. Нажимаем ЛКМ на проводнике, выбираем пункт меню Find Similar Objects…, в появившемся окне помечаем имя проводника и слой (можно выполнять копирование сразу из всех слоев, в т.ч. отверстий).
Рис. 11. Копирование одного проводника в одном слое (top)
Далее жмем Ctrl+C и ставим мышкой привязку к паду процессора. Переходим на нашу плату и жмем Ctrl+V и вставляем. Повторяем для всех четырех проводников и ставим отверстия у падов памяти для перехода на bottom — там стоят резисторы. Если Вы выполнили копирование во всех слоях, то резисторы будет установить проще.
Рис. 12. Копирование одного проводника
На рис. 12. (справа) есть отдельный проводник (с крестиком мышки) — это пример копирования проводника во всех слоях с переходным отверстием. Суть метода состоит в том, что при копировании проводника и «установке его на пад», он принимает имя пада (нужно быть внимательным — если скопировать проводник на другой пад, он примет имя другого пада).
Даже сейчас Вы сможете самостоятельно перенести все проводники с референса на свою плату, но есть более простой способ (вообще их тоже несколько, но остановимся на одном), он отлично подходит для копирования групп проводников в одном слое. Для того, чтобы приступить к копированию проводников со второго (и следующих) слоя необходимо перенести top-проводники со всех падов процессора, в противном случае нарушится связь проводников (нам необходимо перенести переходные отверстия с tob на другие слои, чтобы потом к ним привязывать проводники).
Рис. 13. Копирование всех проводников с переходными отверстиями на top
Теперь у меня выведены с процессора все пады и их можно использовать на других слоях. То есть в другом слое я могу привязать проводники не боясь, что они станут NoNet (висящие «в воздухе» проводники, которые не подцепились). Следующим я перенесу 6 слой (третий, если смотреть рис. 8.), чтобы показать еще один хак. Все тоже самое, выделяем, копируем с привязкой в любому отверстию или паду и вставляем.
Рис. 14. Копирование всех проводников с переходными отверстиями с 6 слоя
В чем состоит хак? Так вот, помимо трассировки оперативки я сумел вывести интерфейсы из-под процессора, которые уже будут сгруппированы в определенных частях платы. В чипе отдельные шины данных расположены в определенных местах. Например, в iMX8 слева внизу CSI, чуть выше NAND и т.д., то есть по-другому вывести их все равно не получится.
После того, как все нужные слои перенесены, необходимо удалить все переходные отверстия и проводники NoNet (при копировании пяти слоев, на нашей плате окажутся пять переходных отверстий на каждом месте). Затем я вручную расставляю via, заодно проверяя все связи. При определенной сноровке вся работа по переносу займет несколько часов.
Bottom
На рис. 8. я показал слой bottom, который тоже хочу перенести. Но главное в нем не проводники (их не так много), а расстановка компонентов. Всего под чипом и оперативкой находятся 132 элемента. Обычно я не копирую этот слой, а просто устанавливаю пассив также как на референсе (открывая две платы на разных мониторах). Такой вариант подойдет, если Вы не меняли типоразмер компонентов на больший, в противном случае придется повозиться.
Рис. 15. Компоненты на обратной стороне платы модуля
Рис. 16. Итоговая трассировка под процессором и памятью сигнальных слоев
Послесловие
Подводя итоги, могу сказать, что данный способ переноса является довольно простым (я не исключаю, что есть и другие). Если начать с простых плат на 4 слоях, то можно быстро научиться переносить и более сложные трассировки, не затрачивая на это больших ресурсов. На этом, полагаю, статью можно закончить.
Для «затравки» скажу, что на получившейся плате 156 полигонов и, если кому-то интересно, могу написать статью о том, как на данном модуле они прокладывались, какие сложности возникали из-за небольших габаритов (размеры модуля 81 мм*58 мм) и что необходимо учитывать.
Спасибо за внимание!