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

Если спросить гугл, то - ru.wikibrief.org/.../...
6'h20: q = 8'hb8;
6'h21: q = 8'hfe;
в IP заголовке?
Я так понимаю она считается из 20-ти байт заголовка. Но каким образом или методом? Пробую в онлайн-калькуля торах crc16, не выходит такая контрольная сумма. Можете пояснить как я могу получить эту контрольную сумму и как называется метод ее расчета?
В данном виде модуль передает пакет каждые 13 милисекунд и в нем четыре байта "полезной нагрузки".
Когда увидите на приемной стороне нажатие кнопок, тогда уже будете переделывать под себя
подскажите, использует Qsys собрать систему для подключение и настройки генератор псевдослучайных чисел?
подскажите, где Вы взяли информацию о том, какой длительности импульс и с какой периодичностью нужно подавать, а так же информацию о кодировании, префиксе и т.д.?
Насколько я помню, при активном трафике эти импульсы не нужны.
В этом пороекте они вообще не вырабатываются - marsohod.org/.../169-ethcam
В linux сетевая карта неправильно настраивается - нужно принудительно задавать настройки (speed 10 duplex full autoneg off) - после этого заводится..
это к 1 сообщению :)
а для контроля пакетов используйте wireshark, помогает нехило
В этом проекте пакеты по 166 байт - marsohod.org/.../169-ethcam
У нас ethernet пакет больше 100 байт на компе дает ошибки CRC, меньшие работают , да и то не на всех сетевухах
IP-адреса находятся в "IP header", последние четыре "FF" - это броадкаст, а перед ними 192.168.1.50(c0 ,a8,01,32) - адрес отправителя.
// 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?
Какой в данном случае там адрес прописан?
К сожалению, непосредственно из 50 МНz получить
10МНz-меандр нельзя. Но, есть способ увеличить частоту
в два раза - forums.xilinx.com/.../....
Правда, на мой взгляд, несколько "левоватый", но работает, я пробовал.
У этого-же автора (Peter Alfke) есть UnusualClockDev iders.pdf, но эти схемки я не испытывал.
В статье немного напутали с терминологией, строго говоря:
1. Протокол Ethernet - канального уровня, он не работает с пакетами, он работает с кадрами (frame), внутри которых протоколы сетевого уровня зашивают пакеты.
2. В вашем случае с пакетами (датаграммами) работает протокол IP. Соответственно, UDP-пакет зашивается в кадр Ethernet
Коротко обясню как устроен приемник. Передаваемый сигнал, сначала,
проходит через разделительный трансформатор, который не пропускает постоянную
составляющую. Поэтому передавать можно только короткие импульсы (типа импульсов "Autonegotiation")
или специально модулированный сигнал. Самый простой способ подобной модуляции - "Manchester"
А затем поступает на вход диффиренциально го усилителя, поэтому, ни полярность, ни амплитуда сигнала
особого значения не имеет. Чувствительност ь диф-усилителя у разных производителей может быть разной,
но , я думаю, не хуже 100мв.
Потихоньку разбираюсь с Ethernet. На сайте fpga4fun.com дан пример, где линия цепляется прямо к ногам платы Pluto. Вроде работает. Попозже проверю на деле и сообщу!
Вопрос такой(тупой, но гложет
"Напрямую" считывать данные с сетевого провода скорее всего не получится. Во-первых, амплитуда там
небольшая, я думаю, 1..2 В. Во-вторых, после разделительного трансформатора, сигнал двухполярный.
Когда-то подключал сетевую пару к циклону. Один провод сразу к ножке, второй к делителю напряжения
между VCC и GND (подстроечному резистору). Смотрел сигналтапом, и подбирал напряжение на делителе,
чтобы ширина импкльсов в "пилоте" была одинаковой. В принципе, пакеты принимать можно,
но такой метод подходит только для экспериментов. На практике, нужно ставить какой-нибудь входной
буффер - типа - операционник, компаратор, LVDS и т.д.
Получается, что Вы напрямую подсоединяете плату к сети? Т.е. нога камня напрямую считывает данные с сетевого провода? Не подскажете размах сигнала в витой паре - что то не получается найти данную информацию...
Для поддержания "Autonegotiatio n", каждые 13мс на линии "TX_P"
вырабатывается положительный импульс длительностью 100нс. В промежутке между
этими импульсами (в серидине, когда "q[16]" = "1"), и в случае, если установлен
флаг "enable", передается пакет общей длинной 72 байта(8+60+4), после чего
флаг "enable" сбрасывается.
ixbt.com/.../...
www.ieee802.org/
В 10baseT кодирование двухуровневое, и меандра 10мгц и
одного элемента XOR - достаточно.
перед тем как загнать линию пакет он должен быть зашифрован по MLT-3. т.е. фактически смодулирован с переменку. здесь мы обходимся без этого.. как ?
Проверяли - прогоняет через себя где-то 12 мбит.
Для выбора элементной базы,я думаю,
следует отталкиваться от конкретной задачи.
может стоит
перейти на epm570 ?
Это совсем другая история. У меня есть заготовка
проекта для приема пакета и его анализа "на лету",
можно ,например, зажигать светодиодики. Не придумал
для этого практической задачи - придумаю - опубликую.
Гораздо сложнее отвечать на пакет,т.к. в плиз очень
мало места для хранения пакета, сдесь есть над чем подумать.
это понятно есть еще commview и т.д.
как задачу на оборот решить что бы плис пакеты принимала
Все параметры передаваемого пакета, кроме UDP_DATA
фиксированные и находятся в константе C64X8.V
В нашем случае - броадкаст на 259 порт.
Много полезной информации дает Ethereal,- рекомендую.
Не, на этой плате однозначно нельзя сделать сниффер. Это так... демонстрационна я плата. Для реальной задачи нужно брать некое устройство с сетевым интерфейсом и соединиться по общей шине с анализируемой сетью.
зависит от задачи, если такая, как описана в статье,
то подходит и EPM240.
смотря что вы подразумеваете под словом "сниффер".
В этом проекте используется передача со скоростью 10Мбит/cек. Вот с такой скоростью можно и принимать и как-то анализировать принятые пакеты.