exponenta event banner

Проверка декодера Витерби с помощью симулятора системных объектов MATLAB и HDL

В этом примере показано, как использовать системные объекты MATLAB ® и Mentor Graphics ® ModelSim ®/QuestaSim ® или Cadence ® Incisive ®/Xcelium ® для косимуляции декодера Витерби, реализованного в VHDL.

Установка параметров моделирования и создание экземпляров объектов системы связи

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

Simulator = 'Incisive';

или если используется ModelSim/QuestaSim, задайте переменной симулятора значение ModelSime

Simulator = 'ModelSim';

Следующий код устанавливает параметры моделирования и создает экземпляры системных объектов, которые представляют канальный кодер, модулятор BPSK, канал AWGN, демодулятор BPSK и калькулятор частоты ошибок. Эти объекты включают систему вокруг декодера Витерби и могут рассматриваться как тестовый стенд для реализации 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);

Создание экземпляра объекта системы Cosimulation

Функция hdlcosim возвращает объект системы косимуляции HDL, который представляет реализацию 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 '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. Запущенный сеанс имитатора ЛПВП компилирует дизайн ЛПВП и загружает имитацию ЛПВП. После полной загрузки моделирования ЛПВП в симулятор можно выполнить косимуляцию.

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 декодера Витерби через объект системы косимуляции. Этот раздел кода вызывает цикл обработки для обработки кадра данных за кадром с 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

Отображение частоты битовых ошибок

Коэффициент битовых ошибок отображается для декодера Витерби.

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

    'Bit Error Rate is 5.511269e-03
     '

Уничтожить объект системы косимуляции для выпуска имитатора ЛПВП

Имитатор ЛПВП разблокируется при уничтожении объекта системы косимуляции ЛПВП в MATLAB. Закройте сеанс имитатора ЛПВП вручную.

clear hDec;

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