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

В этом примере показано, как использовать объекты 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

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

Команда 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 разблокируется, когда системный объект косимуляции HDL разрушается в MATLAB. Закройте Симулятор HDL сеанс вручную.

clear hDec;

На этом завершается «Проверка декодера Viterbi с использованием системного объекта MATLAB и Симулятор HDL».