В этом примере показано, как создать проект HDL Coder™ и сгенерировать код из вашего проекта MATLAB®. В этом примере, вас:
Создайте проект HDL Coder MATLAB.
Добавьте проект и файлы испытательного стенда к проекту.
Запустите 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
sfir_project.prj
файл создается в текущей папке.
2. Для функции MATLAB щелкните по Добавлять ссылке функции MATLAB и выберите КИХ-фильтр, MATLAB проектирует mlhdlc_sfir
. Под разделом MATLAB Test Bench нажмите файлы Add и добавьте испытательный стенд MATLAB mlhdlc_sfir_tb.m
.
3. Нажмите типы Autodefine и используйте рекомендуемые типы в проекте MATLAB. Генератор кода выводит входные типы из испытательного стенда MATLAB.
Нажмите кнопку Workflow Advisor, чтобы запустить HDL Workflow Advisor.
Щелкните правой кнопкой по задаче генерации HDL-кода и выберите Run к выбранной задаче.
Генератор кода запускает Советника по вопросам Рабочего процесса задачи сгенерировать HDL-код для создания фильтра. Шаги:
Переведите свой проект MATLAB с плавающей точкой в проект фиксированной точки. Чтобы исследовать сгенерированную фиксированную точку из проекта с плавающей точкой, кликните по задаче Преобразования Фиксированной точки. Сгенерированная фиксированная точка код MATLAB открывается в редакторе MATLAB. Для получения дополнительной информации смотрите Преобразование из плавающей запятой в фиксированную запятую.
Сгенерируйте HDL-код от фиксированной точки проект MATLAB. По умолчанию HDL Coder генерирует код VHDL. Чтобы исследовать сгенерированный HDL-код, кликните по задаче генерации HDL-кода и затем кликните по гиперссылке на mlhdlc_sfir_fixpt.vhd
в окне Code Generation Log. Чтобы сгенерировать код Verilog, в задаче генерации HDL-кода, выбирают Вкладку "Дополнительно" и устанавливают Язык на Verilog
. Для получения дополнительной информации и изучить, как задать опции генерации кода, смотрите Рабочий процесс генерации HDL-кода из MATLAB.
Чтобы очистить временную папку проекта, запустите эти команды:
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');