В этом примере показано, как работать с проектами MATLAB® HDL Coder™.
Этот пример помогает вам ознакомить себя со следующими аспектами MATLAB проекты HDL Coder™.
Создание Нового проекта HDL Coder MATLAB
Добавление проекта и файлов испытательного стенда к проекту
Запуск HDL Workflow Advisor для MATLAB
Рабочие шаги генерации кода
В конце каждого раздела обращают внимание на меню UI и окна и выполняют любые задачи, требуемые в примере прежде, чем переместиться в следующие шаги.
Это - вводный пример, который показывает различные элементы пользовательского интерфейса рабочего процесса проекта HDL Coder MATLAB. Поскольку более усовершенствованные примеры кодирования и другие задачи рабочего процесса относятся к другим примерам HDL Coder 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, кликните по вкладке Apps. Под Генерацией кода выберите 'HDL Coder'.
Выбор открывает следующее диалоговое окно.
Поменяйте 'Имя': из проекта к 'sfir_project'
Нажмите ОК, чтобы закрыть диалоговое окно
В качестве альтернативы можно также создать проект из командной строки MATLAB с помощью следующей команды.
coder -hdlcoder -new sfir_project
Следующая генерация HDL-кода панель пользовательского интерфейса появится в рабочем столе MATLAB после предыдущего шага.
Кроме того, новый файл, названный 'sfir_project.prj', создается в текущей папке. Этот файл содержит все выборы проекта, сделанные в пользовательском интерфейсе.
Перетащите файл 'mlhdlc_sfir.m' от Браузера текущей папки во вкладку Entry Points HDL Coder пользовательский интерфейс под разделом "MATLAB Function".
Перетащите файл 'mlhdlc_sfir_tb.m' в HDL Coder пользовательский интерфейс под разделом "MATLAB Test Bench".
Кроме того, можно использовать гиперссылки в 'Проекте HDL Панель пользовательского интерфейса', чтобы просмотреть к файлам и добавить их в проект.
Можно оставить типы входного параметра 'Неопределенными' для функции MATLAB. Входные типы автоматически выведены из Испытательного стенда MATLAB.
Нажмите на кнопку 'Workflow Advisor', чтобы поднять диалоговое окно HDL Coder Workflow Advisor MATLAB.
Советник по вопросам рабочего процесса помогает в:
Перевод вашего MATLAB с плавающей точкой проектирует к проекту фиксированной точки
Генерация HDL-кода от фиксированной точки проект MATLAB
Автоматизация шагов в ведущих инструментах симуляции и синтеза
Щелкните правой кнопкой мыши по 'генерации 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');