В этом примере показано, как генерировать код ЛПВП из базового алгоритма оценки временного смещения опережения-запаздывания, реализованного в коде MATLAB ®.
В системах беспроводной связи приемные данные избыточно дискретизируются на RF фронтэнде. Это служит нескольким целям, включая обеспечение достаточных скоростей дискретизации для фильтрации приема.
Однако одной из наиболее важных функций является обеспечение множества точек дискретизации на принимаемом сигнале, так что данные могут быть дискретизированы вблизи точки максимальной амплитуды в принимаемом сигнале. Этот пример иллюстрирует основное ядро оценки сдвига времени опережения-запаздывания, работающее рекурсивно.
Сгенерированное аппаратное ядро для этой конструкции работает при 1/os_rate, где os_rate - скорость избыточной выборки. То есть для 8 циклов избыточно дискретизированного тактового сигнала это ядро итерируется один раз. Выходной сигнал находится на символьной скорости.
design_name = 'mlhdlc_comms_toe'; testbench_name = 'mlhdlc_comms_toe_tb';
Рассмотрим дизайн MATLAB ®.
type(design_name);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MATLAB design: Time Offset Estimation
%
%% Introduction:
%
% The generated hardware core for this design operates at 1/os_rate
% where os_rate is the oversampled rate. That is, for 8 oversampled clock cycles
% this core iterates once. The output is at the symbol rate.
%
% Key design pattern covered in this example:
% (1) Data is sent in a vector format, stored in a register and accessed
% multiple times
% (2) The core also illustrates basic mathematical operations
%
% Copyright 2011-2015 The MathWorks, Inc.
%#codegen
function [tauh,q] = mlhdlc_comms_toe(r,mu)
persistent tau
persistent rBuf
os_rate = 8;
if isempty(tau)
tau = 0;
rBuf = zeros(1,3*os_rate);
end
rBuf = [rBuf(1+os_rate:end) r];
taur = round(tau);
% Determine lead/lag values and compute offset error
zl = rBuf(os_rate+taur-1);
zo = rBuf(os_rate+taur);
ze = rBuf(os_rate+taur+1);
offsetError = zo*(ze-zl);
% update tau
tau = tau + mu*offsetError;
tauh = tau;
q = zo;
type(testbench_name);
function mlhdlc_comms_toe_tb
%
% Copyright 2011-2015 The MathWorks, Inc.
os_rate = 8;
Ns = 128;
SNR = 100;
mu = .5; % smoothing factor for time offset estimates
% create simulated signal
rng('default'); % always default to known state
b = round(rand(1,Ns));
d = reshape(repmat(b*2-1,os_rate,1),1,Ns*os_rate);
x = [zeros(1,Ns*os_rate) d zeros(1,Ns*os_rate)];
y = awgn(x,SNR);
w = fir1(3*os_rate+1,1/os_rate)';
z = filter(w,1,y);
r = z(4:end); % give it an offset to make things interesting
%tau = 0;
Nsym = floor(length(r)/os_rate);
tauh = zeros(1,Nsym-1); q = zeros(1,Nsym-1);
for i1 = 1:Nsym-1
rVec = r(1+(i1-1)*os_rate:i1*os_rate);
% Call to the Timing Offset Estimation Algorithm
[tauh(i1),q(i1)] = mlhdlc_comms_toe(rVec,mu);
end
indexes = 1:os_rate:length(tauh)*os_rate;
indexes = indexes+tauh+os_rate-1-os_rate*2;
Fig1Loc=figposition([5 50 90 40]);
H_f1=figure(1); clf;
set(H_f1,'position',Fig1Loc);
subplot(2,1,1)
plot(r,'b');
hold on
plot(indexes,q,'ro');
axis([indexes(1) indexes(end) -1.5 1.5]);
title('Received Signal with Time Correct Detections');
subplot(2,1,2)
plot(tauh);
title('Estimate of Time Offset');
function y=figposition(x)
%FIGPOSITION Positions figure window irrespective of the screen resolution
% Y=FIGPOSITION(X) generates a vector the size of X.
% This specifies the location of the figure window in pixels
%
screenRes=get(0,'ScreenSize');
% Convert x to pixels
y(1,1)=(x(1,1)*screenRes(1,3))/100;
y(1,2)=(x(1,2)*screenRes(1,4))/100;
y(1,3)=(x(1,3)*screenRes(1,3))/100;
y(1,4)=(x(1,4)*screenRes(1,4))/100;
Выполните следующие строки кода, чтобы скопировать необходимые файлы примеров во временную папку.
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos'); mlhdlc_temp_dir = [tempdir 'mlhdlc_toe']; % 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_comms_toe_tb

coder -hdlcoder -new mlhdlc_toe
Затем добавьте файл «mlhdlc _ comms _ toe.m» в проект в качестве функции MATLAB и «mlhdlc _ comms _ toe _ tb.m» в качестве испытательного стенда MATLAB.
Для получения более полного руководства по созданию и заполнению проектов кодера MATLAB HDL см. раздел Начало работы с MATLAB в Workflow-процессе HDL.
Запустите мастер Workflow Advisor на вкладке Build (Сборка) и щелкните правой кнопкой мыши на шаге Code Generation (Создание кода) и выберите опцию Run to selected task (Выполнить до выбранной задачи), чтобы выполнить все шаги от начала до создания кода HDL.
Проверьте созданный код HDL, щелкнув гиперссылки в окне Журнал генерации кода.
Для очистки временной папки проекта можно выполнить следующие команды.
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos'); mlhdlc_temp_dir = [tempdir 'mlhdlc_toe']; clear mex; cd (mlhdlc_demo_dir); rmdir(mlhdlc_temp_dir, 's');