Перейти к содержанию
    

abarsky111

Участник
  • Постов

    6
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о abarsky111

  • День рождения 08.06.1974

Контакты

  • Сайт
    Array
  • ICQ
    Array

Посетители профиля

500 просмотров профиля
  1. Уже года два надеюсь, что вот ещё немножко, появится время - сяду и напишу свой МАС вместо TSE.... Эх, завидую белой завистью, что у Вас руки до этого дошли! Давайте схему, а там посмотрим, может для начала с TSE будет проще - хотя бы убедиться, что с марвелом всё хорошо)))
  2. А можете прислать или здесь выложить схему соединения плис с марвелом и часть из qsys, что относится к связке ниос+tse+всё остальное)) SGDMA используете? потому как выложил ранее абсолютно рабочую конфигурацию для интерфейса GMII, и напрашивается вывод, что копаем не в том месте.
  3. Несколько лет назад подробно разбирался со связкой 88E1111+CycloneIV, на этом форуме всё уже было с детальными пояснениями. Большое спасибо форумчанам, особенно vadimuzzz! Если есть уверенность, что разводка+подключение ПЛИС и марвела сделаны правильно, то дело в программировании регистров. У меня функция инициализации выглядела так (там кое-что лишнее, применительно к моей конкретной реализации + отладочная информация, но разобраться можно ): alt_u32 t2=0; int status=0; IPADDR2[0]=192; IPADDR2[1]=168; IPADDR2[2]=1; IPADDR2[3]=247; GATE2[0]=192; GATE2[1]=168; GATE2[2]=1; GATE2[3]=254; MASK2[0]=255; MASK2[1]=255; MASK2[2]=255; MASK2[3]=0; MACADDR2[0]=0x00; MACADDR2[1]=0x07; MACADDR2[2]=0xab; MACADDR2[3]=0xf0; MACADDR2[4]=0x0d; MACADDR2[5]=0xb2; //Чтение регистра конфигурации TSE - регистр 0 - номер версии IP TSE (32 бита) t2 = IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE2_BASE); #ifdef DEBUG alt_printf("TSE Command Reg : %x\n",t2); #endif alt_u32 t, r; for (t=0;t<33;t++) { IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE2_BASE, t); Delay(0xFFFF); //alt_printf("Probing PHY at address %x ...\n", t); r = IORD_ALTERA_TSEMAC_MDIO(TSE2_BASE, 0, ALTERA_TSEMAC_PHY_ADDR_PHY_ID1); if( r== 0x141 ) { #ifdef DEBUG alt_printf("Found Marvell 88E1111, PHY=%x\n", t); #endif break; } } t2 = IORD_ALTERA_TSEMAC_MDIO(TSE2_BASE,0,0x1B);//Extended PHY Specific Status Register #ifdef DEBUG alt_printf("Reg 27 : %x\n",t2); #endif t2 &= 0xFFF0; IOWR_ALTERA_TSEMAC_MDIO(TSE2_BASE,0,0x1B,t2|0xf); //f - GMII to Copper; 7 - GMII to fiber; e - GMII to SGMII(=fiber); t2 = IORD_ALTERA_TSEMAC_MDIO(TSE2_BASE,0,0x14);//Extended PHY Specific Control Register #ifdef DEBUG alt_printf("Reg 20 : %x\n",t2); #endif IOWR_ALTERA_TSEMAC_MDIO(TSE2_BASE,0,0x14,t2|0x83);//Add Delay to RX_CLK for RXD Outputs; Add Delay to GTX_CLK for TXD Inputs t2 = IORD_ALTERA_TSEMAC_MDIO(TSE2_BASE,0,26);// #ifdef DEBUG alt_printf("Reg 26 : %x\n",t2); #endif t2 = IORD_ALTERA_TSEMAC_MDIO(TSE2_BASE,0,0); #ifdef DEBUG alt_printf("Reg 0 : %x\n",t2); #endif IOWR_ALTERA_TSEMAC_MDIO(TSE2_BASE,0,ALTERA_TSEMAC_PHY_ADDR_CONTROL,t2|PCS_CTL_sw _reset);//Previous Operations Require SW Reset do { Delay(0xFFFF); t2 = IORD_ALTERA_TSEMAC_MDIO(TSE2_BASE,0,ALTERA_TSEMAC_PHY_ADDR_STATUS); //alt_printf("Reg 1 : %x\n",t2); Delay(0xFFFF); Delay(0xFFFF); Delay(0xFFFF); } while((t2&(alt_u32)0x0004)==0);//wait for link-up // Get the Rx and Tx SGDMA addresses sgdma_tx_dev = alt_avalon_sgdma_open(SGDMA2_TX_NAME); if(!sgdma_tx_dev) { #ifdef DEBUG alt_printf("[triple_speed_ethernet_init] Error opening RX SGDMA\n"); #endif } sgdma_rx_dev = alt_avalon_sgdma_open(SGDMA2_RX_NAME); if(!sgdma_rx_dev) { #ifdef DEBUG alt_printf("[triple_speed_ethernet_init] Error opening TX SGDMA\n"); #endif } IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA2_RX_BASE,ALTERA_AVALON_SGDMA_CONTROL_SOFT WARERESET_MSK); IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA2_RX_BASE, 0x0); // reset the mac IOWR_ALTERA_TSEMAC_CMD_CONFIG(TSE2_BASE , ALTERA_TSEMAC_CMD_SW_RESET_MSK | ALTERA_TSEMAC_CMD_TX_ENA_MSK | ALTERA_TSEMAC_CMD_RX_ENA_MSK | ALTERA_TSEMAC_CMD_PROMIS_EN_MSK); while(IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE2_BASE) & ALTERA_TSEMAC_CMD_SW_RESET_MSK) { } // Initialize MAC registers IOWR_ALTERA_TSEMAC_FRM_LENGTH(TSE2_BASE, ALTERA_TSE_MAX_FRAME_LENGTH); IOWR_ALTERA_TSEMAC_RX_ALMOST_EMPTY(TSE2_BASE, 8); IOWR_ALTERA_TSEMAC_RX_ALMOST_FULL(TSE2_BASE, 8); IOWR_ALTERA_TSEMAC_TX_ALMOST_EMPTY(TSE2_BASE, 8); IOWR_ALTERA_TSEMAC_TX_ALMOST_FULL(TSE2_BASE, 3); IOWR_ALTERA_TSEMAC_TX_SECTION_FULL(TSE2_BASE, 0); IOWR_ALTERA_TSEMAC_RX_SECTION_FULL(TSE2_BASE, 0); IOWR_ALTERA_TSEMAC_TX_CMD_STAT(TSE2_BASE,0); IOWR_ALTERA_TSEMAC_RX_CMD_STAT(TSE2_BASE,0); IOWR_ALTERA_TSEMAC_MAC_0(TSE2_BASE,((int)(MACADDR2[0]) | (int)(MACADDR2[1] << 8) | (int)(MACADDR2[2] << 16) | (int)(MACADDR2[3] << 24))); IOWR_ALTERA_TSEMAC_MAC_1(TSE2_BASE,(((int)(MACADDR2[4]) | (int)(MACADDR2[5] << 8)) & 0xFFFF)); IOWR_ALTERA_TSEMAC_CMD_CONFIG(TSE2_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 ); alt_avalon_sgdma_register_callback(sgdma_rx_dev,(alt_avalon_sgdma_callback)&tse_sgdmaRx_isr,(alt_u16)ALTERA_TSE_SGDMA_INTR_MASK,sgdma_rx_dev); //объявляет буфер некешируемой областью памяти (устанавливает в 1 31-й бит адреса блока) alt_u32 *up; //uncached_packet_payload; up = (void *)alt_remap_uncached ( (void *)pkt, 4); //подготовка дескрипторов к проведению очередной операции alt_avalon_sgdma_construct_stream_to_mem_desc( (alt_sgdma_descriptor *) &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST], // descriptor I want to work with (alt_sgdma_descriptor *) &desc[ALTERA_TSE_SECOND_RX_SGDMA_DESC_OFST], // pointer to "next" up, // starting write_address 0, // read until EOP - переносить пакет до конца данных 0); while ( (IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA2_RX_BASE) & ALTERA_AVALON_SGDMA_STATUS_BUSY_MSK) ) {} //начало асинхронной транзакции t2=alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST]); #ifdef DEBUG t2 = IORD_ALTERA_TSEMAC_MAC_0(TSE2_BASE); alt_printf("MAC 0 : %x\n",t2); t2 = IORD_ALTERA_TSEMAC_MAC_1(TSE2_BASE); alt_printf("MAC 1 : %x\n",t2); t2 = IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE2_BASE); alt_printf("TSE Command Reg : %x\n",t2); #endif
  4. Остановился на "временном соответсвии", большое спасибо всем участвующим в обсуждении.
  5. Переводится только в общем контексте. Как минимум, нужна полная фраза. Лучше - абзац. И обязательно надо знать, о какой области техники идет речь. <{POST_SNAPBACK}> Речь идёт об устройствах FPGA, перевожу описание для начинающих с английского на русских. Остановился на "временном равновесии", другого ничего в голову не пришло. Встречаются вот такие выражения: The term timing closure refers to analyzing a design or architecture to detect and correct any problematic timing paths. ... Not only does this stretch out the design and timing closure process, but it also... ... ...before you get to achieve timing closure on your design. Насколько я понял из описания, этот процесс подразумевает манипулирование внутренностями устройства с тем чтобы оно (устройство FPGA) соответствовало заданным временным ограничениям? Заранее спасибо всем за помощь!
  6. Привет всем! Как перевести на русский timing closure? - временное блокирование, временное замыкание, временное равновесие - или ещё как? Спасибо всем за отзывы!
×
×
  • Создать...