【问题标题】:Is there an efficient way to calculate the smallest N numbers from a set of numbers in hardware (HDL)?有没有一种有效的方法可以从硬件(HDL)中的一组数字中计算出最小的 N 个数字?
【发布时间】:2020-04-18 02:46:37
【问题描述】:

我正在尝试从一组中计算最小的 N 个数字,并且我找到了可以执行此操作的软件算法。我想知道是否有一种有效的方法可以在硬件中执行此操作(即 HDL - 在 System Verilog 或 Verilog 中)?我特别想从一组中计算最小的 2 个数字。

我正在尝试针对面积和速度(针对大量信号)进行组合优化,但我只能想到比较器树来做到这一点?有没有更有效的方法来做到这一点?

谢谢你,感谢任何帮助~

【问题讨论】:

    标签: system-verilog hdl


    【解决方案1】:

    如果您想组合查找两个最小的元素,我认为您无法使用比较器树。但是,如果您的目标不是低延迟,那么(可能是流水线的)时序电路也是一种选择。

    我可以在现场提出的一种方法是使用小型排序网络在硬件中进行一种不完全冒泡排序的操作来分解操作。根据您愿意花费的面积大小,您可以使用更小或更大的 p 排序网络,该网络在 p >= 3 的时间对 p 个元素进行组合排序。然后您可以将此网络应用于大小为 N 的输入集,一次排序 p 个元素。每次迭代中的 两个 最小元素都存储在某种内存中(例如,如果您想处理大量元素,则可以使用 SRAM 内存)。

    这是 p=3 的示例(括号表示应用 p-sorter 的元素分组):

    (4 0 9) (8 6 7) (4 2 1) --> (0 4 9) (6 7 8) (1 2 4) --> 0 4 6 7 1 2

    现在开始下一轮: 您将 p-sorter 应用于第一轮的结果。 再次将 p-sorter 的两个最小输出存储到相同的内存中,覆盖上一轮的值。

    这里继续例子:

    (0 4 6) (7 1 2) --> (0 4 6) (1 2 7) --> 0 4 1 2

    在每一轮中,您可以将要查看的元素数量减少 2/p。例如。使用 p==4 时,您在每一轮中丢弃一半元素,直到最小的两个元素存储在前两个内存位置。因此该算法的时间/周期复杂度为 O(n log(n))。对于实际的硬件实现,您可能希望对排序网络的大小 p 坚持 2 的幂。

    虽然这种电路的控制逻辑实现起来并不简单,但该区域应该主要由排序网络的大小和保存前 2/p*N 中间结果所需的内存(假设您的输入信号尚未存储在您可以为此目的重复使用的内存中)。如果您想调整您的电路以提高吞吐量,您可以增加 p 并将分拣网络流水线化,但会牺牲额外的面积。通过使用多达 p 个双端口存储器(每个 1 个读取和 1 个写入端口)替换单个存储器可以获得额外的加速,这将允许您在单个周期内为排序网络获取和写回数据,从而提高利用率排序网络中比较器的比率。

    【讨论】:

    • 感谢您的回复,我试图避免流水线操作,因为我必须为我的应用程序执行更多控制逻辑。幸运的是,我只是想在 8 的集合大小中找到两个最小的数字,这不应该占用太多的区域。
    猜你喜欢
    • 2018-08-09
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多