Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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

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

この例の FIR モデルとテスト ベンチを設定します。

mlhdlc_demo_setup('sfir');

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 ワークフロー アドバイザーを使用した SystemC コードの生成

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

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

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

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

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

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

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 ワークフロー アドバイザーでの固定小数点変換と SystemC コード生成の実行

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

2.[HDL ワークフロー アドバイザー] ステップで、[コード生成ワークフロー][MATLAB から SystemC] と指定します。

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

4.[コード生成ターゲットを選択] ステップで、[ワークフロー][高位合成][合成ツール][Cadence Stratus] に指定します。

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

コード ジェネレーターはワークフロー アドバイザー タスクを実行して、フィルター設計の SystemC コードを生成します。

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

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

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

SystemC コード生成レポート

[SystemC コード生成] ステップでは、ログ ウィンドウの View Report をクリックしてコード生成レポートを確認できます。

コード生成レポートを使用すると、次を行うことができます。

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

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

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

  • コード ジェネレーターで MATLAB コード内の変数と式の型情報を判断し、伝播する方法を確認する。

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

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

制限

  • 高位合成ツールとして Cadence Stratus のみがサポートされています。Cadence Stratus は、SystemC コード生成用にポイント ツー ポイント (p2p) 通信のみをサポートします。

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

  • 実数データ型および Systems オブジェクトは SystemC コード生成ではサポートされていません。

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

参考