情報画像学実験II

実験II-1. 論理回路

第2週目 ISE Schematic Editor を用いた論理回路設計


今週の目的

先週の実験では、紙上に回路図を書いて回路の設計を行った。しかし、GPU (Graphics Processing Unit) など近年の巨大なシステムを紙上で設計することは困難であり、コンピュータ上で設計することが一般的である。今週は、近年の回路設計技術に対する理解を深めるため、Windows ツール、Xilinx ISE WebPACK を用いて回路設計を行う。また、設計した回路をシミュレータ上で動作させる。


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. 半加算器の真理値表
ABCOS
0000
0101
1001
1110

Xilinx ISE WebPACK の起動

"スタート → プログラム(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" にする。


図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. 半加算器に対する検証結果例

シミュレーション実験

入力波形の作成

続いて、作成した回路をシミュレーション実験によって、動作検証する。まず、シミュレーション実験用モジュールを以下の手順で作成する。ソース窓のタブが Sources 以外になっているときは Source に戻す。New Source Wizard を起動し、ソースタイプ (図5の左側で指定) は "Test Bench Waveform"、File Name は "testbench" とする。続いて、図10 のように Associate Source ダイアログが開くので、検証したいモジュールである "HALF_ADDER" を選ぶ。


図10. 検証対象モジュールの選択

その後、肯定的な回答を繰り返すと、図11 のように "Initialize Timing and Clock Wizard" というダイアログが開く。Clock Information を "Combinational (or internal clock)" に変更する。


図11. クロックウィザード

図12. のような波形エディタが起動する。空色、または黄色の箇所をクリックすると黒い折れ線グラフが変化するのが分かる。この折れ線は、高い位置にあるとき、信号線の値が 1、低い位置にあるとき 0 であることを示している。なお、何度も同じ箇所を変化させていると Pattern Wizard が起動するが、ここではキャンセルすること。 入力 A,B に対し、図12のような波形を作成し、"File → Save" で保存する。


図12. 波形エディタ

黄色地の波形として出力の期待値を記述できる。これは記述しなくても良く、ここでは記述しない。

シミュレーション

ソース窓のタブが "Sources" であることを確認し、窓の上部 Source for を "Behavioral Simulation" とする。続いて、testbench(testbench.tbw) を選ぶ。プロセス窓のタブについて、タブ "Processes" を選び、"Xillinx ISE Simulator → Simulate Behavioral Model" を選ぶ。シミュレータが起動する。ワークスペースについて "testbench" (アイコンが V) と "Simulation" の2個のタブが出現する。タブ "Simulation" を選べば図13のようなシミュレーション結果が表示されるはずである。タブ "testbench" は無視して良い。


図13. シミュレーション結果

出力 CO, S の値が表1 の真理値表と一致することを確認すること。ここで、"\testbench\TX_FILE" と"\testbench\TX_ERROR" という定義していない信号線がある。これらはシミュレータが利用した変数であり、ユーザは無視して良い。

デバッグ

シミュレーション結果が期待と異なる場合は、期待と一致するまで、回路の書き直しとシミュレーションを繰り返す。なお、再シミュレーション時、直前のシミュレーション結果を閉じるよう聞いてくるので肯定的に応答すること。

以下に、デバッグ時に選択すべき各小窓のタブ等の状態をまとめる。

ソース窓
回路入力中は source for "Synthesis/Implementation"、タグは "Symbols"
シミュレーション実行時は source for "Behavioral Simulation"、タグは "Sources"
プロセス窓
シミュレーション時は "Processes"
ワークスペース
回路入力中はモジュール名 (HALF_ADDER)、波形入力中は "testbench" (アイコンが波の方)、シミュレーション時は "Simulation"

階層的回路設計

C言語ではプログラムをある程度のまとまり毎に関数に分けることが通常である。同様に ISE での回路設計では、回路をある程度のまとまり毎にモジュールに分け、階層的に設計することが通常である。次に階層的回路設計について説明する。題材として全加算器を用いる。全加算器は半加算器同様、入力信号 A,B の和を S、桁上がりを CO に返す回路である。ただし、下位桁からの桁上げ CI を加える点で半加算器と異なる。A,B,CI の 3値の和を求める回路と理解しても良い。全加算器の回路図と真理値表をそれぞれ、図14, 表2 に示す。


図14. 全加算器の回路図

表2. 全加算器の真理値表
ABCICOS
00000
01001
10001
11010
00101
01110
10110
11111

図の全加算器では、まず半加算器で A+B を計算し、得られた和と CI の加算により、最終的な和を得ている。すなわち、真理値表を見ながら1から回路構成を考えてはいない。既に作成した半加算器を用いることにより構成している。

半加算器シンボルの作成

まず、プロジェクト HALF_ADDER を閉じる ("File → Close Project") 続いて、プロジェクト FULL_ADDER を作成する。作成の仕方は、プロジェクト名を FULL_ADDER とする他は、プロジェクト HALF_ADDER と同じである。

次に、既に作成した半加算器を再利用するため、半加算器のシンボルを作成する。"Project → Add Copy of Source"、フォルダ HALF_ADDER の中にあるファイル "HALF_ADDER.sch" を選ぶ。"Adding Source Files..." というダイアログが開くので、"Association" を "Synthesis/Imp + Simulation" とする。プロジェクトに HALF_ADDER が読み込まれたことが確認できる。

続いて、ソース窓から "HALF_ADDER (HALF_ADDER.sch)" をダブルクリックすることで、ファイル HALF_ADDER を開く。"Tools → Symbol Wizard" とする。図15のようなダイアログが現れるので、図の通りに Pin Name Source を "Using Schematic", "HALF_ADDER" とする。


図15. シンボルウィザード

後は全て肯定的に応答する。図16 のような半加算器のシンボルを得ることができる。


図16. 半加算器のシンボル

モジュール FULL_ADDER の作成と検証

モジュール FULL_ADDER を新規作成する。図17 のようにソース窓から Symbols に "HALF_ADDER" が出現していることを確認できるはずである。HALF_ADDER はANDゲートやORゲートと同じように配置できる。図14 のとおりに、入出力マーカ、ゲート・モジュールの配置と配線を行う。


図17. ソース窓に出現した新規シンボル HALF_ADDER

"Tools → Check Schematics" により、回路図をチェックする。ここで、"Tools → Hierarchical Check" とすることにより、HALF_ADDER も含め、階層構造全体をチェックすることもできる。最後に、HALF_ADDER と同様にシミュレーションによって動作検証を行う。


バス

1本の信号線が表すことができる情報量は1ビットである。すなわち 0か 1のみである。2ビット以上の情報を扱うためには2本以上の信号線を用いることになる。複数本の信号線をまとめた束をバスと呼ぶ。また、まとめた信号線の本数をバス幅と呼ぶ。次にバスについて説明する。題材として4ビット加算器を用いる。4ビット加算器の回路図を図18に示す。4ビット加算器はバス幅4ビットの入力A, B と出力 S を持つ。バス A は A(3), A(2), A(1), A(0) の4ビットの信号線からなる。また、バス A の値は各信号線の値により2進表記された数値、すなわち23×A(3)+22×A(2)+21×A(1)+20×A(0) であると解釈する。他のバス B, S も同様である。4ビット加算器は3個の全加算器と1個の半加算器からなる。それぞれの加算器では入力バス A, B の i (0≦i<4) ビット目の信号線、A(i), B(i) が入力として与えられ、出力バス S の iビット目, S(i) にその和を出力する。また、互いの加算器はキャリー信号線により、直列に接続される。


図18. 4ビット加算器の回路図

準備

まずは、新規にプロジェクトを作成する。また、FULL_ADDER.sch と HALF_ADDER.sch をプロジェクトに加え、FULL_ADDER をシンボル化する。4ビット加算器を設計するためのモジュールを新規作成する。

バスを用いた回路設計

次に入出力マーカを配置する。"Tools → Create I/O Markers" とし、図19 のように入出力マーカを指定する。ここでバス A は A(3:0) と指定する。この記述は A(3) から A(0) までのバスを意味する。バス B, S も同様に指定する。バス A, B, S を延長する。バスは通常の信号線より太い線で表示されることが分かる。続いて、FULL_ADDER と HALF_ADDER を配置する。


図19. 4ビット加算器の入出力

続いて入出力バスと加算器の間を配線する。まず、"Add → Wire" とし、プロジェクト窓中、 "Automatically add a bus tap between the bus and the wire" にチェックする。各加算器の入出力と対応するバスの間に配線を行う。ここで設定によっては警告が出るが、無視して良い。加算器から信号線が延び、バスに接続される。このとき、バスと信号線の間にバスタップが挿入される。バスタップはパスから指定された信号線を1本選び出す機能を持つ。


図19. バスタップ

さて、この時点ではバスタップがバス中のどの信号線を選び出しているかは決定されていないので、これを決める。まず、選択モードから配線した信号線 (バスタップではない) をダブルクリックする。図20のようなプロパティボックスが開く。Name 行には仮の信号線名 (図20の例はXLXN_5) が与えられているので、A(3) など適切な信号線名に改める。


図20. 信号線名の変更

なお、回路図はワークスペース中のシート(灰色の枠)内に作成しなければならない。シートの大きさを変更したいときは、選択モードから、何も選択せずに "Edit → Object Properties" とする。図21 のようなダイアログが開くので、Size 列を変更するとよい。


図21. シートサイズの変更

シミュレーション

HALF_ADDER, FULL_ADDER 同様に、モジュールとゲートの配置・配線・回路図のチェックを行った後、シミュレーション実験を行う。ただし、シミュレーション実験時、バス入出力は 2値の波形図ではなく 10進表記で表されることに注意すること。入力信号作成時も入力したい数値をキーボードから 10進表記で入力する。なお、図22のようにバス名の左隣の + 記号をクリックすることにより、バスを構成する信号線毎の波形を見たり編集したりすることもできる。また、図22のようにバス名の右に書かれた数値を右クリックすることにより、2進表記 (Binary) や16進表記 (Hexadecimal) など、10進表記 (Decimal) 以外の好みの表記を選択できる。


図22. 波形エディタによる入力バスの値の作成

シミュレーション終了時刻はデフォルトで 1000ns である。この終了時刻は "Test Bench → Set End of Testbench" から変更できる。


今週の課題 - その1

第2週目-課題1

入力バス Iの値に応じ、図23のように8の字型に並べられた7つの発光ダイオード(7セグメントLED)を10進表示するように制御する回路が7セグメントデコーダである。7セグメントデコーダを設計し、シミュレーションで動作確認せよ。なお設計する回路は正論理である(つまり電圧レベルが高いときを1、低いときを0とする)と仮定せよ。


図23. 7セグメントデコーダと7セグメントLED

【参考】7セグメントLEDの表示を模倣する検証用モジュールについて


FPGA の上での設計回路動作

次にISE 上で設計した回路を FPGA 上で動作させる。既に述べたとおり、FPGA は論理回路をエミュレートできる。その際 FPGA はコンフィギュレーションデータと呼ばれる、回路情報データをPC から受け取る。ここでは ISE 上でコンフィギュレーションデータを作成し、それを FPGA へダウンロードする。

実験に用いるのは Xilinx 社の FPGA である spartan-2 (XC2S15-5VQ100C) を用いたHUMANDATA 社の FPGA トレーナー EDX-002 である。教員の机でダウンロードケーブルと共に配っているので、取りに来ること。なお、人数分は用意していないので、隣同士で共用して欲しい。

プロジェクトとモジュールの作成

最初に、LED とスイッチをバッファのみを経由して接続した回路を作成する。バッファとは入力値をそのまま出力値に返すゲートである。つまり、スイッチを ON にしている間のみ LED を ON にする回路を作成する。まずはプロジェクトを新規作成する。ここで、デバイスは図24のように設定すること。なお、プロジェクト名(および続くモジュール名)には予約語である "buf" や "buffer" を使用してはいけない。


図24. EDX-002用デバイス設定

モジュールを新規作成し図5のように、入力 A から 出力 Y をバッファ(buf) を介して接続した回路を作成する。また、作成したモジュールに対し、各検証を行う。


図25. バッファ

入出力ピンの割り当て

次に入出力ピンの割り当てを行う。EDX-002に注目されたい。LED が 8個、スイッチが3個並んでいることが分かる。図26にEDX-002 の回路図の内、スイッチ、LED 周辺を抜粋して示す。この図においては P〜が FPGA の入出力ピンに接続している。図26 (1) より、押しボタンスイッチ3個について、電源 V33、抵抗、押しボタンスイッチ、グランド GND が直列に接続されており、抵抗と押しボタンスイッチの間から FPGA の入力ピン P15〜P17 に接続されているのが分かる。また、図26 (2) より、赤色 LED 8個についてアノードが抵抗を経由し電源 V33 に接続され、カソードがFPGA の出力ピン P53〜P56, P65〜P68 に接続されているのが分かる。


(1) 押しボタンスイッチ


(2) 赤色LED
図26. 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" を選ぶ。質問に対して肯定的に答えると、図27 のように Xilinx PACE が起動する。


図27. Xilinx PACE

図27 のように "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 を起動する。File から、先ほど確認したコンフィギュレーションデータを選択し、Download を選ぶ。これで作業は完了である。ボード上のスイッチ C を押したとき、右端の LED が点灯するのを確認できるはずである。


今週の課題 - その2

第2週目-課題2

2入力ANDゲートを作成し、その入力を押しボタンスイッチ、出力を LED に接続するよう入出力ピンを割り当て、コンフィグレーションデータを作成せよ。また、作成したデータをFPGA にダウンロードし、動作検証せよ。

第2週目-課題3

3個の押しボタンスイッチの状態を0〜7の2進表記された数値とみなし、その数値を7セグメントLEDに表示させる回路を作成せよ。なお、7セグメントデコーダ周辺のEDX-002 の回路図を図28に示す。


図28. 7セグメントデコーダと7セグメントLED


第3週目 Verilog による組合せ回路設計に進む
実験II-1トップページに戻る
難波担当実験・演習のページに戻る

難波 一輝 (助教・伊藤・北神・難波研究室)
工学部1号棟4階409号室、内線3255、043-290-3255、namba@ieee.org