この例では、MATLAB® System object と HDL シミュレータを使用して、VHDL で実装された Viterbi デコーダを共同シミュレーションする方法を示します。
HDL Verifier™ 製品を使用すると、MATLAB System object を使用して Verilog または VHDL で実装された設計を検証できます。この製品を使用すると、HDL コードを MATLAB と共同シミュレーションし、HDL 実装に対してモデルを検証できます。この例では、MATLAB System object と次の HDL シミュレータを使用して、Viterbi デコーダを共同シミュレーションします。
シミュレーションパラメータを設定し、通信システムオブジェクトをインスタンス化する
Xcelium を使用している場合は、シミュレータ変数を Xcelium
に設定します。
ModelSim/QuestaSim を使用している場合は、シミュレータ変数を ModelSim
に設定します。
Vivado シミュレータを使用している場合、Vivado シミュレータの HDL コシミュレーション System object™ は、コシミュレーション ウィザード ツールのみを使用して作成できます。Cosimulation Wizard ツールの詳細については、コシミュレーションウィザード を参照してください。
次のコードは、シミュレーション パラメータを設定し、チャネル エンコーダー、BPSK 変調器、AWGN チャネル、BPSK 復調器、およびエラー レート計算機を表す System object をインスタンス化します。これらのオブジェクトは、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.Sign を Unsigned
に設定します。
c. 分数の長さを 0
に設定します。
d. [Next] をクリックします。
クロック/リセットの詳細ページで、次の手順を実行します。
a.クロック周期を10
に設定します。
b.リセット 初期値 を 1
に設定し、期間 を 8
に設定します。
c. clk_enable Initial Value を 0
に設定し、Duration を 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 シミュレータ セッションを手動で閉じます。
参考