Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

HDL Coder を使用した制御信号ベースの数学関数の実装

このドキュメントでは、HDLMathLib の制御信号ベースの固定小数点数学関数についての概要を示し、HDLMathLib に存在するすべてのブロックに関連する例を HDL Coder™ を使用して紹介します。HDLMathLib には、制御端子をもつ次のブロックが含まれています。

  1. Sqrt

  2. Atan2

  3. Sin

  4. Cos

  5. SinCos

  6. Cos+jSin

  7. Reciprocal

  8. Divide

数学関数用の制御端子をもつ HDLMathLib ライブラリ

HDLMathLib ライブラリのすべての数学関数ブロックを確認するには、次のコマンドを使用してライブラリを開きます。

open_system('HDLMathLib')

制御端子をもつ各種の数学関数ブロックが表示されます。以下の節では、Sqrt、Atan2、SinCos、Reciprocal、および Divide の各ブロックについて例と共に説明します。Sin、Cos、Cos+jSin の各ブロックについても、以下の節を参考に同じようにモデルで使用できます。

制御信号を持つ Sqrt ブロック

Sqrt ブロックの各端子の説明は次のとおりです。

Sqrt ブロックを開くと、data と valid の線に MATLAB Function ブロックが使用されています。これを以下に示します。

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

制御信号ベースの Sqrt ブロックの使用例

この節では、制御信号ベースの Square Root ブロックを使用する例を実装し、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 

Square Root 実装の HDL コードの生成

コードを生成する前に、関数 hdlsaveparams を使用して、モデルに保存されている HDL 設定を確認できます。

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

モデルの Sqrt ブロックの HDL コードを生成するには、関数 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'...
### <a href="matlab:configset.internal.open('hdlcoder_sqrt_bitset_control','AdaptivePipelining')">'AdaptivePipelining'</a> is set to 'Off' for the model. 'AdaptivePipelining' inserts pipeline registers at input or output or both ports of certain blocks to create patterns that efficiently map blocks to DSP units on the target FPGA device. To enable adaptive pipelining, please set the option to 'On'.
### <a href="matlab:configset.internal.open('hdlcoder_sqrt_bitset_control','LUTMapToRAM')">'LUTMapToRAM'</a> is set to 'On' for the model. This option is used to map lookup tables to a block RAM in hardware.  To disable pipeline insertion for mapping lookup tables to RAM, please set the option to 'Off'.
### 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/Bdoc21a_1695482_244693/tp5bec6a6a/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/Bdoc21a_1695482_244693/tp5bec6a6a/hdl_prj/hdlsrc/hdlcoder_sqrt_bitset_control/Sqrt_report.html
### HDL check for 'hdlcoder_sqrt_bitset_control' complete with 0 errors, 0 warnings, and 2 messages.
### HDL code generation complete.

Sqrt ブロックの合成性能

次の図は、Xilinx Virtex 7 デバイスと Intel Stratix V デバイスにおける Sqrt ブロックの合成性能を示しています。

制御信号を持つ Atan2 ブロック

Atan2 ブロックの各端子の説明は次のとおりです。

Atan2 ブロックには、反復回数のマスク パラメーターがあります。既定値は 11 で、このマスク パラメーターによってレイテンシが決まります。

Atan2 ブロックを開くと、data と valid の線に MATLAB Function ブロックが使用されています。これを以下に示します。

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

制御信号ベースの Atan2 ブロックの使用例

この節では、制御信号ベースの Atan2 ブロックを使用する例を実装し、HDL Coder™ を使用して HDL コードを生成する方法を示します。

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 を開き、すべての入力の組み合わせを処理するために必要な十分な終了時間を指定します。モデルには、CORDIC アルゴリズムを validIn 制御信号に使用して Atan2 を実装する Atan2 ブロックがあります。

stoptime_atan2 = length(x_log)-1+latency_atan2;
close all
open_system('hdlcoder_atan2_control')
sim('hdlcoder_atan2_control')

上記のモデルをシミュレートすると、次のような波形が表示されます。dataOut が有効なのは validOut が高いときであることがわかります。

基準出力を使用した Simulink の出力の検証

Simulink モデルをシミュレートして得られた出力を検証するために、Simulink の出力を基準出力と比較できます。基準出力の取得には、MATLAB 関数 atan2 を使用します。

関数 atan2 を使用して基準出力を計算します。比較結果から観測される最大誤差がかなり小さいことがわかります。

comparison_plot_atan2(atan2(y_log,x_log),sim_final_theta(valid_out),3,'theta');
Maximum Error theta 7.233221e-03 

Atan2 実装の HDL コードの生成

コードを生成する前に、関数 hdlsaveparams を使用して、モデルに保存されている HDL 設定を確認できます。

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

モデルの Atan2 ブロックの HDL コードを生成するには、関数 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'...
### <a href="matlab:configset.internal.open('hdlcoder_atan2_control','AdaptivePipelining')">'AdaptivePipelining'</a> is set to 'Off' for the model. 'AdaptivePipelining' inserts pipeline registers at input or output or both ports of certain blocks to create patterns that efficiently map blocks to DSP units on the target FPGA device. To enable adaptive pipelining, please set the option to 'On'.
### <a href="matlab:configset.internal.open('hdlcoder_atan2_control','LUTMapToRAM')">'LUTMapToRAM'</a> is set to 'On' for the model. This option is used to map lookup tables to a block RAM in hardware.  To disable pipeline insertion for mapping lookup tables to RAM, please set the option to 'Off'.
### 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/Bdoc21a_1695482_244693/tp5bec6a6a/hdl_prj/hdlsrc/hdlcoder_atan2_control/Atan2_report.html
### HDL check for 'hdlcoder_atan2_control' complete with 0 errors, 0 warnings, and 2 messages.
### HDL code generation complete.

Atan2 ブロックの合成性能

次の図は、Xilinx Virtex 7 デバイスと Intel Stratix V デバイスにおける Atan2 ブロックの合成性能を示しています。

制御信号を持つ SinCos ブロック

SinCos ブロックの各端子の説明は次のとおりです。

SinCos ブロックには、反復回数のマスク パラメーターがあります。既定値は 11 で、このマスク パラメーターによってレイテンシが決まります。

SinCos ブロックを開くと、data と valid の線に MATLAB Function ブロックが使用されています。これを以下に示します。

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 を開き、すべての入力の組み合わせを処理するために必要な十分な終了時間を指定します。モデルには、CORDIC アルゴリズムを validIn 制御信号に使用して SinCos を実装する SinCos ブロックがあります。残りの三角関数ブロック (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 の出力を基準出力と比較できます。基準出力の取得には、MATLAB 関数 sin および cos を使用します。

関数 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 

SinCos 実装の HDL コードの生成

コードを生成する前に、関数 hdlsaveparams を使用して、モデルに保存されている HDL 設定を確認できます。

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

モデルの SinCos ブロックの HDL コードを生成するには、関数 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'...
### <a href="matlab:configset.internal.open('hdlcoder_sincos_control','AdaptivePipelining')">'AdaptivePipelining'</a> is set to 'Off' for the model. 'AdaptivePipelining' inserts pipeline registers at input or output or both ports of certain blocks to create patterns that efficiently map blocks to DSP units on the target FPGA device. To enable adaptive pipelining, please set the option to 'On'.
### <a href="matlab:configset.internal.open('hdlcoder_sincos_control','LUTMapToRAM')">'LUTMapToRAM'</a> is set to 'On' for the model. This option is used to map lookup tables to a block RAM in hardware.  To disable pipeline insertion for mapping lookup tables to RAM, please set the option to 'Off'.
### 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/Bdoc21a_1695482_244693/tp5bec6a6a/hdl_prj/hdlsrc/hdlcoder_sincos_control/SinCos_report.html
### HDL check for 'hdlcoder_sincos_control' complete with 0 errors, 0 warnings, and 3 messages.
### HDL code generation complete.

SinCos ブロックの合成性能

次の図は、Xilinx Virtex 7 デバイスと Intel Stratix V デバイスにおける SinCos ブロックの合成性能を示しています。

制御信号を持つ Reciprocal ブロック

Reciprocal ブロックの各端子の説明は次のとおりです。

Reciprocal ブロックを開くと、data と valid の線に MATLAB Function ブロックが使用されています。これを以下に示します。

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

制御信号ベースの Reciprocal ブロックの使用例

この節では、制御信号ベースの Reciprocal ブロックを使用する例を実装し、HDL Coder™ を使用して HDL コードを生成する方法を示します。

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 

Reciprocal 実装の HDL コードの生成

コードを生成する前に、関数 hdlsaveparams を使用して、モデルに保存されている HDL 設定を確認できます。

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

モデルの Reciprocal ブロックの HDL コードを生成するには、関数 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'...
### <a href="matlab:configset.internal.open('hdlcoder_reciprocal_shiftadd_control','AdaptivePipelining')">'AdaptivePipelining'</a> is set to 'Off' for the model. 'AdaptivePipelining' inserts pipeline registers at input or output or both ports of certain blocks to create patterns that efficiently map blocks to DSP units on the target FPGA device. To enable adaptive pipelining, please set the option to 'On'.
### <a href="matlab:configset.internal.open('hdlcoder_reciprocal_shiftadd_control','LUTMapToRAM')">'LUTMapToRAM'</a> is set to 'On' for the model. This option is used to map lookup tables to a block RAM in hardware.  To disable pipeline insertion for mapping lookup tables to RAM, please set the option to 'Off'.
### 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/Bdoc21a_1695482_244693/tp5bec6a6a/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/Bdoc21a_1695482_244693/tp5bec6a6a/hdl_prj/hdlsrc/hdlcoder_reciprocal_shiftadd_control/Reciprocal_report.html
### HDL check for 'hdlcoder_reciprocal_shiftadd_control' complete with 0 errors, 0 warnings, and 2 messages.
### HDL code generation complete.

Reciprocal ブロックの合成性能

次の図は、Xilinx Virtex 7 デバイスと Intel Stratix V デバイスにおける Reciprocal ブロックの合成性能を示しています。

制御信号を持つ Divide ブロック

Divide ブロックの各端子の説明は次のとおりです。

Divide ブロックを開くと、data と valid の線に MATLAB Function ブロックが使用されています。これを以下に示します。

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

制御信号ベースの 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 

Divide 実装の HDL コードの生成

コードを生成する前に、関数 hdlsaveparams を使用して、モデルに保存されている HDL 設定を確認できます。

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

モデルの Divide ブロックの HDL コードを生成するには、関数 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'...
### <a href="matlab:configset.internal.open('hdlcoder_divide_shiftadd_control','AdaptivePipelining')">'AdaptivePipelining'</a> is set to 'Off' for the model. 'AdaptivePipelining' inserts pipeline registers at input or output or both ports of certain blocks to create patterns that efficiently map blocks to DSP units on the target FPGA device. To enable adaptive pipelining, please set the option to 'On'.
### <a href="matlab:configset.internal.open('hdlcoder_divide_shiftadd_control','LUTMapToRAM')">'LUTMapToRAM'</a> is set to 'On' for the model. This option is used to map lookup tables to a block RAM in hardware.  To disable pipeline insertion for mapping lookup tables to RAM, please set the option to 'Off'.
### 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/Bdoc21a_1695482_244693/tp5bec6a6a/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/Bdoc21a_1695482_244693/tp5bec6a6a/hdl_prj/hdlsrc/hdlcoder_divide_shiftadd_control/Divide_report.html
### HDL check for 'hdlcoder_divide_shiftadd_control' complete with 0 errors, 0 warnings, and 2 messages.
### HDL code generation complete.

Divide ブロックの合成性能

次の図は、Xilinx Virtex 7 デバイスと Intel Stratix V デバイスにおける Divide ブロックの合成性能を示しています。