В университетском курсе о настраиваемых встроенных системах (на ZYNQ-7010) мы недавно реализовали (наивный) фильтр нижних частот, который применил бы одномерное гауссовское ядро (0,25 * [1 2 1]) к данным, поступающим из блока ОЗУ.VHDL - поведение переменной по сравнению с сигналом в очереди
Мы решили кэшировать (то есть очередь) три пикселя, а затем работать с ними в режиме on-line в процессе вывода данных. Наш первый подход состоял в том, чтобы иметь три переменные процесса и перевернуть их в
pixel[k-2] := pixel[k-1];
pixel[k-1] := pixel[k];
pixel[k] := RAM(address);
мода; Ниже приводится полный процесс:
process (clk25)
-- queue
variable pixelMinus2 : std_logic_vector(11 downto 0) := (others => '0');
variable pixelMinus1 : std_logic_vector(11 downto 0) := (others => '0');
variable pixelCurrent : std_logic_vector(11 downto 0) := (others => '0');
-- temporaries
variable r : unsigned(3 downto 0);
variable g : unsigned(3 downto 0);
variable b : unsigned(3 downto 0);
begin
if clk25'event and clk25 = '1' then
pixelMinus2 := pixelMinus1;
pixelMinus1 := pixelCurrent;
pixelCurrent := RAM(to_integer(UNSIGNED(addrb)));
IF slv_reg0(3) = '0' THEN
-- bypass filter for debugging
dob <= pixelCurrent;
ELSE
-- colors are 4 bit each in a 12 bit vector
-- division by 4 is done by right shifting by 2
r := (
("00" & unsigned(pixelMinus2(11 downto 10)))
+ ("00" & unsigned(pixelMinus1(11 downto 10)))
+ ("00" & unsigned(pixelMinus1(11 downto 10)))
+ ("00" & unsigned(pixelCurrent(11 downto 10)))
);
g := (
("00" & unsigned(pixelMinus2(7 downto 6)))
+ ("00" & unsigned(pixelMinus1(7 downto 6)))
+ ("00" & unsigned(pixelMinus1(7 downto 6)))
+ ("00" & unsigned(pixelCurrent(7 downto 6)))
);
b := (
("00" & unsigned(pixelMinus2(3 downto 2)))
+ ("00" & unsigned(pixelMinus1(3 downto 2)))
+ ("00" & unsigned(pixelMinus1(3 downto 2)))
+ ("00" & unsigned(pixelCurrent(3 downto 2)))
);
dob <= std_logic_vector(r) & std_logic_vector(g) & std_logic_vector(b);
END IF;
end if;
end process;
Однако это оказалось ужасно неправильным; Синтез потребует возраста и приводит к приблизительному использованию LUT приблизительно 130% возможностей устройства.
Мы позже изменили реализацию для использования сигналов вместо переменных и это решены все проблемы; Аппарат вел себя так, как ожидалось, и использование LUT снизилось до нескольких процентов.
Мой вопрос заключается в том, что вызывает здесь проблему при использовании переменных, поскольку, как мы понимаем, она должна работать именно так.