Этот документ дает обзор математических функций на основе управляющего сигнала с фиксированной точкой в HDLMathLib и примеры, сопоставленные со всеми блоками, присутствующими в HDLMathLib, при помощи HDL Coder™. HDLMathLib включает следующие блоки с портами управления.
Sqrt
Atan2
Sin
Cos
SinCos
Cos + jSin
Взаимный
Разделиться
Чтобы увидеть все блоки математических функций в библиотеке HDLMathLib, откройте библиотеку с помощью следующей команды.
open_system('HDLMathLib')
Вы можете увидеть различные математические функциональные блоки с портами управления. Блоки Sqrt, Atan2, SinCos, Returcal и Divide описаны с примером в следующих разделах. Можно использовать блоки sin, cos, Cos + jsin в вашей модели таким же образом, ссылаясь ниже разделы.
Каждый порт блока Sqrt описан ниже.
Когда вы открываете блок Sqrt, он использует блоки MATLAB Function для данных и допустимых линий. Это показано ниже.
open_system('hdlcoder_sqrt_bitset_control') open_system('hdlcoder_sqrt_bitset_control/Sqrt')
В этом разделе показов, как реализовать пример с использованием сигнала управления, основанного Квадратным корнем блоке и генерации HDL-кода при помощи HDL- Coder™.
Перед открытием модели установите вход следующим образом. Вы можете принять решение установить различные входы согласно вашему требованию. Этот пример использует следующие входы, которые являются линейными.
SQRT_input = fi(1/2^17:1/2^17:1,0,18,17)';
Задайте длину слова для типов данных с фиксированной точкой и задержку трубопровода для модели. Пройдите по документации для вычисления задержек.
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 Function для данных и допустимых линий. Это показано ниже.
open_system('hdlcoder_atan2_control') open_system('hdlcoder_atan2_control/Atan2') open_system('hdlcoder_atan2_control/Atan2','force')
В этом разделе показано, как реализовать пример с использованием сигнала управления, основанного на Atan2 блоке, и сгенерировать HDL-код с помощью HDL- Coder™.
Перед открытием модели установите вход следующим образом. Вы можете принять решение установить различные входы согласно вашему требованию. Этот пример использует следующие входы, которые являются линейными и протаскивают входные значения -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 с выходом ссылки. Чтобы получить выход ссылки, используйте функцию 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 Function для данных и допустимых линий. Это показано ниже.
open_system('hdlcoder_sincos_control') open_system('hdlcoder_sincos_control/SinCos') open_system('hdlcoder_sincos_control/SinCos','force')
В этом разделе показано, как реализовать пример с использованием блока SinCos на основе сигналов управления и сгенерировать HDL-код при помощи HDL- Coder™.
Перед открытием модели установите вход следующим образом. Вы можете принять решение установить различные входы согласно вашему требованию. Этот пример использует следующие входы, которые являются линейными и протаскивают входные значения -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.
Каждый порт блока Returcal описан ниже.
Когда вы открываете блок Retrical, он использует блоки MATLAB Function для данных и допустимых линий. Это показано ниже.
open_system('hdlcoder_reciprocal_shiftadd_control') open_system('hdlcoder_reciprocal_shiftadd_control/Reciprocal')
В этом разделе показано, как реализовать пример, используя основанный на сигнале управления Возвратный блок и сгенерировать HDL-код при помощи HDL- 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.
Следующие диграммы показывают эффективность синтеза блоков 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™.
Перед открытием модели установите вход следующим образом. Вы можете принять решение установить различные входы согласно вашему требованию. Этот пример использует следующие входы, которые являются линейными.
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.