Main Content

ビタビ復号化器用の HDL コード生成

この例では、Viterbi Decoder ブロックの HDL コード生成サポートについて示します。このデモでは、固定小数点 Viterbi Decoder モデルから生成した HDL コードのチェック、生成、および検証を行う方法について説明します。また、生成する HDL コードを変更するために使用できる設定についても説明します。

はじめに

このモデルでは、軟判断の畳み込み復号化に使用される固定小数点 Viterbi Decoder ブロック用 HDL コード生成について示します。Viterbi Decoder の HDL サポートの詳細については、ドキュメンテーションにあるブロックのページのHDL コード生成の節を参照してください。

モデルを開くには、次のコマンドを実行します。

modelname = 'hdlcoder_commviterbi';
open_system(modelname);

このモデルでは、最上位のサブシステム Viterbi Decoder Subsystem に Viterbi Decoder ブロックが含まれています。このサブシステムを開くには、次のコマンドを実行します。

systemname = [modelname '/Viterbi Decoder Subsystem'];
open_system(systemname);

ビタビ復号化アルゴリズム

ビタビ復号化アルゴリズムには 3 つの主なコンポーネントがあります。それらは、分岐メトリクス計算 (BMC)、追加比較と選択 (ACS)、およびトレースバック復号化です。次の図にビタビ復号化アルゴリズムの 3 つのユニットを示します。

再正規化メソッド

次の図に示すように、Viterbi Decoder は、各タイム ステップで状態メトリクスの最小値を差し引くことによって、ACS コンポーネントの状態メトリクスのオーバーフローを防ぎます。

1 つのクロック サイクルですべての状態メトリクス要素の最小値を取得することにより、回路のクロック周波数が低下します。回路の性能は、パイプライン レジスタを追加することによって向上することがあります。しかし、パイプライン レジスタによって遅延した最小値を状態メトリクスから単に差し引くだけでは、引き続きオーバーフローが発生する可能性があります。ハードウェア アーキテクチャは、再正規化メソッドを変更し、3 つのステップで状態メトリクスのオーバーフローを回避します。まず、トレリス構造と軟判定ビットの数に基づいて、しきい値とステップ パラメーターの値が計算されます。次に、遅延した最小値がしきい値と比較されます。最後に、最小値がしきい値と同じかそれ以上である場合、状態メトリクスからステップ値が差し引かれます。それ以外の場合、調整は行われません。次の図は、変更された再正規化メソッドを示します。

最適な状態メトリクス語長の計算

ハードウェア実装は、状態メトリクスの最適な語長を計算し、ブロックに指定された値と比較します。指定された値よりも最適値が小さい場合、最適値が使用されます。HDL コードの生成中に値を示すメッセージが表示されます。指定された値よりも計算された値が大きい場合、エラー メッセージおよび最適値が表示されます。

ハードウェア実装で計算された最適な状態メトリクス語長を適用すると、指定した値が大きすぎる場合にハードウェア リソースが大幅に減少することがあります。たとえば、状態メトリクス語長として 16 ビットを指定したときに、同じ数値結果を得るために 9 ビットしか必要ない場合、ハードウェア アーキテクチャで計算された最適な状態メトリクス語長を適用すると、レジスタ リソースの約 40% が節約されます。いくつかの一般的なトレリスの計算された最適な状態メトリクス語長を以下の表に示します。

固定小数点ビタビ モデル用コードのチェックと生成

このモデルは、DVB レート 1/2、拘束長 7,(171,133) 畳み込み符号を 3 ビット軟判定で復号化します。復号化器は、32 のトレースバック長を使った連続モードで実行します。状態メトリック語長は 16 ビットに指定します。Viterbi Decoder ブロックのパラメーター設定を検証するには、次のコマンドを実行します。

  • workingdir = tempname;

  • checkhdl(systemname,'TargetDirectory',workingdir);

checkhdl を実行すると、以下を示すメッセージが生成されます。

  • TracebackStagesPerPipeline の既定値。このパラメーターの詳細は、以下の「レジスタ ベースのトレースバック ユニットのパイプライン」の節を参照してください。

  • HDL コードで使用された状態メトリクス語長とブロック マスクの 1 つのセットの比較

  • パイプライン レジスタによって発生した合計遅延 (元の Viterbi ブロックとの比較)

Viterbi Decoder ブロックを含むサブシステム用に HDL を生成するには、次のコマンドを実行します。workingdir = tempname; makehdl(systemname,'TargetDirectory',workingdir);

最上位の VHDL ファイル名は、モデルのブロックの名前に一致します。Viterbi_Decoder.vhd に生成された Viterbi_Decoder コンポーネントには、次の 3 つのコンポーネントが含まれます。BranchMetric、ACS および Traceback。ACS および Traceback コンポーネントは、それぞれ ACSUnit コンポーネントと TracebackUnit コンポーネントを複数回インスタンス化します。データ型定義は、パッケージ ファイル Viterbi_Decoder_Subsystem_pkg.vhd に含まれています。

Viterbi Decoder ブロックを含むサブシステム用にテストベンチを生成するには、次のコマンドを実行します。makehdltb(systemname,'TargetDirectory',workingdir);

トレースバック ユニットの最適化

トレースバック ユニットを最適化するには、次のいずれかの方法を使用できます。レジスタ ベースのトレースバックのパイプライン、または RAM ベースのトレースバック アーキテクチャの使用。

  • レジスタ ベースのトレースバック ユニットのパイプライン

Viterbi Decoder ブロックは、ブロックに定義されたトレースバック長をトレースバックすることによって各ビットを復号化します。ブロックは各判定ビットに完全なトレースバックを実装するので、トレースバック復号化ユニットに最小状態インデックスと分岐判定を保存するためにレジスタが使用されます。生成された回路の性能を向上させるために、このユニットはパイプライン化することができます。パイプライン レジスタごとにトレースバック ステージの数を指定することにより、パイプライン レジスタをトレースバック ユニットに追加できます。この処理は、HDL ブロックのプロパティ ダイアログで Viterbi Decoder に TracebackStagesPerPipeline 実装パラメーターを設定することによって行うことができます。Viterbi Decoder を右クリックして、[HDL ブロック プロパティ] メニューに移動します。

プロパティ値を 4 に設定すると、次の図に示すように、モデルの 4 つのトレースバック ユニットにそれぞれ 1 つのパイプライン レジスタが挿入されます。

TracebackStagesPerPipeline 実装パラメーターを使用すると、システム要件に基づいて回路性能のバランスをとることができます。小さいパラメーター値は、トレースバック回路の速度を向上させるためにレジスタを追加する必要があることを示します。値を大きくすると、回路速度の低下に加えて、レジスタの使用率が低くなります。このレート 1/2、固定長 7,(171,133) 畳み込み符号の実験では、TracebackStagesPerPipeline パラメーターを 4 から 8 に変更すると、パイプライン レジスタの使用率が半分になり、回路速度が 173 MHz から 94 MHz に変化します。

  • RAM ベースのトレースバック

レジスタを使用する代わりに、RAM を使用して生き残りパス情報を保存できます。この処理は、Viterbi Decoder ブロックの HDL アーキテクチャ プロパティを RAM-based Traceback に設定することによって行うことができます。

レジスタ ベースのトレースバック アーキテクチャと RAM ベースのトレースバック アーキテクチャには、2 つの主な違いがあります。

最初に、レジスタ ベースの実装では、トレースバックと復号化オプションが 1 つのステップに組み合わされ、最小の操作で見つかった最良の状態が復号化初期状態として使用されます。RAM ベースの実装では、データの 1 つのセットがトレースバックされ、データの以前のセットを復号化するための初期状態が検索されます。

次に、レジスタ ベースの実装では、完全なトレースバックの後に 1 ビットが復号化されます。一方、RAM ベースの実装では、M 個のサンプルがトレース バックされ、逆の順序で以前の M ビットが復号化されます。その後、各クロック サイクルで 1 ビットが順に解放されます。

2 つのトレースバック アルゴリズムの違いにより、RAM ベースの実装では、レジスタ ベースのトレースバックとは異なる数値結果が得られます。RAM ベースのトレースバックでは、レジスタ ベースの実装と同様のビット エラー レート (BER) を得るために、長いトレースバック長 (拘束長の 10 倍など) が推奨されます。

実装に必要な RAM のサイズは、トレリスとトレースバック長により異なります。次の表にいくつかの一般的なトレリス構造の RAM 使用率をまとめてあります。

ここでのレート 1/2、拘束長 7、(171, 133) 畳み込み符号の実験では、合成で同様のクロック制約を使用した場合、RAM ベースのトレースバック ユニットでのレジスタの使用率は、レジスタ ベースのトレースバック ユニット (4 ステージごとのパイプライン処理) よりも 90% 少ないことがわかりました。2 つの実装は、個々の設計で調整可能なレジスタと RAM のトレードオフを提供します。

参考文献

  1. Clark, G. C. Jr. and J. Bibb Cain., Error-Correction Coding for Digital Communications, New York, Plenum Press, 1981.

  2. G. Feygin and P. G. Gulak, "Architectural tradeoffs for survivor sequence memory management in Viterbi decoders," IEEE Transactions on Communications, vol. 41, no. 3, pp. 425-429, March 1993.