メインコンテンツ

このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。

MATLAB システム オブジェクトと HDL シミュレータを使用して Viterbi デコーダを検証する

この例では、MATLAB ® システム オブジェクトと HDL シミュレータを使用して、VHDL で実装された Viterbi デコーダをコシミュレーションする方法を示します。

HDL Verifier ™ 製品を使用すると、MATLAB システム オブジェクトを使用して Verilog または VHDL で実装された設計を検証できます。この製品を使用すると、HDL コードを MATLAB とコシミュレーションし、HDL 実装に対してモデルを検証できます。この例では、MATLAB システム オブジェクトと次の HDL シミュレータを使用して、Viterbi デコーダをコシミュレーションします。

  • AMD® の Vivado® シミュレータ

  • Siemens EDA の ModelSim™ または Questa™

  • Cadence® の Xcelium®

シミュレーションパラメーターを設定し、通信システムオブジェクトをインスタンス化する

Xcelium を使用している場合は、シミュレータ変数を Xcelium に設定します。

Simulator = 'Xcelium';

ModelSim/QuestaSim を使用している場合は、シミュレータ変数を ModelSim に設定します。

Simulator = 'ModelSim';

Vivado シミュレータを使用している場合、Vivado シミュレータ用の HDL コシミュレーション System object ™ は、コシミュレーション ウィザード ツールのみを使用して作成できます。Cosimulation Wizard ツールの詳細については、コシミュレーション ウィザード を参照してください。

次のコードは、シミュレーションパラメーターを設定し、チャネルエンコーダー、BPSK 変調器、AWGNチャネル、BPSK 復調器、およびエラー レート計算機を表す System オブジェクトをインスタンス化します。これらのオブジェクトは、Viterbi デコーダーの周囲のシステムを構成し、Viterbi HDL 実装のテスト ベッドと考えることができます。

EsNo = 0;	% Energy per symbol to noise power spectrum density ratio in dB
FrameSize = 1024;  % Number of bits in each frame

畳み込みエンコーダ

hConEnc = comm.ConvolutionalEncoder;

BPSK変調器

hMod    = comm.BPSKModulator;

AWGNチャネル

hChan   = comm.AWGNChannel('NoiseMethod', ...
                         'Signal to noise ratio (Es/No)', ...
                         'SamplesPerSymbol',1, ...
                         'EsNo',EsNo);

BPSK復調器

hDemod  = comm.BPSKDemodulator('DecisionMethod','Log-likelihood ratio', ...
                            'Variance',0.5*10^(-EsNo/10));

エラー率計算機

hError  = comm.ErrorRate('ComputationDelay',100,'ReceiveDelay',58);

コシミュレーション システム オブジェクトをインスタンス化し、HDL シミュレータを起動する

ModelSim または Xcelium の場合

1. ModelSim または Xcelium の HDL コシミュレーション System object は、コシミュレーション ウィザード ツールまたは hdlcosim 関数を使用して作成できます。この例では、hdlcosim 関数を使用して HDL コシミュレーション システム オブジェクトを生成します。System object は、このシミュレーション システムにおける Viterbi デコーダの HDL 実装を表します。オブジェクトのインターフェースはすべてのシミュレーターで共通です。一部の HDL テストベンチ コードを記述する手間を省くため、シミュレータ固有の Tcl コードを使用してクロックとリセットの波形を生成します。

hDec = hdlcosim('InputSignals', {'/viterbi_block/In1','/viterbi_block/In2'}, ...
              'OutputSignals', {'/viterbi_block/Out1'}, ...
              'OutputSigned', false, ...
              'OutputFractionLengths', 0, ...
              'TCLPostSimulationCommand', 'echo "done";', ...
              'PreRunTime', {10,'ns'}, ...
              'Connection', {'Shared'}, ...
              'SampleTime', {10,'ns'});
switch Simulator
  case 'ModelSim'
      hDec.TCLPreSimulationCommand = ...
          'force /viterbi_block/clk_enable 1 0; force /viterbi_block/clk 0 0 ns, 1 5 ns -repeat 10 ns; force /viterbi_block/reset 1 0 ns, 0 8 ns; ';
  case 'Xcelium'
      hDec.TCLPreSimulationCommand = ...
          'force :clk B"0" -after 0ns B"1" -after 5ns -repeat 10ns; force reset B"1" -after 0ns B"0" -after 8ns; force :clk_enable B"1" -after 0ns';
end

2. vsim および nclaunch コマンドは HDL シミュレータを起動します。起動された HDL シミュレータ セッションは、HDL 設計をコンパイルし、HDL シミュレーションをロードします。HDL シミュレーションがシミュレータに完全にロードされると、コシミュレーションを実行する準備が整います。

disp('Launching HDL simulator...');
switch Simulator
  case 'ModelSim'
      vsim('tclstart',viterbi_cosimulation_tclcmds('vsimmatlabsysobj'));
  case 'Xcelium'
      nclaunch('tclstart',viterbi_cosimulation_tclcmds('hdlsimmatlabsysobj'));
end
Timeout=30;
processid = pingHdlSim(Timeout);
Check if HDL simulator is ready for Cosimulation.
assert(ischar(processid),['Timeout: HDL simulator took more than ', num2str(Timeout),' seconds to setup,please increase the timeout in ''pingHdlSim''']);
disp('...Simulator is ready for cosimulation.');

Vivado シミュレータの場合

1. コシミュレーション ウィザード を使用して HDL コシミュレーション System object を生成するには、MATLAB システム オブジェクトのコシミュレーション ウィザード に記載されている手順 6 まで実行します。

入力/出力ポート ページで、次の手順を実行します。

a.clk ポート名を Clock に設定します。

b.reset および clk_enable ポート名を Reset に設定します。

c. In1 および In2 ポート名を Input に設定します。

d. ce_out ポート名を Unused に設定します。

e.Out1 ポート名を Output に設定します。

f.[Next] をクリックします。

出力ポートの詳細で、次の手順を実行します。

a.サンプル時間10に設定します。

b.SignUnsigned に設定します。

c. 分数の長さを 0 に設定します。

d. [Next] をクリックします。

クロック/リセットの詳細ページで、次の手順を実行します。

a.クロック周期を 10 に設定します。

b.リセット初期値1に設定し、期間8に設定します。

c. clk_enable初期値0 に設定し、 期間1 に設定します。

d. [Next] をクリックします。

開始時間の調整ページで、次の手順を実行します。

a.HDL 時間によるコシミュレーションの開始0 に設定して、実行前時間を設定します。

b.図の更新をクリックします。

c. [Next] をクリックします。

System Obj. について生成 ページで、HDL シミュレータのサンプリング期間10 に設定し、完了 をクリックします。

2. 生成された System object スクリプトは次のようになります。

xsiData = createXsiData( ...
   'design', 'xsim.dir/design/xsimk', ...
   'lang', 'vhdl', ...
   'prec', '1ps', ...
   'types', {'Logic' 'Logic' 'Logic' }, ...
   'dims', {3 3 1 }  ...
  );
obj = hdlcosim( ...
   'HDLSimulator', 'Vivado Simulator', ...
   'InputSignals', {'/viterbi_block/In1','/viterbi_block/In2'}, ...
   'OutputSignals', {'/viterbi_block/Out1'}, ...
   'OutputSigned', [false], ...
   'OutputDataTypes', {'fixedpoint'}, ...
   'OutputFractionLengths', [0], ...
   'ClockResetSignals', {'/viterbi_block/clk' '/viterbi_block/reset' '/viterbi_block/clk_enable' }, ...
   'ClockResetTypes', {'Active Rising Edge Clock' 'Step 1 to 0' 'Step 0 to 1' }, ...
   'ClockResetTimes', {{10,'ps'} {8,'ps'} {1,'ps'} }, ...
   'PreRunTime', {0,'ps'}, ...
   'SampleTime', {10,'ps'}, ...
   'XSIData', xsiData  ...
  );

3.MATLAB でこのコマンドを使用して、 System object を新しい変数 hDec に割り当てます。

hDec = hdlcosim_viterbi_block;

コシミュレーションを実行する

この例では、コシミュレーション System object を介して Viterbi デコーダー HDL 実装を組み込んだ MATLAB の BPSK 通信システムをシミュレートします。このコードのセクションでは、処理ループを呼び出して、各データ フレームに 1024 ビットが含まれるデータをフレームごとに処理します。

for counter = 1:20480/FrameSize
  data            = randi([0 1],FrameSize,1);
  encodedData     = hConEnc(data);
  modSignal       = hMod(encodedData);
  receivedSignal  = hChan(modSignal);
  demodSignalSD   = hDemod(receivedSignal);
  quantizedValue  = fi(4-demodSignalSD,0,3,0);
  input1          = quantizedValue(1:2:2*FrameSize);
  input2          = quantizedValue(2:2:2*FrameSize);
   receivedBits    = hDec(input1, input2);
   errors          = hError(data, double(receivedBits));
 end

ビットエラー率の表示

ビタビデコーダのビットエラー率が表示されます。

sprintf('Bit Error Rate is %d\n',errors(1))

コシミュレーション システム オブジェクトを破棄して HDL シミュレータを解放する

HDL コシミュレーション System object が MATLAB で破棄されると、HDL シミュレーターのブロックが解除されます。HDL シミュレータ セッションを手動で閉じます。

clear hDec;

参考