1

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

我遇到的一个大问题是我对 HDL 的理解非常有限——我一直在使用嵌套for循环来编写我的代码,用于光线追踪/扫描线光栅化算法,而没有考虑到这些巨大的循环在循环在合成时被解开。

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

非常感谢!

4

1 回答 1

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 中的显式处理来实现,因此具有该值的信号,并在每次功能计算给定值的结果时对该值进行增量和换行。

并且此代码将为该功能制作串行硬件,但由于循环导致硬件开销:

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

于 2016-04-05T09:27:42.950 回答