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の仕様から。

ヘッドライト・テールライト

ヘッドライト・テールライト

中島みゆきの曲で、僕が大好きな曲の一つだ。この曲はNHKのプロジェクトXというテレビ番組でエンディングテーマとして流れていた。

高校生の時、この番組が好きで良く見ていた。

ビデオに録画していたこともある。好きな回はビデオで何度も見た。

この番組の中で、苦難を乗り越えて技術開発をする技術者の姿が印象に残った。

開発者の言葉と共に流れてくるエンディングテーマがなんとも感動的だった。

プロジェクトXに憧れて、将来自分も電化製品を開発したいと思った。

もともと僕は中学生の時から家電製品が好きだった。

テレビやビデオ、オーディオといったAV機器が大好きで

よく家電量販店に通い、新製品が出る度にワクワクして見に行っていた。

高校受験の面接では将来の夢について、「家電メーカーに就職したい」と言っていたほどだった。

一時はこの夢を忘れかけていたが、大学での就職活動時期に「家電メーカーに入りたい」という夢が再び蘇った。

結果、地元にある家電メーカーに就職することが出来た。

配属は開発部門だった。

僕は運が良かった。開発という仕事に就けたからだ。

会社には品質管理や製造技術など製品を直接開発していない部署もあり、

むしろそのような部署の方が多い。技術系として入社しても製品を開発する部署に入れないこともある。

そんな中で自分は開発という部署に配属された。

配属されたときはホントに何も分からなかった。

大学時代は夢や目標を忘れていて、恥ずかしながら学校の授業をまともに聞いていなかったから、技術的な知識が不足していたのだ。

しかし、幸運なことに自分の部署の上司や先輩はそんな僕に親身に接してくれた。

先輩は休みの日に僕の家まで通って一緒に勉強してくれたほどだった。

今は製品のソフトウェア開発の仕事をしているが、自分がやってこれたのはこの先輩や上司のおかげである。大変な仕事だが、日々新しいことを学べモノを自分で作ることが出来るというこの仕事にとてもやりがいを感じている。

プロジェクトXに憧れて、、

いま僕はあの時思い描いた夢の中にいる。

あのとき夢見た自分にどれほど追いつけただろうか、、

現状は未だ部署では下っ端だし、プロジェクトを自分で引っ張っていく力はまだない。日々目の前の業務に追われているだけになっている。

しかし、自分は常に少しづつでも前に進んで行けると思っている。

まだまだこれから、もっと自分は成長できる。

ヘッドライト・テールライトの歌詞にあるように

旅はまだ終わらない。

これからもこの曲を忘れず、目標を持って進んで行きたいと思う。