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

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

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

  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

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

2. Для функции MATLAB щелкните по Добавлять ссылке функции MATLAB и выберите КИХ-фильтр, MATLAB проектирует mlhdlc_sfir. Под разделом MATLAB Test Bench нажмите файлы Add и добавьте испытательный стенд MATLAB mlhdlc_sfir_tb.m.

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

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

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

  2. Щелкните правой кнопкой по задаче генерации HDL-кода и выберите Run к выбранной задаче.

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

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

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