このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
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.」 In1 と In2 のポート名をInput
に設定します。
「d.」 ce_out ポート名をUnused
に設定します。
「e.」 Out1 ポート名をOutput
に設定します。
「f.」 「次へ」をクリックします。
「出力ポート」の詳細で、次の手順を実行します。
a. サンプル時間 を10
に設定します。
「b.」 Sign をUnsigned
に設定します。
「c.」小数部の長さを0
に設定します。
「d.」 「次へ」をクリックします。
「クロック/リセットの詳細」ページで、次の手順を実行します。
a.クロック周期を10
に設定します。
「b.」 reset Initial Value を1
に、Duration を8
に設定します。
「c.」 clk_enable Initial Value を0
に、Duration を1
に設定します。
「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;