在VHDL中

时间:2016-04-05 09:13:53

标签: for-loop vhdl fpga rasterizing spartan

我正在尝试使用VHDL在Spartan-6 FPGA上创建(非常基本的)GPU。

我遇到的一个大问题是我对HDL的理解非常有限 - 我一直在使用嵌套的for循环编写代码,用于光线跟踪/扫描线光栅化算法,而不考虑这些巨大的循环消耗&gt ;当合成时解开环时,100%的DSP切片。

我的问题是,如果,我有一个时钟触发计数器代替for循环(使用计数器作为索引并将其最大值重置为0),这是否意味着所有逻辑仅生成一次?我可以看到,在600x800屏幕上进行光线跟踪,例如200 MHz时钟,整个屏幕的整体刷新率将降至625 Hz但理论上仍应足够快......?

非常感谢!

1 个答案:

答案 0 :(得分:2)

如果实现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中使用显式处理来实现对不同数据值的处理的交叉处理,从而具有带有值的信号,并且每次功能计算给定值的结果时进行该值的递增和换行。 / p>

此代码将为功能创建串行硬件,但由于循环导致硬件开销:

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综合工具无法展开循环以便随着时间的推移执行。