-
alman
-
-
Не в сети
-
Завсегдатай
-
-
Сообщений: 263
-
Спасибо получено: 41
-
-
-
-
-
|
Таки Вы решили свой Ethernet контроллер запилить с блэкджеком и PHY и блоком управления Ethernet фреймами?
По моему скромному мнению это имеет смысл если собираетесь со временем воплотить проект в кремнии, а для DIY проще использовать готовый контроллер. В принципе, контроллер на HDL может быть интересен в виде анализатора сети - коллизии посчитать, запротоколировать какой-либо обмен или, не дай бог, засниффить чего-нибудь приватное.
А как собираетесь MAC адрес устанавливать? Что дальше делать с Ethernet пакетом? Что делать с броадкастом? А ведь кроме IP поверх Ethernet ещё добрый десяток протоколов может бегать. И отлаживать это дело морока страшная - на другой стороне чтобы добраться до Ethernet пакетов придётся сильно сильно постараться, потому как этот уровень хорошо спрятан от пользователя. А если добавлять IP/UDP поддержку, т.е. "гвоздями прибить" (заранее прописать формат пакетов, меняя лишь поля в заголовке и payload), то получится неуниверсальное решение - шаг вправо, шаг влево - работать не будет.
Про TCP вообще речь не веду - задача реализации TCP на HDL настолько нетривиальная, что спецслужбы памятник при жизни поставят тому, кто это реализует. И на руках носить будут. И окружат заботой. И будет за нами наблюдать какая-нибудь Система Оперативно-Розыскных мероприятий версии 6.
В общем, задачка не для "выходного дня". Я не отговариваю - просто для поддержания разговора.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
Leka
-
Автор темы
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
Только UDP, как замена UART, для связи с ПК, как проводной, так и беспроводной. 100base-tx дает ~~10Мбайт/сек, готовые решения с UART столько не дают (тем более беспроводные).
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от Leka.
|
-
Leka
-
Автор темы
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
Поменял аналоговую часть(5 резисторов) - 0 ошибок в ~128Кбит idle-выборке - даже подозрительно, тк семплирование на частоте 250МГц с минимальной обработкой. Вся обработка пока на ПК, ПЛИС просто записывает семплы в память (~500Кбит), а потом передает в ПК. Теперь запись-расшифровка рабочих пакетов...
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от Leka.
|
-
Leka
-
Автор темы
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
Наконец-то увидел IPv4 кадры...
100base-tx, это всего ~10Мбайт/сек, но со сложным протоколом, поэтому проще сохранять все пакеты в кольцевом буфере, а мелким 100МГц софт-процессором разгребать их. Проблемой оказалось выделение пакетов из непрерывного idle-потока с ошибками. Idle-поток, это повторяющаяся псевдослучайная 2047-битная последовательность (генерируемая при помощи LFSR, см. статью на этом сайте). Тк подстройки частоты семплирования у меня нет, то появляются регулярные ошибки. Семплирование с 2х-кратной частотой позволяет организовать 2 канала приема со сдвинутой фазой, и когда в одном канале идут ошибки (из-за неудачной фазы клока), в другом их нет. Но из-за ошибок теряется синхронизация LFSR-генераторов, и как следствие - сложно отличить idle-поток от потока данных. Вот эту проблему и решал целую неделю... Сейчас дизайн в ПЛИС сохраняет во внутренней памяти только исправные(по предварительной оценке) пакеты данных, и по заполнению буфера передает их в ПК. Ресурсы(кроме блочной памяти и модуля связи с ПК): ~500 ЛЕ на фильтрацию по 2 независимым каналам. Софт-процессор занимает ~200 ЛЕ, так что в окончательном варианте ожидается ~700 ЛЕ на реализацию 100base-tx в ПЛИС без внешних микросхем.
Сейчас разбираюсь в структуре пакетов, раньше никогда этим не занимался.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от Leka.
|
-
Leka
-
Автор темы
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
Leka пишет: Сейчас разбираюсь в структуре пакетов, раньше никогда этим не занимался.
Более менее понятно стало - видно, как комп сливает что-то в M$.
Снял процесс автосогласования. Но в Википедии написано, что это опционально. Можно не заморачиваться с автосогласованием, и сразу начинать слать idle-поток по любой паре - пусть копм (или роутер) сам разбирается ?
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
Leka
-
Автор темы
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
Заработало "автосогласование". В кавычках, тк ПЛИС просто отправляла все принятое обратно с установленным битом "ack". Протокол "автосогласования" при этом получается странным (отличается от автосогласования компа с роутером), но в итоге комп сообщает, что установлено соединение 100Мбит/сек. Теперь буду пробовать что-нибудь послать/принять...
UPD. Можно и без автосогласования - сразу начать выдавать idle-поток. С этого и начинал, но не заработало из-за дурацкой ошибки. Сейчас заработало.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от Leka.
|
-
Leka
-
Автор темы
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
Долго дурацкие ошибки не мог в железе выловить.
Сейчас заработал прием пакетов (от компа или Wi-Fi роутера).
ПЛИС семплирует сигнал (с трансформатора) на 2х-кратной частоте (250МГц), синхронизирует прием, и записывает в буфер только полезные данные, кадр от JK до TR, выбрасывая idle-поток.
С компа по virtual-jtag можно посмотреть содержимое буфера.
Автосогласование при работе на 100Мбит/сек не требуется.
Теперь софт-процессор подключать, и разбираться с протоколами верхнего уровня.
UPD. Достаточно оказалось одного канала приема, так что реализация 100base-tx потребует ~ 400 ЛЕ (включая софт-процессор).
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от Leka.
|
-
Leka
-
Автор темы
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
Комп отправляет UDP-пакеты без ARP-запросов, если предварительно с консоли выполнить команду:
arp -s ...
Но это действует короткое время, потом таблица сбрасывается.
Как на Си обходить эти ограничения, чтобы посылать/принимать UDP-пакеты без лишних заморочек с ARP и тп ? И где лучше смотреть примеры программ (GCC, WinXP) ?
"Hello,World!" по UDP: #include <winsock2.h>
#pragma comment(lib,"Ws2_32.lib")
main(){
WSADATA WsaData;
int sock;
struct sockaddr_in sa;
const char* buffer = "Hello,World!";
int bytes_sent;
WSAStartup(0x0202, &WsaData);
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = htonl(0xC0010102);
sa.sin_port = htons(7654);
bytes_sent = sendto(sock, buffer, strlen(buffer)+1, 0, (struct sockaddr*)&sa, sizeof(struct sockaddr_in));
closesocket(socket);
WSACleanup();
printf( "sent %d\n", bytes_sent);
} Надо как-то привязать условный 192.1.1.2 к условному MAC-адресу, чтобы комп не рассылал ARP-запросы... Как это сделать в программе?
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от Leka.
|
-
Leka
-
Автор темы
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
Уф, наконец-то заработала передача (опять долго не мог выловить дурацкие ошибки).
Пока без софт-процессора, просто непрерывно вываливал из внутренней памяти подготовленные UDP-пакеты.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
Leka
-
Автор темы
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
Понадобился crc32, в инете везде простыни на 100 строк...
Выкладываю параметриpуемый (переписан из Си-кода, взятого с Википедии): module crc32(clk,en,d,q);
localparam N=8, P=32'hEDB88320;
input clk,en;
input [N-1:0] d;
output [31:0] q;
integer i;
reg [31:0] c;
always@(posedge clk)begin
if(en) for(i=0;i<N;i=i+1) c=(c^d[i])&1?(c>>1)^P:c>>1;
else c=~0;
end
assign q=~c;
endmodule Квартус нормально синтезирует подобный код (тут localparam, иначе Icarus Verilog не понимает).
И тестбенч для Icarus Verilog, стандартная проверочная строка"123456789": module tb();
reg clk=0; always #1 clk<=~clk;
reg en;
reg [7:0] d;
wire [31:0] q;
crc32 crc(clk,en,d,q);
always begin
@(posedge clk); d<="1"; en<=1;
@(posedge clk); d<="2";
@(posedge clk); d<="3";
@(posedge clk); d<="4";
@(posedge clk); d<="5";
@(posedge clk); d<="6";
@(posedge clk); d<="7";
@(posedge clk); d<="8";
@(posedge clk); d<="9";
@(posedge clk); $strobe("crc32=%x",q);
@(posedge clk); $finish;
end
endmodule
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от Leka.
|
Время создания страницы: 0.189 секунд