В этом примере показано, как сгенерировать HDL-код из базового алгоритма оценки смещения временной задержки, реализованного в коде MATLAB ®.
В системах радиосвязи приемные данные переизбираются на радиочастотном переднем конце. Это служит нескольким целям, включая обеспечение достаточных частот дискретизации для фильтрации приема.
Однако одной из наиболее важных функций является обеспечение нескольких точек дискретизации на принятой форме волны, так что данные могут быть дискретизированы вблизи максимальной точки амплитуды в принятой форме волны. Этот пример иллюстрирует базовое ядро оценки смещения времени задержки вывода, работающее рекурсивно.
Сгенерированное аппаратное ядро для этого проекта работает в 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 Coder см. в разделе «Начало работы с MATLAB в HDL».
Запустите Workflow Advisor на вкладке Build и щелкните правой нажатие кнопки по шагу 'Генерация Кода' и выберите опцию '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');