exponenta event banner

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

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

Введение

Код 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 testbench: 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 в качестве цели этой демонстрации. Можно изменить тестовые инструменты для нужных ответов.

Создание кода 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. Но прежде чем перейти вперед, давайте увидим несколько заметных тем в объектах конфигурации, чтобы получить преобразование fixpt, создание HDL для получения высокопроизводительного оборудования.

Генерация схем с высокой тактовой частотой Для целей ЛПВП рекомендуется использовать количество точек для функций замены в качестве мощности 2. Мы также поставляем ConstantMultipliaOptimization = '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');