Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

MATLAB から HDL へのワークフロー入門

この例では、HDL Coder™ プロジェクトを作成し、MATLAB® 設計からコードを生成する方法を説明します。この例では次を行います。

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

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

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

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

FIR フィルター MATLAB 設計

MATLAB 設計の mlhdlc_sfir は、単純な対称 FIR フィルターです。

design_name = 'mlhdlc_sfir';
testbench_name = 'mlhdlc_sfir_tb';

MATLAB 設計を確認します。

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

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

サンプル ファイルを一時フォルダーにコピーするには、次のコマンドを実行します。

design_name = 'mlhdlc_sfir';
testbench_name = 'mlhdlc_sfir_tb';
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_sfir'];

一時フォルダーを作成して MATLAB ファイルをコピーします。

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 プロジェクトの作成

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 コード生成の実行

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

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

コード ジェネレーターはワークフロー アドバイザー タスクを実行してフィルター設計の HDL コードを生成します。手順は次のとおりです。

  • 浮動小数点 MATLAB 設計を固定小数点設計に変換します。浮動小数点設計から生成された固定小数点コードを確認するには、[固定小数点の変換] タスクをクリックします。生成された固定小数点 MATLAB コードが MATLAB エディターで開きます。詳細については、Floating-Point to Fixed-Point Conversionを参照してください。

  • 固定小数点 MATLAB 設計から HDL コードを生成します。既定では、HDL Coder で VHDL コードが生成されます。生成された HDL コードを確認するには、[HDL コード生成] タスクをクリックして、コード生成ログのウィンドウの mlhdlc_sfir_fixpt.vhd へのハイパーリンクをクリックします。Verilog コードを生成するには、[HDL コード生成] タスクで [詳細設定] タブを選択し、[言語]Verilog に設定します。詳細について、およびコード生成オプションを指定する方法については、Floating-Point to Fixed-Point Conversionを参照してください。

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

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

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