先週の実験では、紙上に回路図を書いて回路の設計を行った。しかし、GPU (Graphics Processing Unit) など近年の巨大なシステムを紙上で設計することは困難であり、コンピュータ上で設計することが一般的である。今週は、近年の回路設計技術に対する理解を深めるため、Windows ツール、Xilinx ISE WebPACK を用いて回路設計を行う。また、設計した回路をシミュレータ上で動作させる。
一般に集積回路の作製には時間がかかり、また大量生産を行わない限り非常にコストもかかる。そこで、特にシステムの試作段階や、少量生産しか行わないような場合には、FPGA (Field Programmable Gate Array) など論理回路をエミュレートできる回路が使用される。Xilinx は FPGA の大手メーカであり、ISE WebPACK は Xilinx の提供する FPGA デザインツールである。
Xilinx ISE WebPACK (以下、ISE と呼ぶ) は Xilinx のサイトから無料でダウンロード、利用することができる。ただし、自宅で自習しようと考えている者は、インストールが割と大変であることと、計算機室にインストールしているバージョンと最新バージョンにはかなり差があることに注意して欲しい。あと、同サイトでは同時に ISE Design Suite という有償ツールの無料評価版も配布しているので注意されたい。
これから ISE 上での基本的な回路設計ついて説明する。題材として半加算器を用いる。半加算器は1ビットの足し算を行う回路である。具体的に入力信号線 A と B の値を足して得られる値を出力信号線 S に返す。また、桁上げ (キャリー) を出力信号線 CO に返す。半加算器の回路図と真理値表をそれぞれ図1と表1 に示す。
図1. 半加算器の回路図
表1. 半加算器の真理値表
A | B | CO | S |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 |
1 | 0 | 0 | 1 |
1 | 1 | 1 | 0 |
"スタート → プログラム(P) → Xilinx ISE 8.1i → Project Navigator" でISEを起動する。図2のようなソフトが起動する。ISE は (1)ワークスペースの他、(2)ソース窓 (3)プロセス窓 (4)トランスクリプト窓 の3個の小窓を持つ。
図2. ISE 起動直後の画面
C言語のプログラミングを想像して欲しい。C言語では、システムの1部分または全体となるひとまとまりのプログラムを考え、これを関数と呼ぶ。同様に ISE ではシステムを構成するひとまとまりの回路をモジュール (module) と呼ぶ。ISE では、モジュール1個につき、ファイル1個を生成する。またその他、多数の制御用ファイルを作成する。一連の回路設計とこれら必要ファイルをプロジェクト(Project) と呼ばれる単位でまとめて管理している。
まずはプロジェクトを新規作成する。ソース窓が "No project is open" になっていることを確認する。なっていない場合は直前に開いていたプロジェクトが残っているので、"File → Close Project" で閉じる。"File → New Project" を選ぶ。New Project Wizard が起動するので以下の通りに応える。
まず、図3 のようなダイアログが開く。Project Name には作成したいプロジェクトの名前を記入する。ここでは "HALF_ADDER" とする。 Top-Level Source Type を "Schematic" にする。【注意】Project Location は c:\xilinx 下ではなく、Z ドライブ上に変更すること。C ドライブ上に作成したディレクトリ、ファイルは再起動時に削除される。
図3. New Project Wizard - プロジェクト名の設定
プロジェクト名は英数字およびアンダースコア "_" を用いることができる。ただし、1文字目には数字は許されない。日本語は用いることはできない。大文字と小文字は区別されることと、されないことがある。どちらに解釈されても良いように名付ける必要がある。以降、モジュール名、信号線名など、様々な名前をユーザが名付けることになる。このとき、すべて同じ制約が適用される。
次に図4のようなダイアログが開く。ここでは細かなデバイス特性等を指定できる。図4の通りに答える。(おそらくデフォルトの通りである。)
図4. New Project Wizard - デバイスの設定
あとは全て Yes, Ok, Next, Finish など肯定的な返事をしながら進む。
なお、ISE は業務用であり、非常に癖が悪く、バグも多い。どうにも困ったときは、まずは "Project → Cleanup Project Files" としてみるとよい。それでもうまくいかない場合、プロジェクトの作成からやり直した方がはやい。
まずは "Project → New Source" とし、New Source Wizard を起動する。 図5 のようなダイアログが開くので、左側は "Schematic" (回路図の意味) とし、File Name に作成したいモジュール名を書く。ここでは "HALF_ADDER" とする。あとは全て肯定的に応答する。Schematic Editor が起動し、図6のような画面になる。これからワークスペース上に図1に示した半加算器の回路図を記述していく。
図5. New Source Wizard - 新規モジュールのタイプと名前の設定
図6. Schematic Editor 起動直後の画面
まずは入出力マーカを配置する。"Tools → Create I/O Markers" とする。図7のようなダイアログが開く。図1より、配置したい入力マーカは A, B である。そこで、Inputs には "A,B" と書く。同様に Outputs には "S,CO" と書き、配置したい出力マーカを指定する。
図7. 入出力マーカ作成
正しく入出力マーカが出現しているか確認して欲しい。文字が小さいのでズーム ("View → Zoom") を駆使しながら確認すること。
"Tools → Create I/O Markers" は空の回路図に対してだけ実行できる。やり直したいときは、マーカをすべて選択した上、"Edit → Delete" と削除し回路図を空にした上で、"Tools → Create I/O Markers" を再実行する。
次にゲートを配置する。まずは、ソース窓のタブを "Symbols" にする。図8のようなフォームが現れる。図1より、作成したいゲートは 2入力AND が 2個と、2入力OR, インバータ(NOTゲート)である。ソース窓中、Symbols から配置したいゲート名を探し、選択する。選択モードからシンボルモードに移行するので、ゲートをワークスペース上にゲートを配置する。2入力AND, 2入力OR, インバータのシンボル名はそれぞれ "and2", "or2", "inv" である。Symbol Name Filter からシンボル名を絞りながら探すと速い。このとき、ゲート名をフォームに記入しただけではゲートを選んだことにならない。ゲートは Symbols からしか選択できないので注意すること。配置が気に入らない場合、"Edit → Select and Clear → Select Object(s)" から選択モードに戻ることができるので、選択モードでゲート位置を適宜調整されたい。また、"Edit → Mirror", "Edit → Rotate" からゲートを回転、反転させることもできるので、適宜使用されたい。
図8. シンボル選択画面 (ソース窓)
次に入出力マーカ、ゲート間を配線する。"Add → Wire" により配線モードになる。始点と終点をクリックすることにより配線を引くことができる。なお、終点ではダブルクリックが必要である。
最後に "Tools → Check Schematics" により、回路図にエラーがないか確認する。トランスクリプト窓に "No error or warning is detected" と出力されれば検証成功である。図9 は記述した半加算器に対し検証を行った直後の画面である。見にくいが、トランスクリプト窓にエラーが無い旨が表示されている。"File → Save" で作成した回路を保存する。
図9. 半加算器に対する検証結果例
なお、回路図はワークスペース中のシート(灰色の枠)内に作成しなければならない。シートの大きさを変更したいときは、選択モードから、何も選択せずに "Edit → Object Properties" とする。図10 のようなダイアログが開くので、Size 列を変更するとよい。
図10. シートサイズの変更
続いて、作成した回路をシミュレーション実験によって、動作検証する。まず、シミュレーション実験用モジュールを以下の手順で作成する。ソース窓のタブが Sources 以外になっているときは Source に戻す。New Source Wizard を起動し、ソースタイプ (図5の左側で指定) は "Test Bench Waveform"、File Name は "testbench" とする。続いて、図11 のように Associate Source ダイアログが開くので、検証したいモジュールである "HALF_ADDER" を選ぶ。
図11. 検証対象モジュールの選択
その後、肯定的な回答を繰り返すと、図12 のように "Initialize Timing and Clock Wizard" というダイアログが開く。Clock Information を "Combinational (or internal clock)" に変更する。
図12. クロックウィザード
図13. のような波形エディタが起動する。空色、または黄色の箇所をクリックすると黒い折れ線グラフが変化するのが分かる。この折れ線は、高い位置にあるとき、信号線の値が 1、低い位置にあるとき 0 であることを示している。なお、何度も同じ箇所を変化させていると Pattern Wizard が起動するが、ここではキャンセルすること。 入力 A,B に対し、図13のような波形を作成し、"File → Save" で保存する。
図13. 波形エディタ
黄色地の波形として出力の期待値を記述できる。これは記述しなくても良く、ここでは記述しない。
ソース窓のタブが "Sources" であることを確認し、窓の上部 Source for を "Behavioral Simulation" とする。続いて、testbench(testbench.tbw) を選ぶ。プロセス窓のタブについて、タブ "Processes" を選び、"Xillinx ISE Simulator → Simulate Behavioral Model" を選ぶ。シミュレータが起動する。ワークスペースについて "testbench" (アイコンが V) と "Simulation" の2個のタブが出現する。タブ "Simulation" を選べば図14のようなシミュレーション結果が表示されるはずである。タブ "testbench" は無視して良い。
図14. シミュレーション結果
出力 CO, S の値が表1 の真理値表と一致することを確認すること。ここで、"\testbench\TX_FILE" と"\testbench\TX_ERROR" という定義していない信号線がある。これらはシミュレータが利用した変数であり、ユーザは無視して良い。
シミュレーション結果が期待と異なる場合は、期待と一致するまで、回路の書き直しとシミュレーションを繰り返す。なお、再シミュレーション時、直前のシミュレーション結果を閉じるよう聞いてくるので肯定的に応答すること。
以下に、デバッグ時に選択すべき各小窓のタブ等の状態をまとめる。
入力I3〜I0の値に応じ、図15のように8の字型に並べられた7つの発光ダイオード(7セグメントLED)を10進表示するように制御する回路が7セグメントデコーダである。ここで、I3〜I0 の値とは、これらの値を2進表記された数値、すなわち23×I3+22×I2+21×I1+20×I0 であると解釈した値である。7セグメントデコーダを設計し、シミュレーションで動作確認せよ。なお設計する回路は正論理である(つまり電圧レベルが高いときを1、低いときを0とする)と仮定せよ。
図15. 7セグメントデコーダと7セグメントLED
【参考】7セグメントLEDの表示を模倣する検証用モジュールについて
次にISE 上で設計した回路を FPGA 上で動作させる。既に述べたとおり、FPGA は論理回路をエミュレートできる。その際 FPGA はコンフィギュレーションデータと呼ばれる、回路情報データをPC から受け取る。ここでは ISE 上でコンフィギュレーションデータを作成し、それを FPGA へダウンロードする。
実験に用いるのは Xilinx 社の FPGA である spartan-2 (XC2S15-5VQ100C) を用いたHUMANDATA 社の FPGA トレーナー EDX-002 である。教員の机でダウンロードケーブルと共に配っているので、取りに来ること。なお、人数分は用意していないので、隣同士で共用して欲しい。
最初に、LED とスイッチをバッファのみを経由して接続した回路を作成する。バッファとは入力値をそのまま出力値に返すゲートである。つまり、スイッチを ON にしている間のみ LED を ON にする回路を作成する。まずはプロジェクトを新規作成する。ここで、デバイスは図16のように設定すること。なお、プロジェクト名(および続くモジュール名)には予約語である "buf" や "buffer" を使用してはいけない。
図16. EDX-002用デバイス設定
モジュールを新規作成し図17のように、入力 A から 出力 Y をバッファ(buf) を介して接続した回路を作成する。また、作成したモジュールに対し、各検証を行う。
図17. バッファ
次に入出力ピンの割り当てを行う。EDX-002に注目されたい。LED が 8個、スイッチが3個並んでいることが分かる。図18にEDX-002 の回路図の内、スイッチ、LED 周辺を抜粋して示す。この図においては P〜が FPGA の入出力ピンに接続している。図17 (1) より、押しボタンスイッチ3個について、電源 V33、抵抗、押しボタンスイッチ、グランド GND が直列に接続されており、抵抗と押しボタンスイッチの間から FPGA の入力ピン P15〜P17 に接続されているのが分かる。また、図18 (2) より、赤色 LED 8個についてアノードが抵抗を経由し電源 V33 に接続され、カソードがFPGA の出力ピン P53〜P56, P65〜P68 に接続されているのが分かる。
(1) 押しボタンスイッチ
(2) 赤色LED
図18. EDX-002 の回路図 (抜粋)
スイッチ C (EDX-002上で右端の スイッチ) に応じてLED1 (EDX-002上で右端の LED) を点灯させることにする。スイッチ C と LED1 はそれぞれ FPGA の P15, P68 ピンに対応している。
ISE のソース窓について Sources for "Synthesis/Implemenration"、タブを "Sources" とし、モジュール名 "〜(〜.sch)" を選ぶ。プロセス窓についてタブを Processes とし、プロセス窓の "User Constraints → Assign Package Pin" を選ぶ。質問に対して肯定的に答えると、図19 のように Xilinx PACE が起動する。
図19. Xilinx PACE
図19 のように "Design Object List - I/O Pins" の表中、入力 A, 出力 Y に対応する行の "Loc" の列をそれぞれ、"P15", "P68" とする。なお、LoC 列はプルダウンメニューになっているが P15 も P68 もないので、キーボードから入力すること。入力したら保存後、Xilinx PACE を終了する。保存の際の質問は肯定的に答えること。
ソース窓について、モジュール名 "〜(〜.sch)" を選び、プロセス窓中、"Generate Programming File" を選ぶ。プロジェクトのディレクトリ内に拡張子が bit なるファイルが作成されているのが確認できるはずである。これが FPGA のコンフィギュレーションデータである。
最後にコンフィギュレーションデータをFPGA にダウンロードする。FPGA を USB ポートに接続する。BitCfg を起動する。BitCfg は c:\xilinx 下にあるので、適宜探して起動すること。File から、先ほど確認したコンフィギュレーションデータを選択し、Download を選ぶ。これで作業は完了である。ボード上のスイッチ C を押したとき、右端の LED が点灯するのを確認できるはずである。
2入力ANDゲートを作成し、その入力を押しボタンスイッチ、出力を LED に接続するよう入出力ピンを割り当て、コンフィグレーションデータを作成せよ。また、作成したデータをFPGA にダウンロードし、動作検証せよ。
3個の押しボタンスイッチの状態を0〜7の2進表記された数値とみなし、その数値を7セグメントLEDに表示させる回路を作成せよ。なお、7セグメントデコーダ周辺のEDX-002 の回路図を図20に示す。
図20. 7セグメントデコーダと7セグメントLED
難波 一輝 (助教・伊藤・北神・難波研究室)
工学部1号棟4階409号室、内線3255、043-290-3255、namba@ieee.org