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

 
 
> Применение прерываний в Nios II
Alexey_Rostov
сообщение Jan 16 2014, 00:30
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 236
Регистрация: 28-06-13
Из: Минск, Беларусь
Пользователь №: 77 312



Здравствуйте. Только осваиваю Nios. Подскажите пожалуйста как решить следующую задачу.
Собрал в Qsys простейшую схему:
Прикрепленное изображение

В Quartus собрал счетчик. Со счетчика подаю сигнал на Nios и возвращаю из Nios на светодиоды.
Использование функций

Код
d10 = IORD_ALTERA_AVALON_PIO_DATA(DATA_PIO_BASE);
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE , d10);

приводит к тому, что при медленном счете Nios выводит на светодиоды один и тот же отсчет многократно.

Как сделать, чтобы сигнал из Nios на светодиоды выводился только один раз при приеме нового байта от счетчика?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
Swup
сообщение Jan 17 2014, 10:41
Сообщение #2


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

Группа: Свой
Сообщений: 127
Регистрация: 2-09-11
Из: Москва
Пользователь №: 66 970



Я как-то делал вот так.

1. на PIO заведены 4 тумблера.
Модуль вышлет прерывание при изменении любого разряда на регистре PIO. Это будет отражено в регистре pio_edge_cap(как-то так).
Прикрепленное изображение


2. функция прерывания выводящая код с 4 тумблеров на 4 светодиода.

Код
void handle_buttons_ISR()
{
    unsigned int led;
    led = IORD(BUTTONS_BASE, 0x00));    // захват данных из регистра pio
    IOWR(LED_BASE, 0, led );            // запись данных в регистр led
    IOWR(BUTTONS_BASE, 3, 0x00));        // обнуляется регистр pio_edge_cap
}


3. регистрируем прерывание по адресу в основной программе.
Примерно так.
Код
int main (void)
{
    IOWR(BUTTONS_BASE, 2, 0x0F);       //маска прерываний, разрешает прерывание при изменение всех 4х бит
    IOWR(BUTTONS_BASE, 3, 0x00);      // сбрасывается регистр pio_edge_cap
    alt_ic_isr_register( NULL, BUTTONS_IRQ, handle_buttons_ISR, NULL, 0x00 );

    while (1)
    {
    
    }

    return 0;
}


ПС если не хотите с этим морочиться, то перед записью просто проверяйте, что d10 изменился после записи.
Например так.
Код
d10 = IORD_ALTERA_AVALON_PIO_DATA(DATA_PIO_BASE);
if (d10_tmp != d10)
{
     IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE , d10);
}
d10_tmp= d10;


Сообщение отредактировал Swup - Jan 17 2014, 10:44
Go to the top of the page
 
+Quote Post
Alexey_Rostov
сообщение Jan 17 2014, 11:50
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 236
Регистрация: 28-06-13
Из: Минск, Беларусь
Пользователь №: 77 312



Большое спасибо за пример. Сразу не подумал, что можно обойтись и без прерываний. А как быть если в потоке входных данных содержатся два или более одинаковых числа? И их необходимо записать в массив внутри ниоса?
Как я понял входной регистр ядра PIo не обновиться и соответственно не будет сигнала захвата фронта (edge_capture)?
Go to the top of the page
 
+Quote Post
Swup
сообщение Jan 17 2014, 12:18
Сообщение #4


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

Группа: Свой
Сообщений: 127
Регистрация: 2-09-11
Из: Москва
Пользователь №: 66 970



В моем примере это было не нужно, да и в вашем примере со счетчиком тоже.

Ну тут идея простая в принципе: для выделения данных из потока у вас должно быть событие символизирующее о новом слове в потоке. В примере выше это изменение числа на шине.
В более реальном варианте этим событием является известный темп следования данных (тактовая частота шины). С точки зрения системы это более сложный вопрос и не думаю, что PIO подходит для такого решения. Можно использовать например FIFO, DMA или написать что-то своё.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 18:29
Рейтинг@Mail.ru


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