exponenta event banner

Начало работы с потоком операций MATLAB-HDL

В этом примере показано, как создать проект Coder™ HDL и создать код из проекта MATLAB ®. В этом примере выполняется следующее:

  1. Создайте проект кодера MATLAB HDL.

  2. Добавьте файлы проекта и тестового стенда в проект.

  3. Запустите помощник по рабочим процессам HDL для проекта MATLAB.

  4. Выполните преобразование с фиксированной точкой и создание кода HDL.

Конструкция фильтра FIR MATLAB

Проект MATLAB mlhdlc_sfir является простым симметричным КИХ-фильтром.

design_name = 'mlhdlc_sfir';
testbench_name = 'mlhdlc_sfir_tb';

Просмотрите проект MATLAB.

open(design_name);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MATLAB design: Symmetric FIR Filter
% 
% Introduction:
%
% We can reduce the complexity of the FIR filter by leveraging its symmetry. 
% Symmetry for an n-tap filter implies, coefficient h0 = coefficient hn-1, 
% coefficient, h1 = coefficient hn-2, etc. In this case, the number of 
% multipliers can be approximately halved. The key is to add the 
% two data values that need to be multiplied with the same coefficient 
% prior to performing the multiplication. 
%
% Key Design pattern covered in this example: 
% (1) Filter states represented using the persistent variables
% (2) Filter coefficients passed in as parameters

%   Copyright 2011-2019 The MathWorks, Inc.

%#codegen
function [y_out, delayed_xout] = mlhdlc_sfir(x_in,h_in1,h_in2,h_in3,h_in4)   
% Symmetric FIR Filter

% declare and initialize the delay registers
persistent ud1 ud2 ud3 ud4 ud5 ud6 ud7 ud8;
if isempty(ud1)
    ud1 = 0; ud2 = 0; ud3 = 0; ud4 = 0; ud5 = 0; ud6 = 0; ud7 = 0; ud8 = 0;
end

% access the previous value of states/registers
a1 = ud1 + ud8; a2 = ud2 + ud7;
a3 = ud3 + ud6; a4 = ud4 + ud5;

% multiplier chain
m1 = h_in1 * a1; m2 = h_in2 * a2;
m3 = h_in3 * a3; m4 = h_in4 * a4;

% adder chain
a5 = m1 + m2; a6 = m3 + m4;

% filtered output
y_out = a5 + a6;

% delayout input signal
delayed_xout = ud8;

% update the delay line
ud8 = ud7; 
ud7 = ud6;
ud6 = ud5;
ud5 = ud4;
ud4 = ud3;
ud3 = ud2;
ud2 = ud1;
ud1 = x_in;
end

Испытательный стенд FIR-фильтра MATLAB

Тестовые инструменты MATLAB mlhdlc_sfir_tb выполняет конструкцию фильтра.

open(testbench_name);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MATLAB test bench for the FIR filter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%   Copyright 2011-2019 The MathWorks, Inc.
clear mlhdlc_sfir;
T = 2;
dt = 0.001;
N = T/dt+1;
sample_time = 0:dt:T;

df = 1/dt;
sample_freq = linspace(-1/2,1/2,N).*df;

% input signal with noise
x_in = cos(2.*pi.*(sample_time).*(1+(sample_time).*75)).';

% filter coefficients
h1 = -0.1339; h2 = -0.0838; h3 = 0.2026; h4 = 0.4064;

len = length(x_in);
y_out = zeros(1,len);
x_out = zeros(1,len);

for ii=1:len
    data = x_in(ii);
    % call to the design 'mlhdlc_sfir' that is targeted for hardware
    [y_out(ii), x_out(ii)] = mlhdlc_sfir(data, h1, h2, h3, h4);
end

figure('Name', [mfilename, '_plot']);
subplot(3,1,1);
plot(1:len,x_in,'-b');
xlabel('Time (ms)')

ylabel('Amplitude')
title('Input Signal (with noise)')
subplot(3,1,2); plot(1:len,y_out,'-b');
xlabel('Time (ms)')
ylabel('Amplitude')
title('Output Signal (filtered)')

freq_fft = @(x) abs(fftshift(fft(x)));

subplot(3,1,3); semilogy(sample_freq,freq_fft(x_in),'-b');
hold on
semilogy(sample_freq,freq_fft(y_out),'-r')
hold off
xlabel('Frequency (Hz)')
ylabel('Amplitude (dB)')
title('Input and Output Signals (Frequency domain)')
legend({'FilterIn', 'FilterOut'}, 'Location','South')
axis([-500 500 1 100])


Тестирование алгоритма MATLAB

Во избежание ошибок во время выполнения смоделировать конструкцию с помощью испытательного стенда.

mlhdlc_sfir_tb

Создание папки и копирование соответствующих файлов

Чтобы скопировать файлы примеров во временную папку, выполните следующие команды:

design_name = 'mlhdlc_sfir';
testbench_name = 'mlhdlc_sfir_tb';
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_sfir'];

Создайте временную папку и скопируйте файлы MATLAB.

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);

Создание проекта кодера HDL

Для создания проекта кодера HDL:

1. В редакторе MATLAB на вкладке «Приложения» выберите «Кодер HDL». Войти sfir_project в качестве имени проекта.

Чтобы создать проект из командной строки MATLAB, выполните следующую команду:

coder -hdlcoder -new sfir_project

A sfir_project.prj создается в текущей папке.

2. Для функции MATLAB щелкните ссылку Добавить функцию MATLAB и выберите FIR-фильтр MATLAB design mlhdlc_sfir. В разделе MATLAB Test Stench (Испытательный стенд MATLAB) щелкните Add files (Добавить файлы) и добавьте испытательный стенд MATLAB. mlhdlc_sfir_tb.m.

3. Щелкните Автоопределение типов (Autodefine types) и используйте рекомендуемые типы для конструкции MATLAB. Генератор кода выводит типы входных данных из тестового стенда MATLAB.

Выполнение преобразования с фиксированной точкой и создание кода HDL

  1. Нажмите кнопку «Помощник по рабочим процессам» для запуска помощника по рабочим процессам HDL.

  2. Щелкните правой кнопкой мыши задачу Создание кода HDL и выберите Выполнить с выбранной задачей.

Генератор кода запускает задачи помощника по рабочим процессам для создания кода HDL для конструкции фильтра. Шаги:

  • Преобразование конструкции MATLAB с плавающей запятой в конструкцию с фиксированной запятой. Чтобы проверить созданный код с фиксированной запятой из конструкции с плавающей запятой, щелкните задание «Преобразование с фиксированной запятой». Созданный код MATLAB с фиксированной точкой открывается в редакторе MATLAB. Дополнительные сведения см. в разделе Преобразование плавающей точки в фиксированную.

  • Создайте код HDL из проекта MATLAB с фиксированной точкой. По умолчанию кодер HDL генерирует код VHDL. Чтобы проверить созданный код HDL, щелкните задачу Создание кода HDL, а затем щелкните гиперссылку на mlhdlc_sfir_fixpt.vhd в окне Журнал генерации кода. Чтобы создать код Verilog, в задаче «Создание кода HDL» выберите вкладку «Дополнительно» и установите для параметра «Язык» значение Verilog. Дополнительные сведения и сведения о том, как задать параметры генерации кода, см. в разделе Преобразование с плавающей запятой в фиксированную.

Очистка созданных файлов

Чтобы очистить временную папку проекта, выполните следующие команды:

mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_sfir'];
clear mex;
cd (mlhdlc_demo_dir);
rmdir(mlhdlc_temp_dir, 's');