Этот пример показывает генерацию HDL-кода из проекта MATLAB® с плавающей точкой, который не готов к генерации кода на двух шагах. Сначала мы используем float2fixed процесс преобразования, чтобы сгенерировать основанную на интерполяционной таблице функцию MATLAB замены. Затем эта новая заменяющая функция MATLAB используется, чтобы сгенерировать HDL-код. Однако эти два шага непрозрачны пользователю из-за пути float2fixed, и 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
Проект MATLAB: mlhdlc_replacement_exp
Испытательный стенд MATLAB: mlhdlc_replacement_exp_tb
Откройте функцию проекта mlhdlc_european_call путем нажатия на вышеупомянутую ссылку, чтобы заметить использование неподдерживаемых функций фиксированной точки как 'журнал' и '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 как цель этой демонстрации. Можно изменить испытательный стенд для желаемых ответов.
Ваш проект находится в файле 'mlhdlc_replacement_exp.m', где функция экспоненты вычисляется. Испытательный стенд MATLAB находится в файле 'mlhdlc_replacement_exp_tb.m', который может быть запущен отдельно.
Вы отметите, что в настоящее время мы не имеем поддержки фиксированной точки поля функций 'exp', в данный момент, в проекте; это - то, где мы используем объект ''coder.approximation'' включить динамическую замену интерполяционной таблицы для этих 'неподдерживаемых функций'. Запустите следующий код как 'runme.m' файл, чтобы выполнить шаги codegeneration.
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. Но прежде чем мы переходим вперед, давайте смотреть несколько известных тем в объектах конфигурации, чтобы заставить 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');