世界最低クラスの性能の1ビットCPUをASICとして自作し、オーバークロックを試す

YouTubeで開く ↗
概要

電子工作系YouTuberのイチケンは、1ビットCPUをトランジスタレベルから設計し、実際の半導体チップとして製造した。協力したのは、以前オペアンプを自作したときと同じオープンソース半導体コミュニティ「ISHI会」である。この動画では、回路の由来、レイアウト設計、製造、ブレッドボード上での動作確認を順に紹介し、最後にクロック周波数と電源電圧を上げてどこまで動くかを試している。

8分で読めます

元になった回路はnaoto64氏の1ビットCPU

1ビットCPUの設計はイチケンのオリジナルではない。naoto64氏が作った1ビットCPUの回路を、ほぼそのままASIC化したものである。クロック回路や表示回路はチップの外に置いたが、CPU部分は元の回路とほぼ同じ構成だという。naoto64氏自身が販売ページで述べているとおり、この1ビットCPUは世界でもトップクラスに低性能なコンピューターであり、今回はそれをチップにすることが目的である。

回路構成:最小限の部品で組んだCPU

CPUは、レジスタ、演算器、プログラムカウンタ、ROM、デコーダーで構成される。レジスタにはDフリップフロップを使う。演算器はNANDゲート4つで組んだEXORで、半加算器のうち和を出す部分だけにあたり、繰り上がりの回路はない。デコーダーはAND、OR、NOTの各ゲートで組まれている。ROMにもゲートはあるが、実際の値を決めるのは外付けのディップスイッチである。

プログラムカウンタもレジスタも1ビットしかない。イチケンはこれを最小構成のCPUと表現している。命令も足し算(ADD)とジャンプ(JMP)の2つだけである。

KLayoutでのレイアウト:アナログよりずっと楽だった

レイアウトには、前回のオペアンプと同じくオープンソースのレイアウトエディタKLayoutを使った。オペアンプはアナログ回路だったので、トランジスタの配置にかなり気を使った。ビアを2つにする、コモンセントロイド配置で特性を揃える、端にダミートランジスタを置く、といった工夫である。

デジタル回路の今回は、そこまで神経質にならなくてよかった。加えて、今回のプロセスとPDKに最適化されたトランジスタの組み合わせである「スタンダードセル」が用意されている。作業は、必要なスタンダードセルを選んで並べ、メタル層で入出力をつなぐだけだった。動作が確立したセルを使えるので、トランジスタの動作設計に気を使わず配線に集中できる。

回路規模もトランジスタ数も違うため単純な比較はできないと断ったうえで、イチケンは作業時間を比べている。前回のオペアンプのレイアウトは数十時間かかったが、今回の1ビットCPUは2〜3時間ほどで終わり、正直かなり楽だったという。

製造:相乗りチップと東海理化のファウンドリ

設計とレイアウトは自分たちで行い、製造は外部のファウンドリに委託する流れは前回と同じである。今回もチップの相乗りを利用した。1つのチップの面積を参加者で分け合うことで、1人あたりのコストをできるだけ下げている。

ファウンドリは東海理化で、イチケンは「実は半導体を作っている」ことに触れている。製造途中の写真も提供され、アルミのメタル配線工程の前後で「ICHIKEN」ロゴが現れる差分写真を見ると、実際に半導体が作られている実感が湧いたと語る。

完成品はベアチップとパッケージ品の2種類がある。ベアチップをデジタルマイクロスコープで観察すると、他の参加者の回路と一緒に載っていることが分かる。イチケンの回路は右上の部分で、拡大するときちんと作られていることが確認できた。

動作確認の環境

チップ単体では動かないため、チップを挿すソケットボードを用意し、周辺回路をブレッドボード上に組んだ。ディップスイッチがROMにあたり、命令とイミディエイトデータを設定する。LEDでクロック、プログラムカウンタ、レジスタの状態を表示する。

最小サイズのスタンダードセルでは、LEDを点灯させるだけの電流を出せない。そのためバッファ用のトランジスタでLEDを駆動している。イチケンは「これをCPUと呼んでいいのか分からない」としつつ、ひとまず動かしてみることにした。

デモ1:JMP命令だけのループ

使うのはディップスイッチの1、2、7、8番の4ビットだけである。命令ビットが1ならJMP、0ならADDを表す。イミディエイトデータは0Vが0、5Vが1になる。

最初に動いていたのは「JMP 0」を繰り返すだけの状態で、足し算をしないのでレジスタは0のままだった。

次に、番地0に「JMP 1」、番地1に「JMP 0」を置く。1、2番をON・ONにすると番地0の命令がJMP 1になる。7番は5V(JMP)、8番は0V(データ0)にして、番地1の命令をJMP 0にする。リセット後、番地0のJMP 1でプログラムカウンタが1に移り、番地1のJMP 0で0に戻る。これを繰り返すだけで、足し算をしないのでレジスタのLEDは点かない。

デモ2:レジスタに1を足し続ける

続いて、番地0に「ADD A,1」(命令ビット0、データ5Vで1)、番地1に「JMP 0」を置くプログラムを試した。リセットボタンを押したまま電源を入れ、ボタンを離して開始する。

1回目のクロックでADD A,1が実行され、レジスタが1になる。同時にプログラムカウンタも1に進み、両方のLEDが点く。次のクロックでJMP 0が実行され、プログラムカウンタのLEDは消えるが、レジスタは操作されないので1のまま点灯している。さらに次のクロックで再びADD A,1が実行される。加算器には繰り上がりがないため、1+1は0になり、レジスタのLEDが消える。この動作が延々と繰り返され、イチケンはCPUとして動いていることを確認できた。

オーバークロック:5Vで約3MHzまで

自作CPUと聞くと試したくなるのがオーバークロックだと、イチケンは言う。ここまでの入力クロックは1Hzである。今回のプロセスの標準動作電圧は5Vなので、まず5Vのまま周波数を上げた。

10Hz、50Hzでも動いたが、肉眼では追えなくなったためオシロスコープに切り替えた。上からクロック、プログラムカウンタ、レジスタの波形を表示する。100Hzでは、クロックの立ち上がりごとにADDとJMPが交互に実行され、レジスタが1と0を行き来する様子が波形で確認できた。

その後、1kHz、10kHz、100kHz、1MHzと上げても動作し続けた。ただし1MHzあたりから波形がなまり始める。イチケンは、このあたりでトランジスタの設計が効いてくるのではないかと見ている。さらに上げると、0Vまで下がりきらない箇所が出てきた。3.0MHzは一応動いたがギリギリで、3.1MHzではレジスタの値がおかしくなった。これを受けて、5Vでの動作限界は3.1MHzまでだと結論づけている。

電源電圧を上げてさらにクロックを上げる

次は電源電圧を上げた。結果は次のとおりである。

  • 6V:3.7MHzまで動作
  • 7V:4.3MHzまで動作
  • 8V:8.4MHzまで動作(プログラムカウンタの観測をやめた状態)

8Vでは、観測する波形を減らしたほうがCPUの動作への影響が小さくなるとして、プログラムカウンタのプローブを外した。クロックとレジスタだけを見ることで、周波数を大きく上げられたとイチケンは説明している。

トランジスタの動作は8Vまで保証されているが、これはリプルやサージを含めた値である。配線の影響を考えると8Vを超えていそうだとしながらも、動いているので大丈夫だとして先に進んだ。

10Vでは10.0MHzが限界で、10.1MHzにするとところどころ異常な動作が出た。11Vにすると消費電力が急に増え、10Vのときの約65mWから約170mWになった。周波数は10.4MHz程度までしか伸びなかった。

12Vで消費電力0.5W、ここで打ち止め

12Vにすると、消費電力は11Vのときの約166mWから一気に0.5W程度まで跳ね上がった。イチケンは「トランジスタが壊れそう」と感じ、サーモグラフィーで見ると、それなりに発熱している様子が映った。

相乗りチップのため、他の参加者の回路にも電源が供給されており、その影響もありそうだという。危険そうなので、ここで実験を止めた。

イチケンはもう一つ改善点を挙げている。今回の構成では1ビットCPUまでの配線がかなり長い。ブレッドボードではなく専用のプリント基板を設計すれば、動作周波数はもう少し上げられそうだと見込んでいる。

まとめ:できることはLチカ程度でも、学ぶ題材としては面白い

イチケンは、この1ビットCPUでできることはLチカ程度だと認めている。そのうえで、半導体の設計やレイアウトを学ぶ題材としては面白いと締めくくった。