В этом примере показано, как создать проект 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);
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
. Для получения дополнительной информации и изучить, как задать опции генерации кода, смотрите MATLAB к 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');