【发布时间】:2017-07-01 05:48:36
【问题描述】:
我想知道以下哪种设计更快,即可以在更高的 Fmax 下运行:
-- Pipelined
if crd_h = scan_end_h(vt)-1 then
rst_h <= '1';
end if;
if crd_v = scan_end_v(vt) then
rst_v <= '1';
end if;
if rst_h = '1' then
crd_h <= 0;
rst_h <= '0';
if rst_v = '1' then
crd_v <= 0;
rst_v <= '0';
else
crd_v <= crd_v + 1;
end if;
else
crd_h <= crd_h + 1;
end if;
在“上一个”循环中检查循环结束的位置,并通过第一个反馈信号在下一个循环中应用。
与较少流水线的方法相比:
-- NOT Pipelined
if crd_h = scan_end_h(vt) then
crd_h <= 0;
if crd_v = scan_end_v(vt) then
crd_v <= 0;
else
crd_v <= crd_v + 1;
end if;
else
crd_h <= crd_h + 1;
end if;
第一个实现的想法是不要将比较中的算术与增量中的算术相结合。然而,另一方面,在第二种实现中,两个操作可以并行完成,一个的结果将 MUX 另一个。这会和从前一个周期(在第一个实现中)准备好 MUX 控制位一样快吗??
谢谢!
【问题讨论】:
-
如果“更快”是指更高的 Fmax,流水线将为您提供更好的结果。然而,代价是增加了资源使用。对于给出的示例,如果流水线在 Fmax 方面给您带来任何切实的改进,我会感到惊讶,这可能并不值得。最简单的确认方法是使用您列出的两种方法合成代码
-
参见
RTL Hardware Design Using VHDL,Pong Chu,9.4 流水线设计,流水线是提高系统性能的重要技术。基本思想是将多个任务的处理重叠起来,以便在相同的时间内完成更多的任务。如果组合电路可以分阶段,我们可以在适当的位置插入缓冲器(即寄存器),将电路转换为流水线设计。 你的流水线在哪里?高像素时钟速率通常会导致更粗的时序(同步 2 个时钟计数的幂,..)以克服 Fmax 限制。 -
假设您上面的代码是一个时钟进程并且您的流水线代码更快并且假设基于 lut 的设计,而不是更大。如果您希望挤出最后 1% 到 3% 的硬件区域,您可以尝试使用递减计数器并将计数器的进位检测为您的 rst_v。
标签: vhdl fpga mux pipelining asic