Начало работы с MATLAB в HDL- Рабочего процесса

В этом примере показано, как создать проект HDL- Coder™ и сгенерировать код из проекта MATLAB ®. В этом примере вы:

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

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

  3. Запустите HDL Workflow Advisor для проекта MATLAB.

  4. Запустите преобразование с фиксированной точкой и генерацию HDL-кода.

Конечная импульсная характеристика фильтра 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

Конечная импульсная характеристика 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 Coder проект

Чтобы создать проект HDL Coder:

1. В редакторе MATLAB на вкладке Apps выберите HDL Coder. Введите sfir_project как имя проекта.

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

coder -hdlcoder -new sfir_project

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

2. Для MATLAB Function щелкните ссылку Add MATLAB function и выберите КИХ фильтр MATLAB design mlhdlc_sfir. В разделе MATLAB Test Bench нажмите Add files и добавьте MATLAB test bench mlhdlc_sfir_tb.m.

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

Запуск преобразования с фиксированной точкой и генерации HDL-кода

  1. Нажмите кнопку Советник по рабочему процессу, чтобы запустить HDL Workflow Advisor.

  2. Щелкните правой кнопкой мыши Генерации HDL-кода задачу и выберите Запуск для выбранной задачи.

Генератор кода запускает задачи Workflow Advisor, чтобы сгенерировать HDL-код для создания фильтра. Шаги:

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

  • Сгенерируйте HDL-код из проекта MATLAB с фиксированной точкой. По умолчанию HDL Coder генерирует код VHDL. Чтобы изучить сгенерированный HDL-код, щелкните задачу Генерация HDL-кода, а затем щелкните гиперссылку на mlhdlc_sfir_fixpt.vhd в окне Генерация Кода Log. Чтобы сгенерировать код Verilog, в Генерацию HDL-кода задаче выберите вкладку Advanced и установите для Language значение 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');