Jump to content

    

IP Core Triple-Speed Ethernet - нет приема и передачи со стороны MAC

Здравствуйте, уважаемые форумчане

 

я использовал в своих проектах TSE очень давно, причем осуществлял конфигурацию MAC и PHY через NicheStack, при этом делал этот проект я на прошлой работе, и сам проект там и оставил...

а сейчас пришлось самому настраивать и конфигурировать, как говорится ручками без процессора и посторонней помощи...

я подключил jtag_master и командами TCL попытался настроить и PHY и MAC, послать тестовый пакет на 

планируется реализовать плату, в которой 1 PCIE4x и 3 Ethernet(1 работает по MII, остальные 2 по RGMII)

я решил начать с отладки Ethernet, поэтому сейчас у меня собран тестовый проект, где есть 1 Ethernet(eth1,микросхема PHY стоит DP83867IS), который работает в RGMII

взял ПЛИС 5CGXFC5C6F23I7

 

файлы констрейнов (sdc.rar), топовый файл с проектами qsys(top_and_qsys.rar), а так же tcl скрипты конфигурации, генерации пакета и лог вывода отработки консоли(sc_tcl.rar)  я прикрепил

так же прикрепил функциональную схему, сейчас реализован обмен только FAKE_DDR и ETHERNET1(с mSGDMA контроллерами)

 

я сгенерировал UDP пакет через packEth1.6Win32, отследил его в WireShark, преобразовал к байтовому потоку(каждый байт имеет 2 символа, т.е. 0x0 = 00) и записал в файл test_packet.txt(см архив sc_tcl.rar)

 

программа на tcl реализует следующее:

1. инициализируется PHY

2. инициализируется  MAC

3. считывается пакет из test_packet.txt и записывается в FAKE_DDR

4. запускается mSGDMA_TX контроллер вычитывает данные из FAKE_DDR и передает на сторону Ethernet1(передаю 2 пакета)

5. считываются счетчики

 

бьюсь уже неделю, сейчас вижу следующие проблемы:

1. не выходит сигнал клока на пин ETH1_GTX_CLK, хотя сигнал  eth1_tx_clk присутствует(см eth1.stp), но вот буфер altddio_out  не выдает сдвинутый на 90 градусов клок, перегенерация данного элемента через MegaWithard не помогла(код altddio_out.rar)

2. через signaltab пакеты по avalon-ST передаются IP Core Triple-Speed Ethernet(файл eth1.stp), но сигнал ETH1_TX_CTRL не выставляется в 1(пробовал ловить по его фронту/спаду, ничего не происходит, даже когда соединял напрямую клок eth1_tx_clk с ETH1_GTX_CLK, хотя это я сделал на всякий случай)

3. при приеме данных я вижу генерацию сигналов ETH1_RX_CTRL и ETH1_RX_CLK и данных со стороны PHY, когда генерирую пакет через packEth1.6Win32, но вот в самой  IP Core Triple-Speed Ethernet счетчики не изменяются

 

первое, на что я думал, это то, что прием и передача со стороны MAC запрещены, но я специально вывел командный регистр при инициализации и при передаче данных, там биты TX_EN  и RX_EN = 1

второе - это ошибочный пакет, т.е. то, что я передаю на сторону PHY  IP Core Triple-Speed Ethernet просто не пропускает, но почему тогда счетчики TX изменяются

 

заметил еще одну вещь, что когда отключаешь Auto-Negotiation в PHY( set PHY_ENABLE_AN         0;    # Enable PHY Auto-Negotiation), то Link устанавливается только на 10 Мбит, при этом 2 пакета доходят, но они искажены, длина другая, но примерно такая же, и я не понимаю как доходят вообще до WireShar они, т.к. я по-прежнему не вижу на сигналтабе выставление ETH1_TX_CTRL, а так же ETH1_GTX_CLK(пробовал и с ним, т.е. когда подключал напрямую ETH1_GTX_CLK, данные теже)

приходят вот такие данные, причем именно 2 пакета, как я и отсылал(log tcl консоли log_phy_not_AN.txt):

510588988d109901881041000800000891800900d88d18c10144050800440550d88014c10548c0915455555555050000000000000000

Frame 2231: 54 bytes on wire (432 bits), 54 bytes captured (432 bits) on interface \Device\NPF_{DBA6184A-474B-4FB8-951A-BF3CAE942850}, id 0
    Interface id: 0 (\Device\NPF_{DBA6184A-474B-4FB8-951A-BF3CAE942850})
        Interface name: \Device\NPF_{DBA6184A-474B-4FB8-951A-BF3CAE942850}
        Interface description: Ethernet 2
    Encapsulation type: Ethernet (1)
    Arrival Time: Feb  7, 2020 12:53:58.251805000 RTZ 2 (зима)
    [Time shift for this packet: 0.000000000 seconds]
    Epoch Time: 1581069238.251805000 seconds
    [Time delta from previous captured frame: 0.227873000 seconds]
    [Time delta from previous displayed frame: 0.227873000 seconds]
    [Time since reference or first frame: 12622.153244000 seconds]
    Frame Number: 2231
    Frame Length: 54 bytes (432 bits)
    Capture Length: 54 bytes (432 bits)
    [Frame is marked: False]
    [Frame is ignored: False]
    [Protocols in frame: eth:ethertype:ip]
    [Coloring Rule Name: Broadcast]
    [Coloring Rule String: eth[0] & 1]
Ethernet II, Src: 99:01:88:10:41:00 (99:01:88:10:41:00), Dst: 51:05:88:98:8d:10 (51:05:88:98:8d:10)
    Destination: 51:05:88:98:8d:10 (51:05:88:98:8d:10)
        Address: 51:05:88:98:8d:10 (51:05:88:98:8d:10)
        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
        .... ...1 .... .... .... .... = IG bit: Group address (multicast/broadcast)
    Source: 99:01:88:10:41:00 (99:01:88:10:41:00)
        [Expert Info (Warning/Protocol): Source MAC must not be a group address: IEEE 802.3-2002, Section 3.2.3(b)]
        Address: 99:01:88:10:41:00 (99:01:88:10:41:00)
        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
        .... ...1 .... .... .... .... = IG bit: Group address (multicast/broadcast)
    Type: IPv4 (0x0800)
Internet Protocol Version 4
    0000 .... = Version: 0
        [Expert Info (Error/Protocol): Bogus IPv4 version]
            [Bogus IPv4 version]
            [Severity level: Error]
            [Group: Protocol]


 

при этом отсылал я:

503eaa0415f711223344556608004500002112340100ff112738c0a80005c0a8000a1f9022b8000d3cd6aaaaaaaaaa00000000000000000000000000

 

пока не знаю, где копать, надеюсь вы подскажете

 

спасибо, буду рад любой помощи

 

sdc.rar

top_and_qsys.rar

Сетевая карта(Функциональная схема).pdf

eth1.stp

altddio_out.rar

log_phy_not_AN.txt

Edited by xxxmatrixxx

Share this post


Link to post
Share on other sites

с этой коркой не связывался, написал свое. Может он tx слок не выдает, пока посылаемых данных нет. А в stp записи по avalon в корку нет.

 

то что вы пару пакетов странных отхватили, надо доку по phy почитать. Может в нем, как в Marvell заложено генерация тестовых пакетов. Всякое может быть

 

upd. Проглядел, вы там по другому интерфейсу данные записываете

Edited by new123

Share this post


Link to post
Share on other sites

я хотел бы сначала разобраться вот с этим:

не выходит сигнал клока на пин ETH1_GTX_CLK, хотя сигнал  eth1_tx_clk присутствует(см eth1.stp), но вот буфер altddio_out  не выдает сдвинутый на 90 градусов клок, перегенерация данного элемента через MegaWithard не помогла(код altddio_out.rar)

 

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

можно вывести с pll клоки сдвинутые на 90 градусов, но как-то не хотелось бы задействовать для такой задачи еще одну pll

кстати, может кто-нибудь скинет верный udp пакет(в виде потока байт), чтобы я только подставил свои мак адреса, чтобы хоть быть уверенным, что в самих данных нет ошибки?

Share this post


Link to post
Share on other sites
4 hours ago, xxxmatrixxx said:

кстати, может кто-нибудь скинет верный udp пакет(в виде потока байт), чтобы я только подставил свои мак адреса, чтобы хоть быть уверенным, что в самих данных нет ошибки?

1) Можно с варешарком перехватить на своей сетевухе любой udp и от туда взять готовый пакет
2) Можно свой проверить тут https://hpd.gasmi.net/, а вот тут http://packetor.com/ тоже проверить, включая ip sum и udp sum
3) Вот тут https://www.tahapaksu.com/crc/ можно проверить crc frame, поле crc-32, только endian перевернуть (хотя у вас сама корка crc считает)
4) Если со всем этим возиться лень, лучше скачать генератор пакетов. Софта полно. Забиваете поля, вам выдает готовый hex

Edited by new123

Share this post


Link to post
Share on other sites
12 minutes ago, new123 said:

1) Можно с варешарком перехватить на своей сетевухе любой udp и от туда взять готовый пакет
2) Можно свой проверить тут https://hpd.gasmi.net/, а вот тут http://packetor.com/ тоже проверить, включая ip sum и udp sum
3) Вот тут https://www.tahapaksu.com/crc/ можно проверить crc frame, поле crc-32, только endian перевернуть (хотя у вас сама корка crc считает)
4) Если со всем этим возиться лень, лучше скачать генератор пакетов. Софта полно. Забиваете поля, вам выдает готовый hex

 

я именно 1й вариант использовал, проверил через сайты из 2го пункта - показывает верный пакет

спасибо

может есть у кого собранный РАБОЧИЙ проект с TSE на RGMII, работающий на 1 Гбит/с? и конфигурация Mac и PHY, написанная на Си или tcl?

Share this post


Link to post
Share on other sites

Посмотрел ваши файлики.

Это исходники от плат Terasic. Брать их исходник и применять к себе то конечно еще дело. Лучше наверное загенерить с нуля быстренько свое.

Еще посмотрел исходник ddio. DDIO вообще нужен для того, чтобы подать на вход байт, на выходе получить его половинки на разных фронтах такта. в RGMII подаем на вход 8 бит, на выходе имеем по 4 бита по нарастанию и спаду клока. Принято еще вместе с 8 битами простаскивать TX_EN. Но вот чтобы протащить еще и сдвинутый клок, не помню такого. Но может быть, я чего то подзабыл. На 90 же сдвигают, чтобы PHY считал данные прям на гребне волны (не знаю как правильно сказать). Так вот ваш исходник ddio. Там input [0:0]. То есть на вход подается 1 бит всего. Для чего он интересно

Share this post


Link to post
Share on other sites

так я брал исходники конфигурации под pciexpress, его поднял, перешел к ethernet, и его собирал уже сам, основываясь на примеры альтеры

насчет ddio там идет объединение data_h,data_l  по клоку, причем я на rtl вижу в Quartus, что сгенерировано все верно, но нет сигнала на выходе

Edited by xxxmatrixxx

Share this post


Link to post
Share on other sites

сейчас прогнал IP Core TSE через Modelsim, переложил код tcl на systemverilog, увидел ту же картину - не уходит пакет с MAC уровня при передаче(данные на avalon-ST с присутствием StartOfPacket и EndOfPacket от mSGDMA в TSE вижу, а вот на TSE_TXD их нет, и сигнал TX_CTRL не выставляется)

 

возможные причины:

1. неверный пакет

2. неверная инициализация MAC уровня

 

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

 

спасибо, буду рад любой помощи

Edited by xxxmatrixxx

Share this post


Link to post
Share on other sites
1 час назад, xxxmatrixxx сказал:

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

Вот моя функция конфигурации TSE MAC альтеры , но у меня корка работает в режиме 1000BASE-X .

пример пакета для проверки вы можете взять из Wireshark -а

mac_config

И пример вывода в терминал при конфигурации.

log_term.log

Share this post


Link to post
Share on other sites

спасибо, большое

у меня RGMII, но относительно настройки вашей для SGMII через PCS регистры, у меня все сделано верно...

 

я не смог победить пропуск eth_tx_clk через altddio_out и выдачу на выход ETH_GTX_CLK(у меня приложены в самом начале темы соответствующие файлы), все так же на выходе 0

 

моделсим тоже чушь показывал, пока eth_tx_clk не сделал регистром

 

  1. wire eth1_pll_clk_2p5;
  2. wire eth1_pll_clk_25;
  3. wire eth1_pll_clk_125;
  4. pll eth1_pll_inst (
  5. .rst ( !any_rst_n )
  6. ,.refclk ( CLOCK_25_FPGA )
  7. ,.outclk_0 ( eth1_pll_clk_2p5 )
  8. ,.outclk_1 ( eth1_pll_clk_25 )
  9. ,.outclk_2 ( eth1_pll_clk_125 )
  10. ,.outclk_3 ( )
  11. ,.outclk_4 ( )
  12. );
  13.  
  14. wire eth1_mdio_oen;
  15. wire eth1_mdio_out;
  16. wire eth1_mode;
  17. wire eth1_ena_10;
  18. reg eth1_tx_clk;
  19. eth_altddio_out eth1_altddio_out_inst (
  20. .aclr ( !any_rst_n ),
  21. .datain_h ( 1'b1 ),
  22. .datain_l ( 1'b0 ),
  23. .outclock ( eth1_tx_clk ),
  24. .dataout ( ETH1_GTX_CLK )
  25. );
  26.  
  27. always @(*)
  28. begin
  29. if (any_rst_n == 1'b0) eth1_tx_clk <= 1'b0;
  30. else if (eth1_mode) eth1_tx_clk <= eth1_pll_clk_125;// GbE Mode = 125MHz clock
  31. else if(eth1_ena_10) eth1_tx_clk <= eth1_pll_clk_2p5;// 10Mb Mode = 2.5MHz clock
  32. else eth1_tx_clk <= eth1_pll_clk_25; // 100Mb Mode = 25MHz clock
  33. end

 

 

  1. module eth_altddio_out (
  2. aclr,
  3. datain_h,
  4. datain_l,
  5. outclock,
  6. dataout);
  7.  
  8. input aclr;
  9. input [0:0] datain_h;
  10. input [0:0] datain_l;
  11. input outclock;
  12. output [0:0] dataout;
  13.  
  14. wire [0:0] sub_wire0;
  15. wire [0:0] dataout = sub_wire0[0:0];
  16.  
  17. altddio_out ALTDDIO_OUT_component (
  18. .aclr (aclr),
  19. .datain_h (datain_h),
  20. .datain_l (datain_l),
  21. .outclock (outclock),
  22. .dataout (sub_wire0),
  23. .aset (1'b0),
  24. .oe (1'b1),
  25. .oe_out (),
  26. .outclocken (1'b1),
  27. .sclr (1'b0),
  28. .sset (1'b0));
  29. defparam
  30. ALTDDIO_OUT_component.extend_oe_disable = "OFF",
  31. ALTDDIO_OUT_component.intended_device_family = "Cyclone V",
  32. ALTDDIO_OUT_component.invert_output = "OFF",
  33. ALTDDIO_OUT_component.lpm_hint = "UNUSED",
  34. ALTDDIO_OUT_component.lpm_type = "altddio_out",
  35. ALTDDIO_OUT_component.oe_reg = "UNREGISTERED",
  36. ALTDDIO_OUT_component.power_up_high = "OFF",
  37. ALTDDIO_OUT_component.width = 1;
  38.  
  39.  
  40. endmodule

Share this post


Link to post
Share on other sites

Вы попробуйте сначала на одной скорости запустить корку. Допустим, на 100. А потом начать наворачивать.

А то смотрю на эти мультиплексоры клока с асинхронными сбросами...

Была, кстати, годная статья на easyelectronics про отладка ethernet в плис. Посмотрите, мб, поможет чем-то:

http://we.easyelectronics.ru/electro-and-pc/neskolko-slov-ob-otladke-1gb-ethernet-proektov-na-plis.html

 

Share this post


Link to post
Share on other sites

огромное спасибо за ссылку на эту статью, там автором уже указываются трудности снятия с вывода altddio_out через сигналтаб

кстати, нашел более подробное обсуждение на форуме интела:

https://forums.intel.com/s/question/0D50P00003yyTLpSAM/altddioout-for-clock-output-of-chip

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

 

может есть все таки способ увидеть сигнал с altddio_out через сигналтаб на cyclone5? был ли у кого опыт?

осталась тогда проблема с инициализацией mac уровня TSE в режиме rgmii

Edited by xxxmatrixxx

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this