CPUをつくろう -論理回路編-

電圧と数値表現

コンピュータは数値をすべて0または1で表す。ここで0、1とは回路的にはどういう状態なのか?

論理回路では電圧が高い状態を1、低い状態を0とする。電圧が高いとは電源電圧に近い状態のことである。いま電源電圧を5Vとすると2.5V以上を電圧が高い状態(これをHiという)、2.5V未満を電圧が低い状態(これをLoという)とする。(実際の論理ゲートICにはヒステリシスというものがあって、ちょうど2.5Vにはなって無いんだけど。)

よって、まとめると以下の通り。

電圧状態論理
高い(5V)Hi1
低い(0V)Lo0

論理回路

論理回路とは、コンピュータで論理演算を行うための回路のこと。入力に0または1を入力すると、出力が0または1になる。

論理回路にはいくつかの種類があるが、ここでは以下の回路を紹介する。

  • NOT回路
  • AND回路
  • OR回路
  • NAND回路
  • NOR回路

NOT回路

まず、もっとも単純なNOT回路を示す。NOTとは否定である。入力の値を否定する値を出力する。入力の値を反転して出力する回路である。

よってNOT回路は以下のような動きになる。

  • 0を入力すると、1を出力する
  • 1を入力すると、0を出力する

これはまさしく前回紹介したトランジスタのスイッチで実現できる。回路は、前回そのままの回路となる。

InOut
01
10

Inが0の時:Outは1

Inが1の時:Outは0

ところで、上記のような回路を毎回書くのは面倒だ…笑 そんなときのために便利な回路記号が使用できる。NOT回路は下記の記号で表すことが出来る。

CPUをつくろう -トランジスタの使い方編-

トランジスタの使い方

前回でトランジスタの原理は分かったが、では実際にどうやって使えば良いのか。今回は使い方を説明する。ざっくりと分かれば良いので細かいことの説明は省くとする。

前回の投稿で、トランジスタには増幅作用とスイッチング作用があると説明したが、今回はこの内のスイッチング作用のみを考える。論理回路では信号増幅は考えないからだ。

接続方法

スイッチング、名前の通りスイッチである。ON・OFFを制御するもの。トランジスタをスイッチとして使うには以下のように回路を組む。

まずベースに対し直列に抵抗を接続し、更にベース-エミッタ間に並列になるようにもう一つ抵抗を接続する。それぞれの役割はトランジスタ自身を電流制御するためと、ノイズやチャタリングを防ぎ動作を安定させるためだが、詳しく説明すると長くなるため説明は割愛する。次にエミッタを接地する。

更に、ベース側をInput、コレクタ側をOutputとして、Output側をプルアップ抵抗を介して電源に接続する。プルアップ抵抗についても本題から逸れるため説明は割愛する。

スイッチング動作

簡略化のためトランジスタの部分を完全にスイッチとして見なしてしまおう。こうすると理解が簡単になる。Inputに電圧を加えない状態ではスイッチが開いていて、Inputに電圧を加えるとスイッチが閉じるといった理解でよい。

Inputに電圧を加えないと… 下図のようになる。スイッチは開いておりOutputは電源の5Vに接続されている。

よって、Inputに0Vを加えるとOutputは5Vとなる。

次にInputに電圧を加えた場合を考える。その場合は下図のようになる。スイッチは閉じており、OutputはGND(0V)に接続される。

よって、Inputに5Vを加えるとOutputは0Vとなる。

以上のようにInput電圧を変化させる事で、OutputのON/OFFを制御することが出来る。

CPUをつくろう -半導体編2-

トランジスタ

ダイオードの次はトランジスタだ。トランジスタは電流を増幅させたり、スイッチングをする半導体である。トランジスタにはバイポーラトランジスタとユニポーラトランジスタが有るのだが、今回はバイポーラトランジスタを考える。

バイポーラトランジスタとは

バイポーラトランジスタ(以後トランジスタと呼ぶ)とは、ダイオードと同様にP型半導体とN型半導体から成る。ダイオードと違うのはN型半導体2つでP型半導体を挟み込む形になっているところだ。これをNPN型トランジスタと言う。

N型でP型を挟み込めばNPNトランジスタだし、P型でN型を挟み込むとPNPトランジスタになる。それぞれで電流の流れる方向が逆になるのだが、今回はNPNトランジスタを考える。

まずトランジスタは記号で書くと下図の通りとなる。3つの端子が有り、それぞれベース、エミッタ、コレクタと言う。記号で書くとB、E、Cとなる。

続いて構造を示す。ダイオードと同じようにN型半導体とP型半導体が接合されている。真ん中のP型の部分は十分に薄く作られている。ここで、N型に対しP型は薄くなっているため、N型中にあるマイナス電荷の量と比べると、P型中のプラス電荷の量は極端に少なくなっている。

まず、このトランジスタのエミッタ-コレクタ間に電圧を掛けるとどうなるか。下図のようにエミッタ側がマイナス、コレクタ側がプラスとなるように電圧を印加する。 そうするとエミッタ-ベース間はダイオードの初期と同様に境界面の電荷は互いに引き合うが、それ以上は電荷は移動しない。またコレクタ側のマイナス電荷もコレクタ側に引き付けられるため、ベース-コレクタ間にも大きな空乏層ができる。そのため、この状態では電気は流れない。

この状態から更にエミッタ側がマイナスになるように、ベース-エミッタ間に電圧を加える。ベース中のプラス電荷はエミッタ側に、エミッタ側のマイナス電荷はベース側に引き寄せられ、それが連続して起こる。

ここで、ベース中のプラス電荷は大変少ないため、エミッタから流れ込んできたマイナス電荷の大部分はプラス電荷と結合する事が出来ない。結合出来なかったマイナス電荷はそのままベースに流れ込んで行き、さらに空乏層も乗り越えてコレクタ領域へと飛び込んでくる。

こうしてコレクタ-エミッタ間に電流が流れる。ベース-エミッタ間に流れる電流に対して、コレクタ-エミッタ間に流れる電流は非常に大きい。よって、ベースに小さな電流を流すことによって、コレクタに大きな電流を流すことが出来る。

これをトランジスタの増幅作用と言う。ベース電流に対して増幅された電流がコレクタに流れるという事である。

更に見方を変えると、コレクタに流れる電流をベース電流で制御している。ベースに小さな電流を流すことでコレクタをON・OFF出来るわけである。

これをトランジスタのスイッチング作用と言う。半導体スイッチとして回路のON・OFFを切り替えることが出来る。

CPUをつくろう -半導体編-

半導体を知ろう

書籍では詳しは触れていないが、これから回路を組むわけだから回路の知識は必要である。回路は主に論理ゲートを使用して作る。論理ゲートはトランジスタやダイオードで出来ている。トランジスタやダイオードは半導体である。

よって、まずは半導体を理解しよう。

半導体とは

半導体とは…読んで字の如く「半分導体」。半分導体というのは半分電気を流すということだ。半分電気を流すというのは「一方向へは電気を流すが、逆方向へは電気を流さない」ということ。

まずこれが、「ダイオード」である。道路の一方通行みたいなものと考えていいかな。

ダイオード

ダイオードとは上で書いたとおり、一方向のみに電気を流すもの。記号で書くと下図の通り。電流はアノード方向からカソード方向に流れる。

ダイオードは「P型半導体」と「N型半導体」の2種類の半導体を接合してできている。P型はプラス電荷の多い(正確にはマイナス電荷の少ない)半導体で、N型はマイナス電荷の多い半導体である。

この2つを接合すると、接合面の近くにいるプラスとマイナスが互いを打ち消し、何もない空間「空乏層」が出来る。空乏層が障壁となり電荷は移動出来ないため、接合しただけでは電気は流れない。

ここに外部から電圧を加えるとどうなるか。

まず、P型にプラス、N型にマイナスになるように電圧を加えると、プラス電荷はN型方向へ、マイナス電荷はP型方向へ移動し互いに結合を繰り返す。

よって電流が流れる。

次に、さっきとは逆方向に電圧を加えるとどうなるか。

プラス電荷はP型方向へ、マイナス電荷はN型方向へ引き寄せられるため、空乏層は更に拡がる。

よって、電流は流れない。

ダイオードはこのように、電圧を掛ける向きによって電流を制御することが出来る。

CPUをつくろう -仕様編-

仕様を決めよう

仕様を決めよう と言ってもほぼ書籍の通りだけど、1bitに簡略化した為に機能がいくつか減っている。

まずハードの仕様

  • レジスタ:Aレジスタ(1bit)、Bレジスタ(1bit)
  • ROM:5bit幅×4
  • ROMアドレス:0b00 ~ 0b11
  • 入力:1bit
  • 出力:1bit

まずレジスタだが、当然1bitである。

そして書籍ではキャリーフラグもあり、このフラグを見てアドレスをジャンプするのだが、今回の1bitCPUはレジスタが1bitなのでデータ長も1bitである。ということは…0か1しか表現できない。ということは…ジャンプ先のアドレスは0か1しかない。 これではジャンプ命令の意味がないため、今回はキャリーフラグは見ない。

よってフラグレジスタは実装しない!

次にROMアドレスだが、これは0b00(10進数の0)から0b11(10進数の3)までにした。なぜなら…プログラムカウンタを作るの楽だからである。 さすがに0か1の2アドレスは寂しすぎるし、4アドレスとした。

つぎは命令仕様

  • 命令長:5bit(オペコード4bit、オペランド1bit)

オペコードというのは下に書く各種命令のこと。オペランドは下に書くIm:イミディエイトデータのこと。

  • 命令の種類:以下に命令を示す。命令名:命令コード:意味という順で列挙する。
MOV A, Im0b0011ImをAレジスタに転送する
MOV B, Im0b0111ImをBレジスタに転送する
MOV A, B0b0001BレジスタをAレジスタに転送する
MOV B, A0b0100AレジスタをBレジスタに転送する
ADD A, Im0b0000AレジスタにImを加算する
ADD B, Im0b0101BレジスタにImを加算する
IN A0b0010入力ポートからAレジスタに転送する
IN B0b0110入力ポートからBレジスタに転送する
OUT A0b1001Bレジスタから出力ポートへ転送する
OUT Im0b1011Imを出力ポートへ転送する
NOPADD A, 0何もしない

あ…あと、加算命令ADDは0+0、0+1、1+0しか出来ない。1bit CPUだから。

ブロック図

これから作るCPUのイメージ図を作る。かなりお粗末な図だが、なんとなくのイメージはできるかと。

CPUをつくろう -構想編-

CPUを理解しよう

仕事でマイコンのプログラミングをしているのだが、レジスタやスタック、メモリ等がどうやって動いているのかを詳しく知らないということに気づいた。(まぁ気づくことは気づいていたが知らなくても何とかなった)

昔アセンブラを少し勉強しようとしたことはあったが、はやりここはソフトだけでなく回路がどう動くのか原理から知らなくては!

という感じで本を手に取った。これです↓

渡波都さん著 「CPUの創りかた」

まずこの本でCPUとは何ぞやを理解していきたい。

どんなCPUをつくるか

どんなCPU?といってもこの本の通りにつくることにするのだが、一つ二つ難点が…

  • この本で紹介しているICには入手しづらいモノがある
  • 実際に回路を組むのは面倒だ…(配線とかたいへん)
  • 動きを理解するためなら、もう少しシンプルなCPUでもいいのでは?

ということで、つくるのは

まず1bit CPUとする! (書籍のは4bitだけど、そんなにつくるのは大変そうだから笑)

そしてSpice等のシミュレータでつくる!(これなら間違ってもすぐ直せるしコピペも楽だ笑)

これで方向性が決まった。次はCPUの仕様から。