これは、ある種の信号処理カーネルのように聞こえます。デザインの正確なデータフローを知らずにこれに答えるのは難しいです。81要素のメモリを読み書きできる必要があるため、ソートを含むアルゴリズムにはアドレスデコードコストがかかります。このデータがメモリ内にある場合、このコストはすでに支払われていますが、別個のレジスタにある場合、それらへの書き込みにはエリアコストがかかります。
データがメモリ内にあると仮定すると、バブルソートを使用して、下位16の値を取得できます。以下のコードは2ポートメモリを想定していますが、一時レジスタを使用して書き込み値と書き込みインデックスを格納することにより、クロックサイクルごとに読み取りと書き込みを交互に行うことで、単一ポートで動作する可能性があります。これは、メモリ内に81個の要素しかないため、エリア効率が高くない場合があります。あるいは、ソースメモリは、一方が奇数のインデックスを持ち、もう一方が偶数のインデックスを持つ2つのシングルポートメモリとして実装できます。
// Not working code
reg [15:0] inData [80:0]; // Must be two-port
reg [3:0] iterCount = 0;
reg [6:0] index = 0;
reg sorting;
always @(posedge clk)
begin
// Some condition to control execution
if(sorting)
begin
if(index == 80)
begin
// Stop after 16 iterations
if(iterCount == 15)
begin
sorting <= 0;
iterCount <= 0;
end
else
begin
iterCount <= iterCount+1;
index <= 0;
end
end
else
begin
// If this is smaller than next item
if(inData[index] < inData[index+1])
begin
// Swap with next item
inData[index+1] <= inData[index];
inData[index] <= inData[index+1];
end
index <= index + 1;
end
end
end
編集:レイテンシーに制約があり、1つのクロックドメインのみを許可し、パイプラインを作成する必要がある場合、問題はソーティングネットワークの選択とパイプラインへのマッピングに限定されます。リソース共有を使用できないため、ソーティングネットワークを指定すると領域が固定されます。
- N = 81のソーティングネットワーク(Bitonic、Pairwiseなど)を選択します(簡単ではありません)
- ソーティングネットワークを表す制御フローグラフを作成する
- 出力66〜81に必要なノードを除くすべてのノードを削除します
- 1つの比較ノードのレイテンシーLを決定します
- ALAPスケジューリングを使用して、M * L <1/fであるクロックごとにMノードを割り当てます。
- スケジューリングが成功した場合は、HDLでコーディングしてください