2010年8月2日月曜日

リレー加算器

リレーの話だ. 運動会とは関係ない. ここでいうリレーは電気部品で, 電気信号を継続するという意味から, 和語では継電器という.

私が学生時代に所属していた研究室では, 私が研究室に入る少し前までは, 論理回路の素子はリレーであり, それを使って, ディジタル抵抗計を試作したりしていた. 従って, 研究室にはリレーが沢山あった. 物理教室の実験室には, 直流電源が来ていたから, リレーの実験は簡単で, 私も電話交換機に使う回転スイッチを回して遊んだりしたものだ.

当時, 工学部にはリレー回路の講義があった. 私は大学院生になると, 応用物理学科の磯部教授の, William Keisterの教科書The Design of Switching Circuitsによる講義に出席した. もちろん当時は, その後で私もその学科のメンバーになるとは, まったく思わなかった.

私自身は, ちょうど後藤さんがパラメトロンを発明した直後だったから, 論理回路といえばパラメトロン一点張りであり, リレーの経験はない. そこで一度リレーで二進4桁くらいの加算器を作ってみたいと思っていた.

昨年の夏だったか, 日本橋学館大学の田中君が, リレーの加算器を見せてくれたのに刺激され, 私も実現に向け, 少しずつ進んだ.

まずリレーのおさらいを少々.

リレーには働きにより3種類あり, 左からmake, break, transferという. 下の箱にワイヤが巻いてあるのが電磁石で, 電流が流れると(1の時), その磁力により, 普段(0の時)はバネで上の位置にあるスイッチが下の位置になる.

makeは0の時, 左右の回線が切れ, 1の時, 繋がる. breakは0の時, 回線が繋がり, 1の時, 切れる. transferは, 0の時, 左の回線は右の上と繋がり, 1の時, 下と繋がる. このtransferは, 切替えの時, 左の回線は一旦, 上下のいずれとも切れるが, transferには, 一旦上下両方に繋がるタイプもある.

注意: リレーの回路は, このように, 電流が流れていない時(0の時)の図を描くことになっている.


こういうリレーを想定し, 2ヶ月程前, 二進加算器のリレー回路なんか簡単さと思って, 下のように設計した.


図が左右に長いので, 途中で分割してあり, 上の図の右が, 下の図の左に続く.

一番下の桁a0, b0の和がs0で, 繰上げがc1である. 次のa1, b1, c1の和がs1で, 繰上げがc1である. のように見る.

そして, 田中君に意見を求めたところ, 繰上げにリレーを使うと遅くなるからよくないというコメントが早速来た. そしてZuseの回路(dual-rail-carry full adder)を教えてくれた.



これがニ進1桁分, いわゆる全加算器である. 1桁のaとbと, 下の桁からの繰上cinを足す. この入力に対し, 出力はこの桁の和outと, 上の桁への繰上げcoutである.

この回路の最大の味噌は, 繰上げに裏回路があることだ. (dual circuitという.) つまりcinと¬cin, coutと¬coutがある. 回路図では, notは上線で表現するが, htmlでは書けないので, この説明では¬を使う.

左のb=0と書いてある上が, リレーbで動く(つまりbの値の0,1で動く)リレーで, 4回路のtransferになっている. 4極双投(four pole double throw)ともいう.

右手のa=0と書いてある上がのリレーaである. aとbは上下が反対になっているが, 図を簡単にするためだ.

この他, V+には, 出力を駆動する電源を繋ぐ. (常時1になっている.)

前述のように, aのリレーもbのリレーも0の時の図なので, この時の注目すべき回線を赤線で示す. つまりこの時は, V+の1が¬coutを1にしている. cin, ¬cinはいずれかが1のはずだが, ¬cinが1なら, その先はどこにも繋がっていないので, 関係なし. cinが1なら, 下から繰上げがあり, outを1にする.

全加算器の真理値表は下のようだ. 計算機屋なら夢の中でも書けるはずだ.


入力 出力
a b c s c ¬c
0 0 0 0 0 1
0 0 1 1 0 1
0 1 0 1 0 1
0 1 1 0 1 0
1 0 0 1 0 1
1 0 1 0 1 0
1 1 0 0 1 0
1 1 1 1 1 0

さてZuseの回路のチェックは次のようにする. まずoutが1になる条件を調べる. aとbの組合せを4通り書き, outが1になる条件を探す. つまりoutから逆にV+かcinか¬cinを見るわけである. 0 0ならc=1だ. 0 1ならbの節点を上に切替えてみると, ¬cinに辿り着くからc=0だ. このようにして書くと

a b c
Out= 0 0 1
0 1 0
1 0 0
1 1 1

が得られ, 二進3変数の和であることが分かる. 同様にして, cout, ¬coutも書いてみる. xはそういうcはないこと, oはcに関係なく1になることを示す.

a b c
cout 0 0 x
0 1 1
1 0 1
1 1 o

a b c
cnot 0 0 o
0 1 0
1 0 0
1 1 x

というわけで, この全加算器回路は正しいことが分かる. 繰上げが伝搬する場合, aがすべて0, bがすべて1, 一番下のcinが1なら, 右から来たcinは左のcoutから出ていき, aとbのリレーの動作が終った途端に一番上のcoutを1にする.

ウェブページを探したら, リレーを使って計算機を作ったという, やはり物好きな報告を見つけた.
http://web.cecs.pdx.edu/~harry/Relay/RelayPaper.htm
Konrad Zuseの全加算器の説明の後, "Except for the full adder, I designed all circuits used in my computer."と書いてあるから, この加算器は誰にも真似の出来ない完成品なのであろう.

Processingで描いたこの回路のシミュレータが, http://playground.iijlab.net/~ew/relayadder/relayadder.htmlにある. (ダウンロードには多少時間がかかります.) 右下のa,b,cの枠内をクリックすると, その値の0,1が反転する.
キーボードのキーを押しても値は変わる.

0 件のコメント: