PCIe, он же PCI-Express, представляет собой очень мощный интерфейс, и в этой статье я опишу основные принципы его использования в собственных проектах. Поначалу PCIe может немного пугать, но он всё же достаточно прост для экспериментов и вполне пригоден для применения в рамках хобби. В определённый момент вы можете решить использовать микросхему PCIe в собственных проектах или, например, задействовать подключение PCIe на Raspberry Pi Compute Module, так что лучше быть к этому готовым.
Сегодня PCIe можно встретить повсюду. В каждом современном компьютере присутствует ряд устройств PCIe, выполняющих важнейшие функции, и даже в iPhone этот интерфейс внутренне используется для соединения процессора с флеш-памятью и микросхемой Wi-Fi. Нам доступны всевозможные устройства с PCIe: контроллеры Ethernet, высокопроизводительные платы Wi-Fi, графические ускорители и всяческие дешёвые NVMe-диски. Если вы экспериментируете с ноутбуком или одноплатником и хотите добавить в него устройство с PCIe, то можете получить сигнал PCIe от одного из разъёмов PCIe или просто подключиться к имеющейся линии PCIe, если таковых разъёмов нет. С момента появления устройств PCIe прошло уже два десятилетия — сейчас эта технология достигла ревизии 5.0 и однозначно останется с нами надолго.
Фото V4711, CC BY SA 4.0
PCIe — это шина, которая соединяет два устройства по типу «точка-точка» — в противоположность более древней PCI, которая могла соединять на материнской плате цепочку устройств. На одной стороне этого соединения присутствует устройство PCIe, а другая выступает хостом. К примеру, в процессоре ноутбука есть несколько портов PCIe — один используется для подключения GPU, другой для платы Wi-Fi, третий для Ethernet, а четвёртый для NVMe-диска.
Каждая линия PCIe состоит из как минимум трёх дифференциальных пар — одна представляет тактовый генератор 100 МГц, REFCLK, который (почти) всегда необходим для соединения, а две формируют канал PCIe — одна служит для передачи и вторая для получения. Такая схема называется линией 1x — также бывают линии 2х, 4х, 8х и 16х, в которых используется четыре, восемь, шестнадцать и тридцать две дифференциальные пары соответственно плюс, опять же, REFCLK. Чем шире линия, тем выше её пропускная способность.
Ширина линии PCIe представляет интересную тему со многими важными аспектами, но сначала желательно проговорить, что означает «дифференциальная пара» именно в этом контексте. Здесь на Hackaday мы уже рассказывали об особенностях дифференциальных пар — так что, если есть желание разобраться в данной теме более глубоко, рекомендую обратить на данный материал внимание. В текущей же статье я лишь освежу основы и затем расскажу, что вам нужно учитывать при работе с дифпарами, в частности, при их использовании в PCIe.
▍ В чём разница?
Говоря простым языком, дифференциальная пара — это два противоположных сигнала, положительный и отрицательный. Вы получаете логический уровень передаваемого бита путём сравнения этих двух сигналов друг с другом — вместо сравнения уровня каждого отдельного сигнала с землёй, как мы обычно делаем. Этот метод называется «асимметричной сигнализацией». В случае дифференциальной пары сигналы находятся близко друг к другу, а в кабелях даже переплетаются. В результате этого помехи воздействуют на них в равной степени — так как сигналы для получения информации сравниваются друг с другом, это означает, что накладываемый на оба этих сигнала шум на итоговую полученную информацию не влияет. Дифференциальные пары также обуславливают взаимное гашение магнитных полей обоих сигналов, что ведёт к уменьшению шумов на линии передачи.
В результате дифференциальные пары позволяют повысить скорость передачи, не создавая лишнего шума и не повышая восприимчивость к нему. По этой причине в подавляющем большинстве высокоскоростных интерфейсов используется именно эта технология: Ethernet, PCIe, HDMI, DisplayPort, LVDS и даже в USB, хотя USB2 всё же псевдодифференциален, а вот USB 3 уже в этом смысле полноценен. В отказоустойчивых интерфейсах вроде RS485 и CAN также используются дифпары. Любителю не составит проблем начать работать с этой технологией при реализации интерфейсов вроде CAN и даже USB2 — на коротких расстояниях они будут функционировать, несмотря ни на что, хотя в теории дифференциальные сигналы требуют особого подхода.
Тем не менее при разводке печатной платы или сборке кабеля дифпарам действительно необходимо уделять больше внимания. Если в таких случаях не проявить достаточно стараний, есть риск получить загадочные глюки или полностью нерабочие интерфейсы. В этой связи далее предлагаю разобрать все необходимые требования.
▍ Относитесь к дифференциальным парам с уважением
Во-первых, вам нужно держать оба сигнала дифпары рядом по всей их длине. Чем ближе они друг к другу, тем меньше воздействие внешних помех и уровень излучаемого ими шума. Учитывая, что зачастую несколько дифференциальных пар пролегают рядом, это также поможет сохранить целостными сигналы других дифпар. Что касается совместного прокладывания нескольких дифпар, их нужно будет отделить друг от друга и прочих компонентов — будь то заливка полигонами на том же уровне или высокочастотные сигналы. Хорошей практикой здесь будет следовать «правилу 5W», согласно которому между центром дифпары и другими сигналами должно быть расстояние, равное ширине минимум пяти дорожек. К сожалению, соблюсти эту рекомендацию не всегда возможно, но желательно к этому стремиться.
Также нужно будет обеспечить, чтобы прямо под этими сигналами вдоль всего пути дифпары находилась непрерывная линия заземления — отлично подойдёт заливка. И хотя эти два сигнала сравниваются приёмником, каждый из них относительно обратного тока всё равно ведёт себя как асимметричный. Кроме того, здесь явно не помешает некоторое экранирование. Если вы подключаете PCIe к кастомному разъёму, убедитесь, что между каждой парой есть хотя бы один вывод GND. И последнее — проследите, чтобы обе дорожки дифпары были одной длины. Если дифпара где-то поворачивает, одна из её дорожек несколько укорачивается, и в вашем редакторе печатных плат должна быть возможность добавить к этой дорожке «компенсацию», которая позволит сохранить общую длину.
Иногда есть смысл добавить несколько компенсаций. Фото Phiarc, CC BY SA 4.0
Ещё есть один редко проговариваемый нюанс — согласование импеданса. Если вы проводите дифференциальную пару из точки А в точку В, то нужно обеспечить получение правильного импеданса, и добиться этого проще, чем может показаться.
Импеданс подобен сопротивлению, но относится к изменению сигналов. Каждая часть пути дифпары имеет собственный импеданс: приёмник и передатчик внутри используемой микросхемы, выводы микросхемы, дорожки печатной платы и все разъёмы или кабели между ними, если пара проводится через них. В любой точке, где импеданс сигнала меняется, часть этого сигнала отражается от точки несоответствия, и если изменение окажется достаточно значительным, это приведёт к искажению получаемого сигнала.
Итак, это подразумевает необходимость обеспечения правильного импеданса линии PCIe вдоль всего пути — что на практике означает подбор подходящих разъёмов, а также нужной ширины дорожек и отступов между ними. Оборудование PCIe в основном собирается с учётом импеданса 85 Ом. Такие компоненты, как приёмники, передатчики и соответствующие разъёмы находятся вне нашего контроля, и для получения достаточно однообразного импеданса вдоль всего пути необходимо подстраивать под одно значение те элементы, над которыми контроль у нас есть.
Для начала, если вам для линии PCIe нужны разъёмы, то выбирайте такие, которые будут иметь минимальное несоответствие импеданса. Хорошим вариантом будет использовать высокоскоростные модели или те, что собираются с учётом сигналов PCIe — полноразмерные PCIe, M.2, mPCIe, USB3, USB-C и много высокоскоростных семейств от разных производителей.
Теперь перейдём к настройке импеданса дорожек печатной платы. Импеданс дифпары зависит от множества переменных факторов, но если вы начинающий электронщик, то существуют упрощённые калькуляторы — вот мой любимый. Промотайте вниз до пункта «Edge-Coupled Surface Microstrip», для прокладки дифпар на слоях толщиной в 35 мкм укажите высоту дорожки 35, а диэлектрическую константу установите на 4,3, если только производитель платы не рекомендует другое значение. Затем установите толщину изоляции равной расстоянию от дифпар — чтобы его узнать, загляните в раздел документации платы, где описана структура её слоёв. Предположим, ваши дифпары находятся на верхнем слое, и земля проходит по слою под ними. В таком случае ищите толщину «prepreg» между верхним слоем меди и слоем под ним — это значение и будет высотой изоляции. Далее поиграйтесь с шириной дорожек и отступами между ними, стремясь получить сопротивление 85 Ом. В спецификации допускается диапазон от 70 до 100 Ом.
Вот вам практическое упражнение — давайте заглянем в структуру 4-слойной платы OSHPark. Её диэлектрическая константа (dk) равна 3,6, а минимальная ширина дорожек и отступы равны 5 mil, то есть 0,127 мм, или 127 мкм для калькулятора; толщина препрега равна 202 мкм. Введите диэлектрическую константу и толщину препрега в калькулятор и поэкспериментируйте со значениями.
Вы обнаружите, что увеличение ширины дорожки, равно как и уменьшение отступов, ведёт к уменьшению импеданса — установите его на минимально возможное. Вы увидите, что при стремлении к 85 Ом вам нужно использовать пары 0,3/0,127 (ширина/отступы) — это даст 84,8 Ом. Если же вы не можете позволить себе такую ширину дорожек, то используйте 0,2/0,127 — это даст импеданс 106 Ом, который несколько выходит за допустимый диапазон, но при необходимости тоже сгодится.
И последнее — разводите дифпары без лишних манёвров. По возможности не проводите их через отверстия на другие слои — каждая пара отверстий внесёт в сигнал индуктивность, которая может создать помехи для высокоскоростных сигналов. Как правило, начальная и конечная точки линии PCIe находятся на верхнем слое — желательно так всё и оставить. Если есть необходимость перейти на другой слой, добавьте возле дифференциальных пар заземлённые отверстия. Кроме того, удерживайте другие высокоскоростные, быстро меняющиеся либо шумные сигналы как можно дальше от них. Если в ваших проектах наряду с дифпарами также используются высокомощные и асимметричные соединения, то первыми прокладывайте именно дифпары.
Итак, пять важных моментов — прокладывайте дифпары близко друг к другу, размещайте под ними заземление, используйте подобающие разъёмы, корректируйте ширину их дорожек и отступы для получения нужного импеданса, а также делайте разводку без лишних изысков. Всё это основы, которым необходимо следовать, если вы хотите, чтобы дифференциальные пары в дальнейшем выполняли свою роль достойно.
▍ Загадка мокрой верёвки
Если вам доводилось работать с PCIe, ты вы могли открыть для себя одно тайное знание: оказывается, что на практике всё вышеперечисленное проделывать не обязательно.
Возможно, вы слышали, что PCIe работает даже по «мокрой верёвке» (в оригинале wet string — прим. пер.) — впервые так её охарактеризовали на Всемирном конгрессе хакеров 2016 года, 33c3. Это эдакий хакерский способ описывать работу PCIe — вы можете не соблюсти многие из вышеназванных пунктов при подключении двух устройств PCIe, но соединение всё равно заработает. И, что неудивительно, в этом есть крупное зерно истины — PCIe способен работать в субоптимальных условиях, что подтверждается множеством примеров как в мире электронщиков, так и в среде потребителей.
Пожалуй, наиболее доступный пример — это передача сигнала PCIe 1x с помощью USB3, как в использующихся для майнинга райзерах PCIe. Это означает, что вы можете просто зайти в магазин компьютерных аксессуаров и купить продукт, который появился лишь вследствие нарушения правил эксплуатации технологии PCIe.
Ещё один случай, с которым вы могли столкнуться и забыть как страшный сон — это прокладка линии PCIe 8х с помощью, содрогнитесь, проводов для прототипирования. Таким образом Toble_Miner тестировал идею создания переходника для дешёвых высокоскоростных сетевых карт с серверов HP, несовместимых со стандартными слотами PCIe как по распиновке, так и механически. Такая конфигурация для прототипирования позволила ему спроектировать подходящую версию переходника, о которой мы впоследствии написали на Hackaday.
Вы вполне можете наспех проложить линию PCIe через кабель FPC, соединив таким небрежным образом две платы. Аналогичный вариант реализовывался в расширителях eGPU с помощью кабелей HDMI, и его также наверняка можно реализовать с помощью обмоточного провода. Вот ссылка на эксперимент Linus Tech Tips, в котором расширители PCIe соединяли цепочкой, которая успела достичь 5 метров, пока соединение не начало утрачивать стабильность.
PCIe является более снисходительным интерфейсом в сравнении с некоторыми другими, например, с USB3. В нём присутствует механизм подстройки соединения — после установки подключения PCIe приёмник и передатчик перебирают внутренние параметры, корректируя их до тех пор, пока не достигнут максимально возможной скорости при низком уровне ошибок. Далее найденные параметры используются на протяжении всего времени подключения. Также в этом интерфейсе присутствует повторная передача неполученных пакетов. На практике PCIe отличается исключительной стабильностью.
Очевидно, что подстройка соединения PCIe имеет свои уникальные особенности — к примеру, для большего удобства при проектировании платы этот интерфейс также позволяет инвертировать любую дифференциальную пару, за исключением REFCLK, поменяв отрицательный и положительный сигнал местами, что обнаруживается и полноценно компенсируется во время подстройки. Прочие технологии вроде USB3, HDMI или DisplayPort не поддерживают подобные фичи, облегчающие жизнь инженера. В других интерфейсах зачастую требуется, чтобы несколько линий имели одинаковую длину — чтобы данные, передаваемые по одному комплекту дифпар, не прибывали быстрее передаваемых по другому. При этом PCIe отлично работает при расхождении длины дифпар, также обнаруживая и компенсируя это расхождение во время подстройки соединения. И хотя эти особенность больше служат в целях облегчения проектирования печатных плат, нежели отвечают за отказоустойчивость, их наличие определённо помогает.
▍ Стремитесь к лучшему, несмотря ни на что
Двухслойный переходник mPCIe-NVMe с неправильным импедансом, который всё равно работает на моём сервере 24/7
Помогает ли такая отказоустойчивость электронщикам? Безусловно — эти две особенности используются, по сути, в любой профессиональной схеме PCIe, и если вы находитесь в неидеальных условиях, то можете на свой страх и риск выжать из PCIe ещё больше. С другой стороны, не стоит пренебрегать каждым правилом, только потому что кто-то так делает — приложите усилия к соблюдению пяти описанных пунктов, даже если вы ограничены двухслойной платой и никак не можете получить идеальное значение импеданса.
Следование этим правилам не только научит вас дисциплине использования дифференциальных пар для будущих проектов, но также позволит добиться большей устойчивости сигналов, сократит число ошибок и порадует ваши устройства PCIe. Пренебрежение некоторыми или даже всеми из перечисленных руководств может быть уместным, поскольку в определённых случаях вполне сработает, но затрата лишних тридцати минут на вычисление подобающего импеданса поможет исключить необходимость проектирования второй ревизии вашей платы и обеспечить её исправную работоспособность на протяжении всего срока службы.
Так что вот вам общий принцип: относитесь к дифференциальным парам PCIe с уважением. Если вы используете двухслойную печатную плату и собираете дешёвый прототип, желая поскорее получить результат, не следует просто пренебрегать импедансом из-за того, что для получения 85 Ом дорожки придётся сделать слишком широкими. Откройте калькулятор и просчитайте, насколько можно снизить значение импеданса. Уменьшение толщины изоляции ведёт к снижению импеданса, так что рассмотрите вариант с использованием платы 0,8 мм, если механические особенности проекта это позволяют. Попробуйте разное расположение компонентов в поиске более удачного пути для дорожек PCIe с меньшим уровнем шума. Возможно, подстройка соединения снизит характеристики неидеального подключения на одно-два поколения, но это лучше, чем совсем не получить стабильного соединения. Максимально постарайтесь следовать этим правилам при имеющихся ресурсах, и дифференциальные пары ответят на ваше уважение взаимностью.
К примеру, если вы используете KiCad, то ниже я привожу простую демонстрацию того, как можно реализовать соединение PCIe x1 между двух точек, проложив дифпары с соблюдением импеданса, отступов и прошивкой полигонов отверстиями (via stitching).
Теперь вы знаете, как реализуется разводка дифференциальных пар PCIe на плате, причём эти руководства будут применимы ко всем видам других интерфейсов, использующих дифпары. В следующий раз я более подробно расскажу о значениях сигналов PCIe, ширине линий и пропускной способности — об основах, а также обо всех приятных сюрпризах, которые для вас хранит этот интерфейс. Если же вас интересует более глубокое знакомство с принципами работы PCIe, рекомендую статью «The bus, that’s not a bus: the joys of hacking PCI Express» — это будет актуально, если вы планируете собирать собственные устройства PCIe с ППВМ.
Автор: Дмитрий Брайт