VHDL中的极端流水线?

VHDL中的极端流水线?,vhdl,fpga,mux,pipelining,asic,Vhdl,Fpga,Mux,Pipelining,Asic,我想知道以下哪种设计更快,也就是说,可以在更高的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

我想知道以下哪种设计更快,也就是说,可以在更高的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;
——管道化
如果crd\U h=扫描结束(vt)-1,则

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

最终,您是否需要实现更多的流水线应该由您的设计规范和约束驱动。如果您只需要在20 MHz下运行,请为此设置约束,并查看您的设计是否通过计时。如果是这样的话,那么把精力放在优化设计上就没有多大意义了

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

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


您没有包含任何信号定义,但您的进程似乎有两个计数器、一个重置和两个参数作为输入,它们的形式为
scan\u end\u h
scan\u end\u v
。我无法知道它们有多宽,但让我们假设它们是12位值作为示例。然后,您的进程具有来自计数器和参数的
4*12=48
输入。我不希望这么多输入的函数可以放在一个片中,因此您可能可以使用流水线实现更高的Fmax。你的管道化计数器比较的想法看起来不错;正如评论中指出的,您最好尝试一下,并通过查看实施时间报告来了解结果。

如果“更快”是指更高的Fmax,那么流水线将为您提供更好的结果。然而,折衷的办法是增加资源使用。举个例子,如果管道技术在Fmax中给了您任何实质性的改进,我会感到惊讶,这可能不值得。最简单的确认方法是使用所列的两种方法合成代码参见《使用VHDL的RTL硬件设计》,Pong Chu,9.4流水线设计,流水线是提高系统性能的重要技术。基本思想是重叠处理多个任务,以便在相同的时间内完成更多的任务。如果一个组合电路可以分为几个阶段,我们可以在适当的位置插入缓冲器(即寄存器),并将电路转换为流水线设计。你的管道在哪里?高像素时钟速率通常会导致较粗的计时(以2个时钟计数的幂进行同步,…)以克服Fmax限制。假设上面的代码是一个时钟进程,并且您的流水线代码速度更快,并且假设基于lut的设计,而不是更大。如果你想挤出最后1%到3%的硬件面积,你可以尝试一个向下计数器,并检测计数器的进位。当然,我指的是可以达到的最高Fmax。你是对的,它大约是12位,所以我们不能假设一个片段。我想我可以通过一次又一次地增加时钟频率来检查这一点,看看哪一个先失败(否则,我想,我无法保证实现工具能发挥最大的作用。)@Ran请看我的第二段。计算出支持屏幕分辨率所需的频率,设置一个约束条件,并朝着这个方向努力“可实现的最高目标”可能不是一个有用的目标。
    -- 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;