|
Ethernet на ПЛИС, PHY+MAC+UDP/IP |
|
|
|
Sep 4 2014, 07:56
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 6-03-14
Из: Зеленоград
Пользователь №: 80 823

|
Собрал проект, реализующий Ethernet (PHY+MAC+UDP/IP). Я формирую на ПЛИС'ке данные, которые хочу подать, на UDP. При отвправке самого первого пакета при выставлении сигнала sof, UDP/IP stack формирует arp запрос получателю, далее приходит отправителю ответ и после UDP/IP выствляет сигнал dst_rdy, который говорит о том что блок UDP/IP готов к приему данных для отправки. При передаче остальных пакетов сигнал dst_rdy выставляется почти сразу же после выставления sof (промежуток времени между их выставлением равен длине формируемого заголовка). Проблема заключается в следующем. При отправке самого первого пакета сигнал dst_rdy выставляется не сразу, может выставиться аж через 3-5 мин, может меньше может больше, а может и не выставиться. Но после того как это произошло (установилось видимо связь) дальнейшая передача пакетов происходит исправно. Кстати проблема возникает не всегда, например когда проверяю работу на 100 Мбит, зачастую передача работает и редко такое возникает, а когда проверяю на 1gb то наоборот зачастую не работает и только редко начинает работать сразу. Помогите разобраться с этим, буду очень признателен).
Могу выложить описание автомата формир отправку и диаграммы
|
|
|
|
|
 |
Ответов
|
Jun 22 2015, 18:39
|
Знающий
   
Группа: Свой
Сообщений: 555
Регистрация: 14-10-09
Пользователь №: 52 939

|
Основные параметры Код localparam SIZE_ETHER_HDR = 14; localparam SIZE_IP_HDR = 20; localparam SIZE_UDP_HDR = 8;
localparam UDP_PROTO = 8'h11; localparam ETH_TYPE = 16'h0800; localparam IP_VER = 8'h45; localparam IP_TTL = 8'hFF;
assign {ip_hdr_ver_hlen} = IP_VER; assign {ether_hdr_type_code[1],ether_hdr_type_code[0]} = ETH_TYPE; assign ip_hdr_proto = UDP_PROTO; assign ip_hdr_ttl = IP_TTL; Расчет чек суммы для IP и UDP Код module udp_check_summ ( input iclk, input [15:0] packet_in, output [15:0] check_summ_out, input data_valid, input sop );
logic [15:0] accum_rg; logic [16:0] carry_check; logic carry_16; assign carry_check = accum_rg + packet_in; assign check_summ_out = 16'hFFFF - accum_rg; /// always_ff @ (posedge iclk) begin // if (sop && data_valid) // accum_rg <= packet_in; // else if (sop && !data_valid) if (sop) accum_rg <= '0; else begin if(data_valid) begin accum_rg <= accum_rg + packet_in + carry_check[16]; end end end
endmodule Далее просто заполнить поля вашими значениями Код if(avs_s0_write && avs_s0_chipselect) begin unique case(avs_s0_address) `ADDR_ETHER_DEST_MAC_0 : ether_hdr_da[0] <= avs_s0_writedata[7:0]; `ADDR_ETHER_DEST_MAC_1 : ether_hdr_da[1] <= avs_s0_writedata[7:0]; `ADDR_ETHER_DEST_MAC_2 : ether_hdr_da[2] <= avs_s0_writedata[7:0]; `ADDR_ETHER_DEST_MAC_3 : ether_hdr_da[3] <= avs_s0_writedata[7:0]; `ADDR_ETHER_DEST_MAC_4 : ether_hdr_da[4] <= avs_s0_writedata[7:0]; `ADDR_ETHER_DEST_MAC_5 : ether_hdr_da[5] <= avs_s0_writedata[7:0]; `ADDR_ETHER_SOURCE_MAC_0 : ether_hdr_sa[0] <= avs_s0_writedata[7:0]; `ADDR_ETHER_SOURCE_MAC_1 : ether_hdr_sa[1] <= avs_s0_writedata[7:0]; `ADDR_ETHER_SOURCE_MAC_2 : ether_hdr_sa[2] <= avs_s0_writedata[7:0]; `ADDR_ETHER_SOURCE_MAC_3 : ether_hdr_sa[3] <= avs_s0_writedata[7:0]; `ADDR_ETHER_SOURCE_MAC_4 : ether_hdr_sa[4] <= avs_s0_writedata[7:0]; `ADDR_ETHER_SOURCE_MAC_5 : ether_hdr_sa[5] <= avs_s0_writedata[7:0]; /// `ADDR_IP_TOS : {ip_hdr_tos[1], ip_hdr_tos[0]} <= avs_s0_writedata[15:0]; //`ADDR_IP_TLEN : {ip_hdr_tlen[1],ip_hdr_tlen[0]} <= avs_s0_writedata[15:0]; `ADDR_IP_ID : {ip_hdr_id[1],ip_hdr_id[0]} <= avs_s0_writedata[15:0]; `ADDR_IP_FRAG_OFF_ : {ip_hdr_frag_off[1],ip_hdr_frag_off[0]} <= avs_s0_writedata[15:0]; `ADDR_IP_SOURCE_ADDRESS : {ip_hdr_sa[3],ip_hdr_sa[2],ip_hdr_sa[1],ip_hdr_sa[0]} <= avs_s0_writedata; `ADDR_IP_DEST_ADDRESS : {ip_hdr_da[3],ip_hdr_da[2],ip_hdr_da[1],ip_hdr_da[0]} <= avs_s0_writedata; /// `ADDR_UDP_SOURCE_PORT : {udp_hdr_sp[1],udp_hdr_sp[0]} <= avs_s0_writedata[15:0]; `ADDR_UDP_DEST_PORT : {udp_hdr_dp[1],udp_hdr_dp[0]} <= avs_s0_writedata[15:0]; endcase end UPD: Структура для IP чек суммы Код always_comb begin case (cnt_check_words) 0: next_check_ipv4_word = {ip_hdr_ver_hlen, ip_hdr_tos}; 1: next_check_ipv4_word = {ip_hdr_tlen[1],ip_hdr_tlen[0]}; 2: next_check_ipv4_word = {ip_hdr_id[1],ip_hdr_id[0]}; 3: next_check_ipv4_word = {ip_hdr_frag_off[1],ip_hdr_frag_off[0]}; 4: next_check_ipv4_word = {ip_hdr_ttl,ip_hdr_proto}; 5: next_check_ipv4_word = {ip_hdr_sa[3],ip_hdr_sa[2]}; 6: next_check_ipv4_word = {ip_hdr_sa[1],ip_hdr_sa[0]}; 7: next_check_ipv4_word = {ip_hdr_da[3],ip_hdr_da[2]}; 8: next_check_ipv4_word = {ip_hdr_da[1],ip_hdr_da[0]}; default: next_check_ipv4_word = '0; endcase end Структура для UDP чек суммы (если не хотите возиться с ней то можно занулить) Код case (cnt_check_words) //udp pseudo header 0: next_check_udp_word = {ip_hdr_sa[3],ip_hdr_sa[2]}; 1: next_check_udp_word = {ip_hdr_sa[1],ip_hdr_sa[0]}; 2: next_check_udp_word = {ip_hdr_da[3],ip_hdr_da[2]}; 3: next_check_udp_word = {ip_hdr_da[1],ip_hdr_da[0]}; 4: next_check_udp_word = {16'h00,ip_hdr_proto}; 5: next_check_udp_word = {udp_hdr_len[1],udp_hdr_len[0]}; //udp header 6: next_check_udp_word = {udp_hdr_sp[1],udp_hdr_sp[0]}; 7: next_check_udp_word = {udp_hdr_dp[1],udp_hdr_dp[0]}; 8: next_check_udp_word = {udp_hdr_len[1],udp_hdr_len[0]}; default: next_check_udp_word = данные;
|
|
|
|
Сообщений в этой теме
Alexey_pashinov Ethernet на ПЛИС Sep 4 2014, 07:56 billidean При отправке самого первого пакета Ваш стек отправ... Sep 4 2014, 09:07 Alexey_pashinov Это я и пояснил во вступлении чтобы было понятно о... Sep 4 2014, 09:29 billidean Имея картину от сниффера (сохраненный файл), можно... Sep 4 2014, 09:37 Socrates FPGA Triple speed ethernet MAC + Micrel KSZ9021/KS... Sep 4 2014, 13:21 Alexey_pashinov Привожу скрин wireshark, в обоих случаях arp запро... Sep 4 2014, 13:50 billidean Эта картинка, как я понимаю, когда у Вас все хорош... Sep 4 2014, 14:30 Alexey_pashinov Проблема решилась. Оказывается неправильно подавал... Sep 8 2014, 08:36 HFSE Всем Привет.
Я сейчас занимаюсь тем же самым что ... Jun 16 2015, 19:46 mobidev Цитата(HFSE @ Jun 16 2015, 23:46) P.C. На... Jun 18 2015, 06:30 doom13 Если плата отправляет пакет, то wireshark должен е... Jun 16 2015, 20:03 HFSE Да, спасибо доом13, я это уже пробовал к сожалению... Jun 17 2015, 19:42 Bad0512 Цитата(HFSE @ Jun 18 2015, 01:42) Кодlibr... Jun 18 2015, 02:16  HFSE Цитата(Bad0512 @ Jun 18 2015, 02:16) Жест... Jun 18 2015, 05:01   vadimuzzz Цитата(HFSE @ Jun 18 2015, 11:01) Но я пр... Jun 18 2015, 05:03    HFSE Цитата(vadimuzzz @ Jun 18 2015, 05:03) на... Jun 18 2015, 06:22     HFSE Цитата(HFSE @ Jun 18 2015, 06:22) Я это у... Jun 18 2015, 06:41      doom13 Цитата(HFSE @ Jun 18 2015, 09:41) Если я ... Jun 18 2015, 07:34      mobidev Цитата(HFSE @ Jun 18 2015, 10:41) Если я ... Jun 18 2015, 08:15 HFSE Всем сапсибо за советы.
Но до сих пор я не вижу па... Jun 19 2015, 06:56 Sergey_Bekrenyov А зачем Вы TX_CLK_OUT в ноль опускаете? PHY не смо... Jun 19 2015, 14:30  HFSE Цитата(Sergey_Bekrenyov @ Jun 19 2015, 15... Jun 22 2015, 07:19   Sergey_Bekrenyov Цитата(HFSE @ Jun 22 2015, 10:19) Добрый ... Jun 22 2015, 09:26 doom13 Пробуйте проверять соединение в разных сечениях (l... Jun 19 2015, 07:12 NSergeevich Всем привет! Мой проект (MAC + Phy) настроен т... Jun 22 2015, 10:18 mobidev Цитата(NSergeevich @ Jun 22 2015, 14:18) ... Jun 22 2015, 11:31  NSergeevich Цитата(mobidev @ Jun 22 2015, 14:31) QM q... Jun 22 2015, 11:41   mobidev Цитата(NSergeevich @ Jun 22 2015, 15:41) ... Jun 22 2015, 12:03   doom13 Цитата(NSergeevich @ Jun 22 2015, 14:41) ... Jun 22 2015, 12:27    NSergeevich Цитата(doom13 @ Jun 22 2015, 15:27) Рукам... Jun 22 2015, 12:41 gosu-art А promiscuous mode у вас включен? У меня, например... Jun 22 2015, 10:30 NSergeevich Цитата(gosu-art @ Jun 22 2015, 13:30... Jun 22 2015, 10:35 gosu-art RE: Ethernet на ПЛИС Jun 22 2015, 10:41 NSergeevich C этим модом тоже самое Jun 22 2015, 10:50 HFSE Цитата(NSergeevich @ Jun 22 2015, 11:50) ... Jun 22 2015, 12:53  mobidev Цитата(HFSE @ Jun 22 2015, 16:53) правиль... Jun 22 2015, 13:26  NSergeevich Цитата(HFSE @ Jun 22 2015, 15:53) Sergeev... Jun 22 2015, 15:02   Corvus Цитата(NSergeevich @ Jun 22 2015, 18:02) ... Jun 22 2015, 15:06 gosu-art Код/// size 14 bytes
logic [7:0] e... Jun 22 2015, 12:54 krux для формирования пакетов есть ещё такая интересная... Jun 22 2015, 13:40 NSergeevich подкиньте ресурс, где можно былобы почитать о всех... Jun 22 2015, 16:00 doom13 Цитата(NSergeevich @ Jun 22 2015, 19:00) ... Jun 22 2015, 19:03  gosu-art Цитата(doom13 @ Jun 22 2015, 22:03) Вообщ... Jun 22 2015, 19:23   doom13 Цитата(gosu-art @ Jun 22 2015, 22:23... Jun 22 2015, 20:02  NSergeevich Цитата(doom13 @ Jun 22 2015, 22:03) Вообщ... Jun 23 2015, 07:39   doom13 Цитата(NSergeevich @ Jun 23 2015, 10:39) ... Jun 23 2015, 08:17    NSergeevich Цитата(doom13 @ Jun 23 2015, 11:17) Вот т... Jun 23 2015, 08:48     doom13 Цитата(NSergeevich @ Jun 23 2015, 11:48) ... Jun 23 2015, 09:19 NSergeevich Может кто-нибудь сталкивался со следующей проблемо... Jun 30 2015, 10:52 NSergeevich В случае MII на 100mb интерфейса TXD[3... 0]: Tran... Jul 10 2015, 13:30 HFSE Цитата(NSergeevich @ Jul 10 2015, 14:30) ... Jul 13 2015, 07:53
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|