Я пытаюсь настроить простой процессор свертки с принудительной обработкой с помощью моей платы DEP Nano Altera FPGA. Вот что мой код выглядит следующим образом:VHDL: для цикла, арифметика индекса не работает
LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.numeric_bit.all;
ENTITY Convolution IS
PORT( clock : IN std_logic;
audio_in : IN unsigned(15 downto 0);
audio_out : OUT unsigned(31 downto 0));
END Convolution;
ARCHITECTURE Convolution_Core OF Convolution IS
constant impulse_length : integer := 10;
type array16 is array(0 to impulse_length-1) of unsigned(15 downto 0);
type array32 is array(0 to impulse_length-1) of unsigned(31 downto 0);
constant impulse : array16 := (x"FFFF", x"FFFE", x"FFFD", x"FFFC",
x"FFFB", x"FFFA", x"FFF9", x"FFF8",
x"FFF7", x"FFF6");
signal audio_buffer : array16 := (others=> (others=>'0'));
signal seq_buffer : unsigned(31 downto 0);
BEGIN
process(clock)
begin
if rising_edge(clock) then
-- buffer the audio input in audio_buffer
for i in 0 to (impulse_length-2) loop
audio_buffer(i) <= audio_buffer(i+1);
end loop;
audio_buffer(impulse_length-1) <= audio_in;
for i in 0 to (impulse_length-1) loop
if i = 0 then
seq_buffer <= audio_buffer(i) * impulse(impulse_length-1-i);
else
seq_buffer <= seq_buffer + audio_buffer(i) * impulse(impulse_length-1-i);
end if;
end loop;
end if;
end process;
audio_out <= seq_buffer;
END Convolution_Core;
Моя проблема заключается в следующем: индекс импульса (impulse_length-1-I) не уменьшается во время последовательных для петель, а индекс audio_buffer (I) делает. Вот что я люблю симулировать код и выяснять, почему мои результаты ошибочны.
Я попытался поместить (impulse_length-1-i) в сигнал, чтобы иметь возможность смотреть его в ModelSim, и он начинается с max/min. 32 бита с диапазоном символов (+/- 2 147 483 647) и следующего цикл переходит в ноль и остается на ноль.
Я также попытался использовать переменную j внутри процесса, чтобы иметь возможность инициировать ее в нуле в начале процесса и использовать ее как индекс для своих массивов вместо i и увеличивать его после фактического вычисления, но это заставило ModelSim сообщать о фатальной ошибке, не может понять, почему и нет.
Может ли кто-нибудь объяснить мне, что я сделал не так?
Thanx заранее.
Смотрите также http://stackoverflow.com/questions/13954193/is-process-in-vhdl-reentrant/13956532#13956532 –