1

我是 Verilog 的新手,但我有一个 16 个元素的数组(每个元素长 16 位),我希望找到数组的最小条目,返回最小值,然后重新排列所有条目最小值之后的数组,以便该数组是一个连续的条目块。我知道我必须使用比较器,但我真的不知道从哪里开始比较一大组数字并确定最小值。

编辑:我实际上在做的是一个优先队列。我已经实现了队列功能,但是我不想返回队列头部的内容,而是希望返回具有最小值的条目,并保持存储连续。

e.g. {2,3,4,1,5,6,-,-} 
min is 1 --> {2,3,4,-,5,6,-,-} 
Rearrange so everything following the returned min is moved to the index preceding it-->
{2,3,4,5,6,-,-,-}
4

2 回答 2

2

如果您没有减少门或 LUT 数量的压力,一种简单的方法是实现树型结构。

如果队列中的条目是 A0、A1、... A7,请执行以下步骤:

  1. 计算 B0 = min (A0, A1), B1 = min (A2, A3), B2 = min (A4, A5), B3 = min (A6, A7)
  2. 计算 C0 = min (B0, B1), C1 = min (B2, B3)
  3. 计算 D = min (C0, C1)

在每一步,还传递较小条目的索引。

这需要同时访问所有数据,因此这意味着整个存储都在触发器中,而不是在 RAM 中。

鉴于所有数据都在触发器中,重新打包并不太难,只需创建一些逻辑以有条件地从存储中的下一个更高条目加载每个条目,并将被删除元素的索引解码为启用向量为要删除的元素上方的每个条目向下移动。

如果您想提高效率,可以使用的一个变量是比较是在入队时还是出队时进行。您可能还需要考虑是否真的需要在每次出队后重新打包。

于 2011-04-26T05:23:20.180 回答
0

SystemVerilogsort为数组提供了一种方法。请参阅 IEEE Std 1800-2009 中第 7.12.2 节的“阵列排序方法”。

于 2011-04-26T13:12:50.193 回答