For loop VHDL中的串行化代码

For loop VHDL中的串行化代码,for-loop,vhdl,fpga,rasterizing,spartan,For Loop,Vhdl,Fpga,Rasterizing,Spartan,我正在尝试使用VHDL在Spartan-6FPGA上创建一个(非常基本的)GPU 我遇到的一个大问题是,我对HDL的理解非常有限——我一直在使用嵌套的for光线跟踪/扫描线光栅化算法循环来编写代码,而没有考虑到这些巨大的循环在合成过程中分解时会消耗超过100%的DSP切片 我的问题是,如果我有一个时钟触发计数器来代替for循环(使用计数器作为索引,并将其最大值重置为0),这是否意味着所有逻辑只生成一次?我可以看到,以600x800屏幕上的光线跟踪为例,以200 MHz时钟为例,整个屏幕的整体刷新

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

我遇到的一个大问题是,我对HDL的理解非常有限——我一直在使用嵌套的
for
光线跟踪/扫描线光栅化算法循环来编写代码,而没有考虑到这些巨大的循环在合成过程中分解时会消耗超过100%的DSP切片

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


非常感谢

如果实现for循环,则for循环中的功能将同时对for循环所经过的所有值执行。为了实现这一点,合成工具必须为for循环中的每个值实现一次功能,因此您仍然需要大量的硬件实现

例如,在本例中,此代码将展开到并行硬件的功能、and门,但由于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;
过程(clk_i)是
开始
如果上升沿(clk_i),则
对于z_par_o'range循环中的idx_par

z_par_o(idx_par)抱歉-我理解关于合成工具的第一部分为每个值实现一次(导致大量硬件),但我不太了解交错处理的第二部分?为了澄清VHDL结构——在我密切相关的问题之后——所有
function
语句是否在一个周期内执行(如果不是,如何创建一个函数以在多个时钟周期内执行),或者将计算扩展到几个周期只能用实体来完成吗?如果通过
function
语句,您的意思是调用函数,或者使用中缀函数调用,如
+
,那么是的,这些将在一个周期内执行,实际上是在零时间内,因为函数不能等待。一个
过程可以有等待,但合成不能合成等待。因此,要使某些东西能够在几个周期内进行综合计算,请在
实体中使用
过程
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;