1

私はVerilogの初心者ですが、16要素の配列(各要素は16ビット長)があり、配列の最小エントリを見つけて最小値を返し、すべてのエントリを再配置したいと考えています。配列がエントリの1つの連続したブロックになるように、最小値の後に来る配列。コンパレータを使用する必要があることはわかっていますが、多数の数値を比較して最小値を決定することに関して、どこから始めればよいのか本当にわかりません。

編集:私が実際に作っているのは優先キューです。キュー機能を実装しましたが、キューの先頭にあるものを返す代わりに、最小値のエントリを返し、ストレージを連続させたいと考えています。

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ではなくフリップフロップにあることを意味します。

すべてのデータがフリップフロップにあることを考えると、再パックはそれほど難しくありません。ストレージ内の次に高いエントリから各エントリを条件付きでロードするロジックを作成し、削除される要素のインデックスをベクトルにデコードして、削除される要素の上の各エントリのシフトダウン。

より効率的にしたい場合に使用する変数の1つは、比較がエンキ​​ュー時に行われるか、デキュー時に行われるかです。また、各デキュー後に再パックする必要があるかどうかを検討することもできます。

于 2011-04-26T05:23:20.180 に答える
0

SystemVerilogは、sort配列のメソッドを提供します。IEEEStd1800-2009のセクション7.12.2の「アレイの順序付け方法」を参照してください。

于 2011-04-26T13:12:50.193 に答える