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

В этом примере показано, как работать с проектами MATLAB® HDL Coder™.

Введение

Этот пример помогает вам ознакомить себя со следующими аспектами MATLAB проекты HDL Coder™.

  1. Создание Нового проекта HDL Coder MATLAB

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

  3. Запуск HDL Workflow Advisor для MATLAB

  4. Рабочие шаги генерации кода

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

Это - вводный пример, который показывает различные элементы пользовательского интерфейса рабочего процесса проекта HDL Coder MATLAB. Поскольку более усовершенствованные примеры кодирования и другие задачи рабочего процесса относятся к другим примерам HDL Coder MATLAB.

Проект MATLAB

Код MATLAB, используемый в примере, является простым симметричным КИХ-фильтром. Пример также показывает испытательный стенд MATLAB, который осуществляет фильтр.

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

Давайте смотреть на проект MATLAB

type(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-2015 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
type(testbench_name);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MATLAB test bench for the FIR filter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%   Copyright 2011-2015 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])

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

Выполните следующие строки кода, чтобы скопировать необходимые файлы в качестве примера во временную папку.

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

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

% 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_sfir_tb

Создайте новый проект HDL Coder

Чтобы создать новый проект HDL Coder, кликните по вкладке Apps. Под Генерацией кода выберите 'HDL Coder'.

Выбор открывает следующее диалоговое окно.

  1. Поменяйте 'Имя': из проекта к 'sfir_project'

  2. Нажмите ОК, чтобы закрыть диалоговое окно

В качестве альтернативы можно также создать проект из командной строки MATLAB с помощью следующей команды.

coder -hdlcoder -new sfir_project

Следующая генерация HDL-кода панель пользовательского интерфейса появится в рабочем столе MATLAB после предыдущего шага.

Кроме того, новый файл, названный 'sfir_project.prj', создается в текущей папке. Этот файл содержит все выборы проекта, сделанные в пользовательском интерфейсе.

Задайте проект и испытательный стенд

  1. Перетащите файл 'mlhdlc_sfir.m' от Браузера текущей папки во вкладку Entry Points HDL Coder пользовательский интерфейс под разделом "MATLAB Function".

  2. Перетащите файл 'mlhdlc_sfir_tb.m' в HDL Coder пользовательский интерфейс под разделом "MATLAB Test Bench".

Кроме того, можно использовать гиперссылки в 'Проекте HDL Панель пользовательского интерфейса', чтобы просмотреть к файлам и добавить их в проект.

Можно оставить типы входного параметра 'Неопределенными' для функции MATLAB. Входные типы автоматически выведены из Испытательного стенда MATLAB.

Запустите советника по вопросам рабочего процесса от вкладки сборки

Нажмите на кнопку 'Workflow Advisor', чтобы поднять диалоговое окно HDL Coder Workflow Advisor MATLAB.

Советник по вопросам рабочего процесса помогает в:

  1. Перевод вашего MATLAB с плавающей точкой проектирует к проекту фиксированной точки

  2. Генерация HDL-кода от фиксированной точки проект MATLAB

  3. Автоматизация шагов в ведущих инструментах симуляции и синтеза

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

Щелкните правой кнопкой мыши по 'генерации HDL-кода', продвигаются и выбирают опцию, 'Запущенную к выбранной задаче', чтобы запустить все шаги с начала через генерацию HDL-кода.

Советник по вопросам Рабочего процесса преобразует ваш проект MATLAB к фиксированной точке и затем сгенерирует HDL из проекта фиксированной точки.

Исследуйте сгенерированный код

Исследуйте сгенерированную фиксированную точку из проекта с плавающей точкой путем нажатия на гиперссылки в окне 'Type Validation Output', чтобы открыть сгенерированную фиксированную точку код MATLAB в редакторе MATLAB.

Для получения дополнительной информации о преобразовании из плавающей запятой в фиксированную запятую относятся к учебному Преобразованию из плавающей запятой в фиксированную запятую

Исследуйте сгенерированный HDL-код путем нажатия на гиперссылки в окне Code Generation Log.

Для получения дополнительной информации о генерации HDL-кода симуляция и шаги синтеза относятся к учебному Рабочему процессу генерации HDL-кода

Очистите Сгенерированные Файлы

Можно запустить следующие команды, чтобы очистить временную папку проекта.

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