Main Content

乗算器のリソース共有による面積の削減

この例では、HDL Coder™ でリソース共有最適化を使用する方法を示します。この最適化では、MATLAB® コードに含まれる機能的に等価な乗算器の演算を特定し、設計面積を最適化するためにそれらを共有します。設計で共有する乗算器の数を制御できます。

はじめに

リソース共有は、面積効率の高いハードウェアを実装するために HDL Coder™ でサポートされている設計全体の最適化です。

この最適化を使用すると、ユーザーは N 個の機能的に等価な MATLAB 演算子 (この例では乗算器) を単一の演算子にマッピングしてハードウェア リソースを共有できます。

ユーザーは最適化パネルで Resource Sharing Factor オプションを使用して N を指定します。

次の対称 FIR フィルターのモデル例について考えます。機能的に等価な 4 つの Product ブロックがあり、ハードウェアの 4 つの乗算器にマッピングされています。リソース利用レポートに、設計から推定される乗算器の数が表示されます。

この例では、MATLAB 設計 mlhdlc_sharing で固定小数点変換を実行してから HDL Coder に進みます。この前提条件の手順により、固定小数点コードで使用されているすべての乗算器が正規化されます。この固定小数点変換のフェーズでは、推奨された型の設定を入力します。

MATLAB 設計

この例で使用する MATLAB コードは MATLAB で記述されたシンプルな対称 FIR フィルターであり、このフィルターを使用するテストベンチも含まれています。

design_name = 'mlhdlc_sharing';
testbench_name = 'mlhdlc_sharing_tb';

MATLAB 設計を確認します。

type(design_name);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MATLAB design: Symmetric FIR Filter
% 
% Key Design pattern covered in this example: 
% (1) Filter states represented using the persistent variables
% (2) Filter coefficients passed in as parameters
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%   Copyright 2011-2015 The MathWorks, Inc.

%#codegen
function [y_out, x_out] = mlhdlc_sharing(x_in, h)
% Symmetric FIR Filter

persistent ud1 ud2 ud3 ud4 ud5 ud6 ud7 ud8;
if isempty(ud1)
    ud1 = 0; ud2 = 0; ud3 = 0; ud4 = 0; ud5 = 0; ud6 = 0; ud7 = 0; ud8 = 0;
end

x_out = ud8;


a1 = ud1 + ud8;
a2 = ud2 + ud7;
a3 = ud3 + ud6;
a4 = ud4 + ud5;

% filtered output
y_out = (h(1) * a1 + h(2) * a2) + (h(3) * a3 + h(4) * a4);


% update the delay line
ud8 = ud7; 
ud7 = ud6;
ud6 = ud5;
ud5 = ud4;
ud4 = ud3;
ud3 = ud2;
ud2 = ud1;
ud1 = x_in;

end
type(testbench_name);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MATLAB test bench for the FIR filter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%   Copyright 2011-2015 The MathWorks, Inc.

clear mlhdlc_sharing;
 
% input signal with noise
x_in = cos(3.*pi.*(0:0.001:2).*(1+(0:0.001:2).*75)).';

len = length(x_in);
y_out = zeros(1,len);
x_out = zeros(1,len);

% Define a regular MATLAB constant array:
%
% filter coefficients
h = [-0.1339 -0.0838 0.2026 0.4064];

for ii=1:len
    data = x_in(ii);
    % call to the design 'mlhdlc_sfir' that is targeted for hardware
    [y_out(ii), x_out(ii)] = mlhdlc_sharing(data, h);    
end

figure('Name', [mfilename, '_plot']);
plot(1:len,y_out);

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

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

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

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

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

次のコマンドを実行して新しいプロジェクトを作成します。

coder -hdlcoder -new mlhdlc_sfir_sharing

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

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

乗算器の N 対 1 のマッピングの実現

[リソース共有係数] を正の整数値に設定してリソース共有最適化をオンにします。

このパラメーターは、N 対 1 のハードウェア マッピングにおける N を指定します。N > 1 の値を選択します。

リソース レポートの確認

この例の設計には乗算演算子が 4 つあります。SharingFactor を 4 にして HDL を生成すると、生成されたコードでは乗算器が 1 つだけになります。

共有アーキテクチャ

次の図は、生成されたコードを共有最適化をオンにせずに合成した場合のハードウェアへのアルゴリズムの実装を示しています。

次の図は、共有最適化オプションをオンにした場合に HDL Coder で自動的に実装される共有アーキテクチャを示しています。

共有乗算器への入力が速いレートで時間多重化されます (この例では 4 倍の速さであり、赤で示してあります)。その後、出力がそれぞれのコンシューマーに遅いレートで送られます (緑の部分)。

固定小数点変換と HDL コード生成の実行

ワークフロー アドバイザーを起動して [コード生成] の手順を右クリックします。[選択したタスクまで実行] オプションを選択して、最初から HDL コード生成までのすべての手順を実行します。

詳細な例については、Fixed-Point Type Conversion and Derived Rangesを参照してください。固定小数点変換で型の推奨に関する設定を更新するチュートリアルを提供しています。

語長の異なる乗算器を共有する場合は、HDL コンフィギュレーション パラメーターの [最適化]、[リソース共有] タブで [乗算器拡張のしきい値] を指定することに注意してください。

合成の実行と合成結果の確認

この最適化をオフにした設計とオンにした設計から生成されたコードをそれぞれ合成し、リソース レポートで面積の数値を調べます。

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

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

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