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

NIOS, Avalon to External Bus Bridge, IOWR

Только-только начал ковырять 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".

 

Уважаемые знатоки, подскажите пожалуйста где тут зарыта собака?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только-только начал ковырять 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(есть в закромах)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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) Отладчик родной... Закрома Вы имеете ввиду местные?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 да на местном фтп

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

только я не понимаю, зачем вам понадобился Avalon to External Bus Bridge?

если для таких целей avalon tristate bridge существует..просто не ясно зачем шину наружу выводить :)

Ну, как говорится, я еще мал и глуп и не видал больших синиц ;)

В процессе ковыряния Avalon Tri-state Bridge обнаружилась одна гадкая особенность - он не хочет использовать прерывание от этого самого WizNet'a как входное прерывание для процессора. Только как выход :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, как говорится, я еще мал и глуп и не видал больших синиц ;)

В процессе ковыряния Avalon Tri-state Bridge обнаружилась одна гадкая особенность - он не хочет использовать прерывание от этого самого WizNet'a как входное прерывание для процессора. Только как выход :(

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Я так понял, что у 7.1 багов, связанных с SOPC Builder'ом - как грязи. Поэтому и ковыряюсь на 6.1. Но это лирика.

Главное - другое. Переделал все через трайстейт мост и передача (как и прием) таки состоялись!!! Огромное спасибо, Postoroniy_V!! :a14:

Осталось придумать как прикрутить прерывания от wiznet'а.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так, с прерываниями все нормально - это я просто сглупил. Просто нужно иметь в виду, что при создании компонента направление сигналов указываются для подключаемого устройства по отношению к шине.

Но...

1) Отчего-то в SignalTap не добавляются ноги данных созданной шины

2) При выполнении одной команды чтения генерируется ЧЕТЫРЕ цикла чтения. Я так понимаю, что это связано с тем, что SOPC Builder посчитал, что у моего устройства есть byte_enable, но я, при создании компонента, таких сигналов не задавал :( Читаю макросом IORD_8DIRECT.

3) Кроме того огромное количество варнингов по поводу "Reduced register" где-то внутри процессора. Это нормально?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

C

1) Разобрался - убедил SignalTap

2) Я не одинок во вселенной. Эта проблема как выяснилось нерешабельна. Описано здесь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тему пора переименовывать, ну да ладно...

Знатоки NIOS, ежели кто использовал Avalon TriState Bridge для подключения внешей перефирии, подскажите пожалуйста - это вообще возможно использовать прерывание, подключенное через этот мост к NIOS'у? Меня собственно почему сомнение берет - не нашел в mnl_avalon_spec.pdf никаких про то упоминаний.

У меня прерывание как-то не так работает. В мосте (Avalon TriState Bridge) определил соответствие между внешней ногой и сигналом irq_n - повесил на 0-е прерывание.

alt_irq_register определил не в main, а в отдельной функции.

После выполнения "регистрации прерывания" процессор закольцовывается на обработчике прерывания, указанном в alt_irq_register. То есть возникает ощущение, что прерывание возникает постоянно, хотя на самом деле линия стоит - не шелохнется (осциллограф и SignalTap тут единодушны).

 

Может кто сталкивался с такой необходимостью - подключать к NIOS'у периферию, работающую с прерываниями? Поделитесь, как вы ее побеждали, пожалуйста...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) Обработчик снимает прерывание?

2) Дизассемблировали?

3) Отладчиком проходили или моделсимом?

4) В какой точке закольцовывается?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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() дебаггер уже не показывает где он находится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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() дебаггер уже не показывает где он находится.
Можно на паузу нажать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...