Добро пожаловать, Гость
Логин: Пароль: Запомнить меня

ТЕМА: Минималистичный FS USB-хост для клавиатуры

Минималистичный FS USB-хост для клавиатуры 9 года 2 мес. назад #5763

Таки Вы решили свой Ethernet контроллер запилить с блэкджеком и PHY и блоком управления Ethernet фреймами?

По моему скромному мнению это имеет смысл если собираетесь со временем воплотить проект в кремнии, а для DIY проще использовать готовый контроллер. В принципе, контроллер на HDL может быть интересен в виде анализатора сети - коллизии посчитать, запротоколировать какой-либо обмен или, не дай бог, засниффить чего-нибудь приватное.

А как собираетесь MAC адрес устанавливать? Что дальше делать с Ethernet пакетом? Что делать с броадкастом? А ведь кроме IP поверх Ethernet ещё добрый десяток протоколов может бегать. И отлаживать это дело морока страшная - на другой стороне чтобы добраться до Ethernet пакетов придётся сильно сильно постараться, потому как этот уровень хорошо спрятан от пользователя. А если добавлять IP/UDP поддержку, т.е. "гвоздями прибить" (заранее прописать формат пакетов, меняя лишь поля в заголовке и payload), то получится неуниверсальное решение - шаг вправо, шаг влево - работать не будет.
Про TCP вообще речь не веду - задача реализации TCP на HDL настолько нетривиальная, что спецслужбы памятник при жизни поставят тому, кто это реализует. И на руках носить будут. И окружат заботой. И будет за нами наблюдать какая-нибудь Система Оперативно-Розыскных мероприятий версии 6.

В общем, задачка не для "выходного дня". Я не отговариваю - просто для поддержания разговора.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Минималистичный FS USB-хост для клавиатуры 9 года 2 мес. назад #5770

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
Только UDP, как замена UART, для связи с ПК, как проводной, так и беспроводной. 100base-tx дает ~~10Мбайт/сек, готовые решения с UART столько не дают (тем более беспроводные).

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Leka.

Минималистичный FS USB-хост для клавиатуры 9 года 2 мес. назад #5772

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
Поменял аналоговую часть(5 резисторов) - 0 ошибок в ~128Кбит idle-выборке - даже подозрительно, тк семплирование на частоте 250МГц с минимальной обработкой. Вся обработка пока на ПК, ПЛИС просто записывает семплы в память (~500Кбит), а потом передает в ПК. Теперь запись-расшифровка рабочих пакетов...

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Leka.

Минималистичный FS USB-хост для клавиатуры 9 года 2 мес. назад #5827

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
Наконец-то увидел IPv4 кадры...
100base-tx, это всего ~10Мбайт/сек, но со сложным протоколом, поэтому проще сохранять все пакеты в кольцевом буфере, а мелким 100МГц софт-процессором разгребать их. Проблемой оказалось выделение пакетов из непрерывного idle-потока с ошибками. Idle-поток, это повторяющаяся псевдослучайная 2047-битная последовательность (генерируемая при помощи LFSR, см. статью на этом сайте). Тк подстройки частоты семплирования у меня нет, то появляются регулярные ошибки. Семплирование с 2х-кратной частотой позволяет организовать 2 канала приема со сдвинутой фазой, и когда в одном канале идут ошибки (из-за неудачной фазы клока), в другом их нет. Но из-за ошибок теряется синхронизация LFSR-генераторов, и как следствие - сложно отличить idle-поток от потока данных. Вот эту проблему и решал целую неделю... Сейчас дизайн в ПЛИС сохраняет во внутренней памяти только исправные(по предварительной оценке) пакеты данных, и по заполнению буфера передает их в ПК. Ресурсы(кроме блочной памяти и модуля связи с ПК): ~500 ЛЕ на фильтрацию по 2 независимым каналам. Софт-процессор занимает ~200 ЛЕ, так что в окончательном варианте ожидается ~700 ЛЕ на реализацию 100base-tx в ПЛИС без внешних микросхем.

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

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Leka.

Минималистичный FS USB-хост для клавиатуры 9 года 2 мес. назад #5839

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54

Leka пишет: Сейчас разбираюсь в структуре пакетов, раньше никогда этим не занимался.

Более менее понятно стало - видно, как комп сливает что-то в M$.

Снял процесс автосогласования. Но в Википедии написано, что это опционально. Можно не заморачиваться с автосогласованием, и сразу начинать слать idle-поток по любой паре - пусть копм (или роутер) сам разбирается ?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Минималистичный FS USB-хост для клавиатуры 9 года 2 мес. назад #5863

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
Заработало "автосогласование". В кавычках, тк ПЛИС просто отправляла все принятое обратно с установленным битом "ack". Протокол "автосогласования" при этом получается странным (отличается от автосогласования компа с роутером), но в итоге комп сообщает, что установлено соединение 100Мбит/сек. Теперь буду пробовать что-нибудь послать/принять...

UPD. Можно и без автосогласования - сразу начать выдавать idle-поток. С этого и начинал, но не заработало из-за дурацкой ошибки. Сейчас заработало.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Leka.

Минималистичный FS USB-хост для клавиатуры 9 года 2 мес. назад #5916

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
Долго дурацкие ошибки не мог в железе выловить.
Сейчас заработал прием пакетов (от компа или Wi-Fi роутера).
ПЛИС семплирует сигнал (с трансформатора) на 2х-кратной частоте (250МГц), синхронизирует прием, и записывает в буфер только полезные данные, кадр от JK до TR, выбрасывая idle-поток.
С компа по virtual-jtag можно посмотреть содержимое буфера.
Автосогласование при работе на 100Мбит/сек не требуется.

Теперь софт-процессор подключать, и разбираться с протоколами верхнего уровня.

UPD. Достаточно оказалось одного канала приема, так что реализация 100base-tx потребует ~ 400 ЛЕ (включая софт-процессор).

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Leka.

Минималистичный FS USB-хост для клавиатуры 9 года 2 мес. назад #5918

  • 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.

Минималистичный FS USB-хост для клавиатуры 9 года 1 мес. назад #5941

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
Уф, наконец-то заработала передача (опять долго не мог выловить дурацкие ошибки).
Пока без софт-процессора, просто непрерывно вываливал из внутренней памяти подготовленные UDP-пакеты.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Минималистичный FS USB-хост для клавиатуры 9 года 1 мес. назад #5954

  • Leka
  • 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 секунд
Работает на Kunena форум