Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывания в PicoBlaze.
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
mkalexey
Доброго времени суток!

Может есть какие-то идеи или примеры?
Может быть аналоги для других софт-процессоров?

Буду благодарен.
lutik
что имеется в виду под "комплексная система прерываний".

если нада несколько источников использовать - сделайте програмно доступный регистр запросов, выходы его сложите по ИЛИ и на interrupt.

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

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

короче остановились тада на первом варианте, чего и вам советую
mkalexey
Спасибо за совет, но мне не все понятно и я хотел бы разобраться...

Отвечаю на Ваш вопрос
Цитата
что имеется в виду под "комплексная система прерываний".

Под комплексной системой прерывания имеется ввиду "сложная" система прерываний. В вышеупомянутом софт-процесоре изначально используется только один обработчик прерывания. А мне интересно как сделать, чтобы по прерываниям от разных источником выполнялся соответствующий обработчик.

Не могли бы Вы рассказать по подробнее об предложеных Вами вариантах.
Спасибо.
lutik
да никак не делать..
один источник прерывания - один обработчик.

если есть желание и время пошаманить и хватает 8-ми регистров - берете пикоблаз для кулранеров.
он не примитивами описан а поведенчески, открываете его и в програмном счетчике видите

--****************************
COUNTER:
process begin
wait until rising_edge(clk);
if interrupt = '1' then
count_value <= "11111111";
elsif reset = '1' then
count_value <= "00000000";
elsif T_state = '0' then
if normal_count = '1' then
count_value <= count_value + 1;
elsif i_return = '1' then
count_value <= selected_load_value + 1;
else
count_value <= selected_load_value;
end if;
end if;
end process;
program_count <= count_value;
--****************************

тобишь - в коде четко забит адрес перехода и событие.

если хотите увеличить кол-во прерываний:

entity pblaze
.........
interrupt : in std_logic_vector(скоканада-1 downto 0);
........

правите все файлы в которых обрабатывается прерывание типа так

было
irq_out <= irq_in and EN;
стало
irq_out(0) <= irq_in(0) and EN;
irq_out(1) <= irq_in(1) and EN;
...
irq_out(скоканада-1) <= irq_in(скоканада-1) and EN;

и тада можна будет править програмный счетчик так

--****************************
COUNTER:
process begin
wait until rising_edge(clk);
if interrupt(0) = '1' then
count_value <= "11111111";
elsif interrupt(1) = '1' then
count_value <= "11111110";
.......................................
elsif interrupt(скоканада-1) = '1' then
count_value <= "11111101";
elsif reset = '1' then
count_value <= "00000000";
elsif T_state = '0' then
if normal_count = '1' then
count_value <= count_value + 1;
elsif i_return = '1' then
count_value <= selected_load_value + 1;
else
count_value <= selected_load_value;
end if;
end if;
end process;
program_count <= count_value;
--****************************

и в асме тада так можно


startup:
jump main ;startup procedure
int_routine1:
returni enable
int_routine2:
returni enable
main:
enable interrupt
end:
jump end
address ff
jump int_routine1
address fe
jump int_routine2

ваще я канечно все это не проверял в железе, но по опыту использования пикоблаза - думаю будет работать
mkalexey
Спасибо! Буду разбираться.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.