我想知道以下哪种设计更快,即可以在更高的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控制位准备就绪一样快吗?
谢谢!
答案 0 :(得分:1)
首先,“更快”的原因并不是最好用的词,因为这可以解释为“吞吐量”,“延迟”或“Fmax”。这三个目标可能需要不同的方法。
最终,是否需要实现更多流水线操作应该由您的设计规范和约束驱动。如果您只需要以20 MHz运行,请为此设置约束,并查看您的设计是否通过了时序。如果确实如此,那么将精力放在优化设计上并没有多大意义。
假设您的设计不符合时序要求,您的FPGA实现工具应该能够生成时序报告,这应该告诉您设计的哪些部分是限制因素。然后,您可以专注于优化设计的这些部分。
更一般地说,要了解流程是否会从Fmax的角度来看从流水线操作中受益,您需要了解FPGA工具将用于实现您的设计的基础构建块(通常称为“切片”)。通常,如果顺序函数不能适合一个切片,它可以从流水线操作中受益。过程“适合”在很大程度上取决于它所具有的输入数量。请注意,对于使用 n 位数据进行操作的进程,可能可以将其描述为 n 进程,每个进程使用1位数据,减少用于此分析的输入数量。还要注意,某些类型的过程(例如加法器)可以通过利用两个或更多个切片中的进位链之间的专用互连而有效地分布在多个切片上。同样,您需要详细了解FPGA器件中可用的构建模块。
您没有包含任何信号定义,但看起来您的流程包含两个计数器,一个重置以及scan_end_h
和scan_end_v
形式的两个参数作为输入。我无法知道它们有多宽,但我们假设这些是12位值。然后,您的流程会从计数器和参数中输入4 * 12 = 48
个输入。我不希望这么多输入的函数适合一个切片,因此你可能使用流水线实现更高的Fmax。你对计数器比较进行流水线操作的想法看起来很好;正如评论中所指出的,最好的办法是尝试这一点,看看实施时间报告,看看结果如何。