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

OR回路

ANDと回路来たら次はOR回路。

ORは「または」回路。入力Aが1または入力Bが1の時、出力が1となる。真理値表に表すと以下の通り。

入力A入力B出力Y
000
011
101
111

NOR回路

NOR回路はOR回路の出力を反転させたものである。よって、入力ABのどちらか一方でも1の場合、0を出力する。真理値表表は下記になる。

入力A入力B出力Y
001
010
100
110

NOR回路をトランジスタで

まずはNOR回路をトランジスタで作る。NAND回路のときはNOT回路を縦に2つ接続した。今回はNOT回路を横に2つ接続するイメージで作る。

NOR回路の回路図を以下に示す。2つのNOT回路の出力が重なった形になっている。

回路図記号で示すと下記のようになる。

動作する様子を示す。入力ABの一方でも1となった場合、出力が0となる。

OR回路をトランジスタで

次にOR回路をトランジスタで作ってみよう。OR回路とNOR回路は逆の関係である。OR回路はNOR回路を否定すれば良い。よってNOR回路の出力にNOT回路を接続するとOR回路になる。

回路図を示す。NOR回路の出力にNOT回路が接続されている。

回路記号で表すと以下の通り。

最後にOR回路が動作する様子を示す。入力ABの片方でも1の場合、出力は1となる。

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

AND回路

NOT回路に続いて次はAND回路を紹介しよう。AND回路とは入力が2つあり、2つの入力が両方とも1の場合のみ1を出力する回路である。

表であらわすと以下の通りとなる。ちなみにこのような入出力の関係をまとめた表を真理値表という。

入力A入力B出力Y
000
010
100
111

NAND回路

AND回路の次はNAND回路を示す。NAND回路はAND回路の出力を反転させたものである。よって、入力AB両方が1の時のみ0を出力する。真理値表は下記になる。

入力A入力B出力Y
001
011
101
110

NAND回路をトランジスタで

まずはNAND回路をトランジスタで作ってみよう。まず思いだすとNOTというのは0を入力すると1が出力された。NANDというのはそれを直列に組み合わせる事になる。

回路図を示す。NOT回路が縦に2つ接続されたような回路となっている。

動作する様子を動画で示す。入力が両方とも1(Hi)のときのみ出力が0(Lo)となる。

回路記号は以下のようになる。

AND回路をトランジスタで

次はAND回路。AND回路とNAND回路は逆の関係である。よってAND回路はさっきのNAND回路を否定すれば良い。ということは、NAND回路の出力にNOT回路を接続すれば良い。

下の動画のように入力が両方とも1のときのみ出力が1となる。

回路記号は以下の通り。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

配属は開発部門だった。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

旅はまだ終わらない。

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

ブログを始めた

日々の備忘録としてブログを始めてみようと思う。

きっかけ

仕事でマイコン関係の組み込みソフト開発をしており、日々プログラミングやその他自分の興味のあることを勉強しています。

いつも本やネットを読んで勉強をしているのだが、やはり勉強しているだけではなく自分で情報発信をしたほうが知識は身につくと感じ、ブログを始めてみることにしました。

ブログの方針

このブログでは以下のことを書いて行こうと考えています。

  • プログラミングの知識や学習内容
  • 回路の知識や学習内容
  • その他趣味や興味のあること

まぁプログラミングといっても範囲がすごく広いんですけどね。ぼちぼち投稿していきますので、よろしくお願いします。