2018-09

スポンサーサイト

上記の広告は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の状態になるときに、コンデンサーが右のリレーの電磁石に電流を流してくれます。

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


なんか思ったよか大丈夫そう

こんにちは。米田です。

 久しぶりの活動報告です。

 8月22日から8月24日の3日間を「集中作業期間」に設定して思いっきり作業を進めました。
 そもそもなんでこんな期間を設定したかと言うと、工大祭まであと2ヶ月を切っているのにCPUはおろか電卓も完成していないという状況があったからです。7月13日に決めたスケジュールの通りだと電卓はとっくのとうに完成しているはずだったのになぁ。

 集中作業期間には普段のメンバー(米田、竹村、ふじてつ、桐山)のみならず心強き助っ人にお越し頂き一緒に作業をしました。助っ人の方々には主にCPU部品のハンダ付けをやってもらいましたが、その間に組立やデバッグの方をすることができ大変助かりました。本当にありがとう。

 さて、この日完成した部品のうち2つを紹介をいたします。
 一つ目はレジスタへのアクセスに使うマルチプレクサです。私達が作るCPUにはレジスタが16本あり、この16本のうちのどれにアクセスするかを選択するのに使用します。回路規模はどれ位になるかというと,

( (レジスタ本数) - 1 ) × (レジスタ1本のビット数) = (16 - 1) × 4 = 60個


のリレー(1回路のリレー)が必要となる位です。マルチプレクサは回路自体は単純なのですが数が多いためなかなか大変です。これが完成したのは結構大きいです。

 次に表示回路です。これは電卓で計算結果の表示に使います。電球を使ってい、制御基盤にはAC100Vがかかっている部分があります。ショートしてブレーカーが落ちたり、AC100Vに触れて感電するとまずいのでそこそこ安全設計になっています。
DVC00288.jpg

 表示回路が完成して動いているところを見ると電卓本体の完成を急ぎたくなってきます。

 3日間の集中作業では思ったよりも順調に作業が進みました。CPUの80%の部品の完成、電卓の部品のほとんどが完成、電卓の組み立てとデバッグの70%が完了、というところまで何とか到達したのです。

 さぁ、10月の工大祭まで突っ走るぞ〜!



追加メンバー紹介

拝啓、記事をお読みの皆様
この夏いかがお過ごしでしょうか。
我々はハンダ付けの夏を満喫しています。

遅くなりましたが自己紹介させてもらいます。

・名前
桐山裕匡(きりやま ひろただ)
・所属
東京工業大学理学部情報科学科(<-竹村に続いての理学部)
・特技
直立ニソクホコウができる
・〜には目がない
寿司。寿司になりたい。
・ひとこと
ハンダ付けの夏、風流を感じる。


【解説記事】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の補数表現とマルチプレクサについて解説しようと思います。
足し算の次は引き算です!

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


«  | ホーム |  »

プロフィール

アンチ半導体同盟(仮)

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

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

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

RSSリンクの表示

リンク

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

ブロとも申請フォーム

この人とブロともになる

QRコード

QR

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