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

 
 
 
Reply to this topicStart new topic
> Прерывания в PicoBlaze., Комплексная система прерываний.
mkalexey
сообщение Dec 7 2005, 22:25
Сообщение #1


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

Группа: Свой
Сообщений: 86
Регистрация: 12-04-05
Пользователь №: 4 066



Доброго времени суток!

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

Буду благодарен.


--------------------
Go to the top of the page
 
+Quote Post
lutik
сообщение Dec 8 2005, 09:04
Сообщение #2


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

Группа: Свой
Сообщений: 128
Регистрация: 30-06-04
Из: Odessa
Пользователь №: 216



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

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

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

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

короче остановились тада на первом варианте, чего и вам советую


--------------------
однако..
Go to the top of the page
 
+Quote Post
mkalexey
сообщение Dec 9 2005, 13:00
Сообщение #3


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

Группа: Свой
Сообщений: 86
Регистрация: 12-04-05
Пользователь №: 4 066



Спасибо за совет, но мне не все понятно и я хотел бы разобраться...

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

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

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


--------------------
Go to the top of the page
 
+Quote Post
lutik
сообщение Dec 9 2005, 14:26
Сообщение #4


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

Группа: Свой
Сообщений: 128
Регистрация: 30-06-04
Из: Odessa
Пользователь №: 216



да никак не делать..
один источник прерывания - один обработчик.

если есть желание и время пошаманить и хватает 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

ваще я канечно все это не проверял в железе, но по опыту использования пикоблаза - думаю будет работать


--------------------
однако..
Go to the top of the page
 
+Quote Post
mkalexey
сообщение Dec 9 2005, 14:35
Сообщение #5


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

Группа: Свой
Сообщений: 86
Регистрация: 12-04-05
Пользователь №: 4 066



Спасибо! Буду разбираться.


--------------------
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 12:12
Рейтинг@Mail.ru


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