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