このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
MATLAB から HDL へのワークフロー入門
この例では、HDL Coder™ プロジェクトを作成し、MATLAB® 設計からコードを生成する方法を説明します。この例では次を行います。
MATLAB HDL Coder プロジェクトを作成します。
設計およびテスト ベンチ ファイルをプロジェクトに追加します。
MATLAB 設計の HDL ワークフロー アドバイザーを起動します。
固定小数点変換と 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
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 コード生成の実行
[ワークフロー アドバイザー] ボタンをクリックして HDL ワークフロー アドバイザーを開始します。
[HDL コード生成] タスクを右クリックして [選択したタスクまで実行] を選択します。
コード ジェネレーターはワークフロー アドバイザー タスクを実行してフィルター設計の HDL コードを生成します。
浮動小数点 MATLAB 設計を固定小数点設計に変換します。浮動小数点設計から生成された固定小数点コードを確認するには、[固定小数点の変換] タスクをクリックします。生成された固定小数点 MATLAB コードが MATLAB エディターで開きます。詳細については、浮動小数点から固定小数点への変換を参照してください。
固定小数点 MATLAB 設計から HDL コードを生成します。既定では、HDL Coder で VHDL® コードが生成されます。生成された HDL コードを確認するには、[HDL コード生成] タスクをクリックして、コード生成ログのウィンドウの
mlhdlc_sfir_fixpt.vhd
へのハイパーリンクをクリックします。Verilog® コードを生成するには、[HDL コード生成] タスクで [詳細設定] タブを選択し、[言語] をVerilog
に設定します。詳細について、およびコード生成オプションを指定する方法については、MATLAB から HDL コードと合成へを参照してください。