【问题标题】:Serializing code in VHDL在 VHDL 中序列化代码
【发布时间】:2016-04-05 09:13:53
【问题描述】:

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

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

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

非常感谢!

【问题讨论】:

    标签: for-loop vhdl fpga rasterizing spartan


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

    【讨论】:

    • 抱歉 - 我了解关于合成工具为每个值实现一次的第一部分(导致大量硬件),但我不太了解交错处理的第二部分?
    • 为了澄清 VHDL 结构 - 在我密切相关的问题之后 - 所有 function 语句都在单个周期内执行(如果不是,如何创建一个函数以在多个时钟周期内执行),还是只能通过实体来将计算分散到多个周期?
    • 如果function 语句是指调用函数,或者使用像+ 这样的中缀函数调用,那么是的,这些将在一个周期内执行,实际上是零时间,因为函数等不及了。 procedure 可以等待,但综合无法合成。因此,要制作可在多个周期内计算的可综合计算,请在 entity 中使用 process
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多