Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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

この例では、ビタビ復号化アルゴリズムを実装して HDL コードを生成するための 2 つの異なるモデリング パターンを示します。そのうち 1 つのパターンでは MATLAB Function ブロックを使用します。もう 1 つのパターンでは Viterbi Decoder ブロックを使用します。Viterbi Decoder ブロックを使用するには、Communications Toolbox のライセンスが必要です。

Viterbi Decoder ブロックを使用したモデル アルゴリズム

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

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

open_system('hdlcoder_commviterbi');

hdlcoder_commviterbi.png

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

subsystem = 'hdlcoder_commviterbi/Viterbi Decoder Subsystem';
open_system(subsystem);

subsystem.png

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

ビタビ復号化アルゴリズムは、主に、分岐メトリクス計算 (BMC)、可算比較選択 (ACS)、およびトレースバック復号化という 3 つのユニットで構成されます。次の図にアルゴリズムの 3 つのユニットを示します。

再正規化メソッド

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

1 つのクロック サイクルですべての状態メトリクス要素の最小値を取得することにより、回路のクロック周波数が低下します。パイプライン レジスタを追加することで、回路の性能を向上させることができます。しかし、パイプライン レジスタによって遅延した最小値を状態メトリクスから差し引いても、引き続きオーバーフローが発生する可能性があります。ハードウェア アーキテクチャは、再正規化メソッドを変更し、3 つのステップで状態メトリクスのオーバーフローを回避します。

  1. トレリス構造と軟判定ビットの数に基づいて、しきい値とステップ パラメーターの値が計算されます。

  2. 遅延した最小値がしきい値と比較されます。

  3. 最小値がしきい値以上である場合、状態メトリクスからステップ値が差し引かれます。それ以外の場合、調整は行われません。

次の図は、変更された再正規化メソッドを示します。

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

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

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

このモデルは、復号化器レート 1/2、拘束長 7、および (171,133) 符号化で畳み込み符号を復号化します。これは、3 ビット軟判定復号化を使用します。復号化器は、32 のトレースバック長を使った連続モードで実行します。状態メトリクス語長は 16 ビットです。

Viterbi Decoder ブロックのパラメーター設定を検証するには、次のコマンドを実行します。

workingdir = tempname;
checkhdl(subsystem,'TargetDirectory',workingdir);
### Running HDL checks on the model 'hdlcoder_commviterbi'.
### Begin compilation of the model 'hdlcoder_commviterbi'...
### Creating HDL Code Generation Check Report file:///tmp/Bdoc23b_2421742_865116/tp9496b7b9_2780_49aa_abc6_1841c92412f1/hdlcoder_commviterbi/Viterbi_Decoder_Subsystem_report.html
### HDL check for 'hdlcoder_commviterbi' complete with 0 errors, 0 warnings, and 5 messages.

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

  • [TracebackStagesPerPipeline] HDL ブロック プロパティの既定値

  • HDL コードで使用された状態メトリクス語長と Viterbi Decoder ブロックの [Static metric word length] パラメーターに設定された状態メトリクス語長の比較

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

Viterbi Decoder ブロックを含むサブシステム用に HDL を生成するには、次のコマンドを実行します。

makehdl(subsystem,'TargetDirectory',workingdir);
### Generating HDL for 'hdlcoder_commviterbi/Viterbi Decoder Subsystem'.
### Using the config set for model hdlcoder_commviterbi for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoder_commviterbi'.
### Begin compilation of the model 'hdlcoder_commviterbi'...
### Working on the model 'hdlcoder_commviterbi'...
### The code generation and optimization options you have chosen have introduced additional pipeline delays.
### The delay balancing feature has automatically inserted matching delays for compensation.
### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays.
### Output port 1: 20 cycles.
### Working on... GenerateModel
### Begin model generation 'gm_hdlcoder_commviterbi' ....
### Rendering DUT with optimization related changes (IO, Area, Pipelining)...
### Model generation complete.
### Begin VHDL Code Generation for 'hdlcoder_commviterbi'.
### Working on hdlcoder_commviterbi/Viterbi Decoder Subsystem/Viterbi Decoder/BranchMetric as /tmp/Bdoc23b_2421742_865116/tp9496b7b9_2780_49aa_abc6_1841c92412f1/hdlcoder_commviterbi/BranchMetric.vhd.
### Working on hdlcoder_commviterbi/Viterbi Decoder Subsystem/Viterbi Decoder/ACS/ACSEngine/ACSUnit as /tmp/Bdoc23b_2421742_865116/tp9496b7b9_2780_49aa_abc6_1841c92412f1/hdlcoder_commviterbi/ACSUnit.vhd.
### Working on hdlcoder_commviterbi/Viterbi Decoder Subsystem/Viterbi Decoder/ACS/ACSEngine as /tmp/Bdoc23b_2421742_865116/tp9496b7b9_2780_49aa_abc6_1841c92412f1/hdlcoder_commviterbi/ACSEngine.vhd.
### Working on hdlcoder_commviterbi/Viterbi Decoder Subsystem/Viterbi Decoder/ACS/ACSRenorm as /tmp/Bdoc23b_2421742_865116/tp9496b7b9_2780_49aa_abc6_1841c92412f1/hdlcoder_commviterbi/ACSRenorm.vhd.
### Working on hdlcoder_commviterbi/Viterbi Decoder Subsystem/Viterbi Decoder/ACS as /tmp/Bdoc23b_2421742_865116/tp9496b7b9_2780_49aa_abc6_1841c92412f1/hdlcoder_commviterbi/ACS.vhd.
### Working on hdlcoder_commviterbi/Viterbi Decoder Subsystem/Viterbi Decoder/Traceback/TracebackUnit as /tmp/Bdoc23b_2421742_865116/tp9496b7b9_2780_49aa_abc6_1841c92412f1/hdlcoder_commviterbi/TracebackUnit.vhd.
### Working on hdlcoder_commviterbi/Viterbi Decoder Subsystem/Viterbi Decoder/Traceback as /tmp/Bdoc23b_2421742_865116/tp9496b7b9_2780_49aa_abc6_1841c92412f1/hdlcoder_commviterbi/Traceback.vhd.
### Working on hdlcoder_commviterbi/Viterbi Decoder Subsystem/Viterbi Decoder as /tmp/Bdoc23b_2421742_865116/tp9496b7b9_2780_49aa_abc6_1841c92412f1/hdlcoder_commviterbi/Viterbi_Decoder.vhd.
### Working on hdlcoder_commviterbi/Viterbi Decoder Subsystem as /tmp/Bdoc23b_2421742_865116/tp9496b7b9_2780_49aa_abc6_1841c92412f1/hdlcoder_commviterbi/Viterbi_Decoder_Subsystem.vhd.
### Generating package file /tmp/Bdoc23b_2421742_865116/tp9496b7b9_2780_49aa_abc6_1841c92412f1/hdlcoder_commviterbi/Viterbi_Decoder_Subsystem_pkg.vhd.
### Code Generation for 'hdlcoder_commviterbi' completed.
### Creating HDL Code Generation Check Report file:///tmp/Bdoc23b_2421742_865116/tp9496b7b9_2780_49aa_abc6_1841c92412f1/hdlcoder_commviterbi/Viterbi_Decoder_Subsystem_report.html
### HDL check for 'hdlcoder_commviterbi' complete with 0 errors, 0 warnings, and 5 messages.
### HDL code generation complete.

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

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

makehdltb(subsystem,'TargetDirectory',workingdir);
### Begin TestBench generation.
### Generating HDL TestBench for 'hdlcoder_commviterbi/Viterbi Decoder Subsystem'.
### Begin compilation of the model 'hdlcoder_commviterbi'...
### Begin compilation of the model 'gm_hdlcoder_commviterbi'...
### Begin simulation of the model 'gm_hdlcoder_commviterbi'...

### Collecting data...
### Generating test bench data file: /tmp/Bdoc23b_2421742_865116/tp9496b7b9_2780_49aa_abc6_1841c92412f1/hdlcoder_commviterbi/In_rsvd.dat.
### Generating test bench data file: /tmp/Bdoc23b_2421742_865116/tp9496b7b9_2780_49aa_abc6_1841c92412f1/hdlcoder_commviterbi/Out_rsvd_expected.dat.
### Working on Viterbi_Decoder_Subsystem_tb as /tmp/Bdoc23b_2421742_865116/tp9496b7b9_2780_49aa_abc6_1841c92412f1/hdlcoder_commviterbi/Viterbi_Decoder_Subsystem_tb.vhd.
### Generating package file /tmp/Bdoc23b_2421742_865116/tp9496b7b9_2780_49aa_abc6_1841c92412f1/hdlcoder_commviterbi/Viterbi_Decoder_Subsystem_tb_pkg.vhd.
### HDL TestBench generation complete.
 

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

HDL Coder によって Viterbi_Decoder.vhd ファイルに生成される Traceback ユニットを最適化するには、レジスタベースのトレースバック ユニットをパイプライン処理するか、RAM ベースのトレースバック アーキテクチャを使用します。

レジスタベースのトレースバックのパイプライン処理

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

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

[TracebackStagesPerPipeline] プロパティを使用すると、システム要件に基づいて回路性能のバランスをとることができます。プロパティの値を小さくすると、より多くのレジスタが追加され、トレースバック回路の速度が増加します。値を大きくすると、レジスタが少なくなり、回路の速度が減少します。

この例では、[TracebackStagesPerPipeline] プロパティを 4 から 8 に調整すると、パイプラインで使用されるレジスタの数が半分に減少し、回路の速度が 173 MHz から 94 MHz に変化します。

RAM ベースのトレースバックのパイプライン処理

レジスタを使用する代わりに、RAM を使用して生き残りパス情報を保存できます。Viterbi Decoder ブロックを右クリックし、[HDL コード][HDL ブロック プロパティ] をクリックします。[アーキテクチャ]RAM-based Traceback に設定します。

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

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

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

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

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

この例では、合成で同様のクロック制約を使用することで、RAM ベースのトレースバック ユニットでのレジスタ使用数がレジスタベースのトレースバック ユニット (4 ステージごとのパイプライン処理) よりも 90% 減少しています。この 2 つの実装を個々の設計に応じてカスタマイズすることで、レジスタと RAM のトレードオフを実現できます。

MATLAB Function ブロックを使用したモデル アルゴリズム

モデル hdlcoderviterbi2 では、シミュレーションと HDL コード生成で使用する MATLAB Function ブロックを組み込んだビタビ復号化器の実装について示します。

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

open_system('hdlcoderviterbi2');

hdlcoderviterbi2.png

設計に MATLAB Function ブロックが含まれている場合、HDL コード アドバイザーでMATLAB Function ブロックの設定をチェック (HDL Coder)チェックを実行してから、HDL コードを生成します。このチェックでは、HDL コード生成で MATLAB Function ブロック推奨設定が使用されているかどうかが検証されます。

または、次のコマンドを実行します。

checkhdl('hdlcoderviterbi2/viterbi_eml_timed')
### Running HDL checks on the model 'hdlcoderviterbi2'.
### Begin compilation of the model 'hdlcoderviterbi2'...
### Creating HDL Code Generation Check Report file:///tmp/Bdoc23b_2421742_865116/tpcfc4d3e7/comm_hdlcoder-ex05465512/hdlsrc/hdlcoderviterbi2/viterbi_eml_timed_report.html
### HDL check for 'hdlcoderviterbi2' complete with 0 errors, 0 warnings, and 0 messages.

モデルをシミュレートするには、Simulink ツールストリップの [シミュレーション] タブで [実行] をクリックします。

または、次のコマンドを実行します。

sim('hdlcoderviterbi2');

viterbi_eml_timed サブシステムの HDL を生成するには、"HDL Coder" アプリを開きます。モデルで viterbi_eml_timed を選択します。[HDL コード] タブで、[次のコード]viterbi_eml_timed に設定されていることを確認します。選択内容を記憶するには、ピン ボタン をクリックしてサブシステム viterbi_eml_timed をピン留めします。[HDL コードを生成] をクリックします。

または、次のコマンドを実行します。

makehdl('hdlcoderviterbi2/viterbi_eml_timed');
### Generating HDL for 'hdlcoderviterbi2/viterbi_eml_timed'.
### Using the config set for model hdlcoderviterbi2 for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoderviterbi2'.
### Begin compilation of the model 'hdlcoderviterbi2'...
### Working on the model 'hdlcoderviterbi2'...
### Working on... GenerateModel
### Begin model generation 'gm_hdlcoderviterbi2' ....
### Copying DUT to the generated model....
### Model generation complete.
### Begin VHDL Code Generation for 'hdlcoderviterbi2'.
### Working on hdlcoderviterbi2/viterbi_eml_timed/ACS Unit/ACS as hdlsrc/hdlcoderviterbi2/ACS.vhd.
### Working on hdlcoderviterbi2/viterbi_eml_timed/ACS Unit/Renormalize_pipelined as hdlsrc/hdlcoderviterbi2/Renormalize_pipelined.vhd.
### Working on hdlcoderviterbi2/viterbi_eml_timed/ACS Unit as hdlsrc/hdlcoderviterbi2/ACS_Unit.vhd.
### Working on hdlcoderviterbi2/viterbi_eml_timed/TraceBack Unit/TBU1 as hdlsrc/hdlcoderviterbi2/TBU1.vhd.
### Working on hdlcoderviterbi2/viterbi_eml_timed/TraceBack Unit/TBU_OUT as hdlsrc/hdlcoderviterbi2/TBU_OUT.vhd.
### Working on hdlcoderviterbi2/viterbi_eml_timed/TraceBack Unit as hdlsrc/hdlcoderviterbi2/TraceBack_Unit.vhd.
### Working on hdlcoderviterbi2/viterbi_eml_timed/BMU as hdlsrc/hdlcoderviterbi2/BMU.vhd.
### Working on hdlcoderviterbi2/viterbi_eml_timed as hdlsrc/hdlcoderviterbi2/viterbi_eml_timed.vhd.
### Generating package file hdlsrc/hdlcoderviterbi2/viterbi_eml_timed_pkg.vhd.
### Code Generation for 'hdlcoderviterbi2' completed.
### Creating HDL Code Generation Check Report file:///tmp/Bdoc23b_2421742_865116/tpcfc4d3e7/comm_hdlcoder-ex05465512/hdlsrc/hdlcoderviterbi2/viterbi_eml_timed_report.html
### HDL check for 'hdlcoderviterbi2' complete with 0 errors, 0 warnings, and 0 messages.
### HDL code generation complete.

viterbi_eml_timed サブシステム用のテスト ベンチを生成するには、[HDL コード] タブで [Generate Testbench] をクリックします。

または、次のコマンドを実行します。

makehdltb('hdlcoderviterbi2/viterbi_eml_timed');
### Begin TestBench generation.
### Generating HDL TestBench for 'hdlcoderviterbi2/viterbi_eml_timed'.
### Begin compilation of the model 'hdlcoderviterbi2'...
### Begin compilation of the model 'gm_hdlcoderviterbi2'...
### Begin simulation of the model 'gm_hdlcoderviterbi2'...

### Collecting data...
### Generating test bench data file: hdlsrc/hdlcoderviterbi2/In1.dat.
### Generating test bench data file: hdlsrc/hdlcoderviterbi2/Out1_expected.dat.
### Working on viterbi_eml_timed_tb as hdlsrc/hdlcoderviterbi2/viterbi_eml_timed_tb.vhd.
### Generating package file hdlsrc/hdlcoderviterbi2/viterbi_eml_timed_tb_pkg.vhd.
### HDL TestBench generation complete.
 

参考文献

  1. Clark, George C., and J. Bibb Cain. Error-Correction Coding for Digital Communications. Springer US, 1981.

  2. Feygin, G., and P. Gulak. “Architectural Tradeoffs for Survivor Sequence Memory Management in Viterbi Decoders.” IEEE Transactions on Communications, vol. 41, no. 3, Mar. 1993, pp. 425–29.