最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。
この例では、プログラミング可能 FIR フィルターの HDL コードを生成する方法を示します。ホスト インターフェイスを使用して係数を内部レジスタに読み込むことで、このフィルターを目的の応答にプログラムすることができます。
この例では、1 つのチップ上にそれぞれ応答が異なる複数のフィルターで構成される列を実装します。これらのフィルターすべてに直接形式の FIR 構造があり、長さが同じ場合、必要に応じてホスト インターフェイスを使用して、各応答の係数をレジスタ ファイルに読み込むことができます。
この設計により、入力サンプルを読み込まれた係数で処理できるようになる前に、数サイクル分の遅延が追加されます。ただし、これには同じフィルター ハードウェアを新しい係数でプログラムして、別のフィルター応答を取得できるという利点があります。これにより、チップ領域が節約されます。そうでないと、チップ上に各フィルターを別々に実装することになります。
この例を実行するには、HDL Coder™ ライセンスが必要です。
以下のコマンドを入力して、モデル例を開きます。
modelname = 'dspprogfirhdl';
open_system(modelname);
2 つの FIR フィルターについて検討します。一方はローパス応答をもち、他方はハイパス応答をもちます。係数は [モデル プロパティ] のコールバック関数 InitFcn で指定できます。
Programmable FIR via Registers ブロックが、Host Behavioral Model からローパス係数を読み込み、入力チャープ サンプルを最初に処理します。次に、ハイパス係数を読み込み、同じチャープ サンプルを再度処理します。
以下のコマンドを入力して、Programmable FIR via Registers ブロックを開きます。
systemname = [modelname '/Programmable FIR via Registers'];
open_system(systemname);
'write_enable' 信号が高い場合、coeffs_registers ブロックが係数を内部レジスタに読み込みます。'write_done' 信号が高い場合、以下のシャドウ レジスタが係数レジスタから更新されます。これにより、フィルター エンティティによるデータの同時読み込みと処理が可能になります。この例では、完全に並列なアーキテクチャ実装を Discrete FIR Filter ブロックに適用します。また、[HDL Block Properties] メニューから直列アーキテクチャを選択することもできます。
これらのブロックが 2 組目の係数を読み込んで、最後のいくつかの入力サンプルを同時に処理したことに注目してください。
以下のコマンドを入力して、モデル例を実行します。
sim(modelname);
以下のコマンドを入力して、スコープを開きます。
open_system([modelname '/Scope']);
DUT (テスト対象設計) 出力を参照出力と比較します。
以下のコマンドを入力して、スコープを閉じます。
close_system([modelname '/Scope']);
信号はロジック アナライザーでも表示できます。ロジック アナライザーでは 1 つのウィンドウで複数の信号を表示できます。また、信号の遷移を簡単に見つけることができます。
対象の信号 input coefficients、write address、write enable、write done、filter in、filter out、reference out および error が可視化のためにストリーミングされています。
モデルのツール バーからロジック アナライザーを起動します。
ロジック アナライザーの表示は波形ごとまたはデバイダーごとに制御することもできます。個々の波形やデバイダーを変更するには、波形またはデバイダーを選択して [Wave] タブをクリックします。ロジック アナライザーにおける便利な可視化モードとして、アナログ形式の表示があります。
ロジック アナライザーの詳細については、ロジック アナライザードキュメンテーションを参照してください。
生成されたファイル用に一意の一時ディレクトリ名を取得します。
workingdir = tempname;
HDL コードを生成せずに、HDL コード生成に関してモデルに問題がないかチェックするために、次のコマンドを実行できます。
checkhdl(systemname,'TargetDirectory',workingdir);
以下のコマンドを入力して、HDL コードを生成します。
makehdl(systemname,'TargetDirectory',workingdir);
### Generating HDL for 'dspprogfirhdl/Programmable FIR via Registers'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('dspprogfirhdl', { 'HDL Code Generation' } )">dspprogfirhdl</a> for HDL code generation parameters. ### Starting HDL check. ### Begin VHDL Code Generation for 'dspprogfirhdl'. ### Working on dspprogfirhdl/Programmable FIR via Registers/coeffs_registers as /tmp/BR2018ad_802882_51908/publish_examples2/tp8a154188_953e_4b66_9cef_05c480f1fa30/dspprogfirhdl/coeffs_registers.vhd. ### Working on dspprogfirhdl/Programmable FIR via Registers/Discrete FIR Filter as /tmp/BR2018ad_802882_51908/publish_examples2/tp8a154188_953e_4b66_9cef_05c480f1fa30/dspprogfirhdl/Discrete_FIR_Filter.vhd. ### Working on dspprogfirhdl/Programmable FIR via Registers as /tmp/BR2018ad_802882_51908/publish_examples2/tp8a154188_953e_4b66_9cef_05c480f1fa30/dspprogfirhdl/Programmable_FIR_via_Registers.vhd. ### Generating package file /tmp/BR2018ad_802882_51908/publish_examples2/tp8a154188_953e_4b66_9cef_05c480f1fa30/dspprogfirhdl/Programmable_FIR_via_Registers_pkg.vhd. ### Creating HDL Code Generation Check Report file:///tmp/BR2018ad_802882_51908/publish_examples2/tp8a154188_953e_4b66_9cef_05c480f1fa30/dspprogfirhdl/Programmable_FIR_via_Registers_report.html ### HDL check for 'dspprogfirhdl' complete with 0 errors, 0 warnings, and 0 messages. ### HDL code generation complete.
以下のコマンドを入力して、テスト ベンチを生成します。
makehdltb(systemname,'TargetDirectory',workingdir);
### Begin TestBench generation. ### Generating HDL TestBench for 'dspprogfirhdl/Programmable FIR via Registers'. ### Begin simulation of the model 'gm_dspprogfirhdl'... ### Collecting data... ### Generating test bench data file: /tmp/BR2018ad_802882_51908/publish_examples2/tp8a154188_953e_4b66_9cef_05c480f1fa30/dspprogfirhdl/coeffs_in.dat. ### Generating test bench data file: /tmp/BR2018ad_802882_51908/publish_examples2/tp8a154188_953e_4b66_9cef_05c480f1fa30/dspprogfirhdl/write_address.dat. ### Generating test bench data file: /tmp/BR2018ad_802882_51908/publish_examples2/tp8a154188_953e_4b66_9cef_05c480f1fa30/dspprogfirhdl/write_enable.dat. ### Generating test bench data file: /tmp/BR2018ad_802882_51908/publish_examples2/tp8a154188_953e_4b66_9cef_05c480f1fa30/dspprogfirhdl/write_done.dat. ### Generating test bench data file: /tmp/BR2018ad_802882_51908/publish_examples2/tp8a154188_953e_4b66_9cef_05c480f1fa30/dspprogfirhdl/filter_in.dat. ### Generating test bench data file: /tmp/BR2018ad_802882_51908/publish_examples2/tp8a154188_953e_4b66_9cef_05c480f1fa30/dspprogfirhdl/filter_out_expected.dat. ### Working on Programmable_FIR_via_Registers_tb as /tmp/BR2018ad_802882_51908/publish_examples2/tp8a154188_953e_4b66_9cef_05c480f1fa30/dspprogfirhdl/Programmable_FIR_via_Registers_tb.vhd. ### Generating package file /tmp/BR2018ad_802882_51908/publish_examples2/tp8a154188_953e_4b66_9cef_05c480f1fa30/dspprogfirhdl/Programmable_FIR_via_Registers_tb_pkg.vhd. ### HDL TestBench generation complete.
生成した .do ファイル スクリプトをテスト ベンチに対して実行した後の ModelSim HDL シミュレーターを以下の図に示します。以前にプロットしたように、ModelSim 結果と Simulink 結果を比較します。
これで、「プログラミング可能 FIR フィルターの HDL コードの生成」の例は終了です。