В этом документе приводится обзор математических функций фиксированной точки на основе управляющего сигнала в HDLMathLib и примеры, связанные со всеми блоками, присутствующими в HDLMathLib, с помощью Coder™ HDL. HDLMathLib включает следующие блоки с управляющими портами.
Sqrt
Atan2
Грех
Cos
SinCos
Cos + jSin
Взаимный
Разделиться
Для просмотра всех математических функциональных блоков в библиотеке HDLMathLib откройте библиотеку с помощью следующей команды.
open_system('HDLMathLib')

С портами управления можно просмотреть различные математические функциональные блоки. Блоки Sqrt, Atan2, SinCos, Revacal и Divide описаны на примере в следующих разделах. Можно использовать блоки sin, cos, Cos + jsin в модели таким же образом, обратившись к нижеприведенным разделам.
Каждый порт блока Sqrt описан ниже.
При открытии блока Sqrt для данных и допустимых строк используются функциональные блоки MATLAB. Это показано ниже.
open_system('hdlcoder_sqrt_bitset_control') open_system('hdlcoder_sqrt_bitset_control/Sqrt')

В этом разделе показано, как реализовать пример с использованием блока квадратного корня на основе управляющего сигнала и сформировать код HDL с помощью Coder™ HDL.
Перед открытием модели задайте входные данные следующим образом. Можно задать различные параметры ввода в соответствии с требованиями. В этом примере используются следующие входные данные, которые являются линейными.
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 с опорными выходными данными. Для получения опорных выходных данных используйте 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'...
### 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 на устройствах Xilinx Virtex 7 и intel Stratix V.
Каждый порт блока Atan2 описан ниже.
Блок Atan2 имеет число итераций в качестве параметра маски. Значение по умолчанию - 11, а задержка зависит от этого маскированного параметра.
При открытии блока Atan2 для данных и допустимых строк используются функциональные блоки MATLAB. Это показано ниже.
open_system('hdlcoder_atan2_control') open_system('hdlcoder_atan2_control/Atan2') open_system('hdlcoder_atan2_control/Atan2','force')

В этом разделе показано, как реализовать пример, используя блок Atan2 на основе управляющего сигнала, и генерировать код ЛПВП с помощью Coder™ ЛПВП.
Перед открытием модели задайте входные данные следующим образом. Можно задать различные параметры ввода в соответствии с требованиями. В этом примере используются следующие входные данные, которые являются линейными и сдвигаются через входные значения от -pi до pi.
input_values = (-pi:.01/(2*pi):pi)'; RADIUS = 10.^(-2.5:.25:0);
Укажите длину слова для типов данных с фиксированной точкой и задержку конвейера для модели. Ознакомьтесь с документацией по расчету задержек. Задержка зависит от количества итераций.
WL_atan2 = 18; latency_atan2 = 14;
Настройка переменных для регистрации входных значений 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 с опорными выходными данными. Для получения опорных выходных данных используйте функцию 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'...
### 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 на устройствах Xilinx Virtex 7 и intel Stratix V.
Каждый порт блока SinCos описан ниже.
Блок SinCos имеет количество итераций в качестве параметра маски. Значение по умолчанию - 11, а задержка зависит от этого маскированного параметра.
При открытии блока SinCos для данных и допустимых строк используются функциональные блоки MATLAB. Это показано ниже.
open_system('hdlcoder_sincos_control') open_system('hdlcoder_sincos_control/SinCos') open_system('hdlcoder_sincos_control/SinCos','force')

В этом разделе показано, как реализовать пример с использованием блока SinCos на основе управляющего сигнала и генерировать код HDL с помощью Coder™ HDL.
Перед открытием модели задайте входные данные следующим образом. Можно задать различные параметры ввода в соответствии с требованиями. В этом примере используются следующие входные данные, которые являются линейными и сдвигаются через входные значения от -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 с опорными выходными данными. Для получения опорных выходных данных используйте функцию 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, сохраненные в модели, с помощью 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 на устройствах Xilinx Virtex 7 и intel Stratix V.
Каждый порт блока возвратно-поступательного движения описан ниже.
При открытии блока Взаимность для данных и допустимых строк используются функциональные блоки MATLAB. Это показано ниже.
open_system('hdlcoder_reciprocal_shiftadd_control') open_system('hdlcoder_reciprocal_shiftadd_control/Reciprocal')

В этом разделе показано, как реализовать пример с использованием обратного блока на основе управляющего сигнала и генерировать код ЛПВП с использованием Coder™ ЛПВП.
Перед открытием модели задайте входные данные следующим образом. Можно задать различные параметры ввода в соответствии с требованиями. В этом примере используются следующие входные данные, которые являются линейными.
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 с опорными выходными данными. Для получения опорных выходных данных используйте 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'...
### 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.
На следующих диаграммах показана производительность синтеза блока обратной связи на устройствах Xilinx Virtex 7 и intel Stratix V.
Каждый порт блока разделения описан ниже.
При открытии блока Разделить для данных и допустимых строк используются функциональные блоки MATLAB. Это показано ниже.
open_system('hdlcoder_divide_shiftadd_control') open_system('hdlcoder_divide_shiftadd_control/Divide')

В этом разделе показано, как реализовать пример с использованием блока Divide на основе управляющего сигнала и сформировать код HDL с помощью Coder™ HDL.
Перед открытием модели задайте входные данные следующим образом. Можно задать различные параметры ввода в соответствии с требованиями. В этом примере используются следующие входные данные, которые являются линейными.
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 с опорными выходными данными. Для получения опорных выходных данных используйте 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'...
### 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.