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

 
 
> Как сделать быстрый Priority encoder, Проблема множества прерываний.
count_enable
сообщение Jun 8 2017, 13:18
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 310
Регистрация: 28-01-13
Из: Лондон
Пользователь №: 75 384



Дано: от 10 до 100 блоков могущих сгенерировать прерывание. Требуется: подтвердить приём прерывания и записать номер блока в память.

Моя логика: Блоки остаются в высоком состоянии пока не получат подтверждения. Приоритетным энкодером выбирать по одному блоку за такт. Желательно чтобы энкодер работал быстрее чем тактовая блоков, чтобы максимально быстро их обслужить.

Написал приоритетный энкодер типа:
Код
entity spikebuffer is
generic( NUMINPUTS: integer:=1000;
            OUT_WIDTH:integer :=10);
    Port ( REQ : in  STD_LOGIC_VECTOR (NUMINPUTS-1 downto 0);
              ACK : out  STD_LOGIC_VECTOR (NUMINPUTS-1 downto 0);
           CLK : in  STD_LOGIC;
           AEROUT : out  STD_LOGIC_VECTOR (OUT_WIDTH-1 downto 0);  --отсюда вылетает номер прерывания 1 за такт
              DVALID:out STD_LOGIC);
end spikebuffer;

architecture Behavioral of spikebuffer is


begin

shifting : PROCESS(clk)
   VARIABLE highest_switch : integer range 0 to NUMINPUTS := NUMINPUTS;
begin
if rising_edge(CLK) then
ACK<=(others=>'0');
DVALID<='0';
highest_switch := NUMINPUTS;
   for i in 0 to NUMINPUTS-1  loop
      if REQ((i)) = '1' then                       -- ищем прерывания
         highest_switch := (i);                -- последнее найдённое запоминаем
            DVALID<='1';
      end if;
   end loop;
    if (highest_switch<NUMINPUTS) then   -- если были прерывания
        AEROUT<=std_logic_vector(to_unsigned(highest_switch,AEROUT'length));
        ACK(highest_switch)<='1';       -- то подтверждаем приём и тогда блок отпустит REQ
    else
        DVALID<='0';
        ACK<=(others=>'0');
    end if;
end if;
end process;


К сожалению для 7 виртекса синтезируется на ~140 Mhz. Возможно ли написать требуемый блок быстрее? Как за мин. количество клоков прочитать и запомнить от 0 до 100 прерываний?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
count_enable
сообщение Jun 9 2017, 14:16
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 310
Регистрация: 28-01-13
Из: Лондон
Пользователь №: 75 384



Цитата
Внутри ПЛИС Hi-Z не действуют...
ЕМНИП синтезатор заменяет их на wire OR вполне успешно, иначе я не совсем понял как "запретить" блоку выставлять что-то на общую шину. Все блоки сидят на одной "IRQNUM" и должны какое-то состояние выставить. Разве нет?

Написал согласно Вашим рецептам, но с hi-z, синтезировалось и симулируется. Показывает 446 МГц для 100 блоков - вполне неплохо, хотя на большие "гирлянды" конечно масштабировать не стоит.

Теперь о каскадировании. Уважаемый RobFPGA, это была моя начальная идея, но я так и не придумал как потом объединять несколько выходных потоков в реальном времени.
Я немного неправильно описал систему, слишком упрощённо. Не хочу перегружать деталями. Точный порядок прерываний не нужен, они квантуются каждые несколько десятков клоков - т.е. внутри этого окна они могут быть перемешаны, но обрабатывать их после этого окна нежелательно. Окна формируются прерыванием от Глобального Оконного Таймера (ГОТ). Т.е. между двумя событиями ГОТ порядок остальных прерываний роли не играет.

Общая логика такова: каждый блок может заявить прервание каждые Х клоков. Если Х>N то задача тривиальна но обычный случай это N=100..200 X=20, частота ок.300 МГц. Т.е. в критичном случае у нас будет 200 прерываний и 20 циклов (300 МГц) на обработку. Если прерывание не было обслужено на протяжении 20 циклов то поднимается флаг "ПРОСРОЧЕН" который тормозит конвеер пока все прерывания не обработают.
Обработка прерывания - запись его в большую очередь.
Соответственно задача стоит обработать макс. число прерываний за мин. время. Подход двоякий: во-первый второй тактовый сигнал большей частоты, во-вторых минимальное число клоков на обработку.

Если поделить все блоки на группы меньше 20 то задача банально решается опросом. Но после этого у нас есть N/20 независимых очередей которые надо склеить в одну сохранив порядок окон ГОТ. Мои неуклюжие попытки (поллинг мастеров и поочередная выгрузка очередей "до следующего ГОТа") к сожалению получались неудобными и медленными.

Я подозреваю надо обьеденить подходы, или сделав daisy-chain из локальных мастеров, или наоборот, сделать дерево где локальные мастера будут короткими daisy-chain цепочками (10 блоков синтезируются на ок.800 Мгц).
Я продолжаю экспериментировать, и буду благодарен за новые идеи.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- count_enable   Как сделать быстрый Priority encoder   Jun 8 2017, 13:18
- - Golikov A.   почему нельзя выбирать за такт из нескольких блоко...   Jun 8 2017, 13:20
- - count_enable   А как записать в память? Держать память на каждый ...   Jun 8 2017, 13:32
|- - RobFPGA   Приветствую! Поиск решения без понимания зада...   Jun 8 2017, 14:46
- - iosifk   Цитата(count_enable @ Jun 8 2017, 16:18) ...   Jun 8 2017, 13:35
- - count_enable   Извините, но я не cовсем понял Т.е. у нас есть...   Jun 8 2017, 13:42
|- - iosifk   Цитата(count_enable @ Jun 8 2017, 16:42) ...   Jun 8 2017, 13:51
- - count_enable   Большое вам спасибо! Думаю понял как оно. А за...   Jun 8 2017, 13:53
|- - iosifk   Цитата(count_enable @ Jun 8 2017, 16:53) ...   Jun 8 2017, 14:00
- - Golikov A.   ну да с наиболее приоритетного конца соединить их ...   Jun 8 2017, 13:58
- - Golikov A.   можно чтобы блок выставлял адрес если 1 вбок или 0...   Jun 8 2017, 14:28
|- - RobFPGA   Приветствую! Цитата(count_enable @ Jun 9...   Jun 9 2017, 16:26
- - Golikov A.   так если у вас не 1 такт, то лучше обрабатывать ма...   Jun 9 2017, 14:53


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 21:40
Рейтинг@Mail.ru


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