メインコンテンツ

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

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

この例では、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 ™ は、コシミュレーションウィザード ツールのみを使用して作成できます。 コシミュレーション 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;

AWGNチャネル

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

エラー率計算機

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=150;
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 システムオブジェクトのコシミュレーション Wizard を使い始める に記載されている手順 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コシミュレーションを開始する時間10 に設定して、実行前時間を設定します。

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       = pskmod(encodedData,2);
  receivedSignal  = hChan(modSignal);
  demodSignalSD   = pskdemod(receivedSignal,2,OutputType='llr',NoiseVariance=0.5*10^(-EsNo/10));
  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

ビットエラーレートの表示

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

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

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

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

clear hDec;

参考