zvs 0 8 ноября, 2007 Опубликовано 8 ноября, 2007 · Жалоба Только-только начал ковырять NIOS, посему все чаще хватаюсь за голову со словами "Создатель, как много я еще не знаю!!!". Задачка с виду простая. Есть некая железяка (старая, замучаная макетка) к которой прикручена перифирия в виде Wiznet'овского модуля Ethernet. Есть выдернутая из альтеровской университетской программы "мегафункция" Avalon to External Bus Bridge. Нужно записать 8-битные данные по некоторому адресу шины. Пытаюсь сделать это vfrhjcjv IOWR (или IOWR_8DIRECT), но при пошаговом выполнении в отладчике происходит нечто странное. Выглядит это как будто при попытке записать (или прочитать) данные по адресу, выделенному этому External Bus Bridge'у в SOPC Builder'e данные все-таки записываются (то есть на шине возникают соотвествующие сигналы с avalon_chipselect, avalon_write и т.д.) но потом программа сбрасывается (то бишь выполнение опять начинается с начала) Может нельзя вот так напрямую использовать эти макросы? С другой стороны их активно применяют в NIOS'овском примерчике который называется "memtest". Уважаемые знатоки, подскажите пожалуйста где тут зарыта собака? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Postoroniy_V 0 8 ноября, 2007 Опубликовано 8 ноября, 2007 · Жалоба Только-только начал ковырять NIOS, посему все чаще хватаюсь за голову со словами "Создатель, как много я еще не знаю!!!". Задачка с виду простая. Есть некая железяка (старая, замучаная макетка) к которой прикручена перифирия в виде Wiznet'овского модуля Ethernet. Есть выдернутая из альтеровской университетской программы "мегафункция" Avalon to External Bus Bridge. Нужно записать 8-битные данные по некоторому адресу шины. Пытаюсь сделать это vfrhjcjv IOWR (или IOWR_8DIRECT), но при пошаговом выполнении в отладчике происходит нечто странное. Выглядит это как будто при попытке записать (или прочитать) данные по адресу, выделенному этому External Bus Bridge'у в SOPC Builder'e данные все-таки записываются (то есть на шине возникают соотвествующие сигналы с avalon_chipselect, avalon_write и т.д.) но потом программа сбрасывается (то бишь выполнение опять начинается с начала) Может нельзя вот так напрямую использовать эти макросы? С другой стороны их активно применяют в NIOS'овском примерчике который называется "memtest". Уважаемые знатоки, подскажите пожалуйста где тут зарыта собака? 1) я бы на вашем месте почитал в хандбуке статью про avalon tristate bridge оно как раз для вашего случая 2)IOWR работать должен и просто обязан, кроме случаев когда у вас кеш используется, тогда писать нужно в обход кеша, об этом тоже есть в хандбуке 3)а вот почему резетися проц х.з. Код исходный можно увидеть? И что там у вас за перифирия кроме визнета внешнего?..И ещё - сопц билдер генерит ниос безо всяких тайм лимитед? 4) отладчик какой? родной ниос иде? пробовали codelab(есть в закромах)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zvs 0 8 ноября, 2007 Опубликовано 8 ноября, 2007 · Жалоба 1) Как раз этим и занимаюсь :) 2) А кеша у меня вроде как нет совсем - NIOS задан в конфигурации "/е" 3) Код... :( Код наибанальнейший. Просто для теста: #include <io.h> int main(void) { int i, a, b; a = 1024; b = 1010; a = a-b; for(i=0;++i<=255;) { if(i>a) { IOWR_8DIRECT(0x2000,0x0000,0x11); } else b = IORD_8DIRECT(0x2000,0x0000); //c адреса 0x2000 начинается пространство Avalon to External Bus Bridge } return 0; } Периферия - кроме Avalon to External Bus Bridge только onchip'овая память (2кБайта) cpu_0 was generated with full capabilities... - это от SOPC Builder'а, ну а Quartus вообще молчит 4) Отладчик родной... Закрома Вы имеете ввиду местные? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Postoroniy_V 0 8 ноября, 2007 Опубликовано 8 ноября, 2007 · Жалоба 1) Как раз этим и занимаюсь :) 2) А кеша у меня вроде как нет совсем - NIOS задан в конфигурации "/е" 3) Код... :( Код наибанальнейший. Просто для теста: Периферия - кроме Avalon to External Bus Bridge только onchip'овая память (2кБайта) cpu_0 was generated with full capabilities... - это от SOPC Builder'а, ну а Quartus вообще молчит 4) Отладчик родной... Закрома Вы имеете ввиду местные? 1,2 это хорошо! 3 - как бы ничего криминального в коде нет только я не понимаю, зачем вам понадобился Avalon to External Bus Bridge? если для таких целей avalon tristate bridge существует..просто не ясно зачем шину наружу выводить :) You must use a tristate bridge in either of the following cases: ■ The off-chip device has bidirectional data pins. ■ Multiple off-chip devices share the address and/or data buses. 4 да на местном фтп Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zvs 0 8 ноября, 2007 Опубликовано 8 ноября, 2007 · Жалоба только я не понимаю, зачем вам понадобился Avalon to External Bus Bridge? если для таких целей avalon tristate bridge существует..просто не ясно зачем шину наружу выводить :) Ну, как говорится, я еще мал и глуп и не видал больших синиц ;) В процессе ковыряния Avalon Tri-state Bridge обнаружилась одна гадкая особенность - он не хочет использовать прерывание от этого самого WizNet'a как входное прерывание для процессора. Только как выход :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Postoroniy_V 0 8 ноября, 2007 Опубликовано 8 ноября, 2007 · Жалоба Ну, как говорится, я еще мал и глуп и не видал больших синиц ;) В процессе ковыряния Avalon Tri-state Bridge обнаружилась одна гадкая особенность - он не хочет использовать прерывание от этого самого WizNet'a как входное прерывание для процессора. Только как выход :( вообщем в 7.1 есть баг связанный с трайстейт мостом...ищите по форуму, и один человек выкладывал патч для сопц билдера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zvs 0 8 ноября, 2007 Опубликовано 8 ноября, 2007 · Жалоба вообщем в 7.1 есть баг связанный с трайстейт мостом...ищите по форуму, и один человек выкладывал патч для сопц билдера. Я так понял, что у 7.1 багов, связанных с SOPC Builder'ом - как грязи. Поэтому и ковыряюсь на 6.1. Но это лирика. Главное - другое. Переделал все через трайстейт мост и передача (как и прием) таки состоялись!!! Огромное спасибо, Postoroniy_V!! :a14: Осталось придумать как прикрутить прерывания от wiznet'а. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zvs 0 9 ноября, 2007 Опубликовано 9 ноября, 2007 · Жалоба Так, с прерываниями все нормально - это я просто сглупил. Просто нужно иметь в виду, что при создании компонента направление сигналов указываются для подключаемого устройства по отношению к шине. Но... 1) Отчего-то в SignalTap не добавляются ноги данных созданной шины 2) При выполнении одной команды чтения генерируется ЧЕТЫРЕ цикла чтения. Я так понимаю, что это связано с тем, что SOPC Builder посчитал, что у моего устройства есть byte_enable, но я, при создании компонента, таких сигналов не задавал :( Читаю макросом IORD_8DIRECT. 3) Кроме того огромное количество варнингов по поводу "Reduced register" где-то внутри процессора. Это нормально? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zvs 0 9 ноября, 2007 Опубликовано 9 ноября, 2007 · Жалоба C 1) Разобрался - убедил SignalTap 2) Я не одинок во вселенной. Эта проблема как выяснилось нерешабельна. Описано здесь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zvs 0 15 ноября, 2007 Опубликовано 15 ноября, 2007 · Жалоба Тему пора переименовывать, ну да ладно... Знатоки NIOS, ежели кто использовал Avalon TriState Bridge для подключения внешей перефирии, подскажите пожалуйста - это вообще возможно использовать прерывание, подключенное через этот мост к NIOS'у? Меня собственно почему сомнение берет - не нашел в mnl_avalon_spec.pdf никаких про то упоминаний. У меня прерывание как-то не так работает. В мосте (Avalon TriState Bridge) определил соответствие между внешней ногой и сигналом irq_n - повесил на 0-е прерывание. alt_irq_register определил не в main, а в отдельной функции. После выполнения "регистрации прерывания" процессор закольцовывается на обработчике прерывания, указанном в alt_irq_register. То есть возникает ощущение, что прерывание возникает постоянно, хотя на самом деле линия стоит - не шелохнется (осциллограф и SignalTap тут единодушны). Может кто сталкивался с такой необходимостью - подключать к NIOS'у периферию, работающую с прерываниями? Поделитесь, как вы ее побеждали, пожалуйста... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
id_gene 0 15 ноября, 2007 Опубликовано 15 ноября, 2007 · Жалоба 1) Обработчик снимает прерывание? 2) Дизассемблировали? 3) Отладчиком проходили или моделсимом? 4) В какой точке закольцовывается? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zvs 0 16 ноября, 2007 Опубликовано 16 ноября, 2007 · Жалоба 1) Снимает... Но собсно дело не в этом - дело в том, что его никто не выставляет :( Оно само... 2) Нет... Не умею я :( А подскажите пожалуйста, куда там смотреть и что в ассемблерном виде я там смогу увидеть? 3) Отладчиком. 4) А можно с этого места поподробнее? Код у меня такой: int main(void) { int result = 0; alt_busy_sleep(160000); do { result = WiznetInit(); // вот тут производится инициализация контроллера // и регистрация прерывания. } while (result == 0); while(1) //ожидание прерывания { if(int_type != 0) { if(int_type != RECV_INT) WiznetRead(); } } /**/ } int WiznetInit(void) { (...)// инициализацию контроллера я пропустил... Для ясности. if(alt_irq_register(0, ptr_int_type, IntHandle)!=0) return(0); //регистрация прерывания else return(1); } static void IntHandle(void* context, alt_u32 id) //обработчик прерывания { alt_u8 type; alt_u8* ptr_int_type = (alt_u8*)context; type = IORD_8DIRECT(COMMON,IR); if(type&&S0_INT_MSK) { type = IORD_8DIRECT(S0,Sn_IR); if(type&&SEND_OK) *ptr_int_type = SEND_OK; else if(type&&TIMEOUT) *ptr_int_type = TIMEOUT; else if(type&&RECV_INT) *ptr_int_type = RECV_INT; else *ptr_int_type = 0; } else *ptr_int_type = 0; IOWR_8DIRECT(S0,Sn_IR,0x1F); //снятие прерывания } И ежели я ставлю brakepoint внутри обработчика прерывания - то могу отловить момент "зацикливания". А ежели иду step-by-step от начала main(), то на следующей строке после alt_irq_register() дебаггер уже не показывает где он находится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
id_gene 0 16 ноября, 2007 Опубликовано 16 ноября, 2007 · Жалоба 1) Снимает... Но собсно дело не в этом - дело в том, что его никто не выставляет :( Оно само... 2) Нет... Не умею я :( А подскажите пожалуйста, куда там смотреть и что в ассемблерном виде я там смогу увидеть? 3) Отладчиком. 4) А можно с этого места поподробнее? Код у меня такой: И ежели я ставлю brakepoint внутри обработчика прерывания - то могу отловить момент "зацикливания". А ежели иду step-by-step от начала main(), то на следующей строке после alt_irq_register() дебаггер уже не показывает где он находится. 1. это Дед Мороз к НГ готовится и дергает прерывания :smile3046: 2. смотреть на инструкции, выполняемые процессором. В отладчике есть весьма полезная кнопка stepping mode, при этом процессор останавливается после выполнения каждой инструкции. Общие предложения: 1. проверить alt_irq_init, alt_irq_enable (0) - посмотреть в отладчике соответствующие регистры процессора status, estatus, ienable на вкладке регистры. 2. замаскировать прерывание alt_irq_disable... и посмотреть наличие прерывания в регистре ipending 3. signaltap-ом или другим устройством убедиться, что прерывание приходит и уходит когда надо. 4. как вариант - отключить прерывание в процессоре в регистре ienable (но оставить в статусном регистре), чтобы не вызывался обработчик (может, придется закомментировать alt_irq_register), и переписать main так, чтобы в цикле while (1) читался регистр ipending, при наличии там прерывания явно вызывалась функция обработчика, и только потом проверять переменную int_type (наверное, она глобальная или volatile или вместе) А ежели иду step-by-step от начала main(), то на следующей строке после alt_irq_register() дебаггер уже не показывает где он находится.Можно на паузу нажать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться