computer-creation

必要部品から動作確認まで コンピュータの作成プロセス10項

「コンピュータの根本的な動作原理を知るためには、自分で部品を集めてマイコンを作るのが一番いい方法だ」著者の矢沢久雄氏はそう述べる。ここではマイコン制作の紙上体験を行い、その動作原理をまとめる。

1 コンピュータ作りに必要な部品

マイコン制作に必要な部品は基本的に「CPU」「メモリー」「I/O」の3つだけであり、それぞれ単体のICとして市販されている。CPUはコンピュータの頭脳であり、プログラムを解釈・実行する。メモリーはプログラムやデータを記録する。I/OはInput/Outputの略で、コンピュータと外部装置(周辺装置)を接続する。

以上の3つの他に、補助的な役割を担ういくつかの部品がある。まずCPUを動作させるために、クロック信号を出力する部品である「クロック・ジェネレータ」が必要である。クロック信号とは、時計のようにカチカチと電圧の高低を繰り返す電気信号である。クロック・ジェネレータの中には水晶(クリスタル)があり、その周波数(振動数)に応じてクロック信号を発生する。クロック信号の周波数が、CPUの動作速度となる。

また、プログラムを入力する装置も必要となる。ここでは「ディップ・スイッチ」と呼ぶ8個のスイッチが横に並んだ部品を使ってプログラムを入力する。プログラムの動作結果を出力する装置には「LED(発光ダイオード)」を8個用いる。

あとは細かい部品である。以下にこれまで述べた部品も含めて一覧を示す(( )内は個数)。「74367」と「7404」もICである。これらは外部装置とうまく接続するために利用する。「抵抗」とは、電流の流れを妨げ、電圧を低下させる素子のこと。配線の手間を省くため、8個の抵抗を1つの部品に収めた「集合抵抗」も使う。抵抗値の単位はΩ(オーム)。「コンデンサ」は電気をためる素子。蓄電できる容量の単位はF(ファラド)。マイコンの動作には直流5Vの電源が必要。ここでは、交流100V電源を直流5Vに変換する「スイッチング電源」という装置を使うことにする。

  • Z80 CPU(1):CPU(8ビットCPU)
  • TC5517(1):メモリー(8ビット×2K)
  • Z80 PIO(1):I/O(8ビット×2ポート並列I/O)
  • 74367(4):3ステート・バス・バッファ
  • 7404(2):インバータ
  • クロック・ジェネレータ(1):2.5MHz
  • ディップ・スイッチ(3):オン/オフが切り替わるもの(8ビット)
  • プッシュ・スイッチ(2):常時オフでバネで元に戻るもの
  • スナップ・スイッチ(2):オン/オフが切り替わるもの
  • 集合抵抗(3):4.7kΩ×8個入(1/4W)
  • 集合抵抗(1):330Ω×8個入(1/4W)
  • 抵抗(6):4.7kΩ(1/4W)
  • 抵抗(1):330Ω(1/4W)
  • コンデンサ(1):10μF(25V)
  • LED(8):色は任意
  • スイッチング電源(1):交流100Vを直流5Vに変換するもの
  • 配線用ワイヤ(適量):AWG30番線が好ましい

 

2 回路図の読み方

回路図(下記図2参照)で各種の図記号を結んでいる直線は、配線を表している。配線が単に交差しているだけの場合は、その位置では接続されていない。交差している位置に小さな黒丸がある場合は、接続されている。

このマイコンは、+5Vの直流電源で動作する。回路の様々な部分に+5Vと0Vを接続するが、回路図が煩雑になることを防ぐために下の図のように2つの図記号を使って+5Vと0Vを示す。(以降のプロセスは図1をコピーして見ながら行うことをおすすめする)

図1

図2:矢沢久雄のソフトウェア芸人の部屋

 

3 電源、データ、アドレスを配線する

ICも普通の電気製品と同様に、電源がないと動作しない。Z80 CPU、TC5517、Z80 PIOにはいずれもVccピンとGNDピンがある。VccとGNDのペアは電源を与えるピンである。Vccピンに電源+5Vをつなぎ、GNDピンには電源0Vをつなぐ。クロック・ジェネレータにも+5Vと0Vをつなぐ。これらの電源によって、ICとクロック・ジェネレータが動作する。

マイコンで使われるICは「ディジタルIC」と呼ばれるものである。ディジタルICでは、すべてのピンが0Vまたは+5Vのいずれかの状態になり、それによって他のICと電気信号をやりとりする。ICに電源を与えるVccピンとGNDピンは、+5Vと0Vに固定されているが、その他のピンの電圧はコンピュータの動作に応じて、+5Vか0Vのどちらかに変化することを繰り返す。0Vが数字の「0」を表し、+5Vが数字の「1」を表していると考えると、ディジタルICは2進数で情報をやりとりしていることになる。

コンピュータはCPUを中心として動作する。CPUはメモリーやI/Oとデータを入出力する。データの入出力先を指定するためにCPUは「アドレス・ピン」を持っている。Z80 CPUのアドレス・ピンは、A0〜A15の16本ある。この略号についている「A」はAddressを意味する。後ろの数字「0〜15」は2進数の桁数で、0が最下位桁、15が最上位桁となる。16本のアドレス・ピンで指定できるアドレスを2進数で表すと、0000000000000000〜1111111111111111までの65536通りである。したがってZ80 CPUは、65536通りの相手(メモリー、またはI/Oのアドレス)を指定して情報の入出力ができる。

アドレスが指定できたら、データ・ピンを使ってデータを入出力する。Z80 CPUには、D0〜D7の8本のデータ・ピンがある。「D」はDataを意味し、0〜7の数字はアドレス・ピンと同様2進数の桁数である。一度に8ビットのデータを入出力できる。もしもこれより大きな桁数(ビット数)のデータを入出力したい場合には、8ビットずつに分けることになる。

メモリーであるTC5517には、A0〜A10のアドレス・ピンとD0〜D7のデータ・ピンがあり、1つのICの中に8ビットのデータを2048個記憶できるようになっている。これらのピンは、Z80 CPUの同じ略号のピンに接続する。ただし、プログラムの入力に使用するディップ・スイッチが8ビットでアドレスを指定するようになっているので、アドレス・ピンはA0〜A7の8本だけを使うことにして、残りのA8〜A10を0Vに接続(0に固定)する。つまり、2048個の記憶場所のうち256ヵ所だけを使うのである。

 

4 I/O周りを配線する

配線の意味を理解するためには、Z80 PIOというICの仕組みを知る必要がある。「レジスタ」とは、CPUおよびI/Oの中で、データを記憶する部分である。Z80 PIO(I/O)には4つのレジスタがある。PIO自体の機能を設定するための2つと、外部装置と入出力するデータを格納するための2つである。

この4つのレジスタはそれぞれAポート制御、Aポート・データ、Bポート制御、Bポート・データと呼ばれる。ポート(port=港)とはI/Oが外部装置とデータを受け渡す場所のこと。Z80 PIOにはAポートとBポートの2つのポートがあり、8ビットのデータを入出力するための外部装置を2つ接続できるようになっている。Z80 PIOにはD0〜D7のデータ・ピンがあるので、これをZ80 CPUの同じ略号のデータ・ピンとつなぐ。このピンを通して、CPUトPIOがデータをやりとりする。

次はZ80 PIOのB/A上線ピンとC/D上線ピンである。これらをZ80 CPUのA0とA1のアドレス・ピンとつなぐ。ICのピンの役割を表す略号の上に線がついているものは、そのピンに1(+5V)が与えられることで有効になることを示し、上に線がないものはそのピンに1(+5V)が与えられることで有効になることを示す。

メモリー(TC5517)内の記憶場所がZ80 CPUのA0〜A7(00000000〜11111111までの256通り)のアドレス・ピンで選択されるように、I/O(Z80PIO)内のレジスタはZ80 CPUのA0〜A1(00〜11までの4通り)のアドレス・ピンで選択される。

Z80 CPUのA8〜A15のアドレス・ピンは未使用なので何もつながない。回路図では、ピンに何もつながないことを「NC」(No Connection=未接続)という略号で表す。

 

5 クロック信号をつなぐ

先に説明したように、Z80 CPUとZ80 PIOが動作するためにはクロック信号が必要である。それぞれのCLK(Clockを意味する)にクロック・ジェネレータの8番ピンが出力するクロック信号をつないでおく。クロック・ジェネレータの8番ピンと+5Vの間についている抵抗は、クロック信号をきれいにするためのものである。

 

6 メモリーとI/Oを区別して入出力する仕組みを配線

Z80 CPUのMemory Requestを意味するMREQ上線ピンと、I/O Requestを意味するIORQ上線ピンとは、TC5517とZ80 PIOのどちらを選択しているのかを区別するための仕組みである。MREQ上線ピンは、Z80 CPUがメモリーと入出力を行うときに0になる。IORQ上線ピンは、Z80 CPUがI/Oと入出力を行うときに0になる。入出力を行わない場合は、それぞれのピンが1になる。

TC5517では、CE上線ピン(Chip Enable)を0にするとICが回路に電気的に接続され、1にするとハイ・インピーダンス状態となって電気的に切り離される。ハイ・インピーダンス状態のピンは、配線されていても電気信号を受け付けない。Z80 PIOでは、同じことをCE上線ピンとIORQ上線ピンの両方を一緒に0や1にすることで実現できる。したがって、Z80 CPUのMREQ上線ピンをTC5517のCE上線ピンにつなぎ、Z80 CPUのIORQ上線ピンをZ80 PIOのCE上線とIORQ上線につなぐことになる。

メモリーやI/Oに対してCPUが入力と出力のどちらを行うのかも区別しなくてはならない。そのために用いられるのが、Z80 CPUのRD上線(Read=入力。入力動作で0になる)ピンと、WR上線(Write=出力。出力動作で0になる)ピンである。これらのピンは、TC5517の同じ名前のピンとつなぐ。

 

7 他の制御ピンをつなぐ

CPU、メモリー、I/Oの持つアドレス・ピンとデータ・ピン以外のピンは「制御ピン」と総称される。ICの機能を制御するための電気信号を入出力するためのピンだからだ。

Z80 CPUのM1上線(Machine Cycle 1)ピンとINT上線(Interrupt=割り込みを意味する)ピンをZ80 PIOの同じ略号のピンにつなぐ。M1上線ピンはタイミングを合わせるためのピンで、INT上線はZ80 PIOからZ80 CPUに割り込みを要求するためのピンである。割り込みとは、外部装置からの入力データに応じてCPUに特定のプログラムを実行させることである(詳細は後述)。

Z80 CPUのRESET上線(リセット)ピンをいったん0にしてから1に戻すと、CPUがリセットされ、メモリー・アドレスの0番地に記憶されたプログラムから順に実行が開始される。リセットは、抵抗を介して+5Vと0Vをつなぐプッシュ・スイッチで行う。RESET上線ピンは、常時+5V(1)になっている。プッシュ・スイッチを離すことで+5V(1)に戻る。抵抗は、プッシュ・スイッチを押したときに+5Vと0Vが直接つながってしまうこと(ショートと呼ぶ)を防ぐために入れている。このように抵抗を介したスイッチで+5Vと0Vをつなぐ方法は、回路の様々な部分で使われている。

RESET上線ピンにつけられたコンデンサは、回路に電源が投入されたときに自動的にリセットするためのものである。コンデンサは、充電式の電池のように電気を貯める機能を持っている。電源投入直後はコンデンサに充電中なので、RESET上線ピンの電圧はすぐに+5Vまで上がらない。充電が完了するとRESET上線ピンの電圧は+5Vになり、RESET上線ピンが0から1に変化してリセットがかかることになる。

Z80 CPUのBUSRQ上線(Bus Request=バス要求。バスはCPUを持つデータ・ピン、アドレス・ピン、制御ピンに接続された配線の総称)ピンは、スナップ・スイッチで0と1に切り替えられるようになっている。BUSRQ上線ピンを0にするとZ80 CPUが回路から電気的に切り離される。この状態にすると、CPUを介さずに手作業でメモリーにプログラムを書き込める。このようにCPUを介さずに外部装置から直接メモリーへの読み書きを行うことを「DMA(Direct Memory Access)」と呼ぶ。通常ハードディスクなどがDMAを用いている。

BUSAK上線(Bus Acknowledge=バス要求受領)ピンは、Z80 CPUが回路から電気的に切り離された状態になったときに0になる。DMAはBUSRQ上線ピンを0にして、BUSAK上線ピンが0になったことを確認してから行う。BUSAK上線は、4個ある74367のG1上線ピンとG2上線ピンにつなぐ(74367の役割は後述)。

Z80 CPUのその他の制御ピンは用いない。WAIT上線ピンとNMI上線ピンは、+5Vに接続して1にする。抵抗を介しているのは、後でスイッチなどを追加するときに便利だからである。このように抵抗を介してピンを+5Vに接続することを「プルアップ」と呼ぶ。HALT上線ピンとRFSH上線ピンには何もつながない。

Z80 PIOのPA0〜PA7(PortA)およびPB0〜PB7(PortB)は、外部装置とデータを入出力するためのもので、後でディップ・スイッチとLEDをつなぐ。IEIピンはプルアップする。IEOピン、ASTB上線ピン、ARDYピン、BSTB上線ピン、BRDYピンには何もつながない。

これで、Z80CPU、TC5517、Z80 PIOおよびクロック・ジェネレータの必要なピンの配列が完了した。

 

8 DMAでプログラムを入力する外部装置をつなぐ

コンピュータ本体と外部装置を接続するための配線に進む。まず、2つのディップ・スイッチと1つのプッシュ・スイッチを使って、アドレス・ピンとデータ・ピンに電気信号を与え、DMAでメモリーにプログラムを記録するための配線をする。

1つのディップ・スイッチ(メモリー・プログラム入力)は、メモリーであるTC5517のD0〜D7のデータ・ピンにつなぐ。もう1つのディップ・スイッチ(メモリー・アドレス指定)は、TC5517のA0〜A7のアドレス・ピンにつなぐ。これで、ディップ・スイッチのオン/オフによって+5Vまたは0Vの信号を入力できる。メモリー書き込みのプッシュ・スイッチは、TC5517のWE上線ピンにつなぐ。書き込みを行うために、TC5517のRD上線ピンをプルアップした電気信号につなぎ、CE上線ピンを0Vにつなぐ。これによって、ディップ・スイッチでアドレス・ピンとデータ・ピンのパターンを2進数で指定してプッシュ・スイッチを押すと、TC5517に書き込める。

ただし、これらのスイッチを直接TC5517の各ピンに接続したのでは、プログラムの実行時にもスイッチの状態が回路に影響してしまう。そこで、74367(3ステート・バス・バッファ)というICを使って、プログラム実行時にはスイッチを回路から電気的に切り離すようにする。

Z80 CPUのBUSRQ上線ピンに接続されたスイッチをオンにすると、CPUがDMA状態になり、BUSAK上線ピンが0になることで知らされる。BUSAK上線ピンを4つの74367のG1上線ピンとG2上線ピンにつなげば、DMAでメモリーへの書き込みが実現できる。

 

9 I/O入出力のための外部装置をつなぐ

マイコン動作中に外部装置からデータを入出力するためのディップ・スイッチ(データ入力)とLED(データ出力)をZ80 PIOにつなぐ。

データ入力用のディップ・スイッチは、Z80 PIOのPA0〜PA7の各ピンにつなぐ。74367を使わないのは、このディップ・スイッチからの入力はプログラム動作中にZ80 PIOを介して取得されるものだからである。

データ出力を示すLEDは抵抗を介して+5Vにつなぐ。ここでは、0Vの電気信号が入力されるとLEDが点灯するようにしている(一般的)。LEDは、7404というICを介してZ80 PIOのPB0〜PB7の各ピンにつなぐ。7404の図記号の中にある三角形の先に白丸がついたマーク(インバータ)は、左側から入力された電気信号を反転(0なら1に、1なら0に)させて右側に出力することを意味している。これによって、Z80 PIOのPB0〜PB7の各ピンが0なら対応するLEDが消灯し、1ならLEDが点灯する。

 

10 テスト・プログラムの入力と動作確認

マイコンの電源を投入したらZ80 CPUのDMA要求のスナップ・スイッチをオンにする。この状態でメモリー・プログラム入力とメモリー・アドレス指定の2つのディップ・スイッチを操作して、マシン語(ネイティブ・コード)のテスト・プログラムを入力していく。まず、ディップ・スイッチで、1行目のアドレスを設定し、プログラムを設定したら、メモリー書き込みのプッシュ・スイッチを押す。次に、2行目のアドレスを設定し、プログラムを設定したら、メモリー書き込みのプッシュ・スイッチを押す。この操作をプログラムの最後の行まで続ける。すべてのプログラムが入力できたら、Z80 CPUのリセットのプッシュ・スイッチを押してから、DMA要求のスナップ・スイッチをオフに戻す。これでプログラムが動作する。

プログラムが動作すると、I/Oデータ入力のディップ・スイッチのオン/オフ状態が、LEDの点灯/消灯で示される。ディップ・スイッチのオン/オフ状態を変えると、LEDの点灯/消灯も変わる。

 

最後に

最初は用語と対応している記号や略語を追っていくこと自体が大変だった(コンピュータの基礎知識)。しかし実際にプロセスをたどっていくと、用語は複雑であれど論理的にムダなく行われていることがわかる。動作を安定させるための抵抗という仕組みや、2進数で表すために様々な工夫を行っていることも理解できる。

結局のところコンピュータの機能とは、CPUがクロック信号に合わせて解釈・実行し、それによってメモリーやI/OからデータをCPUの中に入力し、CPU内部で演算を行い、演算結果をメモリーやI/Oに出力するだけである。大枠のプロセスを頭に入れておけば、迷うことはないだろう。

次回はハンド・アセンブルについてまとめる。

コンピュータはなぜ動くのか~知っておきたいハードウエア&ソフトウエアの基礎知識~


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>