Проверьте декодер Витерби Используя системный объект MATLAB и симулятор HDL

Этот пример показывает вам, как использовать Системные объекты MATLAB® и Наставника Graphics® ModelSim®/QuestaSim® или Cadence® Incisive®/Xcelium® к cosimulate Декодер Витерби, реализованный в VHDL.

Установите параметры симуляции и инстанцируйте объектов системы связи

Если вы используете Incisive/Xcelium, переменную средства моделирования набора к 'Острому'

Simulator = 'Incisive';

% or if you are using ModelSim/QuestaSim, set simulator variable to
% 'ModelSim'
Simulator = 'ModelSim';

% The following code sets up the simulation parameters and instantiates the
% system objects that represent the channel encoder, BPSK modulator, AWGN
% channel, BPSK demodulator, and error rate calculator. Those objects
% comprise the system around the Viterbi decoder and can be thought of as
% the test bed for the Viterbi HDL implementation.

EsNo = 0;	% Energy per symbol to noise power spectrum density ratio in dB
FrameSize = 1024;  % Number of bits in each frame

% Convolution Encoder
hConEnc = comm.ConvolutionalEncoder;
% BPSK Modulator
hMod    = comm.BPSKModulator;
% AWGN channel
hChan   = comm.AWGNChannel('NoiseMethod', ...
                           'Signal to noise ratio (Es/No)',...
                           'SamplesPerSymbol',1,...
                           'EsNo',EsNo);
% BPSK demodulator
hDemod  = comm.BPSKDemodulator('DecisionMethod','Log-likelihood ratio',...
                               'Variance',0.5*10^(-EsNo/10));
% Error Rate Calculator
hError  = comm.ErrorRate('ComputationDelay',100,'ReceiveDelay', 58);

Инстанцируйте системного объекта Cosimulation

hdlcosim функция возвращает HDL cosimulation Системный объект, который представляет реализацию HDL Декодера Витерби в этой системе симуляции.

switch Simulator
    case 'ModelSim'
        hDec    = hdlcosim('InputSignals', {'/viterbi_block/In1','/viterbi_block/In2'}, ...
                           'OutputSignals', {'/viterbi_block/Out1'}, ...
                           'OutputSigned', false, ...
                           'OutputFractionLengths', 0, ...
                           '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; ', ...
                           'TCLPostSimulationCommand', 'echo "done";', ...
                           'PreRunTime', {10,'ns'}, ...
                           'Connection', {'Shared'}, ...
                           'SampleTime', {10,'ns'});
    case 'Incisive'
        hDec    = hdlcosim('InputSignals', {'/viterbi_block/In1','/viterbi_block/In2'}, ...
                           'OutputSignals', {'/viterbi_block/Out1'}, ...
                           'OutputSigned', false, ...
                           'OutputFractionLengths', 0, ...
                           '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', ...
                           'TCLPostSimulationCommand', 'echo "done";', ...
                           'PreRunTime', {10,'ns'}, ...
                           'Connection', {'Shared'}, ...
                           'SampleTime', {10,'ns'});
end

Запустите симулятор HDL

vsim и nclaunch команда запускают симулятор HDL. Запущенный сеанс симулятора HDL компилирует проект HDL и загружает симуляцию HDL. Вы готовы выполнить cosimulation, когда симуляция HDL полностью загружается в средстве моделирования.

disp('Waiting for HDL simulator to launch ...');
switch Simulator
    case 'ModelSim'
        vsim('tclstart',viterbi_tclcmds_modelsim('vsimmatlabsysobj'));
    case 'Incisive'
        nclaunch('tclstart',viterbi_tclcmds_incisive('hdlsimmatlabsysobj'));
end
Timeout=450;
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('Ready for cosimulation ...');

Запустите Cosimulation

Этот пример моделирует систему связи BPSK в MATLAB, включающем реализацию HDL Декодера Витерби через cosimulation Системный объект. Этот раздел кода вызывает цикл обработки, чтобы обработать данные, покадровые с 1 024 битами в каждом кадре данных.

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

Отобразите частоту ошибок по битам

Частота ошибок по битам отображена для Декодера Витерби.

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

Уничтожьте системный объект Cosimulation, чтобы выпустить симулятор HDL

Симулятор HDL разблокируется, когда HDL cosimulation системный объект уничтожается в MATLAB. Закройте сеанс симулятора HDL вручную.

clear hDec;

% This concludes the "Verify Viterbi Decoder Using MATLAB System Object and
% HDL Simulator".