加算器を作る === ## モチベーション とてもとても加算器を作りたくなった。 * リレー回路 * 汎用ロジックIC * トランジスタ回路 での実装する。 ## リレー回路での実装 ### リレーの予備知識 まず、リレーは [ここ](https://www.fa.omron.co.jp/guide/faq/detail/faq02056.html) で述べられているように複数の接点を持つ。 リレーはある入力を受け付けると、ONになるスイッチ(a接点)とOFFになるスイッチ(b)が組み合わされている。これらを適切に組み合わせることで、さまざまな論理演算を行うことが可能である。 ### 回路図 結論からいうと次のようなリレー回路を組めばよい。 +となっているところにはリレーの起動電圧を入れる。 GNDとONはコイル部分の13,14番ピンである。 下側が入力のX, Y, C, 上側が出力のSumとCarryである。 ![title](Img/relay_fulladdr_base.PNG) ### リレー全自動加算器の動作原理 次に、それぞれの入力状態で、各リレーがどのように動作し、どのように出力されるのかを示す。 オレンジがコイルによって動作した部分、赤は電圧が伝搬している旨を示している。 * X=0, y=0, C=0 結果はSum = 0, Carry = 0 ![title](Img/relay_fulladdr_000.PNG) * X=1, y=0, C=0 結果はSum = 1, Carry = 0 ![title](Img/relay_fulladdr_100.PNG) * X=0, y=1, C=0 結果はSum = 1, Carry = 0 ![title](Img/relay_fulladdr_010.PNG) * X=1, y=1, C=0 結果はSum = 0, Carry = 1 ![title](Img/relay_fulladdr_110.PNG) * X=0, y=0, C=1 結果はSum = 1, Carry = 0 ![title](Img/relay_fulladdr_001.PNG) * X=1, y=0, C=1 結果はSum = 0, Carry = 1 ![title](Img/relay_fulladdr_101.PNG) * X=0, y=1, C=1 結果はSum = 0, Carry = 1 ![title](Img/relay_fulladdr_011.PNG) * X=1, y=1, C=1 結果はSum = 1, Carry = 1 ![title](Img/relay_fulladdr_111.PNG) 上記のように、適切に加算器の演算となることがわかる。 ## 調達と実装 リレーを実際に利用する際は、ソケットを用いた実装とした。 ラッピングワイヤが使えればそれでもいいが、実際問題、ソケットが現実的だろう。 ただ、このリレーとソケットの組み合わせは恐ろしく高い。新品定価で購入しようとすると、2c接点の組み合わせで1500 + 1000 = 2500円位する。これは現実的でないので、 [FA機器](https://fakiki.com/) などで安い2MY等が出るのを待ち購入した。 尚、ソケットは基本的にM3のねじでとまる。ただし、若干長さがあるのであまり短いと合わないかも。 ![機材](Img/relay_buy.jpg) この結果、4c接点を含む20強のリレーを手に入れた。 ご覧の通り、リレーの端子はY端子をねじ止めすることになっている。 配膳部材としては以下のものを用意した。 * VSF 0.75mm より線(結局20m分くらい) * ニチフ 1.25Y-3.5 (200個) * スリーブ(TIC 1.25) (200個) ![機材](Img/relay_tool.jpg) 基本的に電工カッターで向いて、圧着する。の繰り返し。 ![機材](Img/relay_tool2.jpg) あとはドリルなりM3のねじやナットでこうやって詰めていく。 ![機材](Img/relay_tool3.jpg) 基本的に忠実に作っていけばあまり問題はない。 ![機材](Img/relay_tool4.jpg) ほぼ完成したところ。 右上のほうの端子はリレー回路実験用の端子盤。こういうのがあるとトラブルシュートが楽。 ![機材](Img/relay_tool5.jpg) 最終的にこのように組み込まれた。 # 汎用ロジックIC での演算回路の検討 まず、NAND回路を使って半加算演算が以下のようにあらわされることはよく知られている。NAはNANDを示す。尚、下の入力をショートさせているNANDはNOTの等価回路である。 ![NANDでHA](Img/ha_nand.PNG) このような図から話を進める際は、自分の誤解を含めて、本当にこの論理式が正しいか確認する必要があると思う。 [他の記事](http://www.hogetan.net/note/memo/iverilog.html) にて、Velilogをつかって、ロジックの正しさを検証する記事を書いた。 ![ロジックシミュレート](../memo/Img/gtkwave1.PNG) ``` module HA( input x, y, output r, c); logic r11, r21, r22, r23, r31; assign r11 = x ~& y; assign r21 = x ~& r11; assign r22 = y ~& r11; assign c = r11 ~& r11; assign r = r21 ~& r22; endmodule module test; logic a, b, c, s; HA adder(.x(a), .y(b), .r(s), .c(c)); initial begin $dumpfile("test.vcd"); $dumpvars(0, test); $display("A B C S"); $monitor("%b %b %b %b", a, b, c, s); a = 0; b = 0; #1; a = 0; b = 1; #1; a = 1; b = 0; #1; a = 1; b = 1; #1; $finish; end endmodule ``` のようなロジックから上記のシミュレートを導きだせる。 ぜひ論理式検証には使うべきだと思う。 ## 半加算器を使った全加算器の実装 半加算器がある環境下において全加算器は以下のように示される。 半加算器はHAとして表現した。 ![HAを組み合わせたFA](Img/fa_logic.PNG) ## 汎用ロジックICを使った実装 これを半加算器のNANDに書き下してそのまま実装すると ![HAを組み合わせたFA](Img/fa_ic.PNG) となる。図の下がNANDだけに書き下したものだ。 この回路は無理にNANDだけで演算しようとしているが、ORをもうちょっと省力化してもいいかもしれない。 ICとしては秋月電子で購入できる74HC00を使った。 これは比較的低額にできる。せいぜい、IC代20円 x 4程度だ。 ## トランジスタを使ったNANDの実装 汎用ロジックICで回路が組めるのだから、もちろん、半導体のディスクリートで回路が組める。 トランジスタ等(FETなど)を使ったNANDの実装はいくつかあるが、まず思いつくのが、 ![Tr NAND](Img/nand_tr1.PNG) という回路で、Trを用いた教科書的なANDとNOTを組み合わせただけの簡単な回路である。 これは一見して動くように見える。ただ、青い線の場合のように、X=0, Y=0のとしてGNDに落とした場合、期待としてはTrのベースに対する入力は0vとなり、結果、outにVccが印加されてほしいが、ダイオードのVFがあるため、この回路ではTrのベースには0.8V以上(VF次第)がかかり、トランジスタがONしてしまう。 こうなると、コレクタ側からの5Vはすべて接地されてしまい、outに出力がない。 そこで、 ![Tr NAND](Img/nand_tr2.PNG) のように、Trの手前に(通常はIn側と同じ)ダイオードを入れてやる。これをレベルシフトダイオードと呼ぶ。こうなると、VF分落ちるので、Trはめでたく0Vとなり、OFF状態になって、NANDとして作用する。 実際にブレッドボードに試作した。 ![Tr NAND](Img/nand_tr3.PNG) ## トランジスタを使った半加算器の実装 これらを組み合わせて上記のようにNANDとして組み合わせてやる。 しかし、なかなか一発で実装するのは怖いので、試しに、LTSpiceをつかってシミュレートしてみた結果が以下。 やり方はいくつかあるんだろうけど、よくわからなかったので、電源を複数種類用意してパルス波形をはくシミュレーションにした。 ![HAのトランジスタ回路](Img/ha_ltspice.jpg) 実際にうまくいきそうなので、ユニバーサル基盤に実装した。 ![HAのトランジスタ回路](Img/ha_tr.jpg) ![HAのトランジスタ回路](Img/ha_tr2.jpg) 家にあったユニバーサル基盤に全加算器を実装できないかなとトライを初めてものすごい詰め込んだらつらいことになってしまった。一応、各ロジックか5x5のピンには収まっている。