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

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

  1. Sqrt

  2. Atan2

  3. Sin

  4. Cos

  5. SinCos

  6. Cos + jSin

  7. Взаимный

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

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

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

open_system('HDLMathLib')

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

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

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

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

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

Пример использования блока Sqrt на основе контольных сигналов

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

Откройте и запустите модель Simulink

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

SQRT_input = fi(1/2^17:1/2^17:1,0,18,17)';

Задайте длину слова для типов данных с фиксированной точкой и задержку трубопровода для модели. Пройдите по документации для вычисления задержек.

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')

Вы можете увидеть нижеследующую форму волны, когда моделируете вышеописанную модель. Вы можете увидеть, что dataOut действителен, когда 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.
### 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'...
### 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/BR2021ad_1584584_202060/publish_examples0/tp2ea99964/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/BR2021ad_1584584_202060/publish_examples0/tp2ea99964/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

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

input_values = (-pi:.01/(2*pi):pi)';
RADIUS = 10.^(-2.5:.25:0);

Задайте длину слова для типов данных с фиксированной точкой и задержку трубопровода для модели. Пройдите по документации для вычисления задержек. Задержка зависит от количества итераций.

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')

Вы можете увидеть нижеследующую форму волны, когда моделируете вышеописанную модель. Вы можете увидеть, что dataOut действителен, когда 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.
### 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'...
### 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/BR2021ad_1584584_202060/publish_examples0/tp2ea99964/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 имеет количество итераций в качестве параметра маски. Значение по умолчанию является 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

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

input_values = (-pi:.01/(2*pi):pi)';

Задайте длину слова для типов данных с фиксированной точкой и задержку трубопровода для модели. Пройдите по документации для вычисления задержек. Задержка зависит от количества итераций

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')

Вы можете увидеть нижеследующую форму волны, когда моделируете вышеописанную модель. Вы можете увидеть, что dataOut действителен, когда validOut высок.

Проверьте вывод Simulink при помощи ссылочных Выходов

Чтобы подтвердить результат, полученный путем симуляции модели Simulink, можно сравнить выход Simulink с выходом ссылки. Чтобы получить выход ссылки, используйте функцию sin and cos 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.
### 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'...
### 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/BR2021ad_1584584_202060/publish_examples0/tp2ea99964/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.

Возвратный блок с управляющими сигналами

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

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

open_system('hdlcoder_reciprocal_shiftadd_control')
open_system('hdlcoder_reciprocal_shiftadd_control/Reciprocal')

Пример с использованием ответного блока на основе управляющего сигнала

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

Откройте и запустите модель Simulink

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

reciprocal_input = fi(1/2^17:1/2^17:1,0,18,17)';

Задайте длину слова для типов данных с фиксированной точкой и задержку трубопровода для модели. Пройдите по документации для вычисления задержек.

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')

Вы можете увидеть нижеследующую форму волны, когда моделируете вышеописанную модель. Вы можете увидеть, что dataOut действителен, когда 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.
### 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'...
### 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/BR2021ad_1584584_202060/publish_examples0/tp2ea99964/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/BR2021ad_1584584_202060/publish_examples0/tp2ea99964/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.

Перфроманс обратного синтеза блоков

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

Задайте длину слова для типов данных с фиксированной точкой и задержку трубопровода для модели. Пройдите по документации для вычисления задержек.

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')

Вы можете увидеть нижеследующую форму волны, когда моделируете вышеописанную модель. Вы можете увидеть, что dataOut действителен, когда 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.
### 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'...
### 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/BR2021ad_1584584_202060/publish_examples0/tp2ea99964/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/BR2021ad_1584584_202060/publish_examples0/tp2ea99964/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.