我正在尝试使用VHDL在Spartan-6 FPGA上创建(非常基本的)GPU。
我遇到的一个大问题是我对HDL的理解非常有限 - 我一直在使用嵌套的for
循环编写代码,用于光线跟踪/扫描线光栅化算法,而不考虑这些巨大的循环消耗&gt ;当合成时解开环时,100%的DSP切片。
我的问题是,如果,我有一个时钟触发计数器代替for
循环(使用计数器作为索引并将其最大值重置为0),这是否意味着所有逻辑仅生成一次?我可以看到,在600x800屏幕上进行光线跟踪,例如200 MHz时钟,整个屏幕的整体刷新率将降至625 Hz但理论上仍应足够快......?
非常感谢!
答案 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综合工具无法展开循环以便随着时间的推移执行。