1

私は、ブロックRAM(または同様のもの)を使用して、VHDLで大量のデータを転置する優れた方法を見つけようとしてきました。

ベクトルのベクトルを使用するのは比較的簡単ですが、大量のデータを処理するのは面倒です。

デュアルチャネルブロックRAMを使用して、一方のブロックに書き込み、もう一方のブロックを読み取ることができるようにします。8ビットのstd_logic_vectorsを書き込み、32ビットのstd_logic_vectorsを読み取ります。ここで、32ビットは(少なくとも最初の回転では)入力ベクトル0〜31、次に32〜63のMSB、次に294911、次にMSB-1などです。

上記のケースは私の理想的なシナリオです。これも可能ですか?私はこれを行うための良い方法を見つけることができないようです。

4

2 に答える 2

1

この回答では、18k ビットのザイリンクス スタイルの BRAM を想定しています。私は Virtex-4 に最も精通しているので、以下では UG070 を参照しています。その答えは、他のザイリンクス FPGA や、おそらく他のベンダーのパーツにも簡単にマップできます。

最初に注意すべきことは、Virtex-4 BRAM はポートごとに異なるジオメトリを持つデュアル ポート モードで使用できることです。ただし、1 ビット幅のポートでは、これらの RAM のパリティ ビットは役に立ちません。したがって、ここでは 18k ビットの BRAM は事実上 16k ビットにすぎません。

次に、(デザインに関係なく) ストレージに必要な BRAM の数を検討します。294912x8 ビットは 144 個の BRAM にマップされ、これはかなり大きなリソース コミットメントです。スループット、設計の複雑さ、およびリソース要件の間には常にバランスがあります。デザインからすべての MBit/sec を絞り出す必要がある場合は、おそらく BRAM ベースのアプローチが理想的です。そうでない場合は、スループットとレイテンシの要件により、BRAM の代わりにオフチップ RAM を使用できるかどうかを検討する必要があります。

BRAM を使用する予定がある場合は、18x8 BRAM のアレイを検討する必要があります。8 つの列にはそれぞれ 1 つの入力ビットが格納されます。各 BRAM は 1 ビット ポートを介して書き込まれ、32 ビット ポートを使用して読み出されます。

各 8 ビット書き込みは、8 つの 1 ビット書き込み (各列の BRAM への 1 つの書き込み) にマップされます。

すべての 32 ビット読み出しは、 1 つのBRAMからの1つの 32 ビット読み出しにマップされます。

これを機能させるには、シーケンス ロジック (RAMB16 プリミティブ周辺) はほとんど必要ありません。主な複雑さは、1 ビット ポートと 32 ビット ポートの間でアドレス ビットをマップする方法です。

于 2012-10-26T18:09:04.320 に答える
0

少し調査して考えた後、これがこの問題に対する私の答えです。

ブロック RAM アドレッシングの性質上、OP に記載されている理想的なシナリオは、現在のブロック RAM アドレッシングの実装では実現できません。説明した方法でビットごとのマトリックス転置を実行するには、ブロック RAM アドレス指定で水平方向と垂直方向を切り替えることができる必要があります。つまり、RAM は行方向と列方向の両方でアクセス可能でなければならず、アドレッシング モードはリアルタイムで切り替え可能でなければなりません。ビット単位のデータ転置は実際には特に「有用な」変換ではないため、そのような切り替え方式を実装する理由はありません。特にブロックRAMの要点は、データを1ビット以上のチャンクに格納することであり、そのような変換はデータをスクランブルします。

294911 x 8 ビットを一度に変換する必要はなく、プロセスを使用して段階的に変換するように設計を変更する方法を発見しました。これは、変換を実行するためにブロック ram に依存しません。

于 2012-10-31T17:33:59.953 に答える