2018-07

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【解説記事】Dラッチの構成とその挙動

こんにちは、竹村です。

今回紹介するのはDラッチという回路で、値を保存する回路です。
この回路は今まで紹介した回路とさまざまな点で違います。なので、難しく感じるかもしれませんが、しっかり読んでもらえば理解できると思います。
今回はおまけもついていますよ!
それでは始めていきましょう。


早速ですが、値を保存する回路にはどのような入力があり、どのような出力があればいいのでしょうか?

入力は2種類あります。
1つ目は保存したい値です。
例えば、3という数を保存したいときは、値を保存する回路に「3を保存しろ」と教えてやる必要があります。これが必要なことはすぐにわかると思います。
2つ目は保存するタイミングを教える入力です。
これは、入力されている数をどのタイミングで保存するかを決めるものです。

ここで、疑問に思う人が多いかと思います。
「なぜ保存するタイミングを決める必要があるの?保存したい値が入力されたときにその値を保存すればいいのに」と。
それには、電気回路の性質が関係しています。
電気回路は「入力が無い状態」を作るのが難しいのです。
以前の記事でも紹介しましたが、僕たちは電圧で0と1を表現しています。
仮に入力に何もつながなかったとしても、電圧というものがなくなることはありません。
つまり、いつでも何らかの値が入力されることになってしまうのです。
なので、入力が保存したい値になったときだけ、値を保存するように指示する必要があります。

出力の方はいたってシンプルで、保存している値を出力すれば充分です。
他に欲しい情報も得にありません。

また、以前の記事でも紹介したように、CPUの内部では数は2進数で表現されているので、当然保存する数も、2進数で表現されたものになります。
つまり、0か1のどちらかを選んで保存できる回路が必要となります。それこそがDラッチなのです。
1つのDラッチでは1桁の2進数しか保存できませんが、Dラッチをいくつも用意することで、何桁の2進数でも保存できるようになります。

ではDラッチの真理値表を…と言いたいところなのですが、実はDラッチは真理値表を持ちません
今まで紹介した回路は、ある入力に対し対応する出力がただ一つ存在しました
そのような回路を組み合わせ回路と呼びます。
それに対し、Dラッチは入力が同じでも出力が違う場合があります
具体的に言えば、保存できない状態で保存したい値を0としても、保存している値、つまり出力が、0の場合も1の場合もあり得るのです。
これは、直前の出力が現在の出力に関係するので起こります。このような性質を持つ回路を順序回路と呼びます。

そういうわけで、Dラッチの挙動を回路と照らし合わせながら説明していきます。
リレーの挙動が不安な人は、リレーについての記事と照らし合わせながら読むといいと思います。
Dラッチの回路図は図1となります。右のリレーの出力が左のリレーの入力の一つとなっているのが大きな特徴です。
入力のうち、保存したい値をin、保存できるかできないかを決める入力をCLK、出力をoutとしています。

D-Latch0.png
(図1:Dラッチ 初期状態)

Dラッチは、CLKが1のとき保存可能で、0のときは保存できないようになっています。
つまり、DラッチはCLKが1から0になるときのinの値を、CLKが0の間保存します。
また、回路が複雑でoutが0になるときと1になるときの違いが分かりにくいと思いますが、outは右のリレーの上段のスイッチで決まります。
つまり、左のGとつながっているときはoutは0で、逆に右のVとつながっているときはoutは1になります。

では、0を保存する場合を考えてみましょう。つまりinは0です。
CLKが1のとき、左のリレーのスイッチが動くので、図2のようにinが右のリレーの電磁石の回路につながります。しかし、inは0なので右のリレーのスイッチは動かず、outは0のままです。
ここで、CLKを0にすると、図1の状態に戻り、左のリレーのスイッチが元に戻るのでinが変化してもoutは変わらなくなります。
そして、このときのoutは、Gにつながっているので0です。

D-Latch1.png
(図2:Dラッチ CLK=1、in=0のとき)

次に、1を保存する場合を考えてみましょう。つまりinは1です。
CLKが1のとき、左のリレーのスイッチが動くので、図3のようにinが右のリレーの電磁石の回路につながります。そして、inが1なので右のリレーのスイッチも動き、outはVとつながって1になります。
ここでCLKを0にすると、図4のようになります。
こうして、CLKが0になったときでもoutは1のままで、inが変化してもoutは変化しないまま、つまり値が保存されるのです。

D-Latch2.png
(図3:Dラッチ CLK=1、in=1のとき)

D-Latch3.png
(図4:Dラッチ CLK=1、in=1からCLK=0にしたとき)

実はこのDラッチという回路、論理ゲートの組み合わせでも作れます
しかし、そうするとDラッチ1個あたり7個ものリレーを使うことになってしまうので、コストが明らかに足りなくなってしまうんですね。
この回路のコストをいかに下げるかが、僕らにとって死活問題だったわけです。


今回の解説は以上です。
実はこのDラッチ、以前の活動報告にて動画で紹介した事があります。
動画内ではCLKのことをイネイブル(Enable)と呼んでいますが、それ以外は同じなので、ぜひ見てみてください。

さて、解説記事はこれで一区切りとなり、次回は未定です。
質問は遠慮なくコメントでお願いします。

それではまた、次回の更新で。



おまけ
今回説明したDラッチ、実は紹介した回路通りに作るとちゃんと動いてくれません
どこで誤作動を起こすかというと、1を保存するときです。
図3から図4の状態になるとき、左のリレーのスイッチが動いている間、右のリレーの電磁石に電流は流れません。
よって、右のリレーのスイッチも動いてしまい、図1の状態に戻ってしまうわけです。

これを解決するには、図3から図4の状態になるときに、右のリレーの電磁石に電流を流す必要があります。
そこで登場するのがコンデンサーです。
コンデンサーは充電式の電池だと思ってもらえれば大丈夫です。
コンデンサーを図5のように回路にいれます。

D-Latch4.jpg
(図5:Dラッチ コンデンサーあり)

こうすると、図3から図4の状態になるときに、コンデンサーが右のリレーの電磁石に電流を流してくれます。

説明の簡略化のために本文では省略しましたが、間違ったことを書いておくのもなあと思ったので、おまけという形で紹介しました。


スポンサーサイト

【解説記事】2の補数表現&マルチプレクサ

こんにちは、竹村です。

今回は「計算」パート最終章、2の補数表現マルチプレクサについてです。
これまでに比べて、内容が難しくなると思います。
それでは、張り切っていきましょう!


前回で2進数の足し算ができるようになりました。
では、引き算をしようと思ったとき、どうすればいいのでしょうか?
結論から言うと、前回の最後に紹介した、全加算器を組み合わせた回路(以下、この回路を単に「加算回路」と呼びます)で引き算も計算できるようになるのですが、それには少し工夫が必要です。
では、足し算をする回路で引き算をするためには、どのような工夫が必要なのでしょうか?

足し算と引き算はとても似ています。
引き算のことをマイナスの数を足す足し算だと思えば、引き算を足し算で計算できます。
たとえば、5-3=2を5+(-3)=2と考えればいいのです。
すると、マイナスの数を2進数で表現する必要が出てきます。
それこそが、2の補数表現です。

では、2の補数を具体例を通じて説明していきます。
2の補数は桁数が重要です。
同じ桁数の2の補数どうしでなければ計算ができません。
表1は、4桁の2の補数と、それに対応する10進数をまとめたものです。
4桁の2の補数では、-8から7までの16個の10進数を表現することができます。

 2の補数  10進数 
0111
7
0110
6
0101
5
0100
4
0011
3
0010
2
0001
1
0000
0
1111
-1
1110
-2
1101
-3
1100
-4
1011
-5
1010
-6
1001
-7
1000
-8
(表1:4桁の2の補数)

どうしてこのように数字を割り当てるのでしょうか?
この割り当て方こそが、加算回路で引き算を実現する工夫なのです。
加算回路は、普通の2進数の計算をするように設計されました。
なので、2の補数も、普通の2進数と同じように計算できる必要があるのです。

では、試しに計算してみましょう。
0101+1101=0010を計算したのが図1です。
前回と同様、一番上の行は繰り上がりを表しています。
表1と見比べてみると、この計算は5+(-3)=2となり、確かに引き算ができています。

2の補数の足し算
(図1:2の補数の足し算)

桁数を維持するために、一番上の桁の繰り上がりは無視します。
「そんなことしていいの?」と思う方もいるかもしれませんが、いいんです。
2の補数はそもそも、それを前提として考えられた数の表現法なのです。

2の補数のすごさはこれだけではありません。
気付いた方もいるかもしれませんが、表1を一番上の桁に注目して見てみてください。
なんと、マイナスの数かそうでないかが、一番上の桁を見ればすぐにわかります!
これは何桁の2の補数でも共通する性質です。

「これの何が嬉しいの?」と思う方がほとんどだと思います。
しかし、CPUにとってはとってもありがたいのです。
なぜなら、その数がマイナスかそうでないかが、たった一桁見ればわかるのですから。
実際に、CPUのとても重要なところで、この性質を使っています

さて、足し算と同じ回路で引き算ができることがわかりましたが、このままではちょっと嬉しくありません。
今のままでは、実際に計算させる式を入力するときに、足し算の形でしか入力できないのです。
そこで、ここからは足し算か引き算かを選べる回路を実現していこうと思います。

たとえば、6-4を計算させたいとき、ボタンを「6」「+」「-4」「=」と押すのは嫌ですよね?そこは「6」「-」「4」「=」と押したくなると思います。
この機能を回路で実現するためには、「-」ボタンが押されたとき、そのあとに入力される数をマイナスに変換する必要があります。
では、2の補数で表された数字は、どのようにすればプラスとマイナスを入れ替えられるのでしょうか?

その方法は、結構簡単です。
全ての桁にNOT演算を施して、それに1を足せばいいのです
NOT演算ってなんだっけ?という人は、論理ゲートについての解説記事を読んでください。
では、4桁の2の補数を例に考えてみましょう。
6を-6にしようとしてみます。
表1より、6は0110で表現されます。
これのすべての桁にNOT演算を施すと1001となります。
最後に、これに1を足すと1010となり、表1で確認してみると確かに-6を表しています。
この方法は、何桁の2の補数にも使えます。

さて、これで足し算か引き算かを選んで入力できる回路ができるかと思いきや、実はもう一工夫必要です。
まだ、足し算か引き算かを「選ぶ回路」を作っていません。
その「選ぶ回路」というのがマルチプレクサです。

マルチプレクサというのは、多くの入力の中から1つを選んで出力する回路の事です。
いまはその中でももっとも単純な、2つの入力のどちらかを選ぶ、2入力マルチプレクサを考えようと思います。

この回路、論理ゲートを組み合わせて作ろうとすると結構な個数が必要なのですが、実はリレーを使うと1個でできてしまいます。
思い出してみてください。リレーは2つのうちどちらかを選ぶスイッチでした。
つまり、入力のどちらかを出力するのです。
これは2入力マルチプレクサそのものではないですか!
ということで、2入力マルチプレクサの真理値表のようなものと、それを実現する回路を、それぞれ表2と図2に示します。

 SEL 
 out 
0
in1
1
in2
(表2:2入力マルチプレクサの真理値表のようなもの)

MUX_relay.png
(図2:リレーによる2入力マルチプレクサ)

つまり、SELが0か1かで、どちらの入力を出力とするかが決まるわけです。
また、これから2入力マルチプレクサは図3のように表現します。

MUX.png
(図3:2入力マルチプレクサ)

さて、これで必要なものは揃いました。
やっと、足し算か引き算を選んで計算できる回路を設計していきます。
ここからは図3の記号と、MIL記号や前回の記事で決めた記号を使います。
覚えていない方がほとんどだと思うので、前回の記事や、MIL記号についての記事を見ながら読み進めるといいと思います

何桁の回路でも作ることができますが、いまは4桁で作っていきましょう。
全体のイメージとしては、足し算か引き算かをマルチプレクサで選び、それを加算回路で計算するという感じです。
このイメージを実際の回路にすると、図4のようになります。
入力をa,b、出力をcとし、それぞれ下の桁からa0,a1,a2,a3などとしました。
この回路はSELが0のときa+b=c、SELが1のときa-b=cとなるようにcを計算します
ぱっと見ただけではわからないと思うので、具体例を交えて説明していきます。

adder2.png
(図4:足し算と引き算ができる回路)

まず、2+5を考えてみましょう。
足し算なのでSELは0で、表1よりaは0010、bは0101となりますね。
SELが0なので、2入力マルチプレクサは上の方の入力を出力とします。つまり、bをそのまま出力します。
一番下の桁のcinもSELですから今は0です。
よって、これは前回の記事の図6で示した加算回路とまったく同じ動きをします。
つまり、aとbを普通の2進数の足し算だと思って計算して良いのです。
結果、cは0010+0101=0111となり、表1を見るとちゃんと7になっています。

次に、2-5を考えてみましょう。
先ほどの例と違うのは、SELが1であることだけです。
SELが1だと、2入力マルチプレクサは下の方の入力を出力とするので、bのすべての桁にNOT演算を施すことになります。つまり1010です。
さらに、一番下の桁のcinがSELなので1となり、一番下の桁にさらに1が足されることになります。
足し算は順番を変えても問題ないので、これを1010に足すと1011となり、表1を見ると-5となっていることがわかります。
よって、加算回路では0010+1011が計算され、結果は1101となり、表1を見ると-3であることがわかります。

引き算の方は結構複雑だと思います。
わからなかった方は、2の補数でプラスとマイナスを入れ替える方法を意識して読むと、わかりやすくなると思います。
それでもわからなかった場合は、遠慮なくコメントで質問してください。

ようやく足し算と引き算をすることができる回路が完成しましたが、気を付けなければいけない点があります。
それは、この回路は入力や出力が-8から7までなので、入力や出力がこの範囲に収まるような計算しかできないということです。
たとえば、100-98を計算しようと思っても、この回路では計算できません。
また、4+6を計算しようとすると、表1より0100+0110=1010となり、答えが-6になってしまいます。
後者の例のように、計算はできるものの誤った結果を出力する現象を、オーバーフローと言います。
CPUを万能の計算機だと思い込んで使ってしまうと、こんな落とし穴があるんですね。


今回の解説は以上です。
「計算」パート最終章にふさわしい難しさだったと思います(訳:易しく説明できなくてごめんなさい)
さて次回はついに「値の保存」パート!…なんですが、実はたったの1回で終わってしまうかもしれません。
そんな次回は、Dラッチとその構成について解説します。

それではまた、次回の更新で。


【解説記事】2進数&全加算器

こんにちは、竹村です。

今回は2進数と全加算器についてです。
さっそく説明を始めていきましょう


ついに今回で足し算ができるようになるのですが、回路の説明の前にCPUで数がどのように表現されているか説明しなければなりません。
以前も話しましたが、CPUの内部では0と1だけですべてが表現されています。
すると、0と1だけで数を表す方法、つまり2進数が必要となってくるのです。

それではここで、2進数を復習しておきましょう。
10進数は9の次に繰り上がりが起こるのに対して、2進数は1の次に繰り上がりが起こります
10進数の0から10までと、それに対応する2進数を表1にまとめました。
2進数は下の桁から10進数の1,2,4,8,…を表しているので、2進数の1になっている桁に対応する10進数を足せば、2進数を10進数に変換できます。
たとえば、1011という2進数を10進数に直すと1+2+8=11となります。

10進数
0
1
2
3
4
5
6
7
8
9
10
2進数
0
1
10
11
100
101
110
111
1000
1001
1010
(表1:2進数と10進数)

では、2進数の足し算はどのようになるのでしょうか?
基本的には10進数と同じで、下の桁から足していって繰り上がりが生じたら次の桁に繰り上がった分の数を足します
たとえば、1110+1011=11001は図1のようになります。
一番上の行は繰り上がりを表しています。
1110と1011と11001は10進数でそれぞれ14と11と25なので、足し算が正しく行なわれていることがわかります。

2進数の足し算
(図1:2進数の足し算)

このような足し算を回路で実現していくのですが、一度にすべての桁を考えるのは難しいので、部分的に抜き出して一桁の足し算を計算する回路を考えていきます。
その回路のことを全加算器と呼びます。
では、全加算器は何を入力とし、何を出力とすればいいのでしょうか。

入力から考えていきます。
まず、足し合わせる2つの数が必要ですね。
それに、下の桁からの繰り上りがあった場合は、それも足さなくてはいけません。
すると、3つの0か1の入力が必要になります。

次に、出力を考えてみましょう。
当たり前ですが、その桁の足し合わされた結果の数が必要です。
さらに、繰り上がりがあった場合には、次の桁にそのことを伝えなくてはいけません。
よって、2つの0か1の出力が必要になります。

では、どのような入力のときにどのような出力になるのでしょうか。
真理値表を図2にまとめてみました。
入力は、下の桁からの繰り上がりをcin(carry inの略)、足し合わせる2つの数をin1、in2としました。
出力は、上の桁への繰り上がりをcout(carry outの略)、足し合わせた結果をoutとしました。
入力が3種類あるので、2×2×2=8種類の入力パターンがあることに注意しましょう。

 cin 
 in1 
 in2 
 cout 
 out 
0
0
0
0
0
0
0
1
0
1
0
1
0
0
1
0
1
1
1
0
1
0
0
0
1
1
0
1
1
0
1
1
0
1
0
1
1
1
1
1
(表2:全加算器の真理値表)

では、この真理値表が正しいか確認してみましょう。
実は以前の活動報告で説明したことがありますが、この記事でも説明します。
要は、3つの0か1を足して、結果を2桁の2進数で表せばいいのです。
このとき、上位の桁がcoutとなり、下位の桁がoutとなります。
足す順番は結果に関係ないので、以下の4パターンしかありません。

0+0+0=00
0+0+1=01
0+1+1=10
1+1+1=11

つまり、入力に1がいくつあるかで結果が決まります
実際に真理値表を確認してみると、確かに合っています。

そして、この真理値表に対応する回路、全加算器は図2のように論理ゲートを組み合わせることで実現できます。
線が重なっているところは、黒い丸があるところだけつながっています

FullAdder.png
(図2:全加算器)

これが先ほどの真理値表通りに動くかどうかの確認は、すべてのパターンをここで紹介するのは無駄に長くなるだけなので、2つの例で確認することにします。
以下の2つの図では、0を黒、1を赤で表しました

FullAdder-ex1.png
(図3:cin=0,in1=0,in2=1の場合)

FullAdder-ex2.png
(図4:cin=1,in1=1,in2=0の場合)

確かに真理値表と一致しています。
論理ゲートの挙動を覚えていない人は、前回の記事と見比べながら確かめるといいと思います。

さて、これで1桁の足し算ができるようになりました。
これから全加算器は図5のように表します。
FAはfull adderの略です。

FA.png
(図5:全加算器の略記)

あとは、前の桁のcoutを次の桁のcinにすれば、何桁の計算でもできるようになります。
ただし、一番下の桁のcinは0です。
例として、4桁の計算をする回路を図6に示します。
足し合わせる数をa,b、足した結果をcとし、それぞれ下の桁からa0,a1,a2,a3などとしました。

adder.png
(図6:4桁の足し算をする回路)

この回路では、4桁目のcoutを一番上の桁とすることで、出力で5桁の2進数を表現できますが、普通は4桁目のcoutを無視して、出力は4桁の2進数とします。
よって、この回路では出力が0から15までの数しか表現できないので、足した結果がこの範囲に収まるように、足し合わせる数に気を付ける必要があります。
もし、足した結果が15を超えるような入力をした場合、15の次は0に戻るので、15で割った余りが出力されることになります。


今回の解説は以上です。
足し算をするだけでこのややこしさです。わかりにくいことがあったら遠慮なくコメントで質問してくださいね。
さて次回は、ついに「計算」パート最終章!2の補数表現とマルチプレクサについて解説しようと思います。
足し算の次は引き算です!

それではまた、次回の更新で。


【解説記事】論理ゲート&MIL記号

こんにちは、竹村です。

今回はANDゲート、ORゲート、XORゲートの構成と、MIL記号についてです。
それではさっそく始めていきます。

今回紹介する論理ゲートは、どれも入力が2つあります。
すると、真理値表が少しだけ変わってきます。
NOTゲートは入力が1つだったので、入力のパターンが2種類でした。
それが入力が2つになると、2×2=4種類の入力パターンが考えられます。
なので、真理値表は表1のようになります。
in1とin2が入力で、outが出力です。
今は入力に注目しているので、outは空欄にしてあります。

 in1 
 in2 
 out 
0
0
1
0
0
1
1
1
(表1:入力が2つの場合の真理値表)

表1で空欄になっている4つのoutの部分のそれぞれに、0と1のどちらが入るかによってどんな演算となるかが決まります。
では、具体的に見ていきましょう。

AND演算(論理積)というのは、2つの入力をもち、その両方が1になったときだけ1を出力します。
真理値表は表2のようになります。

 in1 
 in2 
 out 
0
0
0
1
0
0
0
1
0
1
1
1
(表2:AND演算の真理値表)

outが1になるためにはinがどっちも1である必要があるというのは、ANDという言葉のニュアンスに合っています。
これをリレーで実現すると、図1となります。

and_gate.png
(図1:ANDゲート)

それでは、確かめてみましょう。
どちらも0のときは確かにoutは0につながっています。
in1だけ1のときも、スイッチは動かないのでoutは0につながったままです。
in2だけ1のときは、スイッチが動きますが、動いた先のin1が0なのでやはりoutは0です。
両方とも1のときは、スイッチが動き、動いた先のin1が1なのでoutは1になります。
真理値表と見比べてみると、ちゃんとAND演算が実現できていることがわかりますね。

次はOR演算です。
OR演算(論理和)というのは、2つの入力をもち、少なくとも1つの入力が1のとき1を出力します。
真理値表は表3のようになります。

 in1 
 in2 
 out 
0
0
0
1
0
1
0
1
1
1
1
1
(表3:OR演算の真理値表)

outが1になるためにはinのどちらかが2であればよいというのは、ORという言葉のニュアンスに合っています。
これをリレーで実現すると、図2となります。

or_gate.png
(図2:ORゲート)

これがOR演算を実現できているかの確認は、ANDゲートとかなり似ています。
なので、ここはちょっと手抜きをさせてください。
ぜひ自分で、ANDゲートと同じように真理値表と見比べながら確認してみてください。
もしわからなければ遠慮なくコメントで質問してください。

最後にXOR演算です。
XOR演算(排他的論理和)というのは、2つの入力をもち、入力の片方が1でもう片方が0のときに出力が1となります。
真理値表は表4のようになります。

 in1 
 in2 
 out 
0
0
0
1
0
1
0
1
1
1
1
0
(表4:XOR演算の真理値表)

XORは聞きなれない言葉だと思いますが、どっちかだけと覚えると覚えやすいかもしれません。
これをリレーで実現すると、図3となります。

xor_gate.png
(図3:XORゲート)

この回路は、スイッチが動けばoutが1になります。
スイッチは、電磁石の2つの端子のうち片方が1でもう片方が0のときに動きます。
つまり、入力の片方だけが1のときにoutも1になります。
ちゃんとXOR演算が実現できていますね。

さて、これで必要な役者は揃いました。
これからは、これらを組み合わせて、足し算と引き算をする回路を作っていきます
しかしその前に、それぞれの論理ゲートに記号を与えましょう。
いちいちリレーの状態で描いて、どれかを判断するのは大変すぎます。
使うのはMIL記号と呼ばれる記号で、図4のように表現されます。

MIL.png
(図4:MIL記号一覧)

次回からはこの記号をたくさん使います。
MIL記号と論理ゲートの挙動を覚えると、これからの解説記事が読みやすくなると思いますが、覚える気なんてさらさらないという方がほとんどだと思います。
そういう方は、次回以降の解説記事もこの記事と照らし合わせながら読むといいと思います。


今回の解説は以上です。
新しい知見が得られるというよりかは、似たような知識の羅列になってしまう回でした。
だからというわけではないですが、今回の記事にはちょっとおまけがついています。
読まなくても次回以降困ることはありません。
内容は難しめですが、興味のある方は読んでみてください。

次回は、2進数と全加算器について解説します。
ついに、足し算ができるようになりますよ!

それではまた、次回の更新で。



おまけ
今回の記事で、論理ゲートをいくつか紹介しました。
実は、論理ゲートの中に、他の論理ゲートを使って作れるものがあります。
NOTとANDをいくつかつなげることでORもXORも作れますし、一方で、NOTとORでANDを作ることもXORを作ることもできます。

これは一般に知られている事実なのですが、どんな真理値表(入力がいくつあってもいいです)に対応する回路も、NOTとANDとORをいくつかつなげることで表現できます。
もちろん、NOTとANDでORを表現したり、NOTとORでANDを表現したりできるので、NOTとANDまたはNOTとORだけで充分です。
それでも、よく使われるのはNOTとANDとORの3つですね。

ここで、こう考える人がいるかと思います。
リレーで作るときもNOTとANDとORの組み合わせでXORとかを作ればいいのに、と。
ですが、そんなことをすると大変なことになってしまいます。
リレーはタダじゃないんです!1個70円と意外に高いんです!それに、個数が増えれば作業量も増えるんです!
というわけで、よく使う論理ゲートを、なんとかして少ない数のリレーで実現しようと、頭をひねりにひねった結果が、紹介した論理ゲートの構成なのです。

ちなみに、最初はANDゲートやORゲートだけでも2個ずつで、XORゲートに至っては8個とか言ってました。
今考えると、恐怖でしかありません。

この話は、活動の中で個人的に印象深い部分だったので、おまけという形としてでも話したかったんです。
わがままにお付き合いいただき、ありがとうございました。


【解説記事】今後の予定&論理ゲート

こんにちは、竹村です。

前回の解説記事は内容が簡単なこともあって質問が来ないかなーなんて思っていたんですが、面白い質問が飛んできました。
コメントで答えたので、みなさんも見てみてください。
いつどの記事に質問しても大丈夫ですから、少しでも気になったことは気軽に質問してみてくださいね。

さて、これからCPUをどのように作っていくのかを説明していくわけですが、そもそもCPUとはなんなのでしょうか?
そして、どんな機能が必要なのでしょうか?

CPUはCentral Processing Unitの略称です。
簡単に言ってしまえば、コンピュータの頭脳部です。
では、CPUにはどんな機能が必要なのでしょうか?

ずばり、CPUにとって重要な機能は以下の二つです。
・計算をすること
・値を保存しておくこと

どうしてこの二つが重要なのか、例を交えて考えてみましょう。

いま、CPUに1から10までの和を計算させることにしましょう。
最初に思いつく最も単純な方法は、1と2を足して、その結果に3を足して、…と順に10まで足していく方法です。
実は、数学の公式などを使わない限り、ほとんどのCPUはこの方法でしか計算できません。
つまり、一度に多くの数字を足し合わせることができないのです。
するとここで、中間的な結果を保存しておく必要が出てきます。
確かに、1+2の結果を覚えておかないと、次は何に3を足せばいいのかわかりません。
それに、最終的な結果も計算した瞬間に消えてしまっては意味がないですよね。

このように、CPUは「計算」と「値の保存」が重要です。
なので、これからはこの2つの要素にスポットを当てて解説をしていこうと思います。
まずは、これから数回かけて「計算」に関することを説明します。そしてそのあとに、これまた数回かけて「値の保存」に関することを説明していく予定です。

そのあとはまだ未定です。
解説記事を続けるなら、具体的なCPUの設計の説明をしたいと思っています。
個人的にはすべてを説明したいなあと思っているのですが、はんだ付け地獄 諸事情によりできない可能性もあるので、今は何とも言えません。

それでは「計算」パートのはじめとして、論理ゲートと、そのうちの1つであるNOTゲートについて説明をはじめようと思います。


みなさんは「コンピュータの内部では0と1だけですべてが表現されている」という話を聞いたことがあると思います。
頭脳部であるCPUも、例外ではありません。

ではそもそも、CPUでは何を0として何を1としているのでしょうか?
答えは電圧です。「ピカチュウ!10万ボルトだ!」のあれです。
僕たちは、5ボルトの電圧を1、0ボルトの電圧を0と考えて設計しました。
なぜそうしたのか、という話は説明が難しいので詳しくは触れませんが、「リレーでCPUを作るのに都合がよかったから」ということです。

これで0と1が表現できたからCPUができるぞー!と言いたいところですが、そんなに簡単ではありません。ここからが本題です。
そうです、CPUにどうやって計算をさせるかという話です。

CPUは論理演算という計算しかできません。
論理演算とは、0と1だけを使った計算の事です。
しかし、計算と言っても、僕たちが小学校で習ったような足し算や引き算ではありません。
代表的なものとしてNOT(否定)、AND(論理積)、OR(論理和)、XOR(排他的論理和)などがあります。
これらの演算を組み合わせることで、足し算や引き算だけでなく、さまざまな計算をすることができます。
詳しくはもう少し後の解説記事まで待っていてください。

論理演算をする機構のことを論理ゲートと言い、NOT演算やAND演算をするものをそれぞれNOTゲートやANDゲートなどと呼びます。
では、リレーをどのように使って論理ゲートを作るのか、NOTゲートを例にして説明していきます。

さっきから論理演算を計算だと説明していますが、関数だと考えてもらった方がわかりやすいと思います。
つまり、何かが入力されたら、それに対応する出力をするということです。
NOT演算は、1つの0か1を入力することができ、0が入力されたときには1を、1が入力されたときは0を出力します。
これを表にまとめると表1のようになります。

 入力  出力 
  0   1 
  1   0 
(表1:NOT演算の真理値表)

つまり、入力とは違う数字を出力しているわけです。
これにNOT(否定)という名前がついているのもしっくりきますね。
また、入力と出力をまとめた、このような表のことを真理値表と呼びます。
今後もよく出てくるので、言葉を覚えてもらえると助かります。

では、この演算をリレーを使ってどのように実現するのかというと、図1のようにします。
inは入力、outは出力のことです。
Vは電源電圧のことで、要は1です。
Gはグラウンドのことで、要は0です。

not_gate.png
(図1:NOTゲート)

では、図1がほんとにNOT演算を実現できているのか確かめてみましょう。
電磁石には、一方の端子が1で、もう一方の端子が0のときだけ電流が流れます。
なので、inが0のとき電磁石は磁力をもたず、スイッチは動きません。
つまり、outはVとつながっているので1になります。
一方、inを1にしてみると、電磁石の端子が1と0になるので電磁石が磁力をもち、スイッチが動きます。
つまり、outはGとつながるので0になります。
以上より、確かにNOT演算を実現できていることがわかります。


今回の説明は以上です。
前回に比べて難しい雰囲気なってきました。
冒頭の部分も長かったので、読むのが大変だったと思います。
わかりやすく書いたつもりではいますが、質問がありましたら遠慮なくお願いします。

次回は「計算」パートの続きとして、ANDゲート、ORゲート、XORゲートの構成と、MIL記号について解説しようと思います。

それではまた、次回の更新で。


«  | ホーム |  »

プロフィール

アンチ半導体同盟(仮)

Author:アンチ半導体同盟(仮)
東京工業大学 工大祭 2013でリレー式計算機を展示します。
日時:10月12日(土)、10月13日(日)
場所:大岡山キャンパス西9号館W934講義室
企画名:リレー式計算機展

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

未分類 (0)
活動紹介 (19)
メンバー紹介 (2)
解説記事 (6)

RSSリンクの表示

リンク

このブログをリンクに追加する

ブロとも申請フォーム

この人とブロともになる

QRコード

QR

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。