Моя логика: Блоки остаются в высоком состоянии пока не получат подтверждения. Приоритетным энкодером выбирать по одному блоку за такт. Желательно чтобы энкодер работал быстрее чем тактовая блоков, чтобы максимально быстро их обслужить.
Написал приоритетный энкодер типа:
Код
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;
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 прерываний?