Перейти к содержанию

Гигабит Ethernet: RGMII и PHY 88e1111. Вопросы по взаимодействию

Добрый день, господа!
Появилась у меня задача - написать простой MAC для связи FPGA c ПК по Гигабит Ethernet. Реализовано все это будет на Cyclone 4 (плата DE2 115).
Вроде задача не сложная, но возник вопрос по взаимодействию с PHY (Marvell 88e1111), который установлен на плате.
Обмен данных с PHY будет организован по интерфейсу RGMII. Собственно вопросы следующие:

1. Как правильно подавать управляющий сигнал TX_EN (transmit enable)?
В стандарте на Ethernet (параграф 22) есть следующее описание -
Код
It shall
be asserted by the Reconciliation sublayer synchronously with the first nibble of the preamble and shall
remain asserted while all nibbles to be transmitted are presented to the MII


Т.е. этим сигналом должны выделяются все байты преамбулы, судя из описания и картинки. Но в то же время, аналогичный сигнал RX_DV (Receive Data Valid), который идет от PHY, судя по описанию, устанавливается несколько иначе -
Код
RX_DV must encompass the frame,
starting no later than the Start Frame Delimiter (SFD) and excluding any End-of-Frame delimiter.


Здесь (при приеме от PHY) преамбула не обязана быть выделена этим сигналом. Выделен обязательно должен быть только байт SFD, идущий непосредственно переда байтами данных.

2. Правильно ли я понял, что получается немного разная логика формирования управляющих сигналов при приеме и передаче? Или я где то ошибся и есть еще какие то тонкости?

3. И как быть с байтом END OF FRAME?
При приеме данных от PHY в описании есть явные указания на то, что он не выделяется сигналом RX_DV.
А вот при передаче данных на PHY про это ничего не написано. Этот байт также не выделяется стробом TX_EN? Или я опять что то упускаю?

Заранее спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Все правильно. Заметьте - TX_EN является входом PHY, а RX_DV - выходом PHY. Так что не удивительно, что логика разная.
Цитата
А вот при передаче данных на PHY про это ничего не написано. Этот байт также не выделяется стробом TX_EN? Или я опять что то упускаю?
TX_EN должен сопровождать все данные, передаваемые в PHY. Он от себя в выходной поток ничего не добавляет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
TX_EN взводится вместе с первым байтом вступления (кстати, большинство современных сетевых девайсов прекрасно принимают пакеты, даже если все 0x55 отсутствуют, главное, что бы был байт 0xD5) и заканчивается в точности за последним байтом проверочной суммы Eth-пакета. Абсолютно в точности та же хрень на приёме. Учтите, что для 4ых даже топовых Циклонов 125МГц - это уже жестковато, поэтому рекомендую все сигналы (даже GTX_CLK) протаскивать через altddio, иначе потом будете долго за голову хвататься почему "акула" всё красным подсвечивает sm.gif

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Kluwert @ Oct 9 2017, 13:52) <{POST_SNAPBACK}>
рекомендую все сигналы (даже GTX_CLK) протаскивать через altddio, иначе потом будете долго за голову хвататься почему "акула" всё красным подсвечивает sm.gif
Извините что вклиниваюсь, стоит аналогичная задача что и у автора темы, вот эти altddio как спасут здесь? Какую роль они выполняют?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(AVR @ Oct 9 2017, 14:58) <{POST_SNAPBACK}>
Извините что вклиниваюсь, стоит аналогичная задача что и у автора темы, вот эти altddio как спасут здесь? Какую роль они выполняют?

Обеспечивают жёсткую времЕнную привязку gtx_clk, стробов и самих данных друг к другу и плюс обеспечивают формирование достаточной крутизны фронтов (на передаче есс-но). Эти мегакоры просто настраивают двухтактные регистры, висящие на входе/выходе соответствующих выводов (см. IOE structure в описании к Циклону). Кстати, учтите один момент, т.к. эти регистры практически прицеплены к самой ноге, то STP дотянуться до них физически не может - посмотреть сигнальчики на этих выходах вы сможете только осциллографом sad.gif

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата
вот эти altddio как спасут здесь

RGMII по обоим фронтам клока работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Kluwert @ Oct 9 2017, 13:52) <{POST_SNAPBACK}>
TX_EN взводится вместе с первым байтом вступления (кстати, большинство современных сетевых девайсов прекрасно принимают пакеты, даже если все 0x55 отсутствуют, главное, что бы был байт 0xD5) и заканчивается в точности за последним байтом проверочной суммы Eth-пакета. Абсолютно в точности та же хрень на приёме. Учтите, что для 4ых даже топовых Циклонов 125МГц - это уже жестковато, поэтому рекомендую все сигналы (даже GTX_CLK) протаскивать через altddio, иначе потом будете долго за голову хвататься почему "акула" всё красным подсвечивает sm.gif


Так они взводятся именно с первым байтом преамбулы (0x55) или байтом SFD (0xD5 - который непосредственно переда данными)?
И еще, правильно ли я понял, что для 1 Gb преамбула будет такая - 55 55 55 55 55 55 55, затем D5?
Например, в 10 Gb (xgmii) несколько иная она - FB 55 55 55 55 55 55, затем D5.

А по поводу клока GTX_CLK - идея кстати не плохая, использовать DDR.

Сейчас еще немного покопался в описании на Etherent - вот нашел такие таблички (правда они для MII, для RGMII ничего нет):
И вот там, что RX_DV, что TX_EN - устанавливаются именно вместе с первым байтом преамбулы (который 0x55)

И еще по поводу клока, у Альтеры есть такой апликейшн ноут - AN 477: Designing RGMII Interfaceswith FPGAs and HardCopy ASICs
Так там написано, что необходимо дополнительно настраивать внешний PHY на прием клока. Если не настраивать - то необходимо самому сдвигать фазу выходного клока на 90 градусов.
Кто как делает: настраиваете PHY или двигаете клок?

Цитата(XVR @ Oct 9 2017, 13:24) <{POST_SNAPBACK}>
Все правильно. Заметьте - TX_EN является входом PHY, а RX_DV - выходом PHY. Так что не удивительно, что логика разная.
TX_EN должен сопровождать все данные, передаваемые в PHY. Он от себя в выходной поток ничего не добавляет.


Например в xgmii логика одинаковая, что на прием, что на передачу. Плюс к тому, что считать данными? Преамбула, CRC, END FRAME BYTE тоже данные или нет?
Изменено пользователем gin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(gin @ Oct 9 2017, 16:49) <{POST_SNAPBACK}>
Так они взводятся именно с первым байтом преамбулы (0x55) или байтом SFD (0xD5 - который непосредственно переда данными)?
И еще, правильно ли я понял, что для 1 Gb преамбула будет такая - 55 55 55 55 55 55 55, затем D5?
Например, в 10 Gb (xgmii) несколько иная она - FB 55 55 55 55 55 55, затем D5.

А по поводу клока GTX_CLK - идея кстати не плохая, использовать DDR.


И еще по поводу клока, у Альтеры есть такой апликейшн ноут - AN 477: Designing RGMII Interfaceswith FPGAs and HardCopy ASICs
Так там написано, что необходимо дополнительно настраивать внешний PHY на прием клока. Если не настраивать - то необходимо самому сдвигать фазу выходного клока на 90 градусов.
Кто как делает: настраиваете PHY или двигаете клок?

Я не знаю, кто чем взводится, но я вам написал выше: всё современное сетевое оборудование прекрасно работает, если даже все 55 пропущены.
По клоку: настраивать физику по MDIO (хотя у некоторых это делается по умолчанию), если она такое вообще позволяет. Сдвигать клок на 4ом Циклоне практически не реально.
А вообще, прежде чем вопросы задавать, не плохо бы ознакомится с вами же найденной литературой, сделать пару проектиков, набить шишек и потом уже задавать конкретные вопросы.
Если вы хотите мастер-класса, то можете договориться с вашим работодателем и я могу за определённый гонорар провести обучение. А обучать вас разработке сетевых модулей через форум за бесплатно никакого интереса нету.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Kluwert @ Oct 10 2017, 11:48) <{POST_SNAPBACK}>
Если вы хотите мастер-класса, то можете договориться с вашим работодателем и я могу за определённый гонорар провести обучение. А обучать вас разработке сетевых модулей через форум за бесплатно никакого интереса нету.

Сурово, но справедливо. На самом деле, я бы не стал обижаться на такие слова со стороны автора темы, это вполне нормальная практика. Я такое практикую, когда что-то у самого не получается, то стараюсь нанять человека, который сделает за деньги, а сам продолжаю делать то, что получается самому, помогая в свою очередь кому-то другому с той задачей, с которой уже ему проблематично а мне запросто. Такая вот взаимовыручка, хоть и с примесью грубого материализма sm.gif

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Kluwert @ Oct 10 2017, 11:48) <{POST_SNAPBACK}>
Я не знаю, кто чем взводится, но я вам написал выше: всё современное сетевое оборудование прекрасно работает, если даже все 55 пропущены.


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


Цитата(Kluwert @ Oct 10 2017, 11:48) <{POST_SNAPBACK}>
Сдвигать клок на 4ом Циклоне практически не реально.


А сдвигать клок на четвертом Циклоне - элементарно. Могу вам даже пару вариантов сходу предложить, как это лучше сделать.
Так что тут еще вопрос, кто кому мастер класс проводить будет wink.gif
Изменено пользователем gin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(gin @ Oct 9 2017, 15:49) <{POST_SNAPBACK}>
Например в xgmii логика одинаковая, что на прием, что на передачу. Плюс к тому, что считать данными? Преамбула, CRC, END FRAME BYTE тоже данные или нет?
Принимайте (и игнорируйте) до 0xD5 включительно. Будет работать с любым способом формирования RX_DV
CRC в данные входит (IMHO), по поводу END FRAME BYTE - не знаю (поставьте натурный эксперимент rolleyes.gif )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(XVR @ Oct 10 2017, 13:28) <{POST_SNAPBACK}>
Принимайте (и игнорируйте) до 0xD5 включительно. Будет работать с любым способом формирования RX_DV
CRC в данные входит (IMHO), по поводу END FRAME BYTE - не знаю (поставьте натурный эксперимент rolleyes.gif )


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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Если завернуть шину данных RXD на TXD и соединить RX_DV с TX_EN и соотв. clk, то всё отлично передается, что свидетельствует об однотипности интерфейсов.
Что касается преамбулы по стандарту передающее оборудование обязано формировать 55..55D5 (на передачу). На счет обработки её при приеме в стандарте ограничений нет, но наша задача устойчиво принимать пакет, как вы это реализуете - ваши проблемы, но можно с уверенностью сказать одно - ориентироваться на полную преамбулу не стоит, т.к. встречается оборудование, в т.ч. cisco выдающее периодически усеченную преамбулу. На эти грабли уже многократно наступали и на форуме она ранее описана.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
0х55 в начале преамбулы вроде бы тянется ещё с тех времён когда в приёмниках 10BASE-T реально отдельные PLL стояли в декодерах манчестера, чтобы им было за что спокойно зацепиться в начале перед приёмом фрейма.
Нынче же схемотехника приёмников "немного" поменялась, да и 10ти мбитный езернет вымер давно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(_pv @ Oct 11 2017, 11:53) <{POST_SNAPBACK}>
0х55 в начале преамбулы вроде бы тянется ещё с тех времён когда в приёмниках 10BASE-T реально отдельные PLL стояли в декодерах манчестера, чтобы им было за что спокойно зацепиться в начале перед приёмом фрейма.
Нынче же схемотехника приёмников "немного" поменялась, да и 10ти мбитный езернет вымер давно.


Возможно преамбула - это и рудимент, но раз в стандарте про нее написано, значит надо ее формировать. Верно ведь? Тем более в том же 10-и гигабитном Ethernet она тоже есть. Во всяком случае с ней вроде разобрался.

Еще вопросик небольшой есть по поводу управления PHY через MDIO интерфейс. Не нашел даташит Марвелла с описанием внутренних регистров микросхемы 88e1111. Понимаю, что все они стандартные и описаны в спецификации на Etherent. Но все же, может кто то подскажет, какая последовательность записи данных в эти регистры? Кто это уже делал, и кому не жалко поделиться такой информацией.
Заранее спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация