В этом примере показано, как создать проект Coder™ HDL и создать код из проекта MATLAB ®. В этом примере выполняется следующее:
Создайте проект кодера MATLAB HDL.
Добавьте файлы проекта и тестового стенда в проект.
Запустите помощник по рабочим процессам HDL для проекта MATLAB.
Выполните преобразование с фиксированной точкой и создание кода HDL.
Проект 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 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])
Во избежание ошибок во время выполнения смоделировать конструкцию с помощью испытательного стенда.
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:
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.
Щелкните правой кнопкой мыши задачу Создание кода 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');