# 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 エディターで開きます。詳細については、浮動小数点から固定小数点への変換を参照してください。

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

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

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

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

### SystemC コード生成レポート

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

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

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

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

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

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

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

### 制限

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

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

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

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