Main Content

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

MATLAB System Object と HDL シミュレーターを使用したビタビ デコーダーの検証

この例では、 MATLAB® System object と HDL シミュレーターを使用して、VHDL で実装されたビタビ デコーダーを協調シミュレーションする方法を示します。

HDL Verifier™製品を使用すると、 MATLAB System object を使用して Verilog または VHDL で実装されたデザインを検証できます。この製品を使用すると、HDL コードをMATLABで協調シミュレーションし、HDL 実装に対してモデルを検証できます。この例では、 MATLAB System object と次の HDL シミュレーターを使用して、ビタビ デコーダーを共同シミュレーションします。

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

  • Mentor Graphics® の ModelSim® または Questa®

  • Cadence® の Xcelium®

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

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

Simulator = 'Xcelium';

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

Simulator = 'ModelSim';

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

次のコードは、シミュレーションパラメーターを設定し、チャネルエンコーダー、BPSK 変調器、AWGNチャネル、BPSK 復調器、および誤り率計算器を表す System object をインスタンス化します。これらのオブジェクトは、ビタビ デコーダ周辺のシステムを構成し、ビタビ 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);

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

≪ModelSimまたはXceliumの場合≫

1. ModelSim または Xcelium の HDL コシミュレーションSystem object は、コシミュレーション ウィザード ツールまたはhdlcosim関数を使用して作成できます。この例では、関数hdlcosimを使用して、HDL コシミュレーション System Object を生成します。System object は、このシミュレーション システムにおけるビタビ デコーダーの 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. Cosimulation Wizard を使用して HDL コシミュレーションSystem objectを生成するには、 MATLAB System Object の協調シミュレーション ウィザードに記載されている手順 6 までに従います。

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

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

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

「c.」 In1In2 のポート名をInputに設定します。

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

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

「f.」 「次へ」をクリックします。

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

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

「b.」 SignUnsignedに設定します。

「c.」小数部の長さを0に設定します。

「d.」 「次へ」をクリックします。

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

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

「b.」 reset Initial Value1に、Duration8に設定します。

「c.」 clk_enable Initial Value0に、Duration1に設定します。

「d.」 「次へ」をクリックします。

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

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

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

「c.」 「次へ」をクリックします。

「システムオブジェクト」について「生成」ページで「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を介してビタビ復号器 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))

Cosimulation System オブジェクトを破棄して HDL シミュレーターを解放する

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

clear hDec;

参考