В этом примере показано, как проверить, сгенерировать и проверить код HDL из кода MATLAB ®, который создает экземпляр объекта системы декодера Витерби.
Код MATLAB, используемый в этом примере, является декодером Витерби, используемым при сверточном декодировании с жестким решением, реализованным как системный объект. В этом примере также показан тестовый стенд MATLAB, который проверяет декодер.
design_name = 'mlhdlc_sysobj_viterbi'; testbench_name = 'mlhdlc_sysobj_viterbi_tb';
Рассмотрим дизайн MATLAB.
type(design_name);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MATLAB design: Viterbi Decoder
%
% Key Design pattern covered in this example:
% (1) Using comm system toolbox ViterbiDecoder function
% (2) The 'step' method can be called only per system object in a design iteration
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Copyright 2011-2015 The MathWorks, Inc.
function decodedBits = mlhdlc_sysobj_viterbi(inputSymbol)
persistent hVitDec;
if isempty(hVitDec)
hVitDec = comm.ViterbiDecoder('InputFormat','Hard', 'OutputDataType', 'Logical');
end
decodedBits = step(hVitDec, inputSymbol);
type(testbench_name);
% Viterbi_tb - testbench for Viterbi_dut
% Copyright 2011-2015 The MathWorks, Inc.
numErrors = 0;
% rand stream
original_rs = RandStream.getGlobalStream;
rs = RandStream.create('mrg32k3a', 'seed', 25);
%RandStream.getGlobalStream(rs);
rs.reset;
% convolutional encoder
hConvEnc = comm.ConvolutionalEncoder;
% BER
hBER = comm.ErrorRate;
hBER.ReceiveDelay = 34;
reset(hBER);
% clear persistent variables in the design between runs of the testbench
clear mlhdlc_msysobj_viterbi;
for numSymbols = 1:10000
% generate a random bit
inputBit = logical(randi([0 1], 1, 1));
% encode it with the Convolutional Encoder - rate 1/2
encodedSymbol = step(hConvEnc, inputBit);
% optional - add noise
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% call Viterbi Decoder DUT to decode the symbol
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
vitdecOut = mlhdlc_sysobj_viterbi(encodedSymbol);
ber = step(hBER, inputBit, vitdecOut);
end
fprintf('%s\n', repmat('%', 1, 38));
fprintf('%%%%%%%%%%%%%% %s %%%%%%%%%%%%%%\n', 'Viterbi Decoder Output');
fprintf('%s\n', repmat('%', 1, 38));
fprintf('Number of bits %d, BER %g\n', numSymbols, ber(1));
fprintf('%s\n', repmat('%', 1, 38));
% EOF
Выполните следующие строки кода, чтобы скопировать необходимые файлы примеров во временную папку.
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos'); mlhdlc_temp_dir = [tempdir 'mlhdlc_so_viterbi']; % Create a temporary folder and copy the MATLAB files. cd(tempdir); [~, ~, ~] = rmdir(mlhdlc_temp_dir, 's'); mkdir(mlhdlc_temp_dir); cd(mlhdlc_temp_dir); copyfile(fullfile(mlhdlc_demo_dir, [design_name,'.m*']), mlhdlc_temp_dir); copyfile(fullfile(mlhdlc_demo_dir, [testbench_name,'.m*']), mlhdlc_temp_dir);
Перед созданием кода смоделируйте проект с помощью средства тестирования, чтобы убедиться в отсутствии ошибок во время выполнения.
mlhdlc_sysobj_viterbi_tb
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%% Viterbi Decoder Output %%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Number of bits 10000, BER 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
В алгоритме декодирования Витерби три основных компонента. Они представляют собой вычисления метрики ветви (BMC), add-compare-select (ACS) и декодирование отслеживания. Следующая диаграмма иллюстрирует три единицы в алгоритме декодирования Витерби.
Декодер Витерби предотвращает переполнение метрик состояния в компоненте ACS, вычитая минимальное значение метрик состояния на каждом временном шаге, как показано на следующем рисунке.
Получение минимального значения всех элементов метрики состояния в одном такте приводит к плохой тактовой частоте для схемы. Рабочие характеристики схемы могут быть улучшены путем добавления регистров трубопроводов. Однако простое вычитание минимального значения, задержанного конвейерными регистрами, из метрик состояния может все же привести к переполнению.
Аппаратная архитектура изменяет метод перенормировки и позволяет избежать переполнения метрики состояния в три этапа. Сначала архитектура вычисляет значения для пороговых параметров и параметров шага на основе решетчатой структуры и количества битов мягкого решения. Во-вторых, минимальное значение задержки сравнивается с порогом. Наконец, если минимальное значение больше или равно пороговому значению, реализация вычитает значение шага из метрики состояния; в противном случае регулировка не выполняется. На следующем рисунке показан модифицированный метод перенормировки.
Для создания нового проекта введите следующую команду:
coder -hdlcoder -new mlhdlc_viterbi
Затем добавьте файл «mlhdlc _ sysobj _ viterbi.m» в проект в качестве функции MATLAB и «mlhdlc _ sysobj _ viterbi _ tb.m» в качестве испытательного стенда MATLAB.
Для получения более полного руководства по созданию и заполнению проектов кодера MATLAB HDL см. раздел Начало работы с MATLAB в Workflow-процессе HDL.
Запустите помощник по рабочим процессам. В помощнике по рабочим процессам щелкните правой кнопкой мыши шаг «Создание кода» и выберите опцию «Выполнить до выбранной задачи», чтобы выполнить все шаги от начала до создания кода HDL.
Проверьте сгенерированный код HDL, щелкнув ссылки в окне журнала.
Список системных объектов, поддерживаемых для генерации кода HDL, см. в разделе Стандартные системные объекты, поддерживаемые для генерации кода HDL.
Выполните следующие команды для очистки временной папки проекта.
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos'); mlhdlc_temp_dir = [tempdir 'mlhdlc_so_viterbi']; clear mex; cd (mlhdlc_demo_dir); rmdir(mlhdlc_temp_dir, 's');