メインコンテンツ

HDL Coder アプリを使用した MATLAB から高位合成へのワークフロー入門

この例では、HDL Coder™ プロジェクトを作成し、対称有限インパルス応答 (FIR) フィルターの MATLAB® 設計から高位合成 (HLS) コードを生成する方法を示します。

FIR フィルター MATLAB 設計

MATLAB 設計の mlhdlc_sfir は、単純な対称 FIR フィルターです。ファイル パスにスペースが含まれていないことを確認してください。

design_name = "mlhdlc_sfir";
testbench_name = "mlhdlc_sfir_tb";

設計を確認します。

open(design_name);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MATLAB design: Symmetric FIR Filter
% 
% Introduction:
%
% We can reduce the complexity of the FIR filter by leveraging its symmetry. 
% Symmetry for an n-tap filter implies, coefficient h0 = coefficient hn-1, 
% coefficient, h1 = coefficient hn-2, etc. In this case, the number of 
% multipliers can be approximately halved. The key is to add the 
% two data values that need to be multiplied with the same coefficient 
% prior to performing the multiplication. 
%
% Key Design pattern covered in this example: 
% (1) Filter states represented using the persistent variables
% (2) Filter coefficients passed in as parameters

%   Copyright 2011-2019 The MathWorks, Inc.

%#codegen
function [y_out, delayed_xout] = mlhdlc_sfir(x_in,h_in1,h_in2,h_in3,h_in4)   
% Symmetric FIR Filter

% declare and initialize the delay registers
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

% access the previous value of states/registers
a1 = ud1 + ud8; a2 = ud2 + ud7;
a3 = ud3 + ud6; a4 = ud4 + ud5;

% multiplier chain
m1 = h_in1 * a1; m2 = h_in2 * a2;
m3 = h_in3 * a3; m4 = h_in4 * a4;

% adder chain
a5 = m1 + m2; a6 = m3 + m4;

% filtered output
y_out = a5 + a6;

% delayout input signal
delayed_xout = ud8;

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

FIR フィルター MATLAB テスト ベンチ

MATLAB テスト ベンチ mlhdlc_sfir_tb はフィルター設計をテストします。テスト ベンチを確認します。

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

%   Copyright 2011-2019 The MathWorks, Inc.
clear mlhdlc_sfir;
T = 2;
dt = 0.001;
N = T/dt+1;
sample_time = 0:dt:T;

df = 1/dt;
sample_freq = linspace(-1/2,1/2,N).*df;

% input signal with noise
x_in = cos(2.*pi.*(sample_time).*(1+(sample_time).*75)).';

% filter coefficients
h1 = -0.1339; h2 = -0.0838; h3 = 0.2026; h4 = 0.4064;

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

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_sfir(data, h1, h2, h3, h4);
end

figure('Name', [mfilename, '_plot']);
subplot(3,1,1);
plot(1:len,x_in,'-b');
xlabel('Time (ms)')

ylabel('Amplitude')
title('Input Signal (with noise)')
subplot(3,1,2); plot(1:len,y_out,'-b');
xlabel('Time (ms)')
ylabel('Amplitude')
title('Output Signal (filtered)')

freq_fft = @(x) abs(fftshift(fft(x)));

subplot(3,1,3); semilogy(sample_freq,freq_fft(x_in),'-b');
hold on
semilogy(sample_freq,freq_fft(y_out),'-r')
hold off
xlabel('Frequency (Hz)')
ylabel('Amplitude (dB)')
title('Input and Output Signals (Frequency domain)')
legend({'FilterIn', 'FilterOut'}, 'Location','South')
axis([-500 500 1 100])


MATLAB アルゴリズムのテスト

実行時エラーを避けるために、テスト ベンチを使用して設計をシミュレートします。

mlhdlc_sfir_tb

HDL ワークフロー アドバイザーを使用した HLS コードの生成

HDL ワークフロー アドバイザーを使用して HLS コードを生成する基本的な手順は、以下のとおりです。

  1. MATLAB コマンド ラインで、関数hdlsetuphlstoolpathを使用して HLS コード生成用の高位合成 (HLS) ツール パスを設定します。

  2. MATLAB HDL Coder プロジェクトを作成します。

  3. 設計およびテスト ベンチ ファイルをプロジェクトに追加します。

  4. MATLAB 設計の HDL ワークフロー アドバイザーを起動します。

  5. 固定小数点変換と HLS コード生成を実行します。

HDL Coder プロジェクトの作成とファイルの割り当て

HDL Coder プロジェクトを作成するには、次を行います。

1. MATLAB エディターの [アプリ] タブで [HDL Coder] を選択します。プロジェクトの [名前] として「sfir_project」と入力します。

MATLAB コマンド プロンプトでプロジェクトを作成するには、次のコマンドを実行します。

coder -hdlcoder -new sfir_project

sfir_project.prj ファイルが現在のフォルダーに作成されます。

2. [MATLAB 関数] で、[MATLAB 関数の追加] リンクをクリックして FIR フィルター MATLAB 設計 mlhdlc_sfir を選択します。[MATLAB テスト ベンチ] セクションで、[ファイルの追加] をクリックして MATLAB テスト ベンチ mlhdlc_sfir_tb.m を追加します。

3. [型の自動定義] をクリックして、MATLAB 設計の推奨タイプを使用します。コード ジェネレーターは入力の型を MATLAB テスト ベンチから推定します。

HDL ワークフロー アドバイザーでの固定小数点変換と HLS コード生成の実行

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

2. [HDL ワークフロー アドバイザー] 手順で、[コード生成ワークフロー][MATLAB から HLS] として指定します。

3. 設計で固定小数点の型と関数を使用していない場合は、浮動小数点 MATLAB 設計を固定小数点設計に変換します。浮動小数点設計から生成された固定小数点コードを確認するには、[固定小数点の変換] タスクをクリックします。生成された固定小数点 MATLAB コードが MATLAB エディターで開きます。詳細については、浮動小数点から固定小数点への変換を参照してください。

4. [コード生成ターゲットを選択] 手順で、[ワークフロー][高位合成] として指定し、[合成ツール] を選択します。

5. [HLS コード生成] タスクを右クリックして [選択したタスクまで実行] を選択します。

コード ジェネレーターでワークフロー アドバイザー タスクが実行され、フィルター設計の HLS コードが生成されます。

生成された HLS コードを調べるには、[HLS コード生成] ログ ウィンドウで mlhdlc_sfir_fixptClass.hpp へのハイパーリンクをクリックします。

6. [HDL テスト ベンチによる検証] 手順で、生成された HLS コードの出力を MATLAB コードの出力と比較できます。この手順で、HLS テスト ベンチ ファイルの生成と Cadence Stratus プロジェクトの作成も行われます。

7. コード生成プロセスの最後の手順は合成です。[合成を実行] 手順で、生成された HLS コードが HLS ツールを使用して合成され、Verilog コードまたは VHDL コードが生成されます。

HLS コード生成レポート

[HLS コード生成] 手順で、ログ ウィンドウにある [View Report] をクリックしてコード生成レポートを確認できます。

コード生成レポートは以下に役立ちます。

  • コード生成の問題をデバッグし、MATLAB コードがコード生成に適していることを確認する。

  • 生成された HLS コードを表示する。

  • 適合性レポートやリソース利用レポートなどの追加レポートにアクセスする。

  • MATLAB コード内の変数と式の型情報がコード ジェネレーターでどのように決定されて伝播されるかを確認する。

コード ペインで MATLAB 関数を表示するには、[MATLAB ソース] ペインで関数の名前をクリックします。コード ペインでは、変数または式の上で一時停止すると、ツールヒントにそのサイズ、型および実数/複素数に関する情報が表示されます。

詳細については、HLS Code Generation Reportを参照してください。

制限

  • Cadence Stratus HLS では、HLS コード生成について、ポイントツーポイント (p2p) 通信のみがサポートされています。

  • 複数のスレッドで実行される HLS コードの生成はサポートされていません。

  • System object™ は HLS コード生成ではサポートされていません。

  • 構造体、列挙、およびクラスの配列は、HLS コード生成では、最上位 DUT の端子の入力および出力としてはサポートされていません。

参考