МАРСОХОД

Open Source Hardware Project

Проекты Altera Quartus II для платы Марсоход

Передаем Ethernet-пакет

Подключение платы Марсоход к сети Ethernetf

Подключение к локальной сети может понадобится для различных задач.
В этой статье хочу рассмотреть самую простую операцию - передачу пакета Ethernet UDP платой Марсоход.

Для начала немного о стандарте Ethernet 10baseT.
Скорость передачи данных в этом режиме - 10Мбит.
Передача и прием данных происходят по двум разным парам кабеля UTP CAT5. В нашем случае понадобится только одна пара, предназначенная для передачи. В разъеме эта пара подключена к ножкам 1, 2.  Для того чтобы сообщить хабу или сетевой карте, к которой мы хотим подключить наше устройство, с какой скоростью мы будем передавать данные, существует специальный механизм - "Autonegotiation".
Для скорости 10Мбит нужно с периодичностью 16ms (+/- 8ms)  передавать в линию однополярный положительный импульс длительностью от 100 до 200ns. В результате этого на хабе (сетевой карте) должна загореться специальная лампочка, обозначающая, что к нему подключено 10Мбитное устройство.
Метод кодирования данных называется "Manchester". В нем каждый бит передаваемых данных кодируется последовательностью из двух бит несущей частоты. Для передачи "0" используется последовательность "1,0" а для "1" - "0,1". Для реализации такого алгоритма достаточно одного элемента XOR:
Логический элемент XOR
Кодирование кодом "Манчестер"

Данные передаются младшими битами вперед. Сам пакет должен начинаться со специального 8 - байтного префикса: 55h, 55h, 55h, 55h, 55h, 55h, 55h, D5h. Получается 63 бита - пилот и последний бит - это стартбит. Далее идут уже полезные данные, адрес получателя,отправителя и т.д. Более подробную информацию о различных типах  пакетов и их структуре, а также о том, какие пакеты реально "ходят" в вашей локальной сети можно узнать при помощи программы "Ethereal" (Теперь эта программа называется Wireshark).

Заканчивается пакет четырехбайтной контрольной суммой ( CRC32 ).
Кроме того существуют ограничения на минимальную и максимальную длину пакета, минимальная - 60 байт ( без префикса и CRC32 ).

Для практической реализации мы взяли конкретную задачу - контроль, при помощи нашего устройства, платы Марсоход, большого промышленного холодильника, находящегося в отдельно-стоящем здании.

Для подключения к сети, как уже ранее было сказано, нам понадобится всего одна пара. На плате Марсоход мы подключаем ее с пинам DP и DN.

К пинам f0..f5 мы будем подключать шесть датчиков температуры (DS18B20). Об измерении температуры этим датчиком у нас уже была статья.

Кроме того, нужна тактовая частота 10Мгц (меандр).  Для ее получения мы установили внешний кварцевый генератор на 80Мгц (можно какой-нибудь другой, из которого, целочисленным делением, можно получить 10Мгц ).

Подключение внешнего генератора к плате Марсоход

Для простоты, чтобы самим не изобретать значения различных полей в пакете, мы взяли за основу реальный пакет, отправленный программкой vdomsg.exe . Эта программка отправляет на IP-адрес, указанный в качестве параметра, тестовую строку.

Воспользовавшись программой Wireshark, мы перенесли все значения в константу C64X8.V - это файл на языке Verilog.

Таким образом, наш посылаемый пакет, до начала UDP-данных, будет всегда одинаковым.

Следующие четыре байта будут нести полезную нагрузку:
0    - Номер опрашиваемого датчика температуры
1    - Состояние кнопок key[3..0] (Для контроля дверей холодильника)
2,3 -  Результат измерения температуры одного из датчиков.

Созданый нами проект для платы Марсоход для Altera Quartus II можно взять здесь:

В этом же архиве есть исходный текст программы (MS Visual C++ 6.0) udp-marsohod.exe, которая используется для приема наших пакетов. Там же есть и уже скомпилированные утилиты.

Зашиваем проект программатором Quartus II и приступаем к лабораторным испытаниям:

Для приема пакетов мы использовали программу udp-mаrsohod.exe, которая показывает принятые данные на экране.

Опишу, что тут видно на этом видео.

Первый столбец это номер датчика температуры, от которого пришла информация, пакет UDP. Второй это состояние кнопочек на плате. Видно как поочередно нажимаем кнопочки и приходят числа 8, 4, 2, 1. Следующие два байта - значение температуры. Видно как оно меняется когда к датчику прикасаемся пальцами.

В лабораторных условиях мы опробовали два разных датчика температуры DS18B20 и DS1820. Кроме того, мы пробовали отнести датчик на расстояние 10м от устройства и увеличивали длину сетевого кабеля до 80м - все работает.

О результатах испытаний и эксплуатации на реальном объекте мы сообщим дополнительно.

 

Комментарии  

0 #47 Ю р и й 05.04.2016 05:41
Собственно, передающий модуль "eth_t". Поставьте, для начала, только его. Подайте на "enable" единичку, на данные, например, кнопки, на клок 10Мгц, но обязательно меандр, его можно сделать на "PLL".
В данном виде модуль передает пакет каждые 13 милисекунд и в нем четыре байта "полезной нагрузки".
Когда увидите на приемной стороне нажатие кнопок, тогда уже будете переделывать под себя
0 #46 Kemok 04.04.2016 20:13
Здравствуйте. Глянул проект, что-то все запутано. Я хочу сделать передачу по UDP с циклона. А тут заблудился в проекте. Подскажите где основная часть без кнопок. термометров?
0 #45 NguyenThang 08.09.2015 19:57
Здравствуйте!
подскажите, использует Qsys собрать систему для подключение и настройки генератор псевдослучайных чисел?
+1 #44 wolf 07.09.2015 09:52
Здравствуйте!
подскажите, где Вы взяли информацию о том, какой длительности импульс и с какой периодичностью нужно подавать, а так же информацию о кодировании, префиксе и т.д.?
+3 #43 andrey 26.06.2013 09:54
Все, разобрался. В конце каждого фрэйма необходимо генерить TP_IDL сигнал (300нс). Тогда все сетевухи работают..
0 #42 andrey 26.06.2013 04:49
спасибо, пауза побольше сделал, заработало. Передаю пакеты по 1056 байт. Проблемой остается то, что разные сетевые карты по разному их принимают(потер и от 60% до 0%) ((((
0 #41 umarsohod 25.06.2013 12:50
Цитирую andrey:
Подскажите пожалуйста, а можно ли между двумя импульсами autoneg передавать больше одного ethernet пакета? у меня видит первый, второй уже нет

Насколько я помню, при активном трафике эти импульсы не нужны.
В этом пороекте они вообще не вырабатываются - http://marsohod.org/index.php/projects/plata1/169-ethcam
0 #40 andrey 25.06.2013 08:57
Подскажите пожалуйста, а можно ли между двумя импульсами autoneg передавать больше одного ethernet пакета? у меня видит первый, второй уже нет
0 #39 Andrey 18.06.2013 18:57
у меня wireshark говорит что неправильная СRC - и показывает вместо нее последние 4 байта данных, в user space все работает.
В linux сетевая карта неправильно настраивается - нужно принудительно задавать настройки (speed 10 duplex full autoneg off) - после этого заводится..
0 #38 ОАО_МТС 14.06.2013 05:18
Цитирую ОАО_МТС:
хмм если только собирать raw data на sd, без распаковки.. c с распаковкой может не успеть..


это к 1 сообщению :)

а для контроля пакетов используйте wireshark, помогает нехило
0 #37 ОАО_МТС 14.06.2013 05:16
хмм если только собирать raw data на sd, без распаковки.. c с распаковкой может не успеть..
0 #36 Ю р и й 13.06.2013 07:55
Цитирую Andrey:
а данные больших размеров передавать не пробовали?
У нас ethernet пакет больше 100 байт на компе дает ошибки CRC, меньшие работают , да и то не на всех сетевухах

В этом проекте пакеты по 166 байт - http://marsohod.org/index.php/projects/plata1/169-ethcam
0 #35 Andrey 12.06.2013 21:02
а данные больших размеров передавать не пробовали?
У нас ethernet пакет больше 100 байт на компе дает ошибки CRC, меньшие работают , да и то не на всех сетевухах
0 #34 Ra3wum 15.12.2012 18:07
Возможно ли сделать аналогичный проект на 100Мбит на базе платы Марсоход2 без внешнего контроллера?
0 #33 Ю р и й 23.04.2012 07:54
Цитирую Ra3wum:
Здарвствуйте. В константе C64X8.V есть поля:
// Ethernet header

6'h08: q = 8'hff;// Ethernet Destination Address (if ff:ff:ff:ff:ff:ff - broadcast)

6'h09: q = 8'hff;

6'h0a: q = 8'hff;

6'h0b: q = 8'hff;

6'h0c: q = 8'hff;

6'h0d: q = 8'hff;

6'h0e: q = 8'h00;// Ethernet Source Address

6'h0f: q = 8'h55;

6'h10: q = 8'h22;

6'h11: q = 8'hB0;

6'h12: q = 8'h9d;

6'h13: q = 8'h39;

Что это за формат представления IP-адреса? IPv6 или IPv4?
Какой в данном случае там адрес прописан?

IP-адреса находятся в "IP header", последние четыре "FF" - это броадкаст, а перед ними 192.168.1.50(c0 ,a8,01,32) - адрес отправителя.
0 #32 Ra3wum 22.04.2012 16:30
Здарвствуйте. В константе C64X8.V есть поля:
// Ethernet header

6'h08: q = 8'hff;// Ethernet Destination Address (if ff:ff:ff:ff:ff: ff - broadcast)

6'h09: q = 8'hff;

6'h0a: q = 8'hff;

6'h0b: q = 8'hff;

6'h0c: q = 8'hff;

6'h0d: q = 8'hff;

6'h0e: q = 8'h00;// Ethernet Source Address

6'h0f: q = 8'h55;

6'h10: q = 8'h22;

6'h11: q = 8'hB0;

6'h12: q = 8'h9d;

6'h13: q = 8'h39;

Что это за формат представления IP-адреса? IPv6 или IPv4?
Какой в данном случае там адрес прописан?
0 #31 Ю р и й 29.02.2012 08:39
Цитирую andrijsd:
Скажите пожалуйста, если есть кварц на 50 МНz, то как полуцить тактовую частоту 10 МНz (меандр)?

К сожалению, непосредственно из 50 МНz получить
10МНz-меандр нельзя. Но, есть способ увеличить частоту
в два раза - http://forums.xilinx.com/xlnx/board/crawl_message?board.id=GenDis&message.id=9253.
Правда, на мой взгляд, несколько "левоватый", но работает, я пробовал.
У этого-же автора (Peter Alfke) есть UnusualClockDev iders.pdf, но эти схемки я не испытывал.
0 #30 andrijsd 28.02.2012 22:01
Скажите пожалуйста, если есть кварц на 50 МНz, то как полуцить тактовую частоту 10 МНz (меандр)?
0 #29 Кислый 13.02.2012 21:20
копетан ? может тогда не стоит нагружать плис ? а использовать mac+phy в одном флаконе ? стандартные интерфейсы в виде паралельной шины, +аппаратная фильтрация пакетов.. а mac уровень на плис можно только в ознакомительных целях самообразования .
+2 #28 Роман 18.01.2012 00:20
Можно немного усложнить схему, добавив отдельный PHY с трансформатором , это позволит и принимать пакеты
0 #27 Артур 16.12.2011 08:21
Добрый день.
В статье немного напутали с терминологией, строго говоря:
1. Протокол Ethernet - канального уровня, он не работает с пакетами, он работает с кадрами (frame), внутри которых протоколы сетевого уровня зашивают пакеты.
2. В вашем случае с пакетами (датаграммами) работает протокол IP. Соответственно, UDP-пакет зашивается в кадр Ethernet
0 #26 Ю р и й 02.12.2011 05:10
Цитирую Петр:
Добрый день.
Потихоньку разбираюсь с Ethernet. На сайте fpga4fun.com дан пример, где линия цепляется прямо к ногам платы Pluto. Вроде работает. Попозже проверю на деле и сообщу!

Вопрос такой(тупой, но гложет :lol: ). Есть 2 провода на передачу. Какие напряжения надо на них выставить, чтобы передать 0 или 1?

Коротко обясню как устроен приемник. Передаваемый сигнал, сначала,
проходит через разделительный трансформатор, который не пропускает постоянную
составляющую. Поэтому передавать можно только короткие импульсы (типа импульсов "Autonegotiation")
или специально модулированный сигнал. Самый простой способ подобной модуляции - "Manchester"
А затем поступает на вход диффиренциально го усилителя, поэтому, ни полярность, ни амплитуда сигнала
особого значения не имеет. Чувствительност ь диф-усилителя у разных производителей может быть разной,
но , я думаю, не хуже 100мв.
0 #25 Петр 02.12.2011 00:40
Добрый день.
Потихоньку разбираюсь с Ethernet. На сайте fpga4fun.com дан пример, где линия цепляется прямо к ногам платы Pluto. Вроде работает. Попозже проверю на деле и сообщу!

Вопрос такой(тупой, но гложет :lol: ). Есть 2 провода на передачу. Какие напряжения надо на них выставить, чтобы передать 0 или 1?
0 #24 Владимир 09.11.2011 09:39
по витой паре гуляет напряжение +\- 1 В. Но можно воспользоваться схемотехникой сетевух и смело подать 3.3 в витуху. А принимать.. в данном сигнале мы работаем с udp траффиком там ниче не надо принимать :)
0 #23 Ю р и й 07.11.2011 10:36
Цитирую Петр:
Добрый день!

Получается, что Вы напрямую подсоединяете плату к сети? Т.е. нога камня напрямую считывает данные с сетевого провода? Не подскажете размах сигнала в витой паре - что то не получается найти данную информацию... :-)

"Напрямую" считывать данные с сетевого провода скорее всего не получится. Во-первых, амплитуда там
небольшая, я думаю, 1..2 В. Во-вторых, после разделительного трансформатора, сигнал двухполярный.
Когда-то подключал сетевую пару к циклону. Один провод сразу к ножке, второй к делителю напряжения
между VCC и GND (подстроечному резистору). Смотрел сигналтапом, и подбирал напряжение на делителе,
чтобы ширина импкльсов в "пилоте" была одинаковой. В принципе, пакеты принимать можно,
но такой метод подходит только для экспериментов. На практике, нужно ставить какой-нибудь входной
буффер - типа - операционник, компаратор, LVDS и т.д.
0 #22 Петр 04.11.2011 23:10
Добрый день!

Получается, что Вы напрямую подсоединяете плату к сети? Т.е. нога камня напрямую считывает данные с сетевого провода? Не подскажете размах сигнала в витой паре - что то не получается найти данную информацию... :-)
0 #21 Ю р и й 15.05.2011 10:52
Цитирую A.P.:
Хочу прояснить несколько моментов. С сигналом TX вроде все понятно, а какое значение принимает сигнал TN? Я так понял он нужен во время autonegotiation, а в остальное время? GND? И второе, правильно ли я понял, что данные начинают передаваться сразу после синхроимпульса с нулевого значения счетчика? Тогда при каком значении счетчика пакет будет полностью передан(я думаю c64x8+32 бита) и что дальше?

Для поддержания "Autonegotiatio n", каждые 13мс на линии "TX_P"
вырабатывается положительный импульс длительностью 100нс. В промежутке между
этими импульсами (в серидине, когда "q[16]" = "1"), и в случае, если установлен
флаг "enable", передается пакет общей длинной 72 байта(8+60+4), после чего
флаг "enable" сбрасывается.
0 #20 A.P. 15.05.2011 10:10
Хочу прояснить несколько моментов. С сигналом TX вроде все понятно, а какое значение принимает сигнал TN? Я так понял он нужен во время autonegotiation , а в остальное время? GND? И второе, правильно ли я понял, что данные начинают передаваться сразу после синхроимпульса с нулевого значения счетчика? Тогда при каком значении счетчика пакет будет полностью передан(я думаю c64x8+32 бита) и что дальше?
0 #19 Кислый 14.05.2011 14:29
http://www.teralink.ru/?do=printt&id=2

http://www.ixbt.com/comm/tech-fast-ethernet.shtml

http://www.ieee802.org/
0 #18 A.P. 14.05.2011 12:02
А реально собрать на конструкторе передачу 100Мбит? И где можно почитать на тему 100baseTX?
0 #17 Кислый 03.04.2011 11:35
хочется еще с платкой поиграться ))
0 #16 Кислый 03.04.2011 11:34
Какую литературу по этому вопросу посоветуете ? именно по Ethernet'у
0 #15 ю р и й 03.04.2011 10:37
Цитирую Кислый:
хмм.. я чего-то не догоняю !!
перед тем как загнать линию пакет он должен быть зашифрован по MLT-3. т.е. фактически смодулирован с переменку. здесь мы обходимся без этого.. как ?

В 10baseT кодирование двухуровневое, и меандра 10мгц и
одного элемента XOR - достаточно.
0 #14 Кислый 03.04.2011 10:30
хмм.. я чего-то не догоняю !!
перед тем как загнать линию пакет он должен быть зашифрован по MLT-3. т.е. фактически смодулирован с переменку. здесь мы обходимся без этого.. как ?
+2 #13 Ржавый 04.03.2011 04:34
Поздравляю с выходом из анабиоза! :lol: Ethereal уже пятый год как WireShark :-*
0 #12 fhunter 03.03.2011 21:08
Цитирую Сергей:
Скажите, а нет ли у Вас разработок на Ethernet 100baseT. И вообще реально ли в недорогом ценовом диапазоне разработать такое устройство?
http://www.terraelectronica.ru/news_made.php?ID=15
Проверяли - прогоняет через себя где-то 12 мбит.
-1 #11 Ю р и й 02.03.2011 06:26
Цитирую 3ABXO3:
Цитирую Ю р и й:
...
Гораздо сложнее отвечать на пакет,т.к. в плиз очень
мало места для хранения пакета, сдесь есть над чем подумать.


может стоит
перейти на epm570 ?

Для выбора элементной базы,я думаю,
следует отталкиваться от конкретной задачи.
0 #10 3ABXO3 02.03.2011 06:08
Цитирую Ю р и й:
...
Гораздо сложнее отвечать на пакет,т.к. в плиз очень
мало места для хранения пакета, сдесь есть над чем подумать.


может стоит
перейти на epm570 ?
0 #9 Ю р и й 02.03.2011 05:53
Цитирую 3ABXO3:
Цитирую Ю р и й:

Все параметры передаваемого пакета, кроме UDP_DATA
фиксированные и находятся в константе C64X8.V
В нашем случае - броадкаст на 259 порт.
Много полезной информации дает Ethereal,- рекомендую.

это понятно есть еще commview и т.д.
как задачу на оборот решить что бы плис пакеты принимала

Это совсем другая история. У меня есть заготовка
проекта для приема пакета и его анализа "на лету",
можно ,например, зажигать светодиодики. Не придумал
для этого практической задачи - придумаю - опубликую.
Гораздо сложнее отвечать на пакет,т.к. в плиз очень
мало места для хранения пакета, сдесь есть над чем подумать.
0 #8 3ABXO3 02.03.2011 05:14
Цитирую Ю р и й:

Все параметры передаваемого пакета, кроме UDP_DATA
фиксированные и находятся в константе C64X8.V
В нашем случае - броадкаст на 259 порт.
Много полезной информации дает Ethereal,- рекомендую.

это понятно есть еще commview и т.д.
как задачу на оборот решить что бы плис пакеты принимала
0 #7 Ю р и й 25.02.2011 05:48
Цитирую 3ABXO3:
а как принимать этот пакет ПЛИС?

Все параметры передаваемого пакета, кроме UDP_DATA
фиксированные и находятся в константе C64X8.V
В нашем случае - броадкаст на 259 порт.
Много полезной информации дает Ethereal,- рекомендую.
0 #6 3ABXO3 25.02.2011 04:07
а как принимать этот пакет ПЛИС?
0 #5 Никита 07.01.2011 18:30
Цитирую Александр:
А возможно ли на этой плате сделать сниффер?

Не, на этой плате однозначно нельзя сделать сниффер. Это так... демонстрационна я плата. Для реальной задачи нужно брать некое устройство с сетевым интерфейсом и соединиться по общей шине с анализируемой сетью.
0 #4 Ю р и й 06.11.2010 06:07
Нужен внешний чип, например RTL8201,а далле всё
зависит от задачи, если такая, как описана в статье,
то подходит и EPM240.
0 #3 Сергей 05.11.2010 23:08
Скажите, а нет ли у Вас разработок на Ethernet 100baseT. И вообще реально ли в недорогом ценовом диапазоне разработать такое устройство?
0 #2 nckm 23.10.2010 04:01
Цитирую Александр:
А возможно ли на этой плате сделать сниффер?

смотря что вы подразумеваете под словом "сниффер".
В этом проекте используется передача со скоростью 10Мбит/cек. Вот с такой скоростью можно и принимать и как-то анализировать принятые пакеты.
0 #1 Александр 22.10.2010 23:07
А возможно ли на этой плате сделать сниффер?

Добавить комментарий


Защитный код
Обновить


GitHub YouTube Twitter
Вы здесь: Начало Проекты Проект Марсоход Передаем Ethernet-пакет