是否有一种有效的方法来从硬件(HDL)中的一组数字中计算最小的N个数字?

问题描述 投票:0回答:1

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

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

谢谢,感谢您的帮助〜

system-verilog hdl
1个回答
0
投票

我可以在现场提出的一种可能的方法是,使用小型分拣网络,对硬件中进行不完全气泡分拣的操作进行分解。根据您愿意花费的面积,您可以使用较小或较大的p排序网络,该网络在p> = 3时对p个元素进行组合排序。然后,您可以将此网络应用于大小为N的输入集,一次排序p个元素。每次迭代中的two最小元素都存储在某种类型的内存中(例如,如果要处理大量元素,则为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分类器应用于第一轮的结果。再次将p分类器的两个最小输出存储到相同的内存中,以覆盖上一轮的值。

这里是示例的继续:

(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个写端口)替换单个内存,可以提高速度,从而使您可以在一个周期内为分拣网络获取和写回数据,从而提高利用率排序网络中比较器的比率。

© www.soinside.com 2019 - 2024. All rights reserved.