Main Content

浮動小数点から固定小数点への変換

この例では、MATLAB® で浮動小数点設計を開始し、MATLAB で効率的な固定小数点設計に収束するまで反復処理してから、生成された固定小数点設計の数値精度を検証する方法を示します。

再構成可能なプラットフォーム用の信号処理アプリケーションには、一般に浮動小数点演算を使用して指定されるアルゴリズムが必要です。しかし、電力、コスト、パフォーマンスの理由から、DSP コアについてはソフトウェアで、FPGA では特殊用途のハードウェアとして、通常は固定小数点演算で実装されます。固定小数点の変換は非常に難しく、時間がかかることがあり、一般に設計と実装にかかる合計時間の 25 ~ 50 パーセントを占めます。自動化ツールを使用すると、変換プロセスが簡単になり、時間を短縮できます。

ソフトウェア実装の場合、与えられた計算精度の制約の中でコード サイズと実行時間を最小化する、最適化された固定小数点の仕様を定義することが目標になります。この最適化は、ターゲット プロセッサでサポートされるそれぞれのデータ型に応じて、2 進小数点の位置の変更 (スケーリング用) とデータの語長の選択を行うことで達成されます。

ハードウェア実装の場合、アーキテクチャ全体を最適化できます。実装が効率的であれば、使用面積と電力消費の両方が最小化されます。そのため、変換プロセスの目標は、通常は演算子の語長を最小化することが中心になります。

浮動小数点から固定小数点へのワークフローは、MATLAB から HDL へのワークフロー入門で説明されているように、現在は HDL ワークフロー アドバイザーに統合されています。

はじめに

HDL Coder™ の浮動小数点から固定小数点への変換ワークフローには次の手順が含まれます。

  1. 浮動小数点設計がコード生成と互換性があることを確認する。

  2. テストベンチのシミュレーションに基づいて固定小数点型を計算する。

  3. 推奨された型を適用して、読み取りおよび追跡が可能な固定小数点 MATLAB コードを生成する。

  4. 生成された固定小数点設計を検証する。

  5. 生成された固定小数点コードの数値精度を元の浮動小数点コードと比較する。

MATLAB 設計

この例で使用する MATLAB コードはシンプルな 2 次直接型 2 転置フィルターです。この例には、このフィルターを使用する MATLAB テストベンチも含まれています。

design_name = 'mlhdlc_df2t_filter';
testbench_name = 'mlhdlc_df2t_filter_tb';

MATLAB 設計を調べます。

type(design_name);
%#codegen
function y = mlhdlc_df2t_filter(x)

%   Copyright 2011-2015 The MathWorks, Inc.

persistent z;
if isempty(z)
    % Filter states as a column vector
    z = zeros(2,1);
end

% Filter coefficients as constants
b = [0.29290771484375   0.585784912109375  0.292907714843750];
a = [1.0                0.0                0.171600341796875];

y    =  b(1)*x + z(1);
z(1) = (b(2)*x + z(2)) - a(2) * y;
z(2) =  b(3)*x - a(3) * y;

end

浮動小数点から固定小数点へのワークフローでは、完全なテストベンチを用意することが推奨されます。推奨された固定小数点データ型の品質は、テストベンチが設計のダイナミック レンジを適切な精度でどれだけカバーできるかによって異なります。

浮動小数点設計とテストベンチの要件の詳細については、生成された固定小数点ファイルの操作の「浮動小数点設計の構造」の節を参照してください。

type(testbench_name);

%

%   Copyright 2011-2015 The MathWorks, Inc.


Fs = 256;              % Sampling frequency
Ts = 1/Fs;             % Sample time
t = 0:Ts:1-Ts;         % Time vector from 0 to 1 second
f1 = Fs/2;             % Target frequency of chirp set to Nyquist
in = sin(pi*f1*t.^2);  % Linear chirp from 0 to Fs/2 Hz in 1 second
out = zeros(size(in)); % Output the same size as the input

for ii=1:length(in)
    out(ii) = mlhdlc_df2t_filter(in(ii));
end

% Plot
figure('Name', [mfilename, '_plot']);
subplot(2,1,1);
plot(in);
xlabel('Time')
ylabel('Amplitude')
title('Input Signal (with Noise)')

subplot(2,1,2);
plot(out);
xlabel('Time')
ylabel('Amplitude')
title('Output Signal (filtered)')

新規フォルダーの作成と関連ファイルのコピー

次のコードを実行して、必要なサンプル ファイルを一時フォルダーにコピーします。

mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_flt2fix_prj'];

% create a temporary folder and copy the MATLAB files
cd(tempdir);
[~, ~, ~] = rmdir(mlhdlc_temp_dir, 's');
mkdir(mlhdlc_temp_dir);
cd(mlhdlc_temp_dir);

copyfile(fullfile(mlhdlc_demo_dir, [design_name,'.m*']), mlhdlc_temp_dir);
copyfile(fullfile(mlhdlc_demo_dir, [testbench_name,'.m*']), mlhdlc_temp_dir);

設計のシミュレーション

コードの生成前にテスト ベンチを使用して設計をシミュレートし、実行時エラーがないことを確認します。

mlhdlc_df2t_filter_tb

HDL Coder プロジェクトの新規作成

新しいプロジェクトを作成するには、次のコマンドを入力します。

coder -hdlcoder -new flt2fix_project

次に、'mlhdlc_filter.m' ファイルを [MATLAB 関数] としてプロジェクトに追加し、'mlhdlc_filter_tb.m' を [MATLAB テスト ベンチ] として追加します。

MATLAB HDL Coder プロジェクトの作成と入力に関する詳細なチュートリアルについては、MATLAB から HDL へのワークフロー入門を参照してください。

固定小数点コード生成ワークフロー

浮動小数点から固定小数点への変換ワークフローでは以下を実行できます。

  • 浮動小数点設計がコード生成に適合していることを確認する

  • シミュレーション データと語長の設定に基づいて固定小数点型を推奨する

  • 推奨された固定小数点型をユーザーが手動で調整できるように許可する

  • 推奨された固定小数点型を検証する

  • 生成された固定小数点 MATLAB コードが目的の数値精度になっていることを確認する

手順 1: ワークフロー アドバイザーを起動します。

  1. [ワークフロー アドバイザー] ボタンをクリックして HDL ワークフロー アドバイザーを起動します。

  2. [固定小数点の変換] オプションで [ビルド時に固定小数点に変換] を選択します。

手順 2: 入力タイプの定義

この手順では、入力の型を手動で定義するか、テストベンチを指定して実行することで定義できます。

  1. [実行] をクリックして、この手順を実行します。

シミュレーション後に確認すると、入力変数 x が double 型のスカラー double(1x1) として定義されていることがわかります。

手順 3: シミュレーションの実行

  1. [固定小数点の変換] の手順をクリックします。

前の手順で定義した入力の型で設計がコンパイルされ、コンパイルが正常に完了すると、設計内のすべての関数に対する推定された型が変数テーブルに表示されます。

この手順では、シミュレーション中に設計内のすべての変数の最小値と最大値が収集されるように、元の設計がインストルメント化されます。

  1. [解析] ボタンをクリックします。

テーブルの [シミュレーションの最小値] と [シミュレーションの最大値] にシミュレーション範囲が取り込まれていることがわかります。固定小数点型は、既定の語長の設定に基づいて推奨されます。

この段階で、すべての変数に対する計算されたシミュレーション範囲に基づいて以下を計算できます。

  • 語長を固定の設定としたときの対応する小数部の長さ。

  • 小数部の長さを固定の設定としたときの対応する語長。

型のテーブルには、浮動小数点 MATLAB 設計に存在するそれぞれの変数について、以下の情報が関数別にまとめて表示されます。

  • シミュレーションの最小値: シミュレーション中に変数に代入される最小値。

  • シミュレーションの最大値: シミュレーション中に変数に代入される最大値。

  • 0 または正の整数: シミュレーション中に代入される値がすべて整数かどうか。

型の推奨手順では、上記の情報をユーザーが指定した語長の設定と組み合わせて使用して、各変数の固定小数点型を推奨します。

[解析] ボタンのドロップダウン メニューで [ヒストグラム データを記録] オプションを有効にして、ヒストグラム データの記録を有効にすることもできます。

ヒストグラムの表示では、変数に対するシミュレーション データのダイナミック レンジに関する情報が簡潔に示されます。x 軸はビットの重みに対応し、y 軸は出現回数を表します。このグラフに推奨された数値型の情報が重ねて表示され、ここで情報を編集できます。白い境界ボックスを左右に動かすと、2 進小数点の位置が変わります。左右の端を動かすと、それに応じて小数部の長さまたは語長が変わります。推奨された型に対する変更は、プロジェクトにすべて保存されます。

手順 4: 型の検証

この手順では、前の手順の固定小数点型を使用して、元の浮動小数点実装から固定小数点 MATLAB 設計を生成します。

  1. [型の検証] ボタンをクリックします。

生成されたコードとその他の変換アーティファクトが、出力ウィンドウにハイパーリンク付きで表示されます。固定小数点型は、生成された MATLAB コードに明示的に示されています。

手順 5: 数値のテスト

  1. [数値のテスト] ボタンをクリックします。

この手順では、生成された固定小数点コードが MATLAB Coder を使用して実行されます。

[数値のテスト] ペインで [比較プロット用のすべての入力と出力を記録] オプションを有効にすると、それぞれのスカラー出力について、浮動小数点および固定小数点の結果と 2 つの差を表示する追加のプロットが生成されます。非スカラー出力についてはエラー情報のみを示します。

手順 6: 結果に対する反復処理

固定小数点シミュレーション後に数値的な結果が所要の精度を満たさない場合は、ワークフロー アドバイザーの [固定小数点型の推定] の手順に戻ることができます。語長の設定を調整するか、必要に応じて型を個別に変更し、目的の結果が得られるまでワークフローの残りの手順を繰り返します。

生成された固定小数点コードのアルゴリズムを繰り返し実行して数値を調整する方法の詳細については、Fixed-Point Type Conversion and Refinementを参照してください。

生成ファイルのクリーンアップ

プロジェクト用の一時フォルダーをクリーンアップするには、次のコマンドを実行します。

mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_flt2fix_prj'];
clear mex;
cd (mlhdlc_demo_dir);
rmdir(mlhdlc_temp_dir, 's');