реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> Создание компонета для SOPC Builder с несколькими регистрами ввода/вывода
Acvarif
сообщение Aug 23 2012, 10:18
Сообщение #31


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Цитата(Копейкин @ Aug 23 2012, 12:05) *
У меня примера под рукой нет, но когда разбирался, то отложилось в памяти так:
1) Интерфейс Interrupt sender даёт нам линии irq или irq_n, которые работают по уровню, не фронту.
Выбрали, допустим irq - срабатывает на уровень "1".
2) Ставим на линию irq триггер.
3) Триггер взводится в "1" Вашим событием (кнопка, счётчик...)
4) Программа в обработчике прерывания ОБЯЗАТЕЛЬНО должна этот триггер сбросить в "0",
иначе из прерывания не выйти. Сбросить можно чтением или записью по адресу, как Вам удобно.
Вот таким образом.

Есть ещё компонент - векторизируемый контроллер прерываний - он даёт возможностей побогаче,
более предсказуемое время входа в прерывание, но требует существенных ресурсов, для реализации.
С ним не разбирался - так, обзорно...

Спасибо. Понятно. Жаль, что только по уровню.
Вобщем так вроде и реализовал. Только сброс со стороны обработчика не делал.
Попробую со сбросом.
Всеравно не до конца понимаю зачем сбрасывать тригер со стороны программы (тоесть в обработчике).
Почему не проходит номер просто формировать импульс небольшой длительности и все?

Читал мануал и выяснил, что если использовать PIO то можно все реализовать и по фронту. В этом случае используется
регистр PIO который внешним событием можно установить, а в обработчике сбросить типа
CODE
/* Initialize the button_pio. */
static void init_button_pio()
{
/* Recast the edge_capture pointer to match the
alt_irq_register() function prototype. */
void* edge_capture_ptr = (void*) &edge_capture;
/* Enable all 4 button interrupts. */
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0xf);
/* Reset the edge capture register. */
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0x0);
/* Register the ISR. */
#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
alt_ic_isr_register(BUTTON_PIO_IRQ_INTERRUPT_CONTROLLER_ID,
BUTTON_PIO_IRQ,
handle_button_interrupts,
edge_capture_ptr, 0x0);
#else
alt_irq_register( BUTTON_PIO_IRQ,
edge_capture_ptr,
handle_button_interrupts );
#endif
}

Вроде и так можно, но тогда придется из компонента прерывание убрать, добавить 1 бит PIO, вывести наружу импульсы запроса прерывания которые подать извне на PIO (тоесть просто перемычка). Насколько так будет хуже или лучше?
Go to the top of the page
 
+Quote Post
Копейкин
сообщение Aug 23 2012, 13:32
Сообщение #32


Частый гость
**

Группа: Участник
Сообщений: 190
Регистрация: 7-11-07
Из: С-Петербург
Пользователь №: 32 134



Импульс небольшой длительности не гарантирует срабатывание вообще или именно однократное срабатывание.
Сбрасывать программой, да ещё в обработчике, нужно потому, что больше никто не знает, что уже отреагировал на IRQ.
Собственно можно и через PIO.
Ничего плохого я в этом не вижу.
Просто если вводить для этого отдельный компонент, то увеличивается нагрузка на шину -> падает быстродействие.
Ещё, компонент получается не самодостаточным, если для только себя, то и пусть, а если отдавать кому, то совестно.
Собственно, сделать детектор перепада уровня - это 2 триггера и логический элемент.
А бит события PIO, также нужно чистить в прерывании, иначе в нем и останешься.
Go to the top of the page
 
+Quote Post
barabek
сообщение Aug 23 2012, 22:19
Сообщение #33


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(Acvarif @ Aug 23 2012, 20:18) *
Спасибо. Понятно. Жаль, что только по уровню.

По другому никак. Ну только у 51-ых для некоторых прерываний флаги автоматом сбрасываются при переходе на вектор прерываний. Но это редкость и это не Ваш случай.Для ниоса попытайтесь понять механизм обработки прерываний. Читайте мануал exaption handling. Кратко так. При появлении какого-либо флага ниос переходит на строго определенный адрес (exception address). И этот адрес ОДИН для всех прерываний в системе. По этому адресу хранится библиотечный обработчик (ЕМНИП irq_handler()), который проверяет регистр ipending. В этот регистр смультеплексированы все флаги прерываний. Проверяет софтверно! И на каждый установленный бит вызывает соответствующий обработчик прерывания из таблицы. А теперь представьте, Вы выставили флаг, обработчик вызвался, но не успел обнаружить Ваш флаг, а Вы его сбросили. Нехорошая ситуация.
Вам же выложили примеры. Там есть прерывания. Посмотрите. У меня в примере есть сбос прерывания по чтению региста данных. Это на несколько команд сокращает обработчик sm.gif. Т.е. не обязательно заставлять пользователя сбрасывать флаг, можно сделать так, чтобы флаг сбрасывался, когда Вы вычитываете (или записываете новые) данные из переферии.
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Aug 24 2012, 08:07
Сообщение #34


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Цитата(barabek @ Aug 24 2012, 01:19) *
По другому никак. Ну только у 51-ых для некоторых прерываний флаги автоматом сбрасываются при переходе на вектор прерываний. Но это редкость и это не Ваш случай.Для ниоса попытайтесь понять механизм обработки прерываний. Читайте мануал exaption handling. Кратко так. При появлении какого-либо флага ниос переходит на строго определенный адрес (exception address). И этот адрес ОДИН для всех прерываний в системе. По этому адресу хранится библиотечный обработчик (ЕМНИП irq_handler()), который проверяет регистр ipending. В этот регистр смультеплексированы все флаги прерываний. Проверяет софтверно! И на каждый установленный бит вызывает соответствующий обработчик прерывания из таблицы. А теперь представьте, Вы выставили флаг, обработчик вызвался, но не успел обнаружить Ваш флаг, а Вы его сбросили. Нехорошая ситуация.
Вам же выложили примеры. Там есть прерывания. Посмотрите. У меня в примере есть сбос прерывания по чтению региста данных. Это на несколько команд сокращает обработчик sm.gif. Т.е. не обязательно заставлять пользователя сбрасывать флаг, можно сделать так, чтобы флаг сбрасывался, когда Вы вычитываете (или записываете новые) данные из переферии.

Да, так все и сделал. В смысле сбрасываю пользовательский тригер, который генерирует уровень прерывания, чтением по определенному адресу.
Вроде работает нормально.
Всем спасибо. В основном вопрос решен.
Но почитал тут лабораторку про прерывания и понял, что в моем случае придется переходить на DMA.
Вот лабораторка http://www.khstu.ru/vestnik/articles/396.pdf
Время забора данных из пользовательской памяти в память SDRAM NIOS у меня сильно ограничено. За 2 мкс в определенный момент нужно перегрузить из пользовательской двухпортовой памяти данные (16 слов) в SDRAM NIOS.
Похоже это уже тема для другой ветки (про DMA) форума...
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th July 2025 - 00:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01372 секунд с 7
ELECTRONIX ©2004-2016