Этот документ дает обзор основанных на управляющем сигнале математических функций фиксированной точки в HDLMathLib и примерах, сопоставленных со всеми блоками, существующими в HDLMathLib при помощи HDL Coder™. HDLMathLib включает следующие блоки с портами управления.
Sqrt
Atan2
Sin
Потому что
SinCos
Cos+jSin
Обратная величина
Разделиться
Чтобы видеть все блоки математической функции в библиотеке HDLMathLib, откройте использование библиотеки после команды.
open_system('HDLMathLib')
Вы видите различные блоки математической функции с портами управления. Sqrt, Atan2, SinCos, Обратная величина и Делятся, блоки описаны с примером в следующих разделах. Можно использовать sin, потому что, Cos+jsin блокирует в модели тот же путь путем обращения ниже разделов.
Каждый порт блока Sqrt как объяснен ниже.
Когда вы открываете блок Sqrt, он использует блоки MATLAB function для данных и допустимых линий. Это как показано ниже.
open_system('hdlcoder_sqrt_bitset_control') open_system('hdlcoder_sqrt_bitset_control/Sqrt')
Этот раздел показывает, как реализовать пример с помощью основанного на управляющем сигнале Квадратного корня, блокируют и генерируют HDL-код при помощи HDL Coder™.
Прежде, чем открыть модель, набор вход можно следующим образом. Вы можете, принял решение установить различный вход согласно вашему требованию. Это использование в качестве примера после входных параметров, который линеен.
SQRT_input = fi(1/2^17:1/2^17:1,0,18,17)';
Задайте wordlength для типов данных фиксированной точки и задержку трубопровода для модели. Пройдите документацию для вычисления задержки.
WL = 18; latency = 20;
Откройте модель hdlcoder_sqrt_bitset_control
и задайте достаточное время остановки, которое потребовало, чтобы обработать все входные комбинации.
stoptime = length(SQRT_input)-1+latency; open_system('hdlcoder_sqrt_bitset_control') sim('hdlcoder_sqrt_bitset_control')
Вы видите ниже формы волны, когда вы симулируете вышеупомянутую модель. Вы видите, что выходные данные допустимы, когда validOut высок.
Чтобы подтвердить выход, полученный путем симуляции модели Simulink, можно сравнить Simulink выход со ссылочным выходом. Чтобы получить ссылочный выход, используйте sqrt
функция.
Вычислите ссылочный выход при помощи sqrt
функция.
ref_SQRT = sqrt(double(SQRT_input));
Используйте логическую индексацию, чтобы извлечь допустимый выход.
implementation_SQRT = simulink_SQRT(valid_output);
Чтобы подтвердить выход, постройте результаты сравнения при помощи comparison_plot
функция в этом примере. Вы видите, что максимальная погрешность, наблюдаемая от результатов сравнения, вполне мала.
comparison_plot_sqrt(ref_SQRT,implementation_SQRT,1,'SQRT linear input');
Maximum Error SQRT linear input 3.814697e-06 Maximum PctError SQRT linear input 3.803159e-02
Прежде чем вы сгенерируете код, вы видите, что настройки HDL экономили на модели при помощи hdlsaveparams
функция.
hdlsaveparams('hdlcoder_sqrt_bitset_control')
%% Set Model 'hdlcoder_sqrt_bitset_control' HDL parameters hdlset_param('hdlcoder_sqrt_bitset_control', 'Backannotation', 'on'); hdlset_param('hdlcoder_sqrt_bitset_control', 'HDLSubsystem', 'hdlcoder_sqrt_bitset_control/Sqrt'); hdlset_param('hdlcoder_sqrt_bitset_control', 'ResetType', 'Synchronous'); hdlset_param('hdlcoder_sqrt_bitset_control', 'ResourceReport', 'on'); hdlset_param('hdlcoder_sqrt_bitset_control', 'SynthesisTool', 'Xilinx Vivado'); hdlset_param('hdlcoder_sqrt_bitset_control', 'SynthesisToolChipFamily', 'Virtex7'); hdlset_param('hdlcoder_sqrt_bitset_control', 'SynthesisToolDeviceName', 'xc7v2000t'); hdlset_param('hdlcoder_sqrt_bitset_control', 'SynthesisToolPackageName', 'fhg1761'); hdlset_param('hdlcoder_sqrt_bitset_control', 'SynthesisToolSpeedValue', '-2'); hdlset_param('hdlcoder_sqrt_bitset_control', 'TargetDirectory', 'hdl_prj\hdlsrc'); hdlset_param('hdlcoder_sqrt_bitset_control', 'TargetFrequency', 500); hdlset_param('hdlcoder_sqrt_bitset_control', 'Traceability', 'on'); % Set SubSystem HDL parameters hdlset_param('hdlcoder_sqrt_bitset_control/Sqrt', 'FlattenHierarchy', 'on'); hdlset_param('hdlcoder_sqrt_bitset_control/Sqrt/LumpLatency', 'Architecture', 'MATLAB Datapath'); % Set SubSystem HDL parameters hdlset_param('hdlcoder_sqrt_bitset_control/Sqrt/LumpLatency', 'FlattenHierarchy', 'on'); hdlset_param('hdlcoder_sqrt_bitset_control/Sqrt/ValidLine', 'Architecture', 'MATLAB Datapath'); % Set SubSystem HDL parameters hdlset_param('hdlcoder_sqrt_bitset_control/Sqrt/ValidLine', 'FlattenHierarchy', 'on');
Сгенерировать HDL-код для Sqrt
блокируйтесь в модели, используйте makehdl
функция.
makehdl('hdlcoder_sqrt_bitset_control/Sqrt') close_system('hdlcoder_sqrt_bitset_control') close all;
### Generating HDL for 'hdlcoder_sqrt_bitset_control/Sqrt'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_sqrt_bitset_control', { 'HDL Code Generation' } )">hdlcoder_sqrt_bitset_control</a> for HDL code generation parameters. ### Running HDL checks on the model 'hdlcoder_sqrt_bitset_control'. ### Begin compilation of the model 'hdlcoder_sqrt_bitset_control'... ### Applying HDL optimizations on the model 'hdlcoder_sqrt_bitset_control'... ### <a href="matlab:configset.internal.open('hdlcoder_sqrt_bitset_control','AdaptivePipelining')">'AdaptivePipelining'</a> is set to 'Off' for the model. 'AdaptivePipelining' can improve the achievable clock frequency and reduce the area usage on FPGA boards. To enable adaptive pipelining, set the option to 'On'. When adaptive pipelining is enabled, it inserts pipeline registers to create patterns that efficiently map blocks to DSP units on the target FPGA device. ### <a href="matlab:configset.internal.open('hdlcoder_sqrt_bitset_control','LUTMapToRAM')">'LUTMapToRAM'</a> is set to 'On' for the model. This option is used to map lookup tables to a block RAM in hardware. To disable pipeline insertion for mapping lookup tables to RAM, set the option to 'Off'. ### Begin model generation. ### Model generation complete. ### Begin VHDL Code Generation for 'hdlcoder_sqrt_bitset_control'. ### Working on hdlcoder_sqrt_bitset_control/Sqrt/Sqrt as hdl_prj/hdlsrc/hdlcoder_sqrt_bitset_control/Sqrt_block.vhd. ### Working on hdlcoder_sqrt_bitset_control/Sqrt as hdl_prj/hdlsrc/hdlcoder_sqrt_bitset_control/Sqrt.vhd. ### Generating package file hdl_prj/hdlsrc/hdlcoder_sqrt_bitset_control/Sqrt_pkg.vhd. ### Code Generation for 'hdlcoder_sqrt_bitset_control' completed. ### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2021bd_1724986_151598/publish_examples0/tp0b0cd55d/hdl_prj/hdlsrc/hdlcoder_sqrt_bitset_control/html/hdlcoder_sqrt_bitset_control_codegen_rpt.html');">hdlcoder_sqrt_bitset_control_codegen_rpt.html</a> ### Creating HDL Code Generation Check Report file:///tmp/BR2021bd_1724986_151598/publish_examples0/tp0b0cd55d/hdl_prj/hdlsrc/hdlcoder_sqrt_bitset_control/Sqrt_report.html ### HDL check for 'hdlcoder_sqrt_bitset_control' complete with 0 errors, 0 warnings, and 2 messages. ### HDL code generation complete.
Следующие диграммы показывают эффективность синтеза блока Sqrt на устройствах Xilinx Virtex 7 и intel Stratix V.
Каждый порт блока Atan2 как объяснен ниже.
Блок Atan2 имеет количество итераций как параметр маски. Значение по умолчанию равняется 11, и задержка зависит от этого параметра маскированного.
Когда вы открываете блок Atan2, он использует блоки MATLAB function для данных и допустимых линий. Это как показано ниже.
open_system('hdlcoder_atan2_control') open_system('hdlcoder_atan2_control/Atan2') open_system('hdlcoder_atan2_control/Atan2','force')
Этот раздел показывает, как реализовать пример с помощью основанного на управляющем сигнале блока Atan2 и сгенерировать HDL-код при помощи HDL Coder™.
Прежде, чем открыть модель, набор вход можно следующим образом. Вы можете, принял решение установить различный вход согласно вашему требованию. Это использование в качестве примера после входных параметров, который линеен и развертка через входные значения - пи к пи.
input_values = (-pi:.01/(2*pi):pi)'; RADIUS = 10.^(-2.5:.25:0);
Задайте wordlength для типов данных фиксированной точки и задержку трубопровода для модели. Пройдите документацию для вычисления задержки. Задержка зависит от количества итераций.
WL_atan2 = 18; latency_atan2 = 14;
Переменные Setup для логгирования входных значений X и Y.
x_log = zeros(length(input_values)*length(RADIUS),1); y_log = zeros(length(input_values)*length(RADIUS),1); for outerindex = 0:length(RADIUS)-1 for index = 1:length(input_values) input = input_values(index); % access current value y = RADIUS(outerindex+1)*sin(input); % compute y x = RADIUS(outerindex+1)*cos(input); % compute x addr = outerindex*length(input_values)+index; y_log(addr) = y; x_log(addr) = x; end end
Откройте модель hdlcoder_atan2_control
и задайте достаточное время остановки, которое потребовало, чтобы обработать все входные комбинации. Модель имеет блок Atan2, который реализует Atan2 с помощью алгоритма CORDIC для validIn
управляющий сигнал.
stoptime_atan2 = length(x_log)-1+latency_atan2; close all open_system('hdlcoder_atan2_control') sim('hdlcoder_atan2_control')
Вы видите ниже формы волны, когда вы симулируете вышеупомянутую модель. Вы видите, что выходные данные допустимы, когда validOut высок.
Чтобы подтвердить выход, полученный путем симуляции модели Simulink, можно сравнить Simulink выход со ссылочным выходом. Чтобы получить ссылочный выход, используйте atan2 функцию MATLAB.
Вычислите ссылочный выход при помощи atan2
функция. Вы видите, что максимальная погрешность, наблюдаемая от результатов сравнения, вполне мала.
comparison_plot_atan2(atan2(y_log,x_log),sim_final_theta(valid_out),3,'theta');
Maximum Error theta 7.233221e-03
Прежде чем вы сгенерируете код, вы видите, что настройки HDL экономили на модели при помощи hdlsaveparams
функция.
hdlsaveparams('hdlcoder_atan2_control')
%% Set Model 'hdlcoder_atan2_control' HDL parameters hdlset_param('hdlcoder_atan2_control', 'HDLSubsystem', 'hdlcoder_atan2_control/Atan2'); hdlset_param('hdlcoder_atan2_control', 'ResetType', 'Synchronous'); hdlset_param('hdlcoder_atan2_control', 'SynthesisTool', 'Xilinx Vivado'); hdlset_param('hdlcoder_atan2_control', 'SynthesisToolChipFamily', 'Virtex7'); hdlset_param('hdlcoder_atan2_control', 'SynthesisToolDeviceName', 'xc7v2000t'); hdlset_param('hdlcoder_atan2_control', 'SynthesisToolPackageName', 'fhg1761'); hdlset_param('hdlcoder_atan2_control', 'SynthesisToolSpeedValue', '-2'); hdlset_param('hdlcoder_atan2_control', 'TargetDirectory', 'hdl_prj\hdlsrc'); hdlset_param('hdlcoder_atan2_control', 'TargetFrequency', 500); hdlset_param('hdlcoder_atan2_control/Atan2/LumpLatency', 'Architecture', 'MATLAB Datapath'); % Set SubSystem HDL parameters hdlset_param('hdlcoder_atan2_control/Atan2/LumpLatency', 'FlattenHierarchy', 'on'); hdlset_param('hdlcoder_atan2_control/Atan2/ValidLine', 'Architecture', 'MATLAB Datapath'); % Set SubSystem HDL parameters hdlset_param('hdlcoder_atan2_control/Atan2/ValidLine', 'FlattenHierarchy', 'on');
Сгенерировать HDL-код для Atan2
блокируйтесь в модели, используйте makehdl
функция.
makehdl('hdlcoder_atan2_control/Atan2') close_system('hdlcoder_atan2_control') close all;
### Generating HDL for 'hdlcoder_atan2_control/Atan2'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_atan2_control', { 'HDL Code Generation' } )">hdlcoder_atan2_control</a> for HDL code generation parameters. ### Running HDL checks on the model 'hdlcoder_atan2_control'. ### Begin compilation of the model 'hdlcoder_atan2_control'... ### Applying HDL optimizations on the model 'hdlcoder_atan2_control'... ### <a href="matlab:configset.internal.open('hdlcoder_atan2_control','AdaptivePipelining')">'AdaptivePipelining'</a> is set to 'Off' for the model. 'AdaptivePipelining' can improve the achievable clock frequency and reduce the area usage on FPGA boards. To enable adaptive pipelining, set the option to 'On'. When adaptive pipelining is enabled, it inserts pipeline registers to create patterns that efficiently map blocks to DSP units on the target FPGA device. ### <a href="matlab:configset.internal.open('hdlcoder_atan2_control','LUTMapToRAM')">'LUTMapToRAM'</a> is set to 'On' for the model. This option is used to map lookup tables to a block RAM in hardware. To disable pipeline insertion for mapping lookup tables to RAM, set the option to 'Off'. ### Begin model generation. ### Model generation complete. ### Begin VHDL Code Generation for 'hdlcoder_atan2_control'. ### Working on hdlcoder_atan2_control/Atan2/Enabled Subsystem as hdl_prj/hdlsrc/hdlcoder_atan2_control/Enabled_Subsystem.vhd. ### Working on hdlcoder_atan2_control/Atan2/Atan2 as hdl_prj/hdlsrc/hdlcoder_atan2_control/Atan2_block.vhd. ### Working on hdlcoder_atan2_control/Atan2 as hdl_prj/hdlsrc/hdlcoder_atan2_control/Atan2.vhd. ### Code Generation for 'hdlcoder_atan2_control' completed. ### Creating HDL Code Generation Check Report file:///tmp/BR2021bd_1724986_151598/publish_examples0/tp0b0cd55d/hdl_prj/hdlsrc/hdlcoder_atan2_control/Atan2_report.html ### HDL check for 'hdlcoder_atan2_control' complete with 0 errors, 0 warnings, and 2 messages. ### HDL code generation complete.
Следующие диграммы показывают эффективность синтеза блока Atan2 на устройствах Xilinx Virtex 7 и intel Stratix V.
Каждый порт блока SinCos как объяснен ниже.
Блок SinCos имеет количество итераций, когда маска parameter.The значение по умолчанию равняется 11, и задержка зависит от этого параметра маскированного.
Когда вы открываете блок SinCos, он использует блоки MATLAB function для данных и допустимых линий. Это как показано ниже.
open_system('hdlcoder_sincos_control') open_system('hdlcoder_sincos_control/SinCos') open_system('hdlcoder_sincos_control/SinCos','force')
Этот раздел показывает, как реализовать пример с помощью основанного на управляющем сигнале блока SinCos и сгенерировать HDL-код при помощи HDL Coder™.
Прежде, чем открыть модель, набор вход можно следующим образом. Вы можете, принял решение установить различный вход согласно вашему требованию. Это использование в качестве примера после входных параметров, который линеен и развертка через входные значения - пи к пи.
input_values = (-pi:.01/(2*pi):pi)';
Задайте wordlength для типов данных фиксированной точки и задержку трубопровода для модели. Пройдите документацию для вычисления задержки. Задержка зависит от количества итераций
WL_SinCos = 18; latency_SinCos = 12;
Откройте модель hdlcoder_sincos_control
и задайте достаточное время остановки, которое потребовало, чтобы обработать все входные комбинации. Модель имеет блок SinCos, который реализует SinCos с помощью алгоритма CORDIC для validIn
управляющий сигнал. Остающиеся блоки тригонометрической функции (Sin, Cos и Cos + jSin) используют тот же метод приближения CORDIC, и интерфейсные порты отличается соответственно.
stoptime_sincos = length(input_values)-1+latency_SinCos; open_system('hdlcoder_sincos_control') sim('hdlcoder_sincos_control')
Вы видите ниже формы волны, когда вы симулируете вышеупомянутую модель. Вы видите, что выходные данные допустимы, когда validOut высок.
Чтобы подтвердить выход, полученный путем симуляции модели Simulink, можно сравнить Simulink выход со ссылочным выходом. Чтобы получить ссылочный выход, используйте sin и потому что функция MATLAB.
Вычислите ссылочный выход при помощи sin
функция. Вы видите, что максимальная погрешность, наблюдаемая от результатов сравнения, вполне мала.
comparison_plot_sincos(sin(input_values),sim_final_sintheta(valid_out),5,'sin');
Maximum Error sin 1.005291e-03
Вычислите ссылочный выход при помощи Cos
функция. Вы видите, что максимальная погрешность, наблюдаемая от результатов сравнения, вполне мала.
comparison_plot_sincos(cos(input_values),sim_final_costheta(valid_out),6,'cos');
Maximum Error cos 1.008159e-03
Прежде чем вы сгенерируете код, вы видите, что настройки HDL экономили на модели при помощи hdlsaveparams
функция.
hdlsaveparams('hdlcoder_sincos_control')
%% Set Model 'hdlcoder_sincos_control' HDL parameters hdlset_param('hdlcoder_sincos_control', 'HDLSubsystem', 'hdlcoder_sincos_control/SinCos'); hdlset_param('hdlcoder_sincos_control', 'ResetType', 'Synchronous'); hdlset_param('hdlcoder_sincos_control', 'SynthesisTool', 'Xilinx Vivado'); hdlset_param('hdlcoder_sincos_control', 'SynthesisToolChipFamily', 'Virtex7'); hdlset_param('hdlcoder_sincos_control', 'SynthesisToolDeviceName', 'xc7v2000t'); hdlset_param('hdlcoder_sincos_control', 'SynthesisToolPackageName', 'fhg1761'); hdlset_param('hdlcoder_sincos_control', 'SynthesisToolSpeedValue', '-2'); hdlset_param('hdlcoder_sincos_control', 'TargetDirectory', 'hdl_prj\hdlsrc'); hdlset_param('hdlcoder_sincos_control', 'TargetFrequency', 500); hdlset_param('hdlcoder_sincos_control/SinCos/LumpLatency', 'Architecture', 'MATLAB Datapath'); % Set SubSystem HDL parameters hdlset_param('hdlcoder_sincos_control/SinCos/LumpLatency', 'FlattenHierarchy', 'on'); hdlset_param('hdlcoder_sincos_control/SinCos/LumpLatency1', 'Architecture', 'MATLAB Datapath'); % Set SubSystem HDL parameters hdlset_param('hdlcoder_sincos_control/SinCos/LumpLatency1', 'FlattenHierarchy', 'on'); hdlset_param('hdlcoder_sincos_control/SinCos/ValidLine', 'Architecture', 'MATLAB Datapath'); % Set SubSystem HDL parameters hdlset_param('hdlcoder_sincos_control/SinCos/ValidLine', 'FlattenHierarchy', 'on');
Сгенерировать HDL-код для SinCos
блокируйтесь в модели, используйте makehdl
функция.
makehdl('hdlcoder_sincos_control/SinCos') close_system('hdlcoder_sincos_control') close all;
### Generating HDL for 'hdlcoder_sincos_control/SinCos'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_sincos_control', { 'HDL Code Generation' } )">hdlcoder_sincos_control</a> for HDL code generation parameters. ### Running HDL checks on the model 'hdlcoder_sincos_control'. ### Begin compilation of the model 'hdlcoder_sincos_control'... ### Applying HDL optimizations on the model 'hdlcoder_sincos_control'... ### <a href="matlab:configset.internal.open('hdlcoder_sincos_control','AdaptivePipelining')">'AdaptivePipelining'</a> is set to 'Off' for the model. 'AdaptivePipelining' can improve the achievable clock frequency and reduce the area usage on FPGA boards. To enable adaptive pipelining, set the option to 'On'. When adaptive pipelining is enabled, it inserts pipeline registers to create patterns that efficiently map blocks to DSP units on the target FPGA device. ### <a href="matlab:configset.internal.open('hdlcoder_sincos_control','LUTMapToRAM')">'LUTMapToRAM'</a> is set to 'On' for the model. This option is used to map lookup tables to a block RAM in hardware. To disable pipeline insertion for mapping lookup tables to RAM, set the option to 'Off'. ### Begin model generation. ### Model generation complete. ### Begin VHDL Code Generation for 'hdlcoder_sincos_control'. ### Working on hdlcoder_sincos_control/SinCos/Enabled Subsystem as hdl_prj/hdlsrc/hdlcoder_sincos_control/Enabled_Subsystem.vhd. ### Working on hdlcoder_sincos_control/SinCos/SinCos as hdl_prj/hdlsrc/hdlcoder_sincos_control/SinCos_block.vhd. ### Working on hdlcoder_sincos_control/SinCos as hdl_prj/hdlsrc/hdlcoder_sincos_control/SinCos.vhd. ### Generating package file hdl_prj/hdlsrc/hdlcoder_sincos_control/SinCos_pkg.vhd. ### Code Generation for 'hdlcoder_sincos_control' completed. ### Creating HDL Code Generation Check Report file:///tmp/BR2021bd_1724986_151598/publish_examples0/tp0b0cd55d/hdl_prj/hdlsrc/hdlcoder_sincos_control/SinCos_report.html ### HDL check for 'hdlcoder_sincos_control' complete with 0 errors, 0 warnings, and 3 messages. ### HDL code generation complete.
Следующие диграммы показывают эффективность синтеза блока SinCos на устройствах Xilinx Virtex 7 и intel Stratix V.
Каждый порт блока Reciprocal как объяснен ниже.
Когда вы открываете блок Reciprocal, он использует блоки MATLAB function для данных и допустимых линий. Это как показано ниже.
open_system('hdlcoder_reciprocal_shiftadd_control') open_system('hdlcoder_reciprocal_shiftadd_control/Reciprocal')
Этот раздел показывает, как реализовать пример с помощью основанного на управляющем сигнале блока Reciprocal и сгенерировать HDL-код при помощи HDL Coder™.
Прежде, чем открыть модель, набор вход можно следующим образом. Вы можете, принял решение установить различный вход согласно вашему требованию. Это использование в качестве примера после входных параметров, который линеен.
reciprocal_input = fi(1/2^17:1/2^17:1,0,18,17)';
Задайте wordlength для типов данных фиксированной точки и задержку трубопровода для модели. Пройдите документацию для вычисления задержки.
WL_recip = 18; recip_latency = 22;
Откройте модель hdlcoder_reciprocal_shiftadd_control
и задайте достаточное время остановки, которое потребовало, чтобы обработать все входные комбинации.
stoptime_recip = length(reciprocal_input)-1+recip_latency; open_system('hdlcoder_reciprocal_shiftadd_control') sim('hdlcoder_reciprocal_shiftadd_control')
Вы видите ниже формы волны, когда вы симулируете вышеупомянутую модель. Вы видите, что выходные данные допустимы, когда validOut высок.
Чтобы подтвердить выход, полученный путем симуляции модели Simulink, можно сравнить Simulink выход со ссылочным выходом. Чтобы получить ссылочный выход, используйте sqrt
функция.
Вычислите ссылочный выход при помощи reciprocal
операция.
ref_reciprocal = 1./double(reciprocal_input);
Используйте логическую индексацию, чтобы извлечь допустимый выход.
implementation_reciprocal = simulink_reciprocal(valid_output);
Чтобы подтвердить выход, постройте результаты сравнения при помощи comparison_plot_reciprocal
функция в этом примере. Вы видите, что максимальная погрешность, наблюдаемая от результатов сравнения, вполне мала.
comparison_plot_reciprocal(ref_reciprocal,implementation_reciprocal,9,'reciprocal linear input');
Maximum Error reciprocal linear input 9.999771e-01 Maximum PctError reciprocal linear input 4.999924e+01
Прежде чем вы сгенерируете код, вы видите, что настройки HDL экономили на модели при помощи hdlsaveparams
функция.
hdlsaveparams('hdlcoder_reciprocal_shiftadd_control')
%% Set Model 'hdlcoder_reciprocal_shiftadd_control' HDL parameters hdlset_param('hdlcoder_reciprocal_shiftadd_control', 'Backannotation', 'on'); hdlset_param('hdlcoder_reciprocal_shiftadd_control', 'HDLSubsystem', 'hdlcoder_reciprocal_shiftadd_control/Reciprocal'); hdlset_param('hdlcoder_reciprocal_shiftadd_control', 'ResetType', 'Synchronous'); hdlset_param('hdlcoder_reciprocal_shiftadd_control', 'ResourceReport', 'on'); hdlset_param('hdlcoder_reciprocal_shiftadd_control', 'SynthesisTool', 'Xilinx Vivado'); hdlset_param('hdlcoder_reciprocal_shiftadd_control', 'SynthesisToolChipFamily', 'Virtex7'); hdlset_param('hdlcoder_reciprocal_shiftadd_control', 'SynthesisToolDeviceName', 'xc7v2000t'); hdlset_param('hdlcoder_reciprocal_shiftadd_control', 'SynthesisToolPackageName', 'fhg1761'); hdlset_param('hdlcoder_reciprocal_shiftadd_control', 'SynthesisToolSpeedValue', '-2'); hdlset_param('hdlcoder_reciprocal_shiftadd_control', 'TargetDirectory', 'hdl_prj\hdlsrc'); hdlset_param('hdlcoder_reciprocal_shiftadd_control', 'TargetFrequency', 500); hdlset_param('hdlcoder_reciprocal_shiftadd_control', 'Traceability', 'on'); % Set SubSystem HDL parameters hdlset_param('hdlcoder_reciprocal_shiftadd_control/Reciprocal', 'FlattenHierarchy', 'on'); hdlset_param('hdlcoder_reciprocal_shiftadd_control/Reciprocal/LumpLatency', 'Architecture', 'MATLAB Datapath'); % Set SubSystem HDL parameters hdlset_param('hdlcoder_reciprocal_shiftadd_control/Reciprocal/LumpLatency', 'FlattenHierarchy', 'on'); hdlset_param('hdlcoder_reciprocal_shiftadd_control/Reciprocal/Reciprocal', 'Architecture', 'ShiftAdd'); hdlset_param('hdlcoder_reciprocal_shiftadd_control/Reciprocal/ValidLine', 'Architecture', 'MATLAB Datapath'); % Set SubSystem HDL parameters hdlset_param('hdlcoder_reciprocal_shiftadd_control/Reciprocal/ValidLine', 'FlattenHierarchy', 'on');
Сгенерировать HDL-код для Reciprocal
блокируйтесь в модели, используйте makehdl
функция.
makehdl('hdlcoder_reciprocal_shiftadd_control/Reciprocal') close_system('hdlcoder_reciprocal_shiftadd_control') close all;
### Generating HDL for 'hdlcoder_reciprocal_shiftadd_control/Reciprocal'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_reciprocal_shiftadd_control', { 'HDL Code Generation' } )">hdlcoder_reciprocal_shiftadd_control</a> for HDL code generation parameters. ### Running HDL checks on the model 'hdlcoder_reciprocal_shiftadd_control'. ### Begin compilation of the model 'hdlcoder_reciprocal_shiftadd_control'... ### Applying HDL optimizations on the model 'hdlcoder_reciprocal_shiftadd_control'... ### <a href="matlab:configset.internal.open('hdlcoder_reciprocal_shiftadd_control','AdaptivePipelining')">'AdaptivePipelining'</a> is set to 'Off' for the model. 'AdaptivePipelining' can improve the achievable clock frequency and reduce the area usage on FPGA boards. To enable adaptive pipelining, set the option to 'On'. When adaptive pipelining is enabled, it inserts pipeline registers to create patterns that efficiently map blocks to DSP units on the target FPGA device. ### <a href="matlab:configset.internal.open('hdlcoder_reciprocal_shiftadd_control','LUTMapToRAM')">'LUTMapToRAM'</a> is set to 'On' for the model. This option is used to map lookup tables to a block RAM in hardware. To disable pipeline insertion for mapping lookup tables to RAM, set the option to 'Off'. ### Begin model generation. ### Model generation complete. ### Begin VHDL Code Generation for 'hdlcoder_reciprocal_shiftadd_control'. ### Working on hdlcoder_reciprocal_shiftadd_control/Reciprocal/Reciprocal as hdl_prj/hdlsrc/hdlcoder_reciprocal_shiftadd_control/Reciprocal_block.vhd. ### Working on hdlcoder_reciprocal_shiftadd_control/Reciprocal as hdl_prj/hdlsrc/hdlcoder_reciprocal_shiftadd_control/Reciprocal.vhd. ### Code Generation for 'hdlcoder_reciprocal_shiftadd_control' completed. ### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2021bd_1724986_151598/publish_examples0/tp0b0cd55d/hdl_prj/hdlsrc/hdlcoder_reciprocal_shiftadd_control/html/hdlcoder_reciprocal_shiftadd_control_codegen_rpt.html');">hdlcoder_reciprocal_shiftadd_control_codegen_rpt.html</a> ### Creating HDL Code Generation Check Report file:///tmp/BR2021bd_1724986_151598/publish_examples0/tp0b0cd55d/hdl_prj/hdlsrc/hdlcoder_reciprocal_shiftadd_control/Reciprocal_report.html ### HDL check for 'hdlcoder_reciprocal_shiftadd_control' complete with 0 errors, 0 warnings, and 2 messages. ### HDL code generation complete.
Следующие диграммы показывают эффективность синтеза блока Reciprocal на устройствах Xilinx Virtex 7 и intel Stratix V.
Каждый порт блока Divide как объяснен ниже.
Когда вы открываете блок Divide, он использует блоки MATLAB function для данных и допустимых линий. Это как показано ниже.
open_system('hdlcoder_divide_shiftadd_control') open_system('hdlcoder_divide_shiftadd_control/Divide')
Этот раздел показывает, как реализовать пример с помощью основанного на управляющем сигнале блока Divide и сгенерировать HDL-код при помощи HDL Coder™.
Прежде, чем открыть модель, набор вход можно следующим образом. Вы можете, принял решение установить различный вход согласно вашему требованию. Это использование в качестве примера после входных параметров, который линеен.
dividend_input = fi(1/2^17:1/2^17:1,0,18,17)'; divisor_input = fi(1/2^17:1/2^17:1,0,18,13)';
Задайте wordlength для типов данных фиксированной точки и задержку трубопровода для модели. Пройдите документацию для вычисления задержки.
WL_divide = 18; divide_latency = 22;
Откройте модель hdlcoder_divide_shiftadd_control
и задайте достаточное время остановки, которое потребовало, чтобы обработать все входные комбинации.
stoptime_divide = length(dividend_input)-1+divide_latency; open_system('hdlcoder_divide_shiftadd_control') sim('hdlcoder_divide_shiftadd_control')
Вы видите ниже формы волны, когда вы симулируете вышеупомянутую модель. Вы видите, что выходные данные допустимы, когда validOut высок.
Чтобы подтвердить выход, полученный путем симуляции модели Simulink, можно сравнить Simulink выход со ссылочным выходом. Чтобы получить ссылочный выход, используйте sqrt
функция.
Вычислите ссылочный выход при помощи divide
функция.
ref_divide = double(dividend_input)./double(divisor_input);
Используйте логическую индексацию, чтобы извлечь допустимый выход.
implementation_divide = simulink_divide(valid_output);
Чтобы подтвердить выход, постройте результаты сравнения при помощи comparison_plot_divide
функция в этом примере. Вы видите, что максимальная погрешность, наблюдаемая от результатов сравнения, вполне мала.
comparison_plot_divide(ref_divide,implementation_divide,11,'divide linear input');
Maximum Error divide linear input Inf Maximum PctError divide linear input 6.249285e+00
Прежде чем вы сгенерируете код, вы видите, что настройки HDL экономили на модели при помощи hdlsaveparams
функция.
hdlsaveparams('hdlcoder_divide_shiftadd_control')
%% Set Model 'hdlcoder_divide_shiftadd_control' HDL parameters hdlset_param('hdlcoder_divide_shiftadd_control', 'Backannotation', 'on'); hdlset_param('hdlcoder_divide_shiftadd_control', 'HDLSubsystem', 'hdlcoder_divide_shiftadd_control/Divide'); hdlset_param('hdlcoder_divide_shiftadd_control', 'ResetType', 'Synchronous'); hdlset_param('hdlcoder_divide_shiftadd_control', 'ResourceReport', 'on'); hdlset_param('hdlcoder_divide_shiftadd_control', 'SynthesisTool', 'Xilinx Vivado'); hdlset_param('hdlcoder_divide_shiftadd_control', 'SynthesisToolChipFamily', 'Virtex7'); hdlset_param('hdlcoder_divide_shiftadd_control', 'SynthesisToolDeviceName', 'xc7v2000t'); hdlset_param('hdlcoder_divide_shiftadd_control', 'SynthesisToolPackageName', 'fhg1761'); hdlset_param('hdlcoder_divide_shiftadd_control', 'SynthesisToolSpeedValue', '-2'); hdlset_param('hdlcoder_divide_shiftadd_control', 'TargetDirectory', 'hdl_prj\hdlsrc'); hdlset_param('hdlcoder_divide_shiftadd_control', 'TargetFrequency', 500); hdlset_param('hdlcoder_divide_shiftadd_control', 'Traceability', 'on'); % Set SubSystem HDL parameters hdlset_param('hdlcoder_divide_shiftadd_control/Divide', 'FlattenHierarchy', 'on'); hdlset_param('hdlcoder_divide_shiftadd_control/Divide/Divide', 'Architecture', 'ShiftAdd'); hdlset_param('hdlcoder_divide_shiftadd_control/Divide/LumpLatency', 'Architecture', 'MATLAB Datapath'); % Set SubSystem HDL parameters hdlset_param('hdlcoder_divide_shiftadd_control/Divide/LumpLatency', 'FlattenHierarchy', 'on'); hdlset_param('hdlcoder_divide_shiftadd_control/Divide/ValidLine', 'Architecture', 'MATLAB Datapath'); % Set SubSystem HDL parameters hdlset_param('hdlcoder_divide_shiftadd_control/Divide/ValidLine', 'FlattenHierarchy', 'on');
Сгенерировать HDL-код для Divide
блокируйтесь в модели, используйте makehdl
функция.
makehdl('hdlcoder_divide_shiftadd_control/Divide') close_system('hdlcoder_divide_shiftadd_control') close all;
### Generating HDL for 'hdlcoder_divide_shiftadd_control/Divide'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_divide_shiftadd_control', { 'HDL Code Generation' } )">hdlcoder_divide_shiftadd_control</a> for HDL code generation parameters. ### Running HDL checks on the model 'hdlcoder_divide_shiftadd_control'. ### Begin compilation of the model 'hdlcoder_divide_shiftadd_control'... ### Applying HDL optimizations on the model 'hdlcoder_divide_shiftadd_control'... ### <a href="matlab:configset.internal.open('hdlcoder_divide_shiftadd_control','AdaptivePipelining')">'AdaptivePipelining'</a> is set to 'Off' for the model. 'AdaptivePipelining' can improve the achievable clock frequency and reduce the area usage on FPGA boards. To enable adaptive pipelining, set the option to 'On'. When adaptive pipelining is enabled, it inserts pipeline registers to create patterns that efficiently map blocks to DSP units on the target FPGA device. ### <a href="matlab:configset.internal.open('hdlcoder_divide_shiftadd_control','LUTMapToRAM')">'LUTMapToRAM'</a> is set to 'On' for the model. This option is used to map lookup tables to a block RAM in hardware. To disable pipeline insertion for mapping lookup tables to RAM, set the option to 'Off'. ### Begin model generation. ### Model generation complete. ### Begin VHDL Code Generation for 'hdlcoder_divide_shiftadd_control'. ### Working on hdlcoder_divide_shiftadd_control/Divide/Divide as hdl_prj/hdlsrc/hdlcoder_divide_shiftadd_control/Divide_block.vhd. ### Working on hdlcoder_divide_shiftadd_control/Divide as hdl_prj/hdlsrc/hdlcoder_divide_shiftadd_control/Divide.vhd. ### Code Generation for 'hdlcoder_divide_shiftadd_control' completed. ### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2021bd_1724986_151598/publish_examples0/tp0b0cd55d/hdl_prj/hdlsrc/hdlcoder_divide_shiftadd_control/html/hdlcoder_divide_shiftadd_control_codegen_rpt.html');">hdlcoder_divide_shiftadd_control_codegen_rpt.html</a> ### Creating HDL Code Generation Check Report file:///tmp/BR2021bd_1724986_151598/publish_examples0/tp0b0cd55d/hdl_prj/hdlsrc/hdlcoder_divide_shiftadd_control/Divide_report.html ### HDL check for 'hdlcoder_divide_shiftadd_control' complete with 0 errors, 0 warnings, and 2 messages. ### HDL code generation complete.
Следующие диграммы показывают эффективность синтеза блока Divide на устройствах Xilinx Virtex 7 и intel Stratix V.