|
|
  |
Ethernet + Cyclone + Nios |
|
|
|
Apr 11 2013, 12:43
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(vadimuzzz @ Apr 10 2013, 17:29)  поправил для передатчика Код set phy_tsu 10 set phy_th 0 set_output_delay -clock { txclk_virt } -rise -max $phy_tsu [get_ports {enet0_tx_d* enet0_tx_en}] set_output_delay -clock { txclk_virt } -rise -min -$phy_th [get_ports {enet0_tx_d* enet0_tx_en}] насчет приемника, думаю дело не в констрейнах. имеет смысл пробежаться сигналтапом, начиная от выхода TSE и до приемного sgdma Спасибо. Я виноват. Мог-бы и сам заметить опечатку. Сигналтапом нет возможности. Пробую другие варианты системы... Если не сложно посоветуйте пожалуйста где можно почитать как строится скрипт констрейнов .sdc. Совсем смутно в этом ориентируюсь.
Сообщение отредактировал Acvarif - Apr 11 2013, 13:12
|
|
|
|
|
Apr 14 2013, 09:10
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Железо перепроовал по всякому (разные процессоры и т.п) Всеравно 88e1111 виснет на приемнике. В то же время на DE0Nano + ksz8721 и приемник и передатчик работает на любом железе и при небольших вариациях констрейнов без проблем. Нашел пару документов 1. http://www.altera.com/literature/ug/ug_tq_tutorial.pdf 2. http://embedders.org/sites/default/files/T...for_dummies.pdfПопробую проанализировать стандартный пример web сервера. Пример работает нормально. Но там столько наворочено...
|
|
|
|
|
Jun 4 2013, 06:41
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(vadimuzzz @ May 30 2013, 16:38)  во втором случае запись гарантировано идет мимо кэша. в первом же случае необходимо сбрасывать кэш, например установкой breakpoint т.е. нельзя объявить указатель на структуру, описывающую регистры периферии, привязать к соответствующему адресу и использовать для конфигурации данного модуля? В обязательном порядке необходимо использовать макросы IOWR, IORD? Поясните пожалуйста, что значит - сбрасывать кэш. Если я использую указатель, то данные сначала запишутся в кэш, а потом необходимо их каким-то образом переписать в регистр?
Сообщение отредактировал doom13 - Jun 4 2013, 06:44
|
|
|
|
|
Jun 7 2013, 11:23
|
Группа: Новичок
Сообщений: 1
Регистрация: 7-06-13
Пользователь №: 77 103

|
Подскажите пожалуйста с реализацией UDP протокола на Cyclone III:
Я столкнулся с задачей передачи видео по RTP/RTCP, который стоит поверх UDP/IP. Поэтому по сути мне нужно реализовать обмен данными по UDP, возникли вопросы как это сделать и с чего начать...
Элементная база: Cyclone III, Marvell 88E1111, SDRAM В связи со спецификой разработки НЕ могу использовать операционные системы. Как я понимаю, таким образом и NicheStack не получиться подключить. Скорость передачи: 48 МБ/с = 380 Мбит/с
Не очень понимаю функционал Triple Speed Ethernet, на вход этой мегафункции необходимо подавать полностью сформированные данные со всеми заголовка, crc и т.д. или часть задач она берет на себя?
Подскажите в каком направление двигаться, заранее спасибо.
|
|
|
|
|
Jun 7 2013, 11:46
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(targasonic @ Jun 7 2013, 14:23)  Подскажите пожалуйста с реализацией UDP протокола на Cyclone III:
Я столкнулся с задачей передачи видео по RTP/RTCP, который стоит поверх UDP/IP. Поэтому по сути мне нужно реализовать обмен данными по UDP, возникли вопросы как это сделать и с чего начать...
Элементная база: Cyclone III, Marvell 88E1111, SDRAM В связи со спецификой разработки НЕ могу использовать операционные системы. Как я понимаю, таким образом и NicheStack не получиться подключить. Скорость передачи: 48 МБ/с = 380 Мбит/с
Не очень понимаю функционал Triple Speed Ethernet, на вход этой мегафункции необходимо подавать полностью сформированные данные со всеми заголовка, crc и т.д. или часть задач она берет на себя?
Подскажите в каком направление двигаться, заранее спасибо. Начать с передачи-приёма данных с помощью ядра TSE, выше выкладывали рабочий драйвер, а к нему уже привинтить реализацию UDP. На вход мегафункции TSE подаётся готовый пакет со всеми заголовками, IP-crc и UDP-crc. TSE считает только контрольную сумму всего пакета (FRAME CHECK SEQUENCE), может заменять мак-адрес передатчика и при приёме может осуществлять фильтрацию мак-адресов.
|
|
|
|
|
Jun 9 2013, 23:49
|

Гуру
     
Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988

|
Цитата(doom13 @ Jun 4 2013, 13:41)  т.е. нельзя объявить указатель на структуру, описывающую регистры периферии, привязать к соответствующему адресу и использовать для конфигурации данного модуля? В обязательном порядке необходимо использовать макросы IOWR, IORD? можно, используйте функцию alt_remap_uncached. иногда можно кэш данных вообще выбросить без ущерба для производительности, зависит от типа памяти. Цитата Поясните пожалуйста, что значит - сбрасывать кэш. Если я использую указатель, то данные сначала запишутся в кэш, а потом необходимо их каким-то образом переписать в регистр? если используете указатель, значит работаете с памятью. вот компилятор и считает себя в праве оптимизировать доступ. если это не совсем то, что вы от него желаете, надо бить его иногда по рукам. в HAL для этого есть несколько функций: Цитата alt_dcache_flush() alt_dcache_flush_all() alt_icache_flush() alt_icache_flush_all() alt_remap_cached() alt_remap_uncached() alt_uncached_free() alt_uncached_malloc() Цитата(targasonic @ Jun 7 2013, 18:23)  Элементная база: Cyclone III, Marvell 88E1111, SDRAM В связи со спецификой разработки НЕ могу использовать операционные системы. Как я понимаю, таким образом и NicheStack не получиться подключить. Скорость передачи: 48 МБ/с = 380 Мбит/с я в этой теме выкладывал пример проекта. после небольшой доработки напильником, из него можно выжать примерно вдвое больше
|
|
|
|
|
Jun 10 2013, 12:59
|
Группа: Новичок
Сообщений: 9
Регистрация: 8-05-13
Пользователь №: 76 766

|
Помогите, пожалуйста, разобраться с приемом TSE. За основу взят проект уважаемого VadimZZZ. Kit DK-DEV-4CGX15N, Cyclone IV, SGMI, Marvell 88e1111. Передача работает. Приема нет При PING ллаты (broadcast) не попадаю в обработчик прерывания. Код выкладываю.
|
|
|
|
|
Jun 10 2013, 14:26
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(TASK @ Jun 10 2013, 15:59)  Помогите, пожалуйста, разобраться с приемом TSE. За основу взят проект уважаемого VadimZZZ. Kit DK-DEV-4CGX15N, Cyclone IV, SGMI, Marvell 88e1111.
Передача работает. Приема нет При PING ллаты (broadcast) не попадаю в обработчик прерывания. Код выкладываю. Вообще не заходит в прерывание или заходит один раз при старте? Если заходит один раз - где-то ошибка с sgdma, разрешено ли прерывание при возникновении ошибки в макросе ALTERA_TSE_SGDMA_INTR_MASK? Я бы построил обработчик прерывания несколько иначе, см. ug_embedded_ip.pdf подраздел Building and Updating Descriptor List. Код alt_sgdma_descriptor * pCurrDescRx = &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST]; alt_sgdma_descriptor * pNextDescRx = &desc[ALTERA_TSE_SECOND_RX_SGDMA_DESC_OFST]; char *rx_buff;
int SgDMARx_Isr(void* context, alt_u32 id) { alt_u32 data; alt_u32 *uncached_packet; alt_sgdma_descriptor *pDescRx; alt_u32 desc_stat = 0;
data = IORD_ALTERA_AVALON_SGDMA_CONTROL( SGDMA_RX_BASE ); data &= ~(ALTERA_AVALON_SGDMA_CONTROL_IE_GLOBAL_MSK | ALTERA_AVALON_SGDMA_CONTROL_RUN_MSK); IOWR_ALTERA_AVALON_SGDMA_CONTROL( SGDMA_RX_BASE, data );
if(IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE) & ALTERA_AVALON_SGDMA_STATUS_CHAIN_COMPLETED_MSK) { IOWR_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE, 0); desc_stat = IORD_ALTERA_TSE_SGDMA_DESC_STATUS(pCurrDescRx); if(desc_stat & ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_TERMINATED_BY_EOP_MSK) { pCurrDescRx->status &= ~ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_TERMINATED_BY_EOP_MSK; //,,, (ОБРАБОТКА ПРИНЯТОГО ПАКЕТА) } uncached_packet = (alt_u32 *)alt_remap_cached((volatile void*) rx_buff, 4); alt_avalon_sgdma_construct_stream_to_mem_desc(pCurrDescRx, pNextDescRx, uncached_packet, 0, 0); alt_dcache_flush(uncached_packet, 4); while (IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE) & ALTERA_AVALON_SGDMA_STATUS_BUSY_MSK) ; alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, pCurrDescRx); } return 0; }
|
|
|
|
|
Jun 10 2013, 16:41
|
Группа: Новичок
Сообщений: 9
Регистрация: 8-05-13
Пользователь №: 76 766

|
Порядок действий: 1) В режиме DEBUG устанавливается точка останова в начале обработчика прерывания int tse_sgdmaRx_isr(void * context, alt_u32 irqnum) 2) Запускается программа int main() { alt_u32 t=0; alt_printf("Hello from NIOS\n"); MAC_init(); while (1){ } return 0; } 3) Затем с PC подается ARP-запрос: Ping 192.168.1.2 4) На точку останова в обработчике ни разу не попасть!
|
|
|
|
|
Jun 10 2013, 17:47
|
Группа: Новичок
Сообщений: 9
Регистрация: 8-05-13
Пользователь №: 76 766

|
Не попасть при приема в обработчик прерывания. (для Cyclone IV, SGMI, Marvell 88e1111)
int MAC_init() { alt_u32 ,t2=0; int status=0; p_counter=0; IOWR_ALTERA_TSEMAC_MDIO_ADDR1(TSE_MAC_BASE, 0); // PHY and other board peripherial initialization IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE_MAC_BASE,PHY); t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,1,0x1B); //Extended PHY Specific Status Register t2 &= 0xFFF0;
IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,1,0x1B,t2 | 0x4);//SGMII without clock to Copper t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,1,0x14); // Disable RGMII Timing Control t2 &= ~0x82; //marvell_cfg_sgmii IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,1,0x14, t2); t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,1,ALTERA_TSEMAC_PHY_ADDR_CONTROL);// PHY reset IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,1,ALTERA_TSEMAC_PHY_ADDR_CONTROL,t2 | PCS_CTL_sw_reset);//Previous Operations Require SW Reset if((IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, ALTERA_TSEMAC_PHY_ADDR_STATUS) & PCS_ST_an_done) == 0) { IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, ALTERA_TSEMAC_PHY_ADDR_CONTROL + 16, 0x78); t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, ALTERA_TSEMAC_PHY_ADDR_CONTROL); IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, ALTERA_TSEMAC_PHY_ADDR_CONTROL, t2 | PCS_CTL_sw_reset); } // Without next string don't work reading packet t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 0, ALTERA_TSE_PCS_IF_MODE); IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 0, ALTERA_TSE_PCS_IF_MODE,t2 | 0x03); // PCS SGMII mode enabled
do { Delay(0xFFFFF); t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, 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(SGDMA_TX_NAME); sgdma_rx_dev = alt_avalon_sgdma_open(SGDMA_RX_NAME); IOWR_ALTERA_AVALON_SGDMA_CONTROL (SGDMA_RX_BASE,ALTERA_AVALON_SGDMA_CONTROL_SOFTWARERESET_MSK); IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_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, TSE_MAC_TRANSMIT_FIFO_DEPTH - 16); //1024/4; IOWR_ALTERA_TSEMAC_TX_SECTION_FULL(TSE_MAC_BASE, 0); 32/4; // start transmit when there are 48 bytes IOWR_ALTERA_TSEMAC_RX_SECTION_EMPTY(TSE_MAC_BASE, TSE_MAC_RECEIVE_FIFO_DEPTH - 16); //4000/4); IOWR_ALTERA_TSEMAC_RX_SECTION_FULL(TSE_MAC_BASE, 0); IOWR_ALTERA_TSEMAC_TX_CMD_STAT(TSE_MAC_BASE,ALTERA_TSEMAC_TX_CMD_STAT_TXSHIFT16_ MSK); //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_PROMIS_EN_MSK);//???ALTERA_TSEMAC_CMD_PROMIS_EN_MSK IOWR_ALTERA_TSEMAC_MAC_0(TSE_MAC_BASE,((int)(0x00) | (int)(0x07 << 8) | (int)(0xED << 16) | (int)(0x19 << 24))); IOWR_ALTERA_TSEMAC_MAC_1(TSE_MAC_BASE,(((int)(0x05) | (int)(0x9B << 8)) & 0xFFFF));
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);
alt_u32 *uncached_packet_payload;
uncached_packet_payload = (void *)alt_remap_cached ((volatile 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" uncached_packet_payload, // starting write_address 0, // read until EOP 0); while ( (IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_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]);
sem=0; return status; } //--------------------------------------------------------------------------------------------- int tse_sgdmaRx_isr(void * context, alt_u32 irqnum) { alt_u32 t2=0; alt_u32 *uncached_packet_payload; t2=IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE); if (t2 & (ALTERA_AVALON_SGDMA_STATUS_CHAIN_COMPLETED_MSK | ALTERA_AVALON_SGDMA_STATUS_DESC_COMPLETED_MSK)) { p_counter++; alt_printf("Packet counter:%x\n",p_counter); IOWR_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE,ALTERA_AVALON_SGDMA_STATUS_CHAIN_C OMPLETED_MSK); t2=IORD_ALTERA_TSE_SGDMA_DESC_STATUS(&desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST]); /*check status and handle packet*/ if( (t2 & (ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_CRC_MSK | ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_PARITY_MSK | ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_OVERFLOW_MSK | ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_SYNC_MSK | ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_UEOP_MSK | ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_MEOP_MSK | ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_MSOP_MSK ) ) == 0) { t2=IORD_16DIRECT(&desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST].actual_bytes_transferred, 0)-2; CheckPacket(pkt,t2); } else { alt_printf("RX descriptor reported error. Packet dropped\n"); } uncached_packet_payload = (void *)alt_remap_cached ((volatile 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" uncached_packet_payload, // starting write_address 0, // read until EOP 0); // don't write to constant address t2=alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, &des[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST]); } return 0; }
|
|
|
|
|
Jun 15 2013, 10:57
|
Частый гость
 
Группа: Свой
Сообщений: 184
Регистрация: 21-03-06
Из: Нижний Новгород
Пользователь №: 15 435

|
Здравствуйте. возник вот какая проблема с использованием PHY_88E1111 + MAC_tse + Nios. В ниосе проект от уважаемого vadimzzz. Когда подключаешся к сети то все нормально все пакеты ходят взад вперед, все работает, лампочки усердно мигают . Собственно так проект и отладили до конца через общественную сеть. Сложность возникла когда стали использовать Media Converter 10/100/1000Base-T to 1000Base-X. Есть два конвертера, когда делаешь связку общественная сеть --- КонвертерА --- оптика --- КонвертерВ -- ПК то все работает как положено, все линки есть и сеть работает. А вот когда подключаешь прибор например к КонвертеруА( или Б) то лампочки на конвертере горит только PWR и иного мигает FDX (по описанию это означает коллизия). На плате прибора тоже все лампочки гаснут и иного мигает лампочка Duplex как сказано в описание тоже означает что коллизия. ни какое шаманство с регистрами не поменяло состояние. Еще заметил что часто бывает что первое чтение после программного сброса возвращает нормальные записи в реситрах, а последующие чтения рестров возвращают всегда фффф. При просмотре сигналов видно что действительно марвел не отвчает по шине мдио/млс. при подключении прибора к ПК на прямую прямым кабелем светодиоды маргают что линк есть, но данные идут странные вот когда связь есть т.е. общественная сеть http://gyazo.com/05d003d967dae4be0368f02ece9c225dа вот когда анпрямую к ПК http://gyazo.com/114e94aa45b6d8446475cd91f440cf26видно что потерялась преамбула я так понимаю что марвел должен был автоматом поменять полярность.. или что то нужно еще сделать чтобы это произошло? вот рисунок дампа регистров взятых и марвела http://gyazo.com/ac80ec5b599128cc1efa4ab7eabe9288здесь показан дамп регистров когда прибор подключен к сети и с линком все нормально http://gyazo.com/c04829de874a1f808321ff8f5d146e03документация на конвертер http://gyazo.com/d313c01d2734b09e4c8329fceed85d16http://gyazo.com/4c2a277e89eec85bf7ba3d7974a13a04фотка конвертера при подключении его к прибору http://gyazo.com/63121c90c10225904d2e760dbd4445a6вот код подключения модуля Код module DevEthernet( // Clock input CLOCK_50, // reset input reset_n, // Ethernet output NET0_GTX_CLK, output NET0_MDC, inout NET0_MDIO, output NET0_RESET_N, input NET0_RX_CLK, input [3: 0] NET0_RX_DATA, input NET0_RX_DV, output [3: 0] NET0_TX_DATA, output NET0_TX_EN );
wire sys_clk, clk_125, clk_25, clk_2p5, clk_200, tx_clk; wire core_reset_n; wire mdc, mdio_in, mdio_oen, mdio_out; wire eth_mode, ena_10; // -- wire udp_stack_fifo_start_to_ethernet; // udp_stack_fifo.start_to_ethernet wire [7:0] udp_stack_fifo_rd_data; // .rd_data wire udp_stack_fifo_rdreq; // .rdreq wire udp_stack_fifo_rdempty; // .rdempty wire [10:0] udp_stack_fifo_rdusedw; // .rdusedw wire [7:0] udp_stack_fifo_wr_data; // .wr_data wire udp_stack_fifo_wrreq; // .wrreq wire udp_stack_fifo_wrfull; // .wrfull wire udp_stack_eth_cntrl_export; // udp_stack_eth_cntrl.export
assign mdio_in = NET0_MDIO; assign NET0_MDC = mdc; assign NET0_MDIO = mdio_oen ? 1'bz : mdio_out; assign NET0_RESET_N = core_reset_n & udp_stack_eth_cntrl_export; assign udp_stack_fifo_start_to_ethernet = 1'b0; assign udp_stack_fifo_rdreq = 1'b0; assign udp_stack_fifo_wr_data = 8'h00; assign udp_stack_fifo_wrreq = 1'b0; pll pll_inst( .areset(~reset_n), .inclk0(CLOCK_50), .c0(sys_clk), .c1(clk_125), .c2(clk_25), .c3(clk_2p5), .c4(clk_200), .locked(core_reset_n) ); assign tx_clk = eth_mode ? clk_125 : // GbE Mode = 125MHz clock ena_10 ? clk_2p5 : // 10Mb Mode = 2.5MHz clock clk_25; // 100Mb Mode = 25 MHz clock ddio_out ddio_out_inst( .datain_h(1'b1), .datain_l(1'b0), .outclock(tx_clk), .dataout(NET0_GTX_CLK) ); nios_system system_inst( .clk_clk (sys_clk), // clk.clk .reset_reset_n (core_reset_n), // reset.reset_n
.reset_tse_reset_n (udp_stack_eth_cntrl_export), .tse_export_rx_control (NET0_RX_DV), // tse_mac_conduit.rx_control .tse_export_rx_clk (NET0_RX_CLK), // .rx_clk .tse_export_tx_control (NET0_TX_EN), // .tx_control .tse_export_tx_clk (tx_clk), // .tx_clk .tse_export_rgmii_out (NET0_TX_DATA), // .rgmii_out .tse_export_rgmii_in (NET0_RX_DATA), // .rgmii_in .tse_export_ena_10 (ena_10), // .ena_10 .tse_export_eth_mode (eth_mode), // .eth_mode .tse_export_mdio_in (mdio_in), // .mdio_in .tse_export_mdio_out (mdio_out), // .mdio_out .tse_export_mdc (mdc), // .mdc .tse_export_mdio_oen (mdio_oen), // .mdio_oen // -- .udp_stack_fifo_start_to_ethernet(udp_stack_fifo_start_to_ethernet), // udp_stack_fifo.start_to_ethernet .udp_stack_fifo_rd_data(udp_stack_fifo_rd_data), // .rd_data .udp_stack_fifo_rdreq(udp_stack_fifo_rdreq), // .rdreq .udp_stack_fifo_rdempty(udp_stack_fifo_rdempty), // .rdempty .udp_stack_fifo_rdusedw(udp_stack_fifo_rdusedw), // .rdusedw .udp_stack_fifo_wr_data(udp_stack_fifo_wr_data), // .wr_data .udp_stack_fifo_wrreq(udp_stack_fifo_wrreq), // .wrreq .udp_stack_fifo_wrfull(udp_stack_fifo_wrfull), // .wrfull .udp_stack_eth_cntrl_export(udp_stack_eth_cntrl_export) // udp_stack_eth_cntrl.export );
endmodule вот код инициализации Код IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE_BASE, PHY); t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_BASE,0,0x1B);//Extended PHY Specific Status Register t2 &= 0xFFF0; IOWR_ALTERA_TSEMAC_MDIO(TSE_BASE,0,0x1B,t2|0xB);//RGMII to Copper t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_BASE,0,0x14);//Extended PHY Specific Control Register IOWR_ALTERA_TSEMAC_MDIO(TSE_BASE,0,0x14,t2|0x82);//Add Delay to RX_CLK for RXD Outputs; Add Delay to GTX_CLK for TXD Inputs t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_BASE,0,ALTERA_TSEMAC_PHY_ADDR_CONTROL); IOWR_ALTERA_TSEMAC_MDIO(TSE_BASE, 0, ALTERA_TSEMAC_PHY_ADDR_CONTROL, t2 | PCS_CTL_sw_reset);//Previous Operations Require SW Reset do { for(i = 0; i < sizeof(reg_phy); i++){ reg_phy[i] = IORD_ALTERA_TSEMAC_MDIO(TSE_BASE, 0, i); } t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_BASE,0,ALTERA_TSEMAC_PHY_ADDR_STATUS); } не могу понять куда дальше копать, в чем проблема что марвел не хочет подключится к прибору? Как/чем можно посмотреть почему phy не поднял линк?
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|