Реализуйте основанные на управляющих сигналах Математические функции с помощью HDL Coder

Этот документ дает обзор основанных на управляющем сигнале математических функций фиксированной точки в HDLMathLib и примерах, сопоставленных со всеми блоками, существующими в HDLMathLib при помощи HDL Coder™. HDLMathLib включает следующие блоки с портами управления.

  1. Sqrt

  2. Atan2

  3. Sin

  4. Потому что

  5. SinCos

  6. Cos+jSin

  7. Обратная величина

  8. Разделиться

Библиотека HDLMathLib с портами управления для математических функций

Чтобы видеть все блоки математической функции в библиотеке HDLMathLib, откройте использование библиотеки после команды.

open_system('HDLMathLib')

Вы видите различные блоки математической функции с портами управления. Sqrt, Atan2, SinCos, Обратная величина и Делятся, блоки описаны с примером в следующих разделах. Можно использовать sin, потому что, Cos+jsin блокирует в модели тот же путь путем обращения ниже разделов.

Блок Sqrt с управляющими сигналами

Каждый порт блока Sqrt как объяснен ниже.

Когда вы открываете блок Sqrt, он использует блоки MATLAB function для данных и допустимых линий. Это как показано ниже.

open_system('hdlcoder_sqrt_bitset_control')
open_system('hdlcoder_sqrt_bitset_control/Sqrt')

Пример с помощью Сигналов Contol базирующийся Блок Sqrt

Этот раздел показывает, как реализовать пример с помощью основанного на управляющем сигнале Квадратного корня, блокируют и генерируют HDL-код при помощи HDL Coder™.

Открытая и запущенная модель Simulink

Прежде, чем открыть модель, набор вход можно следующим образом. Вы можете, принял решение установить различный вход согласно вашему требованию. Это использование в качестве примера после входных параметров, который линеен.

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, можно сравнить 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-код для реализации квадратного корня

Прежде чем вы сгенерируете код, вы видите, что настройки 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

Следующие диграммы показывают эффективность синтеза блока Sqrt на устройствах Xilinx Virtex 7 и intel Stratix V.

Блок Atan2 с управляющими сигналами

Каждый порт блока 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

Этот раздел показывает, как реализовать пример с помощью основанного на управляющем сигнале блока Atan2 и сгенерировать HDL-код при помощи HDL Coder™.

Открытая и запущенная модель Simulink

Прежде, чем открыть модель, набор вход можно следующим образом. Вы можете, принял решение установить различный вход согласно вашему требованию. Это использование в качестве примера после входных параметров, который линеен и развертка через входные значения - пи к пи.

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, можно сравнить 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-код для реализации Atan2

Прежде чем вы сгенерируете код, вы видите, что настройки 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

Следующие диграммы показывают эффективность синтеза блока Atan2 на устройствах Xilinx Virtex 7 и intel Stratix V.

Блок SinCos с управляющими сигналами

Каждый порт блока 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

Этот раздел показывает, как реализовать пример с помощью основанного на управляющем сигнале блока SinCos и сгенерировать HDL-код при помощи HDL Coder™.

Открытая и запущенная модель Simulink

Прежде, чем открыть модель, набор вход можно следующим образом. Вы можете, принял решение установить различный вход согласно вашему требованию. Это использование в качестве примера после входных параметров, который линеен и развертка через входные значения - пи к пи.

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, можно сравнить 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-код для реализации SinCos

Прежде чем вы сгенерируете код, вы видите, что настройки 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

Следующие диграммы показывают эффективность синтеза блока 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™.

Открытая и запущенная модель Simulink

Прежде, чем открыть модель, набор вход можно следующим образом. Вы можете, принял решение установить различный вход согласно вашему требованию. Это использование в качестве примера после входных параметров, который линеен.

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, можно сравнить 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-код для взаимной реализации

Прежде чем вы сгенерируете код, вы видите, что настройки 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.

Взаимный синтез блока Perfromance

Следующие диграммы показывают эффективность синтеза блока 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™.

Открытая и запущенная модель Simulink

Прежде, чем открыть модель, набор вход можно следующим образом. Вы можете, принял решение установить различный вход согласно вашему требованию. Это использование в качестве примера после входных параметров, который линеен.

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, можно сравнить 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-код для реализации деления

Прежде чем вы сгенерируете код, вы видите, что настройки 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.