Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ethernet + Cyclone + Nios
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Страницы: 1, 2, 3, 4, 5, 6, 7, 8
COMA
Alexander_35, констрейны на RGMII правильно составлены?
Alexander_35
С констрейнами у меня пока трудновато, поэтому поставил те, что vadimuzzz предлагал, поправив названия портов:
Код
#RX path
create_clock -name rx_virtualclk -period 40
create_clock -period 40 -name rxclk [get_ports {enet_rx_clk}] -waveform {20ns 40ns}
set_clock_groups -exclusive -group {rxclk rx_virtualclk}
set phy_tco_max 10
set phy_tco_min -10
set_input_delay -clock rx_virtualclk -max $phy_tco_max [get_ports {enet_rxd* enet_rx_dv}]
set_input_delay -clock rx_virtualclk -min $phy_tco_min [get_ports {enet_rxd* enet_rx_dv}]
#TX path
set phy_tsu 10
set phy_th 0
set_output_delay -clock { txclk_virt } -rise -max $phy_tsu [get_ports {enet_txd* enet_tx_en}]
set_output_delay -clock { txclk_virt } -rise -min -$phy_th [get_ports {enet_txd* enet_tx_en}]

Знаю что это для GMII, поэтому не факт что я сделал корректно.
Причем, как я понял, изначально в альтеровском примере констрейнов на RGMII нет, тем не менее SSS запускается. Или я не прав?
Копейкин
Скажите пожалуйста, вышеприведённые констрейны нужно применить вместо тех, что генерируются визардом?
Или модифицировать сгенерированный?
В генерированном ещё мультициклы добавлены...
Q-II 9.1sp2 если что.
COMA
Вот перевод an477, советую посмотреть.

http://electronix.ru/forum/index.php?act=a...st&id=69977
vadimuzzz
вот пример констрейнов для марвела с rgmii
Alexander_35
vadimuzzz, спасибо за констрейны!
doom13, в доке на TSE, правда версии 14, написано:
Код
In the new user interface in Qsys, for a design that has a MAC function, you have to manually connect the exposed ports or terminate them.

И дальше нарисована таблица, что к чему подключить. Попробуйте.
doom13
Цитата(Alexander_35 @ Aug 14 2014, 17:48) *
doom13, в доке на TSE, правда версии 14, написано:
Код
In the new user interface in Qsys, for a design that has a MAC function, you have to manually connect the exposed ports or terminate them.

И дальше нарисована таблица, что к чему подключить. Попробуйте.

Попробовал, не пошло. Отличие только в версии TSE, v12 работает, v13 нет.
MrSeN
Всем привет!
Возникла проблема при работе с модулем TSE и нет никаких предположений в какую сторону копать. Очень надеюсь на вашу помощь!
Я пытаюсь при помощи NIOS и модуля TSE выплюнуть тестовую посылку в Ethernet. За основу взял проект vadimuzzz. В main_memory я при помощи Nios записываю 10 тестовых слов, которые и хочу передать в одной посылке через Ethernet.
TSE настроен на работу по интерфейсу RGMII. Mac Options модуля можно увидеть на фото ниже. Запустить пытаюсь на чипе KSZ9031.
Я считываю все данные из descriptor_memory при помощи SGDMA_tx и передаю их на модуль UDP. Этот модуль формирует на выходе посылку и передает ее на модуль TSE, который в свою очередь никак на это не реагирует.
Очень прошу вашей помощи! Тырните носом в мою ошибку или подскажите в каком направлении ее искать.
Скрин QSYS системы и листинг программы для NIOS:
Нажмите для просмотра прикрепленного файла
Код
#include <altera_avalon_sgdma.h>
#include <altera_avalon_sgdma_descriptor.h>
#include <altera_avalon_sgdma_regs.h>
#include <udp_tx_offload_regs.h>
#include "system.h"
#include <altera_avalon_tse.h>

#include "sys/alt_stdio.h"
#include "sys/alt_irq.h"
#include <stdio.h>
#include <unistd.h>

/*
* -----------------------------------------------------------------------------------------------------------------------------------------
*/
struct mac_struct
{
    /* EXAMPLE
     * 00-1C-23-17-4A-CB
     * mac_hi = 0x17231c00
     * mac_lo = 0x0000CB4a
     * */
    unsigned int    mac_hi;
    unsigned int    mac_lo;
};

typedef union
{
    struct mac_struct    mac_addr;
    unsigned char         mac_arr[6];
} mac_addr_t;

typedef union
{
    unsigned int    addr;
    unsigned char    ad_arr[4];
} ip4_addr_t;

mac_addr_t    MY_MAC_ADDR;
ip4_addr_t    MY_IP_ADDR;

// Create sgdma transmit and receive devices
alt_sgdma_dev * sgdma_tx_dev;
alt_sgdma_dev * sgdma_rx_dev;

// Allocate descriptors in the descriptor_memory (onchip memory)
alt_sgdma_descriptor tx_descriptor        __attribute__ (( section ( ".descriptor_memory" )));
alt_sgdma_descriptor tx_descriptor_end    __attribute__ (( section ( ".descriptor_memory" )));

/*
* -----------------------------------------------------------------------------------------------------------------------------------------
*/

void TSE_init1(void)
{
    alt_u32 /*t,*1=0,*/t2=0;
    int status=0;

#define PHY 0x4

    /* PHY and other board peripherial initialization */
    IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE_MAC_BASE,PHY);
    alt_printf("TSE_MAC_REV:%x\n", IORD_ALTERA_TSEMAC_REV(TSE_MAC_BASE));
    alt_printf("PHY_ID1:%x\n", IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 0, ALTERA_TSEMAC_PHY_ADDR_PHY_ID1));
    alt_printf("PHY_ID2:%x\n", IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 0, ALTERA_TSEMAC_PHY_ADDR_PHY_ID2));
    do
    {
        t2=IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,0,ALTERA_TSEMAC_PHY_ADDR_STATUS);
    }
    while((t2&0x04)==0);//wait for link-up

    /* Get the Rx and Tx SGDMA addresses */
        sgdma_tx_dev = alt_avalon_sgdma_open("/dev/sgdma_tx");
        sgdma_rx_dev = alt_avalon_sgdma_open("/dev/sgdma_rx");
        IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_TX_BASE,ALTERA_AVALON_SGDMA_CONTROL_SOFTWARERESET_MSK);
        IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_TX_BASE, 0x0);
    /* reset the mac */

    IOWR_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE , ALTERA_TSEMAC_CMD_SW_RESET_MSK /*| ALTERA_TSEMAC_CMD_TX_ENA_MSK | ALTERA_TSEMAC_CMD_RX_ENA_MSK*/);
    while(IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE) & ALTERA_TSEMAC_CMD_SW_RESET_MSK)
    {
    }

    /* Initialize MAC registers */

    IOWR_ALTERA_TSEMAC_FRM_LENGTH(TSE_MAC_BASE, ALTERA_TSE_MAC_MAX_FRAME_LENGTH);
    IOWR_ALTERA_TSEMAC_RX_ALMOST_EMPTY(TSE_MAC_BASE, 8);
    IOWR_ALTERA_TSEMAC_RX_ALMOST_FULL(TSE_MAC_BASE, 8);
    IOWR_ALTERA_TSEMAC_TX_ALMOST_EMPTY(TSE_MAC_BASE, 8);
    IOWR_ALTERA_TSEMAC_TX_ALMOST_FULL(TSE_MAC_BASE,  3);
    IOWR_ALTERA_TSEMAC_TX_SECTION_EMPTY(TSE_MAC_BASE, 240); //1024/4;
    IOWR_ALTERA_TSEMAC_TX_SECTION_FULL(TSE_MAC_BASE,  16); //32/4; // start transmit when there are 48 bytes
    IOWR_ALTERA_TSEMAC_RX_SECTION_EMPTY(TSE_MAC_BASE, 240); //4000/4);
    IOWR_ALTERA_TSEMAC_RX_SECTION_FULL(TSE_MAC_BASE,  16);
    IOWR_ALTERA_TSEMAC_TX_CMD_STAT(TSE_MAC_BASE,0);
    IOWR_ALTERA_TSEMAC_RX_CMD_STAT(TSE_MAC_BASE,ALTERA_TSEMAC_RX_CMD_STAT_RXSHIFT16_MSK);
    IOWR_ALTERA_TSEMAC_RX_CMD_STAT(TSE_MAC_BASE,0);
    IOWR_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE, ALTERA_TSEMAC_CMD_TX_ENA_MSK | ALTERA_TSEMAC_CMD_RX_ENA_MSK | /*ALTERA_TSEMAC_CMD_TX_ADDR_INS_MSK |*/ ALTERA_TSEMAC_CMD_RX_ERR_DISC_MSK | ALTERA_TSEMAC_CMD_PAD_EN_MSK | ALTERA_TSEMAC_CMD_CRC_FWD_MSK);
    IOWR_ALTERA_TSEMAC_MAC_0(TSE_MAC_BASE, MY_MAC_ADDR.mac_addr.mac_hi);
    IOWR_ALTERA_TSEMAC_MAC_1(TSE_MAC_BASE, MY_MAC_ADDR.mac_addr.mac_lo);
    }

int UDP_init()
{
    int status=0;

UDP_TX_OFFLOAD_WR_CSR(UDP_TX_OFFLOAD_0_BASE, 0x1);
UDP_TX_OFFLOAD_WR_MAC_DST_HI(UDP_TX_OFFLOAD_0_BASE, 0x2819BEC8);
UDP_TX_OFFLOAD_WR_MAC_DST_LO(UDP_TX_OFFLOAD_0_BASE, 0x0000179B);
UDP_TX_OFFLOAD_WR_MAC_SRC_HI(UDP_TX_OFFLOAD_0_BASE, MY_MAC_ADDR.mac_addr.mac_hi);
UDP_TX_OFFLOAD_WR_MAC_SRC_LO(UDP_TX_OFFLOAD_0_BASE, MY_MAC_ADDR.mac_addr.mac_lo);
UDP_TX_OFFLOAD_WR_IP_SRC(UDP_TX_OFFLOAD_0_BASE, MY_IP_ADDR.ad_arr);
UDP_TX_OFFLOAD_WR_IP_DST(UDP_TX_OFFLOAD_0_BASE, 0x0100A8C0);
UDP_TX_OFFLOAD_WR_UDP_PORTS(UDP_TX_OFFLOAD_0_BASE, 0xE000);
UDP_TX_OFFLOAD_WR_IP_HDR_HI(UDP_TX_OFFLOAD_0_BASE, 0x0);
UDP_TX_OFFLOAD_WR_IP_HDR_LO(UDP_TX_OFFLOAD_0_BASE, 0x00004011/*0x0200FF11*/);
UDP_TX_OFFLOAD_WR_AUX_CONFIG(UDP_TX_OFFLOAD_0_BASE, 0x0800);

    return status;
    }

void add_phy_to_profile()
{

    /* supported PHY definition */

    /* ------------------------------ */
    /* KSZ9031                        */
    /* ------------------------------ */
    enum {
    KSZ9031_OUI = 0x10A1,
    KSZ9031_MODEL = 0x22,
    KSZ9031_REV = 0x02
    };

    alt_tse_phy_profile KSZ9031 = {
                "KSZ9031",                      /* Micrel  KSZ9031                                                  */
                KSZ9031_OUI,                    /* OUI                                                            */
                KSZ9031_MODEL,                    /* Vender Model Number                                            */
                KSZ9031_REV,                    /* Model Revision Number                                          */
                0x1F,                            /* Location of Status Register                                  */
                5,                               /* Location of Speed Status                                      */
                3,                               /* Location of Duplex Status                                    */
                0                               /* Location of Link Status                                      */
                /*&KSZ9031_phy_cfg,*/           /* function pointer to configure Micrel KSZ8893M                  */
                /*&KSZ9031_link_status_read*/   /* Function pointer to read from PHY specific status register     */
                };

    /* add supported PHY to profile */
    alt_tse_phy_add_profile(&KSZ9031);
}


int main(void)
{
  alt_putstr("Start Work!\n");
  /* MAC ADDRESS
   * 00-07-AB-F0-0D-BA
   * IP ADDRESS
   * 192.168.0.3*/
  MY_MAC_ADDR.mac_addr.mac_hi = 0xF0AB0700;
  MY_MAC_ADDR.mac_addr.mac_lo = 0x0000BA0D;
  MY_IP_ADDR.ad_arr[3] = 192;
  MY_IP_ADDR.ad_arr[2] = 168;
  MY_IP_ADDR.ad_arr[1] = 0;
  MY_IP_ADDR.ad_arr[0] = 3;

  unsigned int i;
  unsigned int* adr;
  unsigned int test_data;
  adr = (unsigned int*) MAIN_MEMORY_BASE;

  test_data = 0xFF00AA64;

    adr = (unsigned int*) MAIN_MEMORY_BASE;
        for(i = 0; i < 10; i += 1)
        {
            *adr = test_data;
            adr += 1;
            test_data += 1;
        }

    // Открываем SGDMA
  sgdma_tx_dev = alt_avalon_sgdma_open(SGDMA_TX_NAME);
    if (sgdma_tx_dev == NULL) {
        alt_printf ("Error: could not open scatter-gather dma transmit device\n");
        return -1;
    } else alt_printf ("Opened scatter-gather dma transmit device\n");

    alt_tse_phy_init();
    add_phy_to_profile();
    TSE_init1();
    UDP_init();

    UDP_TX_OFFLOAD_WR_PACKET_LEN(UDP_TX_OFFLOAD_0_BASE, 10);

        alt_u32 *uncached_packet_payload;
        uncached_packet_payload = (alt_u32*)alt_remap_cached ((volatile void*) MAIN_MEMORY_BASE, 4);
        adr = (unsigned int*) MAIN_MEMORY_BASE;

        alt_avalon_sgdma_construct_mem_to_stream_desc(
                &tx_descriptor, // descriptor I want to work with
                &tx_descriptor_end, // pointer to "next"
                uncached_packet_payload,
                40,
                0,
                1,
                1,
                0);

        int timeout;
        timeout = 0;
        while ( (IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_TX_BASE) & ALTERA_AVALON_SGDMA_STATUS_BUSY_MSK) )
        {
            if(timeout++ == ALTERA_TSE_SGDMA_BUSY_TIME_OUT_CNT)
            {
                alt_printf("tse_mac_raw_send: WARNING - TX SGDMA Timeout\n");
                return -22;  // avoid being stuck here
            }
        }
        IOWR_ALTERA_AVALON_SGDMA_CONTROL (SGDMA_TX_BASE, 0);
        IOWR_ALTERA_AVALON_SGDMA_STATUS (SGDMA_TX_BASE, 0xFF);
        // Set up non-blocking transfer of sgdma transmit descriptor
           alt_avalon_sgdma_do_async_transfer( sgdma_tx_dev, &tx_descriptor);

  /* Event loop never exits. */

                while (1);

  return 0;
}
vadimuzzz
Цитата
Запустить пытаюсь на чипе KSZ9031.

С этого момента поподробнее, плиз. Как разведена шина RGMII на плате? Там есть два варианта: делать rx_clk
большей длины, чем rx_d либо крутить тайминги через регистры PHY. Данный проект я последний раз заводил на
KSZ9021, все дорожки на RGMII были одной длины и задержки я крутил через регистры (попутно выяснилось, что
в чипе KSZ9021 есть баг). То, что данные ушли в MAC, но не дошли до хоста - почти наверняка кривые тайминги/констрейны.
Осциллографом еще на gtx_clk/tx_d/tx_en гляньте для уверенности.
MrSeN
Цитата(vadimuzzz @ Oct 28 2014, 03:57) *
С этого момента поподробнее, плиз. Как разведена шина RGMII на плате? Там есть два варианта: делать rx_clk
большей длины, чем rx_d либо крутить тайминги через регистры PHY. Данный проект я последний раз заводил на
KSZ9021, все дорожки на RGMII были одной длины и задержки я крутил через регистры (попутно выяснилось, что
в чипе KSZ9021 есть баг). То, что данные ушли в MAC, но не дошли до хоста - почти наверняка кривые тайминги/констрейны.
Осциллографом еще на gtx_clk/tx_d/tx_en гляньте для уверенности.

rx_clk короче чем rx_d
На gtx_clk 25MHz, как и нужно. tx_en в нуле а вот с tx_d самая проблема, эти сигналы всегда висят в нуле, это видно в сигналтабе, я их смотрю непосредственно как выход модуля tse.
vadimuzzz
Цитата(MrSeN @ Oct 30 2014, 13:44) *
rx_clk короче чем rx_d

должно быть наоборот, см. аттач

Цитата
tx_en в нуле а вот с tx_d самая проблема, эти сигналы всегда висят в нуле, это видно в сигналтабе, я их смотрю непосредственно как выход модуля tse.

в сигналтапе их вы напрямую не увидите - это шина ddr. компилятор их тупо выкинет с соответствующим ворнингом. посмотреть txd можно на входе ddr-регистра, либо осциллографом
alexPec
Всем доброго дня. Возникла проблема с эзернетом от opencores, раньше использовал это ядро- такого не было.

Инициализирую PHY, линк есть, инициализирую MAC теми же значениями что и в предыдущем проекте. Регистрирую прерывание на прием пакетов, завожу один дескриптор на прием, указываю там буфер.
В результате когда делаю пинг процессор попадает в прерывание по приему, читает источник IRQ и вместо бита RXC (принят пакет) или RXE (ошибка) вижу установленный бит BUSY :

This bit indicates that a buffer was received and discarded due to a lack of
buffers. It is cleared by writing 1 to it. This bit appears regardless to the
IRQ bits in the Receive or Transmit Buffer Descriptors.

Читаю регистр CTRL дескриптора функцией IORD_ETH_OCM_DESC_CTRL(ETH_OCM_0_BASE, 1) - получаю значение 0xe000, установленные биты означают:

- The data buffer is empty (and ready for receiving data) or currently
receiving data.
- When data is received (or error occurs), an RXF interrupt will be
asserted (See 3.2 INT_SOURCE (Interrupt Source Register) for more
details).
- This buffer descriptor is the last descriptor in the buffer descriptor table.
After this buffer descriptor is used, the first Rx buffer descriptor in the table
will be used again.

Указатель на буфер в регистре правильный.

Что смотреть и куда копать - думаю, а пока решил спросить...

Раньше это ядро запускал на Q9.1 - сходу заработало, никаких проблем не было. Сейчас запускаю в QSYS на Q13.1.

UPD: прочитал еще doc-файл по авалон-интерфейсу, там написано что бит BUSY ставится при переполнении фифо на RX. Похоже действительно фифо переполняется, а прерывания по приему пакета не идут, только по переполнению фифо.
everest
Добрый вечер , никто на форуме не запускал аппаратно под новый Quartus 13.1 или 14 проект UDP offload example. http://www.alterawiki.com/wiki/Nios_II_UDP_Offload_Example
Плата основана на Cyclone 4 , имеет SDRAM , вместо DDR SDRAM 2. Я так понимаю на TSE также нужно покупать лицензию , ну или лечить.
Микросхема dp83640 с интерфейсом rmii. На форуме альтеры также нашёл переходник mii to rmii.
Qsys + переходник
doom13
Цитата(everest @ Dec 19 2014, 22:25) *
Добрый вечер , никто на форуме не запускал аппаратно под новый Quartus 13.1 или 14 проект UDP offload example. http://www.alterawiki.com/wiki/Nios_II_UDP_Offload_Example
Плата основана на Cyclone 4 , имеет SDRAM , вместо DDR SDRAM 2. Я так понимаю на TSE также нужно покупать лицензию , ну или лечить.
Микросхема dp83640 с интерфейсом rmii. На форуме альтеры также нашёл переходник mii to rmii.
Qsys + переходник

А какие у Вас вопросы? Я свой проект с TSE v14.0 запускал, счас уже всё работает. Основная проблема оказалась в неправильном подключении TSE. После изменения его интерфейса подключения неправильно понял назначение портов и не работало, пока не залез внутрь TSE и не разобрался - что и куда надо подключать.
MrSeN
А ни у кого нету примера с работающим приемом?
everest
Цитата(doom13 @ Dec 23 2014, 10:02) *
А какие у Вас вопросы? Я свой проект с TSE v14.0 запускал, счас уже всё работает. Основная проблема оказалась в неправильном подключении TSE. После изменения его интерфейса подключения неправильно понял назначение портов и не работало, пока не залез внутрь TSE и не разобрался - что и куда надо подключать.


Взял готовый проект с сайта AlteraWiki.
Собрал все в qsys. При компиляции в Eclipse выдаёт следующие ошибки.

Цитата
Код
Description    Resource    Path    Location    Type
make: *** [tut_app.elf] Error 1    tut_app             C/C++ Problem
undefined reference to `install_menu'    demo_control.c    /tut_app    line 96    C/C++ Problem
undefined reference to `stooges'    tut_app        line 0    C/C++ Problem


http://www.alteraforum.com/forum/showthread.php?t=30536
http://www.alteraforum.com/forum/showthread.php?t=45601

В чём может быть проблема?
doom13
Цитата(everest @ Mar 11 2015, 21:20) *
Взял готовый проект с сайта AlteraWiki.

Уберите из проекта всё лишнее, оставте сам процессор, память, TSE, SgDMA TX, SgDMA RX, descriptor_memory. Разберитесь с работой SgDMA (выше в теме был пример) и конфигурацией TSE.
everest
Цитата(doom13 @ Mar 13 2015, 21:47) *
Уберите из проекта всё лишнее, оставте сам процессор, память, TSE, SgDMA TX, SgDMA RX, descriptor_memory. Разберитесь с работой SgDMA (выше в теме был пример) и конфигурацией TSE.


Спасибо за ответ.
Как раз таки это все заработало на 11-ой версии Quartus на примере веб-сервера. (UCOS + NicheStack)
Затем и lwip прикрутил без ос. Правда lwip + FreeRTOS так и не запустился, но это уже другая история...

Интересовала именно аппаратная реализация UDP с кучей второстепенных блоков.
Не очень понятна разница между данной версией на сайте альтеры и реализацией UDP у уважаемого vadimuzz, ужатого в один блок.
Вроде бы и все ветки на форуме перечитал, посвящённые аппаратной реализацией udp протокола.
Видимо я не очень-то хорошо разобрался , пойду дальше изучать.
doom13
Цитата(everest @ Mar 14 2015, 12:52) *
Интересовала именно аппаратная реализация UDP с кучей второстепенных блоков.
Не очень понятна разница между данной версией на сайте альтеры и реализацией UDP у уважаемого vadimuzz, ужатого в один блок.

Формирование UDP-пакета (аппаратное) реализует один блок - udp_offload, всё остальное вспомогательные модули. На udp_offload подаются данные, он добавляет UDP-шапку и выдаёт на TSE, если работает несколько передатчиков - тогда на MAC заводятся через мультиплексор. Я его (udp_offload) допиливал под себя, чтобы была возможность посылать фрагментированный пакет.
everest
Цитата(doom13 @ Mar 14 2015, 13:26) *
Формирование UDP-пакета (аппаратное) реализует один блок - udp_offload, всё остальное вспомогательные модули. На udp_offload подаются данные, он добавляет UDP-шапку и выдаёт на TSE, если работает несколько передатчиков - тогда на MAC заводятся через мультиплексор. Я его (udp_offload) допиливал под себя, чтобы была возможность посылать фрагментированный пакет.


Стало более яснее, то есть по идее можно сделать на примере alterawiki и примера vadimuzz такой же блок (например udp_rx_offload) , но для приёма и обработки UDP пакета и при необходимости добавить демультиплексор.
Естественно придётся писать драйвер.
doom13
Цитата(everest @ Mar 14 2015, 15:14) *
Стало более яснее, то есть по идее можно сделать на примере alterawiki и примера vadimuzz такой же блок (например udp_rx_offload) , но для приёма и обработки UDP пакета и при необходимости добавить демультиплексор.
Естественно придётся писать драйвер.

Пример vadimuzz достаточен, чтоб запустить аппаратное формирование UDP и выдачу в сеть. По поводу приёма не понял, Вам нужен приёмник на логике?
everest
Цитата(doom13 @ Mar 14 2015, 14:42) *
Пример vadimuzz достаточен, чтоб запустить аппаратное формирование UDP и выдачу в сеть. По поводу приёма не понял, Вам нужен приёмник на логике?


Да именно, было бы интересно сделать(переделать) аппаратный приём и обработку UDP пакетов на основе того же примера с сайта альтеры_вики.

doom13
Цитата(everest @ Mar 14 2015, 16:04) *
Да именно, было бы интересно сделать(переделать) аппаратный приём и обработку UDP пакетов на основе того же примера с сайта альтеры_вики.

Но если нужен даже минимальный стек IP протоколов, то реализовать аппаратно будет непростая задача.
Creamman
Здравствуйте!) А каким образом задать для ПЛИС MAC и IP адрес. Cyclone III (Triple Speed Ethernet)
Unfog
Уважаемые гуру, помогите, пожалуйста, с проблемкой =)

Имеется кит на Stratix 3 с 88е1111.
В идеале нужно сделать UDP с обменом по SGMII.

Что получилось:
Конфиг через MDIO, связь через MII. Проблем нет, пакеты отправляются, принимаются.

Т. к. я раньше не имел дело с SGMII решил использовать TSE. В перспективе в Qsys, но т.к. с SGDMA опять же не встречался, решил сначала запустить TSE без NIOS.
И тут затык =(
TSE сконфигуринован на small 10/100MAC.
На входы вроде подаю правильно, а он молчит.
В какую сторону копать?
Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла

clock - 50 МГц
vadimuzzz
не понял, смотрите в сигналтапе? выходы ff_rx никуда не подключены? тогда синтезатор выкинул все
Unfog
Да сигнал тапом. Empty то в 1 стоит.
Пробовал и так, без изменений. Так же вроде не должен выкинуть?
Нажмите для просмотра прикрепленного файла
vadimuzzz
а сам MAC как конфигурируете?
Unfog
Даташит не дочитал, пошел сюда.
Все зашевелилось, DMA заработало.
Я то все думал о каких tx_ena и rx_ena все время говорят.

Спасибо за правильный вопрос =)
Думаю еще вернусь с вопросами по SGMII, но позже.
Кузнец
Всем привет!! Хочу состыковать Cyclone IV(DE0nano)+Nios2+Ethernet+rtl8201cl. Кто-нибудь реализовывал? Ресурс где почитать?
Acvarif
Цитата(Кузнец @ Jun 27 2016, 22:55) *
Всем привет!! Хочу состыковать Cyclone IV(DE0nano)+Nios2+Ethernet+rtl8201cl. Кто-нибудь реализовывал? Ресурс где почитать?

Если DE0Nano+Nios2+Ethernet то тут http://acvarif.info/prvhdl/prvhdl20.html С rtl8201cl по ходу можно разобраться по аналогии.
Кузнец
Цитата(Acvarif @ Jun 27 2016, 20:13) *
Если DE0Nano+Nios2+Ethernet то тут http://acvarif.info/prvhdl/prvhdl20.html С rtl8201cl по ходу можно разобраться по аналогии.

Спасибо!!
wapster
Добрый день!
Наткнулся на проблему с TSE при использовании внешних FIFO.
Имеется NIOS II, к которому через внешние FIFO и mSGDMA подключен TSE. NIOS II работает под управлением Linux со встроенным драйвером. Проблема заключается в том, что на передачу обрезаются первые два байта пакета. Я понимаю, что это связано с выравниванием заголовков, поэтому отключаю опцию "Align packet headers to 32-bit boundary". После данной манипуляции обрезаются первые два байта во входящих сообщениях, в то время как исходящие сообщения отсылаются корректно. То есть всё стало наоборот. Со встроенным в TSE буферами FIFO всё работает правильно. Куда копать? Не могу понять аппаратура это косячит или драйвер. Поставил вывод отсылаемого пакета в консоль в драйвере и ничего криминального не вижу.

Ещё хотел бы уточнить, что ширина шины от процессора до FIFO через DMA 32 бита, а после FIFO она урезается до 8 бит через автоматический адаптер Qsys.
wapster
Кажется сам нашел ответ.
TSE обрезает на передачу первые два байта, потому что в исходящих пакетах в драйвере Linux не предусмотрено выравнивание. Обрезка первых двух байтов выключается программно с помощью регистра tx_cmd_stat. Программное управление этим регистром работает только в случае со встроенным FIFO. С внешним обрезка байтов на приём и передачу выключается одной галкой в Qsys. Таким образом получается, что входящий трафик обрабатывается корректно, а исходящий режется.
Вопрос теперь как правильно переписать драйвер. Или же ещё в голову приходит навертеть какой-нибудь аппаратный блок, который будет заниматься выравниванием.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.