入門チュートリアル - デザイン階層の検討
FPGA プロジェクトファイル (*PrjFpg
) は様々なソースドキュメントとリンクすることで単一のプロジェクトとしてまとめられています。従って、ドキュメント間やネット接続などの関連はドキュメント自体の情報で定義されています。
階層のあるデザインでは、デザインは論理ブロックで仕切られており、それぞれのブロックがトップの回路図シートにシートシンボルとして表現されています。各シートシンボルの Filename の属性は、それが表している元のデザインファイルを参照しています。元のデザインファイルには、以下のものがあります:
- 回路図シート
- OpenBus システムのドキュメント
- VHDL ファイル
- Verilog ファイル
回路図のサブシートにも、更に下位のデザインファイルを参照しているシートシンボルが含められていることがあります。このアプローチで、任意の深さや組合せを持つデザイン階層 を作成することができます。
階層になったネットやバスとドキュメントとの接続性は、標準的な階層プロジェクトの接続の動作に従っています。そこでは、サブドキュメント上のポートが、シートシンボル上でそのドキュメントを表わす同じ名前のシートエントリに接続しています。回路図や VHDL のサブドキュメントについては、図 1 をご覧ください。
図 1. シートエントリからそれに相当する下位ドキュメント上のポートへ接続される階層のあるネット。このチュートリアルでベースとなるシンプルなカウンタのデザイン例にとっては、デスクトップ NanoBoard から供給される同期クロック信号が早すぎます。カウンタをスローダウンさせるため、分周器用の回路を追加します。Simple_Counter の回路図にこの回路を追加するのではなく、サブファイルとして(最初は回路図に、その後に VHDL ファイルに)キャプチャします。それによって、FPGA をプログラムする際、階層デザインがどのように使用されるか確認してみましょう。
回路図サブシートを使用する分周器
分周器の回路を回路図サブシートにキャプチャしてみましょう。
- 回路図ドキュメント
Simple_Counter.SchDoc
を開きます。
- 初めにシート上のフリースペースにシートシンボルを配置します (Place » Sheet Symbol)。このシートシンボルはサブシートを表しています。サブシート上に分周器の回路を定義します。
- シートシンボルをダブルクリックし、表示される Sheet Symbol ダイアログで以下のように設定します:
- デジグネータ:
U_Clock_Divider
- ファイル名:
Clock_Divider.SchDoc
.
- デジグネータ:
- シートエントリをシートシンボルの左右に追加します (Place » Add Sheet Entry)。以下のプロパティを設定します:
- 左側のシートエントリ: Name:
CLK_REF
, I/O Type:Input
- 右側のシートエントリ: Name:
CLK_OUT
, I/O Type:Output
- 左側のシートエントリ: Name:
- シートシンボルをメインの回路内、CLK_REF ポートコンポーネントの隣に接続します(図 3)。
これで、親になるシートシンボルができました。参照先となり、目的の回路が載ったサブシートを実際に作成しなくてはなりません。
注: 以下のステップは、回路図サブシートとその内容を線画で定義するプロセスです。ステップのこの部分を省略するには、Projects パネル内の Simple_Counter.PrjFpg
のエントリを右クリックして、Add Existing to Project を選択してください。Choose Documents to Add to Project ダイアログが表示され、Clock_Divider.SchDoc
ファイルを開くようにナビゲートされます。このファイルは、Altium Designer をインストールしたディレクトリの \Examples\Tutorials\Getting Started with FPGA Design
フォルダにあります。
その後、プロジェクトと回路図のトップシートを保存して、次のステップに進んでください。
- シートシンボルを右クリックして、Sheet Symbol Actions » Create Sheet From Symbol を選択します。新しい回路図ドキュメント
Clock_Divider.SchDoc
が作成され、アクティブドキュメントとしてメインデザインウィンドウ内に開かれます。最初、このドキュメントには 2 つのポート、CLK_REF と CLK_OUT があります。これらは親のシートシンボルにおけるそれぞれのシートエントリに関連(接続)するものです。
- Libraries パネルにアクセスして、6 つの分周器コンポーネント(CDIV10DC50 - 50% の負荷サイクル出力で 10 分の 1 分周)を FPGA Generic 統合ライブラリ (
FPGA Generic.IntLib
) からこの新しいシート上に配置します。コンポーネントを順に接続し、2 つのポート間を接続します(図 4)。
- Tools » Annotate Schematics Quietly を使用してコンポーネントをアノテートします。
- File » Save All を使用して回路図と親プロジェクトの両方を保存します。
Clock_Divider.SchDoc
の保存には、デフォルトの場所(例えば、トップレベル回路図と同名のフォルダ)を用意してください。
- プロジェクトをコンパイルしてエラーをチェックします。エラーがあれば、修正、保存し、再コンパイルしてください。
- コンパイル後、プロジェクトのシート階層を Projects パネルでチェックできます。これでプロジェクトがサブシート (
Clock_Divider.SchDoc
) を Simple_Counter の回路図の子として認識するようになります。
クロック分周器の回路の追加はこれで終了です。テストしてみましょう。
- Devices ビューを開き、Live オプションが有効で、Connection の表示が緑であることを確認します。
- 物理的 FPGA デバイスがプログラムされ、Process Flow は全ステージが完了したことを表示(緑)しています。デザインのソースドキュメントを変更した場合、どうしてこのような結果になるのでしょうか? その答えは、Ignore FPGA source オプション(デフォルトで有効)にあります。このオプションを無効にしなくてはならない場合、Process Flow のステータス評価の際に、変更されたソースドキュメントが考慮されるようになります。無効にすると、Process Flow の各ステージが黄色に変わり、失効、再度実行が必要と言う状態になります。
- ドータボードの FPGA デバイスを再度プログラムします。これを行う最も簡単な方法は、Process Flow の Program FPGA ステージを直接クリックすることです。それに先立つ全てのステージが自動的に、順次実行されます。なぜなら、それらは失効とされているからです。論理合成ステージの後で、この新しい回路図サブシートに関連する中間 VHDL ファイルが、プロジェクト用に生成された VHDL ファイル内に現れます。
一度プログラムされ、カウンタ(DIP スイッチのスイッチ 7、スイッチ 8 がオン)を開始、NanoBoard のユーザ LED の出力がスローダウンしているのを確認します。シーケンスはよりクリアになりました。DIP スイッチを使用して方向を切り替えてみてください。今度はうまくいくはずです。
HDL サブファイルを使用する分周器
回路図シートと HDL コードの組合せでデザインをキャプチャする場合、デザイン階層のコンセプトは容易に拡張できます。VHDL や Verilog のサブドキュメントは、回路図サブシートと同じ方法で参照されます。つまり、シートシンボル中で、それが表しているサブドキュメントのファイル名を特定することで参照されます。
VHDL サブドキュメントを参照する際、考慮される接続性は、シートシンボルから VHDL ファイルにおけるエンティティの宣言までになります。エンティティを VHDL のファイル名とは異なる名前で参照するには、VHDLEntity
パラメータをシートシンボルに含めます。この値は、VHDL ファイルにおいて宣言された Entity の名前です。
Verilog サブドキュメントを参照する際も、プロセスは同様です。考慮される接続性は、シートシンボルから Verilog ファイルにおけるモジュールの宣言までになります。モジュールを Verilog のファイル名とは異なる名前で参照するには、VerilogModule
パラメータをシートシンボルに含めます。この値は、Verilog ファイルにおいて宣言された Module の名前です。
Mhz の単純な遅延によるクロック分周を装備した VHDL ファイルとして、追加したばかりの回路図サブシートの代用を考えてみましょう。
最初に VHDL ソースファイルを生成します。
注: 以下のステップは、VHDL サブファイルとその内容を線画で定義するプロセスです。ステップのこの部分を省略するには、Projects パネル内の Simple_Counter.PrjFpg
のエントリを右クリックして、Add Existing to Project を選択してください。Choose Documents to Add to Project ダイアログが表示され、Clock_Divider.vhd
ファイルを開くようにナビゲートされます。このファイルは、Altium Designer をインストールしたディレクトリの \Examples\Tutorials\Getting Started with FPGA Design
フォルダにあります。
その後、プロジェクトを保存して、既存の回路図サブシートを削除するステップへ進みます。
- Projects パネルの
Simple_Counter.PrjFpg
エントリを右クリックして、Add New to Project » VHDL Document を選択します。新しい VHDL ドキュメント (VHDL1.vhd
) が作成され、アクティブドキュメントとしてメインデザインウィンドウ内に開かれます。ドキュメントをClock_Divider.vhd
の名前で、プロジェクトファイルと同じ場所に保存します。
以下の VHDL コードをドキュメントに入力してください:
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity Clock_Divider is port ( CLK_REF : in std_logic; CLK_OUT : out std_logic ); end entity; architecture RTL of Clock_Divider is begin process(CLK_REF) variable i : integer range 0 to 999999; begin if rising_edge(CLK_REF) then if i = 0 then CLK_OUT <= '1'; i := 999999; else CLK_OUT <= '0'; i := i - 1; end if; end if; end process; end architecture;
- ドキュメントを保存します。
VHDL ソースファイルができました。これで、シートシンボルを直にそこから作成することができます。でもその前に、既存のシートシンボルをトップレベルの回路図と参照先の回路図サブシートから削除しましょう。
- 回路図サブシート
Clock_Divider.SchDoc
を FPGA プロジェクトから削除します。Projects パネル内のサブシート名を右クリックしてメニューから Remove from Project を選択します。
- Simple_Counter の回路図ドキュメント (
Simple_Counter.SchDoc
) を開きます。既存のシートシンボルをクリックして、Delete キーを押します。
- メインメニューから、Design » Create Sheet Symbol From Sheet Or HDL を選択します。Choose Document to Place ダイアログが表示されますので、Clock_Divider.vhd エントリを選択し、OK をクリックします。
- 新しいシートシンボルを回路に配置、配線します(図 8)。Designator と Filename が自動的に
U_clock_divider
とClock_Divider.vhd
にそれぞれ設定されることに注意してください。VHDLENTITY
パラメータもまた、value =clock_divider
(VHDL サブファイルにおけるエンティティの名前)として追加されます。
- 回路図とプロジェクトを保存します。
- プロジェクトをコンパイルしてエラーをチェックします。エラーがあれば、修正、保存し、再コンパイルしてください。
- コンパイル後、プロジェクトの階層を Projects パネルでチェックできます。これでプロジェクトが VHDL サブファイル (
Clock_Divider.vhd
) を Simple_Counter の回路図の子として認識するようになります。
クロック分周器の VHDL バージョンの追加はこれで終了です。テストしてみましょう。
- Devices ビューを開き、ドータボードの FPGA デバイスを再プログラムします。Process Flow の Program FPGA ステージをクリックしてください。
- 一度プログラムされ、カウンタ(DIP スイッチのスイッチ 7、または、スイッチ 8 のどちらかをオンに設定)を開始させます。NanoBoard のユーザ LED で、スローダウンしたカウンタ出力と、DIP スイッチによる出力のコントロールを確認できます。