exponenta event banner

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

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

  1. Sqrt

  2. Atan2

  3. Грех

  4. Cos

  5. SinCos

  6. Cos + jSin

  7. Взаимный

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

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

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

open_system('HDLMathLib')

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

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

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

При открытии блока Sqrt для данных и допустимых строк используются функциональные блоки MATLAB. Это показано ниже.

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

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

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

Открыть и запустить модель 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. Это показано ниже.

open_system('hdlcoder_atan2_control')
open_system('hdlcoder_atan2_control/Atan2')
open_system('hdlcoder_atan2_control/Atan2','force')

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

В этом разделе показано, как реализовать пример, используя блок Atan2 на основе управляющего сигнала, и генерировать код ЛПВП с помощью Coder™ ЛПВП.

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

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

open_system('hdlcoder_sincos_control')
open_system('hdlcoder_sincos_control/SinCos')
open_system('hdlcoder_sincos_control/SinCos','force')

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

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

Открыть и запустить модель 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.

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

Каждый порт блока возвратно-поступательного движения описан ниже.

При открытии блока Взаимность для данных и допустимых строк используются функциональные блоки MATLAB. Это показано ниже.

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

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

В этом разделе показано, как реализовать пример с использованием обратного блока на основе управляющего сигнала и генерировать код ЛПВП с использованием 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.

Производительность синтеза взаимных блоков

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

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

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

При открытии блока Разделить для данных и допустимых строк используются функциональные блоки MATLAB. Это показано ниже.

open_system('hdlcoder_divide_shiftadd_control')
open_system('hdlcoder_divide_shiftadd_control/Divide')

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

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

Открыть и запустить модель 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.