В этом примере показов, как создать проект HDL Coder™, сгенерировать код для вашего проекта MATLAB и синтезировать HDL-код. В этом примере вы:
Создайте проект MATLAB HDL Coder.
Добавьте к проекту файлы дизайна и испытательного стенда.
Запустите HDL Workflow Advisor для проекта MATLAB.
Запустите преобразование с фиксированной точкой и генерацию HDL-кода.
Сгенерируйте испытательный стенд HDL на испытательном стенде MATLAB.
Проверьте сгенерированный HDL-код при помощи Симулятора HDL. Этот пример использует ModelSim ® в качестве инструмента.
Синтезируйте сгенерированный HDL-код с помощью инструмента синтеза. В этом примере в качестве инструмента используется Xilinx ® Vivado ®.
Проект 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
выполняет создание фильтра с помощью репрезентативной входной области значений. Проверьте испытательный стенд 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']; cd(tempdir); [~, ~, ~] = rmdir(mlhdlc_temp_dir, 's'); mkdir(mlhdlc_temp_dir); cd(mlhdlc_temp_dir);
Скопируйте файлы MATLAB.
copyfile(fullfile(mlhdlc_demo_dir, [design_name,'.m*']), mlhdlc_temp_dir); copyfile(fullfile(mlhdlc_demo_dir, [testbench_name,'.m*']), mlhdlc_temp_dir);
Если вы хотите синтезировать сгенерированный HDL-код, прежде чем использовать HDL Coder для генерации кода, настройте путь инструмента синтеза. Чтобы настроить путь к инструменту синтеза, используйте функцию hdlsetuptoolpath. Для примера, если вашим инструментом синтеза является Xilinx Vivado:
hdlsetuptoolpath('ToolName','Xilinx Vivado','ToolPath',... 'C:\Xilinx\Vivado\2018.3\bin\vivado.bat');
Вы, должно быть, уже установили Xilinx Vivado. Чтобы проверить настройку инструмента синтеза Xilinx Vivado, запустите инструмент, запустив эту команду:
!vivado
Если вы хотите симулировать сгенерированный HDL-код с помощью HDL-теста, можно использовать HDL-симулятор, такой как ModelSim ®. Вы, должно быть, уже установили симулятор HDL.
Чтобы создать проект HDL Coder:
1. Создайте проект путем выполнения этой команды:
coder -hdlcoder -new sfir_project
2. Для функции MATLAB добавьте проект MATLAB mlhdlc_sfir
. Добавить mlhdlc_sfir_tb.m
в качестве испытательного стенда MATLAB.
3. Щелкните Типы Autodefine и используйте рекомендуемые типы для проекта MATLAB. Генератор кода выводит типы данных путем запуска испытательных стендов.
Нажмите кнопку Советник по рабочему процессу, чтобы открыть Советник по рабочему процессу. Вы видите, что задача Задать входные типы прошла.
Выполните задачу преобразования фиксированной точки. На правой панели откроется инструмент преобразования точек с фиксированной точкой.
Когда вы запускаете преобразование с фиксированной точкой, чтобы предложить длины дробей для типов данных с плавающей точкой, HDL Coder использует размер слова по умолчанию. В этом руководстве значение по умолчанию размер слова 14
. Советник предоставляет запас прочности по умолчанию для Simulation Min/Max of 0%
. Консультант корректирует область значений данных по этому коэффициенту надежности. Для примера значение 4
задает, что вам нужен область значений не менее 4
процент больше. См. также раздел «Преобразование из плавающей запятой в фиксированную запятую».
Прежде чем вы сгенерируете HDL-код, если хотите развернуть код на целевой платформе, укажите инструмент синтеза. В задаче Генерации кода Target оставьте Рабочий процесс Generic ASIC/FPGA
и задайте Xilinx Vivado
как инструмент синтеза. Если вы не видите инструмент синтеза, щелкните Обновить список. Запустите эту задачу.
В Генерацию HDL-кода задаче при помощи вкладок с правой стороны этой задачи можно задать дополнительные опции генерации кода.
По умолчанию HDL Coder генерирует код VHDL ®. Чтобы сгенерировать код Verilog, на вкладке Target, выберите Verilog
как язык.
Чтобы сгенерировать отчет генерации кода с комментариями и ссылками на трассируемость, на вкладке Стиль кодирования, выберите Включить исходный код MATLAB в качестве комментариев и 'Сгенерировать отчет *.
Для оптимизации проекта можно использовать распределенную оптимизацию конвейеризации. На вкладке Оптимизации задайте 1
для Input pipelining и Output pipelining, а затем выберите Distribute pipeline registers. Дополнительные сведения см. в разделе Распределять конвейеризации.
Нажмите запуск, чтобы сгенерировать код Verilog.
Исследуйте окно журнала и щелкните ссылки, чтобы исследовать сгенерированный код и отчеты.
HDL Coder генерирует HDL- испытательного стенда, запускает HDL- испытательного стенда при помощи Симулятора HDL и проверяет, соответствует ли HDL-симуляция числам и задержкам симуляции MATLAB с фиксированной точкой.
Чтобы сгенерировать HDL- испытательного стенда и симулировать сгенерированный код, в Верификацию HDL-кода > Задача верификации с HDL- Испытательного стенда:
На вкладке Выхода Settings выберите Generate HDL испытательного стенда.
Чтобы симулировать сгенерированный испытательный стенд, установите значение Simulation Tool на ModelSim
. Вы, должно быть, уже установили ModelSim.
Чтобы указать генерацию тестового кода HDL и тестовых данных в отдельных файлах, на вкладке Test Bench Options выберите Multi-file test stench.
Нажмите кнопку Run.
Задача генерирует HDL- испытательного стенда, затем моделирует проект с фиксированной точкой с помощью выбранного инструмента симуляции и генерирует отчет компиляции и отчет симуляции.
HDL Coder синтезирует HDL-код на целевой платформе и генерирует отчеты о области и времени для вашего проекта на основе заданного целевого устройства.
Чтобы синтезировать сгенерированный HDL-код:
1. Запустите задачу Create project.
Эта задача создает проект синтеза Xilinx Vivado для HDL-кода. HDL Coder использует этот проект в следующей задаче, чтобы синтезировать дизайн.
2. Выберите и запустите задачу Run Synthesis.
Эта задача запускает инструмент синтеза в фоновом режиме, открывает проект синтеза, компилирует HDL-код, синтезирует дизайн и генерирует сетевые списки, а также отчеты по области и времени.
3. Выберите и запустите задачу Run Implementation.
Эта задача запускает инструмент синтеза в фоновом режиме, запускает место и маршрут в проекте и генерирует время выполнения до и после маршрута для использования в анализе критического пути и обратной аннотации вашей исходной модели.
Чтобы очистить временную папку проекта, запустите следующие команды:
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');