Этот пример показывает генерацию 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.
clear design_name testbench_name fxpCfg hdlcfg interp_degree hsetupedatoolsenv();
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');