Notice: Memcache::get(): Server localhost (tcp 11211) failed with: Connection refused (111) in /home/a146/www/we.easyelectronics.ru/engine/lib/external/DklabCache/Zend/Cache/Backend/Memcached.php on line 134
Софтовый PHY для Ethernet 10BASE-T / ПЛИС / Сообщество EasyElectronics.ru

Софтовый PHY для Ethernet 10BASE-T

image
Захотелось мне поэкспериментировать с Ethernet на отладочной плате DE0-nano. Эта плата не имеет Ethernet интерфейса, поэтому для реализации такой задачи к ней нужно подключать внешнюю микросхему PHY с обвязкой, которые и обеспечат согласование витой пары сети и ПЛИС. В таком случае уровень MAC реализуется в самой ПЛИС (например при помощи компонента Triple-Speed Ethernet, входящего в состав Quartus).
Вот пример такого подключения. Видно, что проводов выходит довольно много. Конечно, можно использовать PHY c поддержкой RMII, но там уже достаточно высокая частота (50 МГц), и опять же, нужно где-то доставать PHY, делать плату, либо заказывать отладочную плату с PHY в Китае — ее долго ждать.
Но ведь ПЛИС можно подключить к Ethernet практически напрямую! Я сам уже пробовал этот способ ранее, и он работал. Следовательно, вполне реально реализовать полностью программный PHY (конечно, только для Ethernet 10BASE-T). Вот этим я и решил заняться (в первую очередь, чтобы лучше разобраться с Verilog).

Чем же занимается PHY?
Можно открыть структурную схему какой-нибудь микросхемы PHY, и посмотреть. Вот например, KS8721:

Красным выделены блоки, связанные с 10BASE-T. Как видно, в передатчике последовательные данные, передаваемые в PHY от MAC, сериализуются, кодируются Манчестером, и передаются в линию.
В приемнике производятся обратные операции — декодирование Манчестерского кода, десериализация, передача полученных данных в MAC.
Данные между PHY и MAC передаются по интерфейсу MII. Для передачи самих данных в каждую сторону нужно 6 линий: CLK, DATA_EN, DATA0-3.
Данные передаются словами по 4 бита, линия DATA_EN должна устанавливаться в 1 при передаче данных. Частота CLK для 10BASE-T должна быть 2.5 МГц. Так по как по MII одновременно передаются 4 бита, то скорость потока данных в линии как раз будет 10 Mbit/s.
Сигнал тактовой частоты CLK как для приемника, так и передатчика формируется самим PHY.
Кроме этих линий, есть еще и линии управления потоком (error, CRS Carrier sense, COL Collision detect) и специальные линии MDC и MDIO для настройки и контроля PHY, но, как показала реальность, можно обойтись и без них.

В моем проекте PHY приемник и передатчик для удобства отладки полностью разделены.
Передатчик у меня получился совсем простым, большую часть кода я взял с www.fpga4fun.com. Стоит заметить, что в моменты, когда MAC не передает данные, нужно передавать в линию специальные NLP импульсы, которые используются для сигнализации о наличии соединения. Передавать их нужно с периодом 8-24 мс, и этим тоже должен заниматься передатчик PHY.
Наличие NLP импульсов является признаком устройства, работающего в режиме 10BASE-T half duplex. Чтобы перейти в режим full duplex, нужно формировать посылки из FLP импульсов, но я не стал заниматься этим — мне для экспериментов хватает и half duplex.
После того, как полезные данные переданы, линию нужно удерживать в состоянии высокого уровня не менее 300 нс (сигнал TP_IDLE). После этого с линии нужно снять напряжение (сама передача идет дифференциальным сигналом). Все это несколько усложняет передатчик.

Положительный и отрицательный сигналы с выхода передатчика у меня подключены к выводам ПЛИС, которые соединены напрямую с Ethernet трансформатором.
После конфигурации ПЛИС PHY передатчик начинает генерировать NLP импульсы, так что он сразу обнаруживается противоположным сетевым устройством.
После того, как передатчик был подключен к Treple-Speed Ethernet, управляемом Nios II, он практически сразу заработал — Wireshark нормально принимал пакеты, отправленные из Nios.

Следующая часть — PHY приемник. Изначально мне казалось, что его реализация тоже будет достаточно простой — ведь у меня в SDR приемнике уже был реализован прием данных. Как я уже упоминал, сигналы в линии передаются в дифференциальной форме, и имеют амплитуду +-2В. Для приема таких сигналов можно использовать блоки LVDS, что, собственно, и было сделано в SDR приемнике. Однако в этот раз попытка заново подключить выход трансформатора к выводам LVDS напрямую оказалась неудачной — при отсутствии сигнала в линии на выходе LVDS был постоянный шум.
Я по разному пытался его убрать, но единственный способ, при котором удавалось получить более-менее нормальный сигнал — использовать дополнительное напряжение смещения, подаваемое на отрицательный вход компаратора LVDS.
Получилась вот такая схема:

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

Прием данных производится при помощи оверсемплинга — данные от LVDS анализируются с частотой 80 МГц (это частота тактирования приемника и передатчика PHY). Из-за вышеупомянутого искажения сигнала блоком LVDS мне не удалось реализовать декодирование Манчестерского кода традиционным образом (когда детектируются фронты и через некоторое время производится выборка данных). Возможно, что при увеличении частоты дискретизации этот алгоритм и заработал бы, но я не стал это делать. Наиболее стабильным оказался алгоритм, в котором вначале выполняется синхронизация счетчика времени с сигналом в линии, после чего через промежутки времени, определяемые этим счетчиком, берутся выборки передаваемых данных.
Работа алгоритма осложняется наличием NLP импульсов и промежутка TP_IDLE в конце пакетов. В общем, алгоритм приемника вышел каким-то запутанным. В процессе написания PHY приемника пришлось даже написать меленькую программу для компьютера, которая конвертировала данные логического анализатора SignalTap в набор команд для testbench — таким образом можно было симулировать работу приемника на реальных данных, захваченных с линии.

Вид получившейся схемы в Quartus:
image
Сигналы DATA_EN PHY приемника и передатчика выведены на светодиоды, так что видно процесс обмена данными. При помощи одного из переключателей на плате (линия SWITCH) можно соединить вывод передатчика со входом приемника PHY.
Система SOPC взята из предыдущего проекта, видеосистема из нее выброшена, и добавлены компоненты — Triple-Speed Ethernet (TSE), и два модуля SGDMA — для приема и передачи данных в MAC. Кроме того, в системе должен быть таймер, так как предполагается работа с RTOS.
Вид системы SOPC:
image
Настройки SOPC я взял из примера Altera, правда, я не стал создавать отдельную память для дескрипторов SGDMA.
Весь проект занимает в ПЛИС 9722 LE, при этом PHY приемник занимает 136 LE, — передатчик 59 LE.

В получившейся системе, для того, чтобы отправить данные по Ethernet, достаточно настроить SGDMA и запустить его. Для приема нужно настроить другой SGDMA, после чего нужно ждать окончания передачи — «вручную» проверяя состояние этого SGDMA, или включить прерывание от него.
Для проверки работы PHY и MAC я несколько модифицировал пример Altera. Он просто отправляет раз в секунду UDP пакет и выводит в консоль длину принятого пакета. Никакого TCP/IP стека при этом не используется. Проект называется «test_phy».

Следующий этап — работа с TCP/IP стеком. В состав IDE для Nios II входит TCP/IP стек NicheStack работающий совместно с µC/OS-II. Для проверки я использовал проект "Simple Socket Server", входящий в состав IDE.
Для того, чтобы настроить драйвер TSE для работы с софтовым PHY, нужно вызвать функцию «setup_phy» из файла tse_my_system.c в начале функции «main». Кроме того, нужно заменить константы в altera_avalon_tse.h
#define ALTERA_TSE_DUPLEX_MODE_DEFAULT          TSE_PHY_DUPLEX_HALF
#define ALTERA_TSE_MAC_SPEED_DEFAULT            TSE_PHY_SPEED_10
#define ALTERA_TSE_SGDMA_INTR_MASK              ALTERA_AVALON_SGDMA_CONTROL_IE_CHAIN_COMPLETED_MSK | ALTERA_AVALON_SGDMA_CONTROL_IE_GLOBAL_MSK | ALTERA_AVALON_SGDMA_CONTROL_IE_ERROR_MSK

Описание самого проекта входит в документацию на NicheStack TCP/IP Stack.
После запуска примера он сразу заработал — роутер выдал IP при помощи DHCP, устройство нормально пинговалось, и собственно, к нему можно было подключится через telnet и помигать диодами.

Еще один пример, который есть у Altera — запрос времени с NTP сервера (ntp_client). Он аналогично настраивается для работы с софтовым PHY. Кроме того, проект рассчитан на работу с LCD, так что пришлось переделать его на работу с консолью.

Сам проект: github.com/iliasam/10base_t_software_PHY
  • +11
  • 27 декабря 2015, 19:59
  • citizen

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

RSS свернуть / развернуть
а что с 100Мбитным? По моему для плис — это не проблема?
А вообще большая работа проделана. Плюсую!
0
Возможно, предавать пакеты и удастся, но вот прием данных на такой скорости, используя LVDS, кажется мне малореальным. Для приема oversampling нужен, так что тактовая частота приемника должна быть значительно выше 100 МГц.
0
ну вообще несущая частота 100М-битного Ethernet — 125Мгц. Там идет очень простая кодировка — 5 бит -> 4 бита. Это сделано для того, чтобы можно было передавать «нули» через трансформатор. Ну и плюс ко всему добавляется еще служебные комбинации, которые декодируются как внешние сигналы TXEN RXER и прочие.
0
0
Сами микрухи Phy не работают на каких-то сверхвысоких частотах. По моему, как раз на 125Мгц. Другое дело, что нужно много мозг поломать, чтобы сделать работу такт в такт
0
Посмотрите на структурную схему в начале статьи. Для 100BASE-T там есть модуль «Clock Recovery». Подозреваю, что работа этого блока с PLL связана.
Вот тут явно все непросто: www.ece.ncsu.edu/asic/ece733/papers/Equalization/ADSPbased10BaseY.pdf
0
Ну в общем да, без автоподстройки фазы сложно будет что-то сделать. Как я понимаю, ПЛИС это не умеет?
0
Меня насторожил этот момент:
«если подключить его к земле ПЛИС, то прием больших пакетов (более 400 байт) становится значительно стабильнее»
Т.е., есть проблемы при приеме больших пакетов? А ведь максимальный пакет почти в 4 раза больше, 1500 байт.
0
Если подключить средний вывод к земле, как указано, то прием идет вполне нормально. Проверялось при помощи ping, настроенного на передачу пакетов по 1000 байт, 600 пакетов были переданы без потерь, после чего я остановил ping. Длина провода от роутера до ПЛИС была около 10 метров.
0
есть мнение что физический уровень 100мбит, то есть кодировка mlt-3 подразумевает 3 состояния в линии, соответственно в lvds подключить напрямую ну никак не получится, только разве что на передачу, сделав 2х битный R2R ЦАП из двух передатчиков и пары резисторов.
0
Название вводит в заблуждение.
Либо автор изначально заблуждается, считая прошивку ПЛИС «софтом»
0
Этот вопрос, по моему, дискуссионный.
Здесь тоже речь про софт идет: en.wikipedia.org/wiki/Soft_microprocessor
0
Вот если бы это было реализовано на ниосе, тогда — да, софтово. Но выглядело бы очень странно.
А так — сугубо железный блок, без намека на софт.
0
Какой же он железный, если без файла битстрима не работает? :)
В битстрим — это скомпилированная программа. Могла быть написакна на верилоге, могла на вхдл, могла на систем-си, и ещё на десятке языков. Потом компилируется, получается бинарный файл, который проливается в ПЛИС, а без него ПЛСИ ничего не делает. Назвать этот файл аппаратным решением я никак не могу.

Вот если бы в ПЛИС был готовый, аппаратный, модуль Ethernet (во многих старших есть), который сам по себе не требует прошивки, тогда решение было бы аппаратным.
+1
Можно поподробней узнать поо Ваш SDR приемник?
0
В самом начале этой статьи есть ссылка на статью про него: habrahabr.ru/post/204310/
0
Спасибо, не заметил ссылки. Однако сразу подумал про эту статью, так как сейчас по Вашему примеру пытаюсь сделать свой SDR приемник. Структура, антенна — практически все то же самое, только заместо Ethernet-модуля решил взять готовую микросхему.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.