このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
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.Sign を Unsigned
に設定します。
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;