2

我想知道以下哪种设计更快,即可以在更高的 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 控制位一样快吗?

谢谢!

4

1 回答 1

1

首先,“更快”不是最好用的词,因为它可以解释为“吞吐量”、“延迟”或“Fmax”。这三个目标可能需要不同的方法。

最终,您是否需要实现更多流水线应该由您的设计规范和约束来决定。如果您只需要以 20 MHz 运行,请为此设置约束,并查看您的设计是否通过时序。如果是这样,那么优化设计就没有多大意义了。

假设您的设计不符合时序,您的 FPGA 实现工具应该能够生成时序报告,这应该告诉您设计的哪些部分是限制因素。然后,您可以专注于优化设计的这些部分。

更一般地说,要从 Fmax 的角度了解流程是否会受益于流水线,您需要了解底层构建块,通常称为“切片”,FPGA 工具将用于实现您的设计。一般来说,如果一个顺序函数不能放在一个切片中,它可以从流水线中受益。过程是否“适合”在很大程度上取决于其输入的数量。请注意,对于使用n位数据操作的进程,可以将其描述为n每个处理 1 位数据的进程,减少了用于此分析的输入数量。另请注意,某些类型的过程(例如加法器)可以通过使用两个或更多切片中的进位链之间的专用互连有效地分布在多个切片上。同样,您需要详细了解 FPGA 器件中可用的构建块。

您没有包含任何信号定义,但看起来您的进程有两个计数器、一个复位和两个形式为scan_end_h和的参数作为输入scan_end_v。我无法知道它们有多宽,但我们假设这些是 12 位值作为示例。然后,您的流程将获得4 * 12 = 48来自计数器和参数的输入。我不希望这么多输入的函数适合一个切片,因此您可以使用流水线实现更高的 Fmax。您将计数器比较流水线化的想法看起来不错;正如评论中所指出的,您最好的办法是尝试一下,并通过查看实施时间报告来查看结果。

于 2017-02-13T12:22:12.227 回答