Main Content

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

ビタビ復号化器 System object からの HDL コード生成

この例では、ビタビ復号化器 System object™ をインスタンス化する MATLAB® コードをチェックし、そのコードから HDL コードを生成して検証する方法を示します。

MATLAB 設計

この例で使用する MATLAB コードは硬判定畳み込み復号化で使用されるビタビ復号化器で、System object として実装されます。この例では、復号化器をテストする MATLAB テスト ベンチも示します。

design_name = 'mlhdlc_sysobj_viterbi';
testbench_name = 'mlhdlc_sysobj_viterbi_tb';

MATLAB 設計を確認します。

type(design_name);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MATLAB design: Viterbi Decoder 
% 
% Key Design pattern covered in this example: 
% (1) Using comm system toolbox ViterbiDecoder object
% (2) The object can be called only once per design iteration
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%   Copyright 2011-2015 The MathWorks, Inc.

function decodedBits = mlhdlc_sysobj_viterbi(inputSymbol)

persistent hVitDec;

if isempty(hVitDec)
    hVitDec = comm.ViterbiDecoder('InputFormat','Hard', 'OutputDataType', 'Logical');
end

decodedBits = hVitDec(inputSymbol);
type(testbench_name);
% Viterbi_tb - testbench for Viterbi_dut

%   Copyright 2011-2015 The MathWorks, Inc.

numErrors = 0;
% rand stream
original_rs = RandStream.getGlobalStream;
rs = RandStream.create('mrg32k3a', 'seed', 25);
%RandStream.getGlobalStream(rs);
rs.reset;
% convolutional encoder
hConvEnc = comm.ConvolutionalEncoder;
% BER
hBER = comm.ErrorRate;
hBER.ReceiveDelay = 34;
reset(hBER);

% clear persistent variables in the design between runs of the testbench
clear mlhdlc_msysobj_viterbi;

for numSymbols = 1:10000
    % generate a random bit
    inputBit = logical(randi([0 1], 1, 1));
        
    % encode it with the Convolutional Encoder - rate 1/2
    encodedSymbol = hConvEnc(inputBit);
    
    % optional - add noise
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % call Viterbi Decoder DUT to decode the symbol
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    vitdecOut = mlhdlc_sysobj_viterbi(encodedSymbol);
    
    ber = hBER(inputBit, vitdecOut);
end

fprintf('%s\n', repmat('%', 1, 38));
fprintf('%%%%%%%%%%%%%% %s %%%%%%%%%%%%%%\n', 'Viterbi Decoder Output');
fprintf('%s\n', repmat('%', 1, 38));
fprintf('Number of bits %d, BER %g\n', numSymbols, ber(1));
fprintf('%s\n', repmat('%', 1, 38));

% EOF

設計のシミュレーション

コードの生成前にテストベンチを使用して設計をシミュレートし、実行時エラーが発生しないことを確認します。

mlhdlc_sysobj_viterbi_tb
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%% Viterbi Decoder Output %%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Number of bits 10000, BER 0
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

ビタビ復号化アルゴリズムのハードウェア実装

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

再正規化メソッド

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

1 つのクロック サイクルですべての状態メトリクス要素の最小値を取得することにより、回路のクロック周波数が低下します。回路の性能は、パイプライン レジスタを追加することによって向上することがあります。しかし、パイプライン レジスタによって遅延した最小値を状態メトリクスから単に差し引くだけでは、引き続きオーバーフローが発生する可能性があります。

ハードウェア アーキテクチャは、再正規化メソッドを変更し、3 つのステップで状態メトリクスのオーバーフローを回避します。まず、アーキテクチャでトレリス構造と軟判定ビットの数に基づいて、しきい値とステップ パラメーターの値が計算されます。次に、遅延した最小値がしきい値と比較されます。最後に、最小値がしきい値以上である場合、状態メトリクスからステップ値が差し引かれます。それ以外の場合、調整は行われません。次の図は、変更された再正規化メソッドを示しています。

HDL Coder プロジェクトの新規作成

新しいプロジェクトを作成するには、次のコマンドを入力します。

coder -hdlcoder -new mlhdlc_viterbi

次に、mlhdlc_sysobj_viterbi.m ファイルを MATLAB 関数としてプロジェクトに追加し、mlhdlc_sysobj_viterbi_tb.m を MATLAB テスト ベンチとして追加します。

MATLAB HDL Coder プロジェクトの作成と入力に関する詳細なチュートリアルについては、MATLAB から HDL へのワークフロー入門を参照してください。

固定小数点変換と HDL コード生成の実行

ワークフロー アドバイザーを起動します。ワークフロー アドバイザーで、[コード生成] のステップを右クリックして [選択したタスクまで実行] オプションを選択し、最初から HDL コード生成までのすべてのステップを実行します。

ログ ウィンドウにあるリンクをクリックして、生成された HDL コードを確認します。

サポートされている System object

HDL コード生成でサポートされている System object のリストについては、HDL コード生成に使用できる事前定義済みの System Objectsを参照してください。