Сериализация кода в VHDL

Я пытаюсь создать (очень простой) графический процессор на ПЛИС Spartan-6 с использованием VHDL.

Большая проблема, с которой я столкнулся, заключается в том, что мое понимание HDL довольно ограничено — я писал свой код, используя вложенные циклы for для алгоритмов трассировки лучей/развертки, не учитывая, что эти огромные циклы потребляют> 100% срезов DSP, когда петли распутываются при синтезе.

Мой вопрос: если у меня есть счетчик, запускаемый часами, вместо цикла for (используя счетчик в качестве индекса и сбрасывая его на 0 при максимальном значении), означает ли это, что вся логика генерируется только один раз? Я вижу, что, используя трассировку лучей на экране 600x800, например, с тактовой частотой 200 МГц, общая частота обновления всего экрана упадет до 625 Гц, но теоретически этого должно быть достаточно..?

Большое спасибо!


person davidhood2    schedule 05.04.2016    source источник


Ответы (1)


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

Например, этот код будет развернут на параллельном оборудовании для функциональности, в этом случае и шлюза, но без каких-либо накладных расходов на аппаратное обеспечение в результате цикла for:

process (clk_i) is
begin
  if rising_edge(clk_i) then
    for idx_par in z_par_o'range loop
      z_par_o(idx_par) <= a_i(idx_par) and b_i(idx_par);  -- Functionality
    end loop;
  end if;
end process;

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

И этот код создаст последовательное аппаратное обеспечение для функциональности, но с накладными расходами на аппаратное обеспечение в результате цикла:

process (clk_i) is
begin
  if rising_edge(clk_i) then
    if rst_i = '1' then  -- Reset
      idx_ser <= 0;
    else  -- Operation
      z_par_o(idx_ser) <= a_i(idx_ser) and b_i(idx_ser);  -- Functionality
      if idx_ser /= LEN - 1 then  -- Not at end of range
        idx_ser <= idx_ser + 1;  -- Increment
      else  -- At end of range
        idx_ser <= 0;  -- Wrap
      end if;
    end if;
  end if;
end process;

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

person Morten Zilmer    schedule 05.04.2016
comment
Извините - я понимаю первую часть об инструменте синтеза, реализующем один раз для каждого значения (что приводит к массивному оборудованию), но я не совсем понимаю вторую часть обработки с чередованием? - person davidhood2; 05.04.2016
comment
Чтобы уточнить структуру VHDL, следуя моему тесно связанному с этим вопросу, все ли операторы function выполняются в одном цикле (и если нет, то как можно создать функцию для выполнения в течение нескольких тактов), или можно ли распределить вычисления только на несколько циклов? с сущностями? - person davidhood2; 14.04.2016
comment
Если под операторами function вы подразумеваете вызов функций или использование инфиксных вызовов функций, таких как +, тогда да, они будут выполняться в одном цикле и фактически в нулевое время, поскольку функция не может ждать. procedure может подождать, но синтез не может синтезировать это. Итак, чтобы сделать что-то синтезируемое, которое вычисляет за несколько циклов, используйте process в entity. - person Morten Zilmer; 14.04.2016