2016-10-03 3 views
0

Я пытаюсь настроить простой процессор свертки с принудительной обработкой с помощью моей платы 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 заранее.

+0

Смотрите также http://stackoverflow.com/questions/13954193/is-process-in-vhdl-reentrant/13956532#13956532 –

ответ

2

Основная проблема заключается в том, что вы не понимаете, как работают сигналы и петли, когда вы описываете оборудование вместо написания программного обеспечения.

Каждая итерация второго цикла цикла присваивает значение одному и тому же сигналу. Внутри процесса имеет значение только последнее присвоение сигнала именованному сигналу, и все считывания сигнала используют значение, которое оно удерживало до начала процесса. Это означает, что только нулевая итерация вашего второго цикла for ничего не делает.

Я написал ответ несколько лет назад о том, как сигналы и переменные работают в процессе VHDL, который может дать вам немного более подробно об этом: https://stackoverflow.com/a/19234859/1360002

Если вы пишете это так, что все 10 оных/умножают операции происходят в одном и том же цикле (например, используя переменную вместо seq_buffer для вычисления значения, которое вы фактически назначаете сигналу seq_buffer), вы описываете аппаратное обеспечение, которое будет иметь очень длинный логический путь и не будет работать, если ваша тактовая частота даже умеренно высокий. Это не может быть проблемой для вашего дела.

Кроме того, у вас могут возникнуть проблемы с шириной результата, выходящей из оператора умножения, но я не могу быть уверен, так как я не подразумеваю умножение единиц, поэтому я не знаком с деталями связанной операторской функции.

0

Thanx много для ответа!

Так что, если я правильно понимаю, использование цикла for с переменными внутри процесса приводит к реализации такого же логического исполнения, как использование некоторых «генерирующих» операторов. Возможно, поэтому, когда я попробовал что-то подобное для моего алгоритма свертки, потребовалось много времени для компиляции;)

Так что, я думаю, единственный способ сделать что-то похожее на цикл for на Java или C - это «вручную» синхронизировать каждую итерацию, переключать входные сигналы и буферировать успешные результаты, правильно?

Но тогда я должен сказать, что не понимаю, почему процесс «звуковой буферизации», который я написал, работает правильно, даже с симуляцией по времени ...

С наилучшими пожеланиями

+0

«Аудио буферизация» цикл работает, потому что, когда цикл разворачивается, каждая итерация присваивает значение другому индексу в вашем сигнале. Это означает, что все они могут работать параллельно без конфликтов. Для циклов не действуют последовательно сигналы. Генерация операторов работает так же, как и для циклов, но вместо того, чтобы иметь только конечное задание, вы столкнетесь с несколькими ошибками драйвера во время реализации. – QuantumRipple

+0

Вы правы в том, что единственный способ сделать по-настоящему последовательную логику - иметь какой-то конечный автомат, который мультиплексирует входные данные в ваш математический блок, но если вы хотите иметь свежий вывод каждый цикл, который является комбинацией всех 10 значений, вы должны использовать переменную для создания длинного маршрута синхронизации с помощью 10 умножаемых добавок или конвейера вашей математики (которые не будут экономить ресурсы, но будут обеспечивать более короткие логические пути). – QuantumRipple

+0

Время компиляции, как правило, не имеет смысла для того, насколько эффективны расчеты времени или эффективность ресурса. Это соотносится с тем, сколько ресурсов используется в целом по сравнению с тем, сколько из них существует в вашей целевой FPGA, но не сколько из них используется по сравнению с тем, сколько на самом деле необходимо (эффективность) для функции, которую вы пытаетесь реализовать. – QuantumRipple

Смежные вопросы