Этот документ дает обзор основанных на управляющем сигнале математических функций фиксированной точки в 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. ### Starting HDL check. ### 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 HTML files for code generation report at <a href="matlab:web('/tmp/BR2020bd_1444674_32127/publish_examples0/tpb1b885ef/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/BR2020bd_1444674_32127/publish_examples0/tpb1b885ef/hdl_prj/hdlsrc/hdlcoder_sqrt_bitset_control/Sqrt_report.html ### HDL check for 'hdlcoder_sqrt_bitset_control' complete with 0 errors, 0 warnings, and 0 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. ### Starting HDL check. ### Begin VHDL Code Generation for 'hdlcoder_atan2_control'. ### 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. ### Creating HDL Code Generation Check Report file:///tmp/BR2020bd_1444674_32127/publish_examples0/tpb1b885ef/hdl_prj/hdlsrc/hdlcoder_atan2_control/Atan2_report.html ### HDL check for 'hdlcoder_atan2_control' complete with 0 errors, 0 warnings, and 0 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. ### Starting HDL check. ### Begin VHDL Code Generation for 'hdlcoder_sincos_control'. ### 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. ### Creating HDL Code Generation Check Report file:///tmp/BR2020bd_1444674_32127/publish_examples0/tpb1b885ef/hdl_prj/hdlsrc/hdlcoder_sincos_control/SinCos_report.html ### HDL check for 'hdlcoder_sincos_control' complete with 0 errors, 0 warnings, and 1 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. ### Starting HDL check. ### 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. ### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2020bd_1444674_32127/publish_examples0/tpb1b885ef/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/BR2020bd_1444674_32127/publish_examples0/tpb1b885ef/hdl_prj/hdlsrc/hdlcoder_reciprocal_shiftadd_control/Reciprocal_report.html ### HDL check for 'hdlcoder_reciprocal_shiftadd_control' complete with 0 errors, 0 warnings, and 0 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. ### Starting HDL check. ### 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. ### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2020bd_1444674_32127/publish_examples0/tpb1b885ef/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/BR2020bd_1444674_32127/publish_examples0/tpb1b885ef/hdl_prj/hdlsrc/hdlcoder_divide_shiftadd_control/Divide_report.html ### HDL check for 'hdlcoder_divide_shiftadd_control' complete with 0 errors, 0 warnings, and 0 messages. ### HDL code generation complete.
Следующие диграммы показывают эффективность синтеза блока Divide на устройствах Xilinx Virtex 7 и intel Stratix V.