自作3進CPU計画の第2回です。
前回は NOT, NOR, NAND のゲートを作成しましたが、今回はフリップフロップ、すなわち記憶回路の作成に挑戦しました。
目次
フリップフロップ
まず一般的な2進回路におけるフリップフロップについて確認します。
フリップフロップにもいくつかの種類がありますが、代表的なものにDFF(Dフリップフロップ)があります。
DFFはクロックの立ち上がりのタイミングで D(入力)の値を Q (出力)に反映します。~Q には常に Q の反転した値が出力されます。
3進回路でもやりたいことは同じです。クロックの立ち上がりで入力値をサンプルしてそれ以外のタイミングでは出力を保持します。
入力、出力の値は 1, 0, -1 の3種類になりますが、クロックは 1 と -1 の値を取る矩形波とします。
ちなみに、3進回路の場合記憶する値が3種類なのでフリップフラップフロップと呼ばれる場合もあるようです。この記事では今後DFFFと表記することにします。
試作1 NOT + Transfer 型
DFFFは実は2進のDFFと同じ回路で作ることができます。
まず初めにトランジスタの使用量が少ない NOT + Transfer 型のDFFFを作ってみました。
回路はこのようになっています。
ここで、NOTゲートはトランジスタレベルではこのような回路になっています。
また、Transferゲートはトランジスタレベルでは次のような回路です。ゲートのシンボルでは C のみ表記していますが、実際にはその反転の ~C も接続する必要があります。
- C = 1, ~C = -1 のとき IN と OUT が導通状態
- C = -1, ~C = 1 のときは非導通状態
となります。
実際に作ってみた
ユニバーサル基板で試作してみたものがこちらです。
リセット信号Rとリセット時の値Aを追加したので先の回路図よりも少し部品が増えています。
問題発生
NOT + Transfer型のDFFFは C(クロック) = -1 のとき後段のループで値を保持しつつ入力を中間まで取り込み、C = 1 のとき前段のループで値を保持することにより、C が -1 → 1 に変化したタイミングで値を取り込む動作を可能にしています。
試作した回路では、前段と後段のそれぞれのループで値を保持できることは確認できましたが、クロックの切り替わりのタイミングで値が壊れてしまうことに気が付きました。
原因を考えた結果、以下のような仮説を立てました。
まず C = -1 のとき、①は ~D を出力して②に入力しています。③にはDとは無関係の別の値が入力されています。
ここで C = 1 に変化したときの期待する動作は、②の出力 D が①の入力にフィードバックして①は ~D を出力し続け、②は ~~D = D を出力することです。
しかし、ここで問題が発生すると考えます。
①と③の間が導通したとき、②の入力には①の出力と③の入力が接続されることになります。
①の出力は持続的ですが抵抗を通して出力するので弱いです。一方③の入力にはMOSFETなのでキャパシタがあります。キャパシタの持つ電荷の量は小さいですが、抵抗を通さないので一瞬だけ強く出力することになります。
この影響で②の出力が壊れて前段のループの値が壊れてしまったのではないかと考えました。
この問題への対応策として、③の入力からの逆流を防ぐために抵抗を入れ、①の出力を強化するためにNOTゲートの出力の抵抗値を小さくしました。
この対策により基本的な動作ができるようになりました。
動作テスト
動作テストの動画です。3つのLEDは左から入力、クロック、出力を表していて、クロックが立ち上がる(赤→緑)タイミングで入力を取り込むことが出来ました。
問題再び
動作テストの次に D を ~Q に接続してクロックごとに反転させるテストをしたのですが、値が壊れてしまいました。
先ほどと同様の問題が後段のNOTゲートについても発生することに気が付きました。
①の入力から③の入力に逆流が発生してしまいます。
Q や ~Q の出力に抵抗をつければ対応できそうですが、DFFFを実際の回路の中で使うときに懸念事項が増えそうなので、NOT + Transfer型のDFFFの試作はここで終了することにしました。
試作2 NAND型
NOT + Transfer型の問題はTransferゲートが導通したときに違う値の入力が衝突してしまう所にあると考え、Transferゲートを使わないNAND型のDFFFを試作しました。
NANDゲートはトランジスタレベルでは以下のような回路になっています。
動作としては先ほどの NOT + Transfer型と同様で前段と後段の2つでループを作って値を保持するようになっています。
実際に作ってみた
NAND型はトランジスタの使用量が多いので、チップトランジスタをたくさん並べられる半ユニバーサル基板を作りました。
この基板は PCBGOGO さんにスポンサーしていただきました!
毎度お世話になっているのですが、品質も安定していて満足しています。皆さんもプリント基板を作る際は PCBGOGO を利用してみてはいかがでしょうか。
チップトランジスタを並べてNAND型のDFFFを実装したものがこちらになります。表面にはPMOS、裏面にはNMOSを並べて両面を使用しています。
動作テスト
NOT + Transferで失敗した反転テストの動画です。
この動画では波形生成器でクロックを入力しましたが、タクトスイッチで手動クロックを入力すると値が壊れてしまうことが度々ありました。
キャパシタ+インバータでチャタリング対策をするとマシにはなりましたが、それでもたまに値が壊れてしまいました。
結局出力が抵抗を通して弱いことに原因がありそうな気がしたのでNAND型も見送ることにしました。
試作3 バッファ型
現状の3進回路は基本的にどのゲートも抵抗を通して出力しているので、抵抗を通さずに強く出力するゲートを考える必要があります。
いろいろ考えた結果、次のような回路にたどり着きました。
論理的には入力値をそのまま出力する意味のないゲートですが、電気的には出力値を強化してくれるバッファになります。
バッファ回路を利用したDFFFを以下のように構成しました。
構成は NOT + Transfer 型と似ていて、NOT2個でループを作っていた部分をバッファ1つでループさせるようにしています。
デメリットとして ~Q の出力が得られない点がありますが、3進回路においては ~Q があることのメリットは2進回路に比べて小さいと思うので許容することにしました。
実際に作ってみた
NAND型と同様に自作したチップトランジスタ用半ユニバーサル基板でバッファ型DFFFを実装してみました。
リセット信号等も含めてトランジスタの合計数は28個となりました。
動作テスト
まずは任意の値をクロックエッジで取り込むテストです。ちなみに配線を間違えたのでクロックの立下りで取り込むようになってしまいました。
続いて反転のテストです。最初にリセットで値をロードできることも確認してます。
まとめ
いくつか試してみてバッファを用いることで安定した動作のできるDFFFの製作に成功しました。
今後はこのDFFFをベースにもう少し規模の大きい回路を作っていきたいと思います。