Main Content

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

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

HDL Coder™ の HDLMathLib には、制御信号ベースの固定小数点数学関数をもつブロックがあります。この例では、Sqrt、Atan2、SinCos、Reciprocal、Divide など、制御端子をもつさまざまな数学関数ブロックを実装する方法を示します。

HDLMathLib には、制御端子をもつ次のブロックが含まれています。

  • Sqrt

  • Atan2

  • Sin

  • Cos

  • SinCos

  • Cos+jSin

  • Reciprocal

  • Divide

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

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

open_system('HDLMathLib')

ブロック パラメーター

HDL 数学ライブラリのブロックについて、[ブロック パラメーター] ダイアログ ボックスで次のパラメーターを設定できます。

Latency Strategy - レイテンシ手法を選択

  • 設計内のブロックを MAX、CUSTOM、または ZERO のいずれのレイテンシにマッピングするかを指定します。LatencyStrategyも参照してください。

  • : [Max] (既定)、[Custom]、[Zero]

Custom latency - カスタム レイテンシ値を指定

  • [Latency Strategy]Custom に設定する場合、このプロパティを使用して ZERO から MAX のレイテンシまでの範囲でカスタム レイテンシ値を指定します。CustomLatencyも参照してください。

  • : '0' (既定)

出力データ型 - 出力データ型を選択

  • 出力データ型を指定します。データ型は継承するか直接指定できます。このパラメーターは、Sqrt、Divide、および Reciprocal のブロックにのみ使用できます。

  • : [継承: 内部ルールによる継承]、[継承: 逆伝播による継承]、[継承: 1 番目の入力と同じ]、[double]、[single]、[half]、[int8]、[uint8]、[int16]、[uint16]、[int32]、[uint32]、[int64]、[uint64]、[fixdt(1,16,0)]、[fixdt(1,16,2^0,0)]、[fixdt(1,16,2^0,0)]、<データ型式>

  • 制限: half、single、double などの浮動小数点データ型は HDL コード生成でサポートされません。

整数オーバーフローで飽和 - 整数オーバーフローが発生したときの動作を選択

  • オーバーフローで飽和するかラップするかを指定します。このチェック ボックスをオンにすると、オーバーフローはデータ型で表現できる最小値または最大値のいずれかに飽和します。このパラメーターは、Sqrt、Divide、および Reciprocal のブロックにのみ使用できます。

  • : 'オン' (既定)、'オフ'

整数丸めモード - 丸めモードを選択

  • 丸めモードを指定します。このパラメーターは、Sqrt、Divide、および Reciprocal のブロックにのみ使用できます。

  • : [ゼロ方向] (既定)、[正方向]、[最も近い偶数方向]、[負方向]、[最も近い正の整数方向]、[最も近い整数方向]、[最も簡潔]

  • 制限: HDL コード生成では、HDL 数学ライブラリのブロックの丸めモードについて次の制限があります。

  1. Sqrt ブロックでは、[最も近い偶数方向] モードと [最も近い整数方向] モードはサポートされません。

  2. Divide ブロックでは、[ゼロ方向] モードと [最も簡潔] モードのみがサポートされます。

  3. Reciprocal ブロックでは、[ゼロ方向] モードのみがサポートされます。

Number of iterations - 使用する反復回数

  • CORDIC アルゴリズムを実行する反復回数を指定します。既定値は 11 です。このパラメーターは、Sin、Cos、SinCos、Cos+jSin、および Atan2 のブロックに使用できます。

  • : '11' (既定)

制御信号をもつ 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');

% Set Sqrt HDL parameters
hdlset_param('hdlcoder_sqrt_bitset_control/Sqrt/Sqrt', 'LatencyStrategy', 'Max');

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' can improve the achievable clock frequency and reduce the area usage on FPGA boards. To enable adaptive pipelining, please set the option to 'On'. When adaptive pipelining is enabled, it inserts pipeline registers to create patterns that efficiently map blocks to DSP units on the target FPGA device.
### <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/Bdoc22a_1862740_191983/tp528b3a8d/ex55107189/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/Bdoc22a_1862740_191983/tp528b3a8d/ex55107189/hdl_prj/hdlsrc/hdlcoder_sqrt_bitset_control/Sqrt_report.html
### HDL check for 'hdlcoder_sqrt_bitset_control' complete with 0 errors, 1 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/Atan2', 'Architecture', 'Cordic');

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' can improve the achievable clock frequency and reduce the area usage on FPGA boards. To enable adaptive pipelining, please set the option to 'On'. When adaptive pipelining is enabled, it inserts pipeline registers to create patterns that efficiently map blocks to DSP units on the target FPGA device.
### <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/atan2_cordic_nw as hdl_prj/hdlsrc/hdlcoder_atan2_control/atan2_cordic_nw.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/Bdoc22a_1862740_191983/tp528b3a8d/ex55107189/hdl_prj/hdlsrc/hdlcoder_atan2_control/Atan2_report.html
### HDL check for 'hdlcoder_atan2_control' complete with 0 errors, 1 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.036532e-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/SinCos', 'Architecture', 'Cordic');

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' can improve the achievable clock frequency and reduce the area usage on FPGA boards. To enable adaptive pipelining, please set the option to 'On'. When adaptive pipelining is enabled, it inserts pipeline registers to create patterns that efficiently map blocks to DSP units on the target FPGA device.
### <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/SinCos_cordic_nw as hdl_prj/hdlsrc/hdlcoder_sincos_control/SinCos_cordic_nw.vhd.
### Working on hdlcoder_sincos_control/SinCos as hdl_prj/hdlsrc/hdlcoder_sincos_control/SinCos.vhd.
### Code Generation for 'hdlcoder_sincos_control' completed.
### Creating HDL Code Generation Check Report file:///tmp/Bdoc22a_1862740_191983/tp528b3a8d/ex55107189/hdl_prj/hdlsrc/hdlcoder_sincos_control/SinCos_report.html
### HDL check for 'hdlcoder_sincos_control' complete with 0 errors, 1 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' can improve the achievable clock frequency and reduce the area usage on FPGA boards. To enable adaptive pipelining, please set the option to 'On'. When adaptive pipelining is enabled, it inserts pipeline registers to create patterns that efficiently map blocks to DSP units on the target FPGA device.
### <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/Bdoc22a_1862740_191983/tp528b3a8d/ex55107189/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/Bdoc22a_1862740_191983/tp528b3a8d/ex55107189/hdl_prj/hdlsrc/hdlcoder_reciprocal_shiftadd_control/Reciprocal_report.html
### HDL check for 'hdlcoder_reciprocal_shiftadd_control' complete with 0 errors, 1 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' can improve the achievable clock frequency and reduce the area usage on FPGA boards. To enable adaptive pipelining, please set the option to 'On'. When adaptive pipelining is enabled, it inserts pipeline registers to create patterns that efficiently map blocks to DSP units on the target FPGA device.
### <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/Bdoc22a_1862740_191983/tp528b3a8d/ex55107189/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/Bdoc22a_1862740_191983/tp528b3a8d/ex55107189/hdl_prj/hdlsrc/hdlcoder_divide_shiftadd_control/Divide_report.html
### HDL check for 'hdlcoder_divide_shiftadd_control' complete with 0 errors, 1 warnings, and 2 messages.
### HDL code generation complete.

Divide ブロックの合成性能

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