2018-07

スポンサーサイト

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

【解説記事】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の補数」は具体的に示されているので分かるんだけど、そもそも「補数」って何なんだ?という疑問が残ってしまいました。補数がわからなくても内容の理解にあまり影響しない気がしますけど、気になります。

僕らは「2の補数」については人に説明できる程度には知っているつもりですが、「補数」という概念についてはそこまで詳しくないので、求められているレベルの答え方ができないかもしれません。ご了承ください。

補数には2種類あります。「基数の補数」と「減基数の補数」です。

「基数の補数」というのは「繰り上がりに必要な最小の数」です。
これは何進法かによって変化するので、通常「~進法の~に対する~の補数」という使い方をします。
たとえば、10進法の35に対する10の補数は100-35=65、2進法の1010に対する2の補数は10000-1010=0110となります。

「減基数の補数」というのは「繰り上がりに必要な最小の数-1」です。
これは呼び方が少し変わります。
たとえば、10進法の35に対する9の補数は99-35=64、2進法の1010に対する1の補数は1111-1010=0101というように使います。

普通は「~進法の」という言葉を省略しますが、これは「基数の補数」か「減基数の補数」かが明らかなときでないと、誤解を生む可能性があります。
記事の中で紹介した「2の補数」は数を2進法で表しているので「基数の補数」であるということがわかります。
コンピュータ上の数の表現法として「1の補数」も使うことがありますが、これは「減基数の補数」です。

また、この言葉の定義からすると、記事中での「2の補数」という言葉の使い方に違和感を感じるかもしれません。
しかし「2の補数」は、補数の正確な定義を指す言葉としてより、2の補数を利用したコンピュータにおける数の表現法を指す言葉として使われることが多いです。

コメントの投稿


管理者にだけ表示を許可する

トラックバック

http://antisemiconductor.blog.fc2.com/tb.php/19-08086bdc
この記事にトラックバックする(FC2ブログユーザー)

«  | ホーム |  »

プロフィール

アンチ半導体同盟(仮)

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

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

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

RSSリンクの表示

リンク

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

ブロとも申請フォーム

この人とブロともになる

QRコード

QR

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