Сгенерируйте HDL-код из функций MATLAB с помощью автоматической генерации интерполяционной таблицы

В этом примере показана генерация HDL-кода из проекта MATLAB ® с плавающей точкой, который не готов к генерации кода в два шага. Сначала мы используем процесс преобразования float2fixed, чтобы сгенерировать интерполяционную таблицу Функции MATLAB основе замен. Затем эта новая функция замещения MATLAB используется для генерации HDL-кода. Однако эти два шага являются непрозрачными для пользователя из-за того, как активируются float2fixed и MATLAB HDL Coder.

Введение

Код MATLAB, используемый в примере, является реализацией функции переменной степени.

MATLAB- Проекта

design_name = 'mlhdlc_replacement_exp';
testbench_name = 'mlhdlc_replacement_exp_tb';

Давайте посмотрим на гамма- коррекцию Проекта

dbtype(design_name)
1     function y = mlhdlc_replacement_exp(u)
2     %
3     
4     %   Copyright 2014-2015 The MathWorks, Inc.
5     
6     y = exp(u);
7     
8     end

Моделируйте проект

Всегда рекомендуется моделировать проект с помощью тестбенча перед генерацией кода, чтобы убедиться, что нет ошибок во время выполнения.

mlhdlc_replacement_exp_tb

  1. MATLAB Проекта: mlhdlc_replacement_exp

  2. Тестовый набор MATLAB: mlhdlc_replacement_exp_tb

Откройте mlhdlc_european_call функции проекта, нажав на вышеуказанную ссылку, чтобы заметить использование неподдерживаемых функций с фиксированной точкой, таких как 'log' и 'exp'.

Создайте новую папку и скопируйте соответствующие файлы

Выполните следующие строки кода, чтобы скопировать необходимые файлы примера во временную папку.

mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
mlhdlc_temp_dir = fullfile(tempdir(),'mlhdlc_replacement_exp');

% create a temporary folder and copy the MATLAB files
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);

Примечания к проекту и испытанию

Проект находится в файле 'mlhdlc _ replacement _ exp.m'. Испытательный стенд MATLAB находится в файле 'mlhdlc _ replacement _ exp _ tb.m', который можно запускать отдельно. Мы проиллюстрировали замену функции exp как цели этого демо. Вы можете изменить testbench для ваших желаемых ответов.

Сгенерируйте HDL-код с помощью неявного преобразования с фиксированной точкой

Ваш проект находится в файле 'mlhdlc _ replacement _ exp.m', где вычисляется функция экспоненты. Испытательный стенд MATLAB находится в файле 'mlhdlc _ replacement _ exp _ tb.m', который можно запускать отдельно.

Вы заметите, что в настоящее время у нас нет готовой поддержки функций 'exp' с фиксированной точкой, на данный момент в проекте; здесь мы используем объект «coder.approximation», чтобы включить динамическую замену интерполяционной таблицы для этих 'неподдерживаемых функций'. Запустите следующий код как файл 'runme.m', чтобы выполнить шаги кодовой егенерации.

  Set up the path to your installed synthesis tool. This example uses Vivado(R).
  hdlsetuptoolpath('ToolName', 'Xilinx Vivado', 'ToolPath', 'C:\Xilinx\Vivado\2019.1\bin\vivado.bat');
  clear design_name testbench_name fxpCfg hdlcfg interp_degree
  design_name = 'mlhdlc_replacement_exp';
  testbench_name = 'mlhdlc_replacement_exp_tb';
  interp_degree = 0;
  %%    fixed point converter config
  fxpCfg = coder.config('fixpt');
  fxpCfg.TestBenchName = 'mlhdlc_replacement_exp_tb';
  fxpCfg.TestNumerics = true;
  %    specify this - for optimized HDL
  fxpCfg.DefaultWordLength = 10;
  %%    exp - replacement config
  mathFcnGenCfg = coder.approximation('exp');
  %    generally use to increase accuracy; specify this as power of 2 for optimized HDL
  mathFcnGenCfg.NumberOfPoints = 1024;
  mathFcnGenCfg.InterpolationDegree = interp_degree; %         can be 0,1,2, or 3
  fxpCfg.addApproximation(mathFcnGenCfg);
  %%    HDL config object
  hdlcfg = coder.config('hdl');
  hdlcfg.TargetLanguage = 'Verilog';
  hdlcfg.DesignFunctionName = design_name;
  hdlcfg.TestBenchName = testbench_name;
  hdlcfg.GenerateHDLTestBench=true;
  hdlcfg.SimulateGeneratedCode=true;
  %If you choose VHDL set the ModelSim compile options as well
  %    hdlcfg.TargetLanguage = 'Verilog';
  %    hdlcfg.HDLCompileVHDLCmd = 'vcom %s %s -noindexcheck \n';
  hdlcfg.ConstantMultiplierOptimization = 'auto'; %optimize out any multipliers from interpolation
  hdlcfg.PipelineVariables = 'y u idx_bot x x_idx';%
  hdlcfg.InputPipeline = 2;
  hdlcfg.OutputPipeline = 2;
  hdlcfg.RegisterInputs = true;
  hdlcfg.RegisterOutputs = true;
  hdlcfg.SynthesizeGeneratedCode = true;
  hdlcfg.SynthesisTool = 'Xilinx ISE';
  hdlcfg.SynthesisToolChipFamily = 'Virtex7';
  hdlcfg.SynthesisToolDeviceName = 'xc7vh580t';
  hdlcfg.SynthesisToolPackageName = 'hcg1155';
  hdlcfg.SynthesisToolSpeedValue = '-2G';
  %codegen('-config',hdlcfg)
  codegen('-float2fixed',fxpCfg,'-config',hdlcfg,'mlhdlc_replacement_exp')
  %If you only want to do fixed point conversion and stop/examine the
  %intermediate results you can use,
  %only F2F conversion
  codegen('-float2fixed',fxpCfg,'mlhdlc_replacement_exp')

Как только вы запустите скрипт 'runme', вы увидите следующий выход от конвертера fixpt и HDL Coder. Но прежде чем мы прыгнем вперед, давайте увидим несколько заметных тем в объектах config, чтобы получить преобразование fixpt, HDL генерация, чтобы получить высокую эффективность оборудование.

Генерация высококлократных схем Использование количества точек для функций замены в качестве степени 2 рекомендуется для HDL-целей. Мы также поставляем ConstantMultiplierOptimization = ' auto ', чтобы использовать лучшие подходы FCSD или CSD в сгенерированном HDL-коде. Обратите внимание на наше использование конвейерных переменных в генерации HDL-кода, чтобы минимизировать задержки синхроимпульса и улучшить частоту схем.

Выходные и итеративные улучшения

Сначала преобразование с фиксированной точкой завершается соответствующими заменами функций как,

  ============= Step1: Analyze floating-point code ==============
  Input types not specified, inferring types by simulating the test bench.
  ============= Step1a: Verify Floating Point ==============
  ### Analyzing the design 'mlhdlc_replacement_exp'
  ### Analyzing the test bench(es) 'mlhdlc_replacement_exp_tb'
  ### Begin Floating Point Simulation (Instrumented)
  ### Floating Point Simulation Completed in   1.8946 sec(s)
  ### Elapsed Time:             2.8361 sec(s)
  ============= Step2: Propose Types based on Range Information ==============
  ============= Step3: Generate Fixed Point Code ==============
  ### Generating Fixed Point MATLAB Code <a href="matlab:edit('codegen/mlhdlc_replacement_exp/fixpt/mlhdlc_replacement_exp_fixpt.m')">mlhdlc_replacement_exp_fixpt</a> using Proposed Types
  ### Generating Fixed Point MATLAB Design Wrapper <a href="matlab:edit('codegen/mlhdlc_replacement_exp/fixpt/mlhdlc_replacement_exp_wrapper_fixpt.m')">mlhdlc_replacement_exp_wrapper_fixpt</a>
  ### Generating Mex file for ' mlhdlc_replacement_exp_wrapper_fixpt '
  Code generation successful: To view the report, open('codegen/mlhdlc_replacement_exp/fixpt/fxptmp/mlhdlc_replacement_exp_wrapper_fixpt/html/index.html').
  ### Generating Type Proposal Report for 'mlhdlc_replacement_exp' <a href="matlab:web('codegen/mlhdlc_replacement_exp/fixpt/mlhdlc_replacement_exp_report.html', '-new')">mlhdlc_replacement_exp_report.html</a>
  ============= Step4: Verify Fixed Point Code ==============
  ### Begin Fixed Point Simulation : mlhdlc_replacement_exp_tb
  ### Fixed Point Simulation Completed in   1.9497 sec(s)
  ### Generating Type Proposal Report for 'mlhdlc_replacement_exp_fixpt' <a href="matlab:web('codegen/mlhdlc_replacement_exp/fixpt/mlhdlc_replacement_exp_fixpt_report.html', '-new')">mlhdlc_replacement_exp_fixpt_report.html</a>
  ### Elapsed Time:             2.6488 sec(s)
  As this is a small design with only one replacement functions you can
  try different number of points in approximation function generation.
  Re-examine the generated HDL code and compare it with the previous step.
  ### Begin VHDL Code Generation
  ### Generating HDL Conformance Report <a href="matlab:web('codegen/mlhdlc_replacement_exp/hdlsrc/mlhdlc_replacement_exp_fixpt_hdl_conformance_report.html')">mlhdlc_replacement_exp_fixpt_hdl_conformance_report.html</a>.
  ### HDL Conformance check complete with 0 errors, 2 warnings, and 0 messages.
  ### Working on mlhdlc_replacement_exp_fixpt as <a href="matlab:edit('codegen/mlhdlc_replacement_exp/hdlsrc/mlhdlc_replacement_exp_fixpt.vhd')">mlhdlc_replacement_exp_fixpt.vhd</a>.
  ### Generating package file <a href="matlab:edit('codegen/mlhdlc_replacement_exp/hdlsrc/mlhdlc_replacement_exp_fixpt_pkg.vhd')">mlhdlc_replacement_exp_fixpt_pkg.vhd</a>.
  ### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays.
  ### Output port 0: 12 cycles.
  ### Output port 1: 12 cycles.
  ### Generating Resource Utilization Report '<a href="matlab:web('codegen/mlhdlc_replacement_exp/hdlsrc/resource_report.html')">resource_report.html</a>'
  ### Begin TestBench generation.
  ### Accounting for output port latency: 12 cycles.'
  ### Collecting data...
  ### Begin HDL test bench file generation with logged samples
  ### Generating test bench: codegen/mlhdlc_replacement_exp/hdlsrc/mlhdlc_replacement_exp_fixpt_tb.vhd
  ### Creating stimulus vectors ...
  ### Simulating the design 'mlhdlc_replacement_exp_fixpt' using 'ModelSim'.
  ### Generating Compilation Report codegen/mlhdlc_replacement_exp/hdlsrc/mlhdlc_replacement_exp_fixpt_vsim_log_compile.txt
  ### Generating Simulation Report codegen/mlhdlc_replacement_exp/hdlsrc/mlhdlc_replacement_exp_fixpt_vsim_log_sim.txt
  ### Simulation successful.
  ### Creating Synthesis Project for 'mlhdlc_replacement_exp_fixpt'.
  ### Synthesis project creation successful.
  ### Synthesizing the design 'mlhdlc_replacement_exp_fixpt".
  ### Generating synthesis report codegen/mlhdlc_replacement_exp/hdlsrc/ise_prj/mlhdlc_replacement_exp_fixpt_syn_results.txt.
  ### Synthesis successful.

Исследуйте результаты синтеза Запустите шаг логического синтеза со следующими опциями по умолчанию, если на вашей машине установлен ISE. В отчете о синтезе обратите внимание на тактовую частоту, сообщаемую инструментом синтеза, без включенных опций оптимизации. Обычно эффективность синхронизации этого проекта с помощью инструмента синтеза Xilinx ISE для семейства чипов Virtex7, устройства xc7vh580t, пакета hcg1155, -2G уровня скорости, с высокой тактовой частотой порядка 300 МГц.

Очистка сгенерированных файлов

Для очистки временной папки проекта можно запустить следующие команды.

mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_replacement_exp'];
clear mex;
cd (mlhdlc_demo_dir);
rmdir(mlhdlc_temp_dir, 's');