В этом примере показано, как создать проект HDL Coder™, сгенерируйте код для своего проекта MATLAB и синтезируйте HDL-код. В этом примере, вас:
Создайте проект HDL Coder MATLAB.
Добавьте проект и файлы испытательного стенда к проекту.
Запустите 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, чтобы сгенерировать код, настройте свой инструмент path синтеза. Чтобы создать путь к вашему инструменту синтеза, используйте функцию 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. Генератор кода выводит типы данных путем выполнения испытательного стенда.
Нажмите кнопку Workflow Advisor, чтобы открыть Советника по вопросам Рабочего процесса. Вы видите, что Входная Define задача Типов передала.
Запустите задачу Преобразования Фиксированной точки. Инструмент Fixed-Point Conversion открывается на правой панели.
Когда вы запускаете преобразование фиксированной точки, чтобы предложить дробные длины для типов данных с плавающей точкой, HDL Coder использует размер слова По умолчанию. В этом примере размером слова По умолчанию является 14
. Советник обеспечивает Запас прочности по умолчанию в течение Min/Max Симуляции 0%
. Советник настраивает область значений данных этим запасом прочности. Например, значение 4
указывает, что вы хотите область значений, по крайней мере, 4
больше процент. См. также Преобразование из плавающей запятой в фиксированную запятую.
Прежде чем вы сгенерируете HDL-код, если вы хотите развернуть код на целевую платформу, задайте инструмент синтеза. В Целевой задаче Генерации кода оставьте Рабочий процесс Generic ASIC/FPGA
и задайте Xilinx Vivado
как Инструмент Синтеза. Если вы не видите инструмент синтеза, нажмите список Refresh. Запустите эту задачу.
В задаче генерации HDL-кода, при помощи вкладок на правой стороне этой задачи, можно задать опции генерации дополнительного кода.
По умолчанию HDL Coder генерирует код VHDL®. Чтобы сгенерировать код Verilog, во вкладке Target, выбирают Verilog
как Язык.
Чтобы сгенерировать отчет генерации кода с комментариями и ссылками трассируемости, во вкладке Стиля кодирования, выбирают исходный код Include MATLAB, когда комментарии и 'Генерируют report*.
Чтобы оптимизировать ваш проект, можно использовать распределенную оптимизацию конвейеризации. Во вкладке Optimizations задайте 1
для Входной конвейеризации конвейеризации и Выхода и затем выбирают конвейерные регистры Distribute. Чтобы узнать больше, смотрите Распределенную Конвейеризацию.
Нажмите Run, чтобы сгенерировать код Verilog.
Исследуйте логарифмическое окно и щелкните по ссылкам, чтобы исследовать сгенерированный код и отчеты.
HDL Coder генерирует испытательный стенд HDL, запускает испытательный стенд HDL при помощи симулятора HDL и проверяет, совпадает ли симуляция HDL с численными данными и задержкой фиксированной точки симуляция MATLAB.
Чтобы сгенерировать испытательный стенд HDL и симулировать сгенерированный код, в верификации HDL-кода> Проверяют с задачей Испытательного стенда HDL:
Во вкладке Output Settings выберите испытательный стенд Generate HDL.
Чтобы симулировать сгенерированный испытательный стенд, установите Инструмент Симуляции на ModelSim
. Вы, должно быть, уже установили ModelSim.
Чтобы задать генерацию кода испытательного стенда HDL и данных об испытательном стенде в отдельных файлах, во вкладке Test Bench Options, выбирают Multi-file test bench.
Щелкните по кнопке Run.
Задача генерирует испытательный стенд HDL, затем симулирует проект фиксированной точки при помощи выбранного инструмента симуляции и генерирует отчет компиляции и отчет симуляции.
HDL Coder синтезирует HDL-код на целевой платформе и генерирует область и синхронизирующие отчеты для вашего проекта на основе целевого устройства, что вы задаете.
Синтезировать сгенерированный HDL-код:
1. Запустите Создать задачу проекта.
Эта задача создает проект синтеза Xilinx Vivado для HDL-кода. HDL Coder использует этот проект в следующей задаче синтезировать проект.
2. Выберите и запустите задачу Синтеза Запуска.
Эта задача запускает инструмент синтеза в фоновом режиме, открывает проект синтеза, компилирует HDL-код, синтезирует проект и генерирует списки соединений и область и синхронизирующие отчеты.
3. Выберите и запустите задачу Реализации Запуска.
Эта задача запускает инструмент синтеза в фоновом режиме, место запусков и маршрут на проекте, и генерирует пред - и время выполнения постмаршрута для использования в анализе критического пути и обратной корректировке проекта вашей исходной модели.
Чтобы очистить временную папку проекта, запустите эти команды:
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');