6.6K Views
June 03, 24
スライド概要
2024/6/2に自作CPUを語る会で発表した資料です。
平衡3進数の紹介と3進論理回路、3進加算器などの解説をしています。
低レイヤー好きの大学生です。 ハードウェア的に面白い計算装置を電子工作で自作するのが好きです。
3進CPUを自作する!!! きっちー@rikeden_net 2024/6/2 自作CPUを語る会
Index • はじめに • 平衡3進数を布教したい • 3進NANDは実は簡単 • 3進加算器の工夫を語りたい • フリップフラップフロップ! • 1trit手動制御CPUを作りました
はじめに • 現在の進捗: 3進回路の各種コンポーネントを製作中 • 3trit手動制御CPU基板を1週間前に発注(明日到着予定) • 1trit版をユニバーサル基板で作ったので後で見てください
なぜ3進? どんな自作CPUがあるか? FPGA、ロジックIC、NAND、リレー etc. →材料に違いはあれど全部2進(一部4進?) じゃあ3進のCPUを作ろう!
Index • はじめに • 平衡3進数を布教したい • 3進NANDは実は簡単 • 3進加算器の工夫を語りたい • フリップフラップフロップ! • 1trit手動制御CPUを作りました
3進数にも種類がある • 普通の3進数 (0, 1, 2 の3文字を使用) 201(3) = 2×9 + 0×3 + 1×1 = 19 9の位─┘││ 3の位──┘│ 1の位───┘
3進数にも種類がある • 平衡3進数 (0, 1, -1 の3文字を使用) -1を#と表記(1� が一般的) 1#0(3) = 1×9 + (-1)×3 + 0×1 = 6 9の位─┘││ 3の位──┘│ 1の位───┘
各記数法の比較 10進数 3進数 平衡3進数 0 0 0 1 1 1 2 2 1# 3 10 10 4 11 11 5 12 1## 6 20 1#0 7 21 1#1 8 22 10# 9 100 100
各記数法の比較(負数) 10進数 符号付き絶対値 3進数 3の補数(4桁) 平衡3進数 -0 0000 0 -1 2222 # -2 2221 #1 -3 2220 #0 -4 2212 ## -5 2211 #11 -6 2210 #10 -7 2202 #1# -8 2201 #01 -9 2200 #00
平衡3進数のメリット • 負数を”自然に”表現できる • 表現できる数の範囲が対称 例. 3桁なら -13 ~ 13 の27種類 • 各桁の反転が符号反転になる • 最上位の値で符号(正負とゼロ)が分かる • 切り捨てが丸めになる
Index • はじめに • 平衡3進数を布教したい • 3進NANDは実は簡単 • 3進加算器の工夫を語りたい • フリップフラップフロップ! • 1trit手動制御CPUを作りました
NAND(バイナリ) • CMOS(nMOS + pMOS) でのNANDの構成図 • nMOS • 0を伝達 • 1でON • pMOS • 1を伝達 • 0でON NAND 0 1 0 1 1 1 1 0
NANDを3進数に拡張 • AND を MIN に一般化 • NAND(A, B) = ~MIN(A, B) NAND -1 0 1 -1 1 1 1 0 1 0 0 1 1 0 -1
NANDを3進数に拡張 • CMOSでどうやって実現するか? NAND -1 0 1 -1 1 1 1 0 1 0 0 1 1 0 -1
NANDを3進数に拡張 • CMOSでどうやって実現するか? • 抵抗を2個追加すればOK!!! NAND -1 0 1 -1 1 1 1 0 1 0 0 1 1 0 -1
NANDを3進数に拡張 • nMOS • pMOS • -1を伝達 • 1を伝達 • 0, 1でON • 0, -1でON • 1と-1の一方のみON → その値 • 両方ON → 抵抗で分圧され て0を出力 NAND -1 0 1 -1 1 1 1 0 1 0 0 1 1 0 -1
CMOS + 抵抗の構成の特徴 NOT, NAND, NOR がバイナリと同じ構成で作れる 出力に抵抗(10k)を介するので出力インピーダンスが大きい 静的な電力消費がある NOT NOR NAND
Index • はじめに • 平衡3進数を布教したい • 3進NANDは実は簡単 • 3進加算器の工夫を語りたい • フリップフラップフロップ! • 1trit手動制御CPUを作りました
平衡3進数の加算 • 平衡3進数1桁(-1~1)同士の加算 → -2 ~ 2 10進 3進 2 1# 1 C -1 0 1 S -1 0 1 01 -1 -1 0 0 -1 1 -1 0 0 00 0 0 0 0 0 -1 0 1 -1 0# -2 #1 1 0 0 1 1 0 1 -1
半加算器 • 試行錯誤、紆余曲折があって現時点で最もコンパクトな回路↓ • 16個のMOS
• X1: A=B=1のときのみ0, それ以外は1 • X2: A=B=-1のときのみ0, それ以外は-1 • C: X1 = 0のとき1, X2 = 0のとき-1, それ以外は0 C -1 0 1 -1 -1 0 0 0 0 0 0 1 0 0 1
~S NOT S -1 0 1 -1 1 -1 0 0 -1 0 1 1 0 1 -1 ~S -1 0 1 -1 -1 1 0 0 1 0 -1 1 0 -1 1
• A=B=1, A=B=-1の部分はCと似てる • 他の出力が”弱い”なら、これらを”強く”出力する ことで上書きできる C -1 0 1 ~S -1 0 1 -1 -1 0 0 -1 -1 1 0 0 0 0 0 0 1 0 -1 1 0 0 1 1 0 -1 1
• A=B=1, A=B=-1の部分はCと似てる • 他の出力が”弱い”なら、これらを”強く”出力する ことで上書きできる • 真理値表の左上を1, 右下を-1にすれば いい感じに1と-1をカバーできる • A=1, B=-1とA=-1, B=1の場合に両方の スイッチがOFFになるのでHi-Zとなってしまう ~S -1 0 1 -1 -1 1 0 0 1 0 -1 1 0 -1 1
• Hi-Zを解決するために0にプルダウン(?) すると、1, -1を出力したいときに 0.5, -0.5になってしまう ~S -1 0 1 -1 -1 1 0 0 1 0 -1 1 0 -1 1
• Hi-Zを解決するために0にプルダウン(?) すると、1, -1を出力したいときに 0.5, -0.5になってしまう • 謎の回路によってこの問題を解決 ~S -1 0 1 -1 -1 1 0 0 1 0 -1 1 0 -1 1
• 謎の回路によってHi-Z問題を解決 • すべての場合でHi-Zにならず、抵抗を通して ”弱く”出力する
半加算器(再掲) • 試行錯誤、紆余曲折があって現時点で最もコンパクトな回路↓ • 16個のMOS
全加算器 • 1桁の値3つの 加算 • 半加算器2個 + S回路
Index • はじめに • 平衡3進数を布教したい • 3進NANDは実は簡単 • 3進加算器の工夫を語りたい • フリップフラップフロップ! • 1trit手動制御CPUを作りました
DFFF • 1bitの記憶回路をフリップフロップと言うが、1tritを記憶する 場合はフリップフラップフロップという名前がある • DFFFはクロックの立ち上がりで値を取り込み、保持する回路
DFFF • NOTゲート, Transferゲートを用いてバイナリと全く同じ構成 で作ることができる • クロックは1/-1の2値から成る矩形波
DFFF • 試作してみたところクロック切り替わり時に値が壊れてしまう • NOTゲートの出力の弱さが原因の可能性
DFFF • 試作してみたところクロック切り替わり 時に値が壊れてしまう • NOTゲートの出力が弱く、入力容量に負け てしまう可能性がある ① ③ ②
DFFF • 出力抵抗を小さく、スイッチ部に大きな 抵抗を入れると正しく動作 • アナログ回路的な影響を考えるのは大変な ので別の構成を試してみる ① ③ ②
バッファ回路 • 抵抗を介さずに出力できる 回路が欲しい • 入力値をそのまま出力する バッファ回路なら実現可能
DFFF(バッファ型) • 2つのバッファで自己ループを作り値を保持するDFFFを構成 • 試作品で動作テストに成功 • 今日のデモマシンではNOT型よりも動作不安定?
Index • はじめに • 平衡3進数を布教したい • 3進NANDは実は簡単 • 3進加算器の工夫を語りたい • フリップフラップフロップ! • 1trit手動制御CPUを作りました
1trit 手動制御CPU • 1trit レジスタ x2 • ALU (NAND, NOR, ADD) • ALU入出力選択MUX • クロック、制御信号はスイッチ で手動入力
1trit 手動制御CPU
3進CPUとは無関係ですが過去に作ったアナログライフゲームも 展示するので是非見てください
ご清聴ありがとうございました