В этом примере показано, как использовать объекты MATLAB ® System и Mentor Graphics ® ModelSim ®/QuestaSim ® или Cadence ® Incisive ®/Xcelium ® для косимуляции декодера Viterbi, реализованного в VHDL.
Если вы используете Incisive/Xcelium, установите переменную симулятора на 'Incisive'
Simulator = 'Incisive';
или если вы используете ModelSim/QuestaSim, установите переменную симулятора на 'ModelSime'
Simulator = 'ModelSim';
Следующий код устанавливает параметры симуляции и создает экземпляры системных объектов, которые представляют энкодер канала, модулятор BPSK, канал AWGN, демодулятор BPSK и калькулятор частоты ошибок. Эти объекты содержат систему вокруг декодера 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);
Функция hdlcosim возвращает HDL- Системного объекта косимуляции, который представляет HDL- реализации декодера Viterbi в этой системе симуляции. Интерфейс объекта является общим для всех симуляторов. Для удобства, чтобы избежать записи некоторого кода HDL testbench, мы генерируем формы сигналов для часов и сбрасывает с помощью специфичного для симулятора кода 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 'Incisive' 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
Команда vsim и nclaunch запускает Симулятор HDL. Запущенный Симулятором HDL сеанс компилирует HDL- проекта и загружает HDL- симуляции. Вы готовы выполнить косимуляцию, когда симуляция HDL будет полностью загружена в симулятор.
disp('Launching HDL simulator...'); switch Simulator case 'ModelSim' vsim('tclstart',viterbi_cosimulation_tclcmds('vsimmatlabsysobj')); case 'Incisive' 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.');
Launching HDL simulator... ...Simulator is ready for cosimulation.
Этот пример моделирует систему связи BPSK в MATLAB, включающую реализацию HDL декодера Viterbi через системный объект косимуляции. Этот раздел кода вызывает цикл обработки, чтобы обработать кадр за кадром данных с 1024 битами в каждой системе координат данных.
for counter = 1:20480/FrameSize data = randi([0 1],FrameSize,1); encodedData = step(hConEnc, data); modSignal = step(hMod, encodedData); receivedSignal = step(hChan, modSignal); demodSignalSD = step(hDemod, receivedSignal); quantizedValue = fi(4-demodSignalSD,0,3,0); input1 = quantizedValue(1:2:2*FrameSize); input2 = quantizedValue(2:2:2*FrameSize); receivedBits = step(hDec,input1, input2); errors = step(hError, data, double(receivedBits)); end
Для декодера Viterbi отображается вероятность битовой ошибки.
sprintf('Bit Error Rate is %d\n',errors(1))
ans = 'Bit Error Rate is 5.511269e-03 '
Симулятор HDL разблокируется, когда системный объект косимуляции HDL разрушается в MATLAB. Закройте Симулятор HDL сеанс вручную.
clear hDec;
На этом завершается «Проверка декодера Viterbi с использованием системного объекта MATLAB и Симулятор HDL».