世界最低クラスの性能の1ビットCPUをASICとして自作し、オーバークロックを試す
イチケン / ICHIKEN電子工作系YouTuberのイチケンは、1ビットCPUをトランジスタレベルから設計し、実際の半導体チップとして製造した。協力したのは、以前オペアンプを自作したときと同じオープンソース半導体コミュニティ「ISHI会」である。この動画では、回路の由来、レイアウト設計、製造、ブレッドボード上での動作確認を順に紹介し、最後にクロック周波数と電源電圧を上げてどこまで動くかを試している。
元になった回路は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チカ程度だと認めている。そのうえで、半導体の設計やレイアウトを学ぶ題材としては面白いと締めくくった。
この動画はJLCPCBの提供でお送りします。
こんにちは。今回はこちらの1ビットCPUを作りましたので、どうやって作ったのか、そしてこちらの回路で実際に作った1ビットCPUの動作検証をしてみます。
以前オペアンプ回路を自作したときのオープンソース半導体コミュニティのISHI会に今回も協力してもらって、トランジスタレベルから1ビットCPUを自作しました。
実際に作り始める前に今日のスポンサーの紹介です。どうぞ。
プリント基板を安く作るのなら、JLCPCBが結構オススメです。プリント基板というと、このような緑色の硬い基板を想像しますが、JLCPCBでは柔らかいフレキシブル基板も作れます。ウェアラブル機器や、より柔軟性の高い部品配置で、フレキシブル基板はほぼ必須となっています。
今現在フレキシブル基板を多くの人に使ってほしいということで、価格をかなり下げて製造しています。100×100mmが5枚で2ドルから。かなり安いですね。
フレキシブル基板を補強するための補強材もいろいろ選べて、Polyimide、FR4、Stainless Steel、3M Tape、さらにEMI Shielding Filmも選べるようになっています。フレキシブル基板のクーポンも概要欄のリンクで配布していますので、皆さんもぜひいろいろ作ってみてください。
またJLCPCBが2026年6月10日~12日まで開催されるJPCA Showに出展します。東京ビッグサイトで3日間やりますので、都合の合う方はぜひ立ち寄ってみてください。
今回1ビットCPUを作っていくわけですが、1ビットCPU自体は私が考えたわけではなくて、元ネタがあります。概要欄にも書いてありますが、naoto64さんが作った回路をほぼそのままASIC化しています。
もともとの回路としてはこのようになっていて、これをASIC化するとこのようになります。今回はクロックや表示回路などは外部回路を使っていますが、CPU部分についてはほぼそのままの回路となっています。
本人も販売ページで言われているように、1ビットCPUは世界でもトップクラスの低性能コンピューターとなります。今回はそれをASIC化していくわけです。
回路の構成としては、レジスタ、演算器、プログラムカウンタ、ROM、デコーダーです。レジスタはDフリップフロップを使っています。演算器はNANDゲートを4つで構成しているEXORです。半加算器の足し算の部分で、繰上りの部分はありません。デコーダーもAND、OR、NOT回路で構成しています。ROMにもゲートはありますが、実際の値を決めているのは外部で使っているディップスイッチです。
プログラムカウンタは1ビットですし、レジスタも1ビットです。非常にシンプルな構成といいますか、最小構成のCPUかなというところです。このようなこともありまして、命令も足し算とJMPの2つだけです。
今回はもともとの論理ゲートはありますので、それを並べていってレイアウトしていきます。前回のオペアンプ設計と同じく、オープンソースレイアウトエディタのKLayoutを使いました。
前回のオペアンプのときはアナログ回路だったので、トランジスタのレイアウトにはかなり気を使った設計をしていました。例えばビアを2つにしたり、コモンセントロイドで特性を揃えたり、端っこの方にダミーのトランジスタを用意したりなどです。ですが今回はデジタル回路の設計なので、そこまで神経質にならずにレイアウトできます。
しかも使うトランジスタについても、スタンダードセルと呼ばれる、今回のプロセスやPDKに最適化されたトランジスタの組み合わせみたいなのが用意されています。今回やったことは、必要なスタンダードセルを選んで並べていって、それをメタル層でつないだ、それだけです。
これは今回使ったスタンダードセルです。入力・出力がありまして、それらを前後のスタンダードセルにつないでいきます。最初から動作が確立されたものが用意されているので、トランジスタの動作の設計に気を使う必要がなくて、レイアウトというか配線作業に集中できるのはかなり楽です。
実際アナログ回路と比べると、今回のデジタル回路のレイアウト作業と配線作業はかなり簡単でした。回路の規模や使うトランジスタの数が違うので単純な比較はできないのですが、前回のオペアンプのレイアウトが数十時間かかったのに対して、今回の1ビットCPUは2、3時間程度で終わっています。前回と比べると正直言ってかなり楽でした。
次は製造に入っていきます。前回と同じく回路の設計とレイアウトは自分たちでやって、製造については外部のファウンドリに委託します。当然今回もチップの相乗りはやっていまして、1つのチップのスペースをみんなで分け合って使っています。そのため1人当たりのコストをできる限り低くするということが出来ています。
使ったファウンドリですが、今回は東海理化を使っています。東海理化、実は半導体作っているんですね。製造工程の途中の写真も送ってもらいまして、このようにアルミメタル配線の前後でICHIKENロゴが入る差分の写真なども送ってもらっています。こういうのを見ると、実際に半導体が作られているというのがよく分かりますね。
こちらが実際に製造が完了したものです。ベアチップのものとパッケージングされたものがそれぞれあります。ベアチップのものをデジタルマイクロスコープで見てみました。このように他の人の回路と一緒に乗っているので、何かいろいろ入っているというのが分かりますね。今回イチケンが作った回路は右上にあるこの回路の部分です。拡大してみると、しっかりと作られていることが分かります。
ここからは1ビットCPUの動作を確認していきます。こちらのチップだけでは動きませんので、チップを入れるソケットのボードと周辺回路はブレッドボード上で組みました。この部分が1ビットCPU、ディップスイッチがROMです。命令とイミディエイトデータを決めています。LED周辺はクロックとプログラムカウンタ、レジスタの状態を見ています。1ビットCPUなのでプログラムカウンタは0か1ですし、レジスタも1個だけです。
1ビットCPUに使った最小単位のスタンダードセルでは、LEDを駆動出来るだけの電流を出せません。そのためバッファ用のトランジスタでLEDを駆動しています。
これをCPUとして良いのか分かりませんが、とりあえず動かしてみます。というか、実はこれもう動いているんですね。ここのディップスイッチで命令とイミディエイトデータを決めています。使っているのはディップスイッチの1、2、7、8、その4ビット分だけです。命令はJMPとADDしかないので、今それをひたすら実行しています。
今実行している命令はJMP 0です。当然足し算などそういう命令も実行していないので、レジスタも0のままです。
次やってみる動作はJMP 1、JMP 0です。ディップスイッチでイミディエイトデータを変えます。まずJMP 1にするには、この1、2の部分をON、ONにします。そしてJMP 0はどうなるかというと、この7、8の部分をON、OFFにします。
命令のビットが1のとき、それはJMPの命令です。0は、この後出てくるのですがADDです。イミディエイトデータのところは0Vが0で5Vが1です。そのため今これはJMPの命令をしていて、どこにジャンプするかというと、プログラムカウンタが1のところにジャンプするわけです。次こちら、7のところが5Vになっているので、これはJMPの命令です。そして8のところ、こちら0Vになっているので、これはJMP 0の命令です。
そのため、まずリセットを押して、番地0のJMP 1を読み込んで、プログラムカウンタは1に飛びます。次にプログラムカウンタ1のところにある命令は何かというと、JMP 0なんですね。そのためもう一回プログラムカウンタが0になると、それをひたすら繰り返すという、そのような動作になっています。当然こちらの命令も足し算などはやっていませんので、レジスタは点灯しません。
次にやるのが、レジスタに1を加算し続けるプログラムをやってみます。加算の命令はここが0、イミディエイトデータは1を加算し続けるので5Vで1にします。プログラムカウンタが続くとこちらの命令の方に行くわけですが、1を加算し続けるのでJMP 0にする必要があります。命令はJMPでイミディエイトデータが0になっているので、JMP 0になっています。
これを実際に実行してみましょう。では電源を入れます。まずはリセットボタンを押したままにして電源を入れます。リセットボタンを離します。
良さそうですね。まず動作を見てみると、1回目のクロックが入ったところでプログラムカウンタは1、そしてレジスタの部分も1となりました。こんな感じです。もう一回行きますね。1回目のクロックを入れるとプログラムカウンタが1で、そしてレジスタも1です。
これはまず何が起こったかというと、レジスタに1を足しますということをしました。そうすると当然レジスタに1が加算されますので、ここが光るわけです。その命令を実行するとプログラムカウンタに1が加算されますので、同じように1発目のクロックでプログラムカウンタも光りますと。
次にJMP 0の命令を実行します。そうすると次のクロックが入ったときに、分かりますか、このように点いて、もう1回クロック入ると、プログラムカウンタが消えましたよね。もう一回行きますね。プログラムカウンタが点いて、もう一回クロックが入ると、プログラムカウンタが消えることになります。レジスタについては特に足し算などはしていないので、そのままの状態を保ちます。これJMP 0、でもレジスタはそのままという状態です。
プログラムカウンタが0になったら次にどうなるかというと、ADD A,1をするんですね。つまりレジスタが1のところにさらに1を足すと。今回加算器は足し算をするだけで、キャリーは特に考えていません。そのため1と1を足したら0になるんですね、その部分は。動作的にはこうです。
1と1足されたのでレジスタは0になると。この動作をひたすら繰り返していきます。こんな感じで動いているのが分かって良かったです。
こういう自作とかCPUとかいうワードが出てくると、試したくなるのがオーバークロックです。当然今入力の周波数は1Hzですが、この入力周波数を高くすると、それはオーバークロックになります。今回作ったCPUのプロセスの電圧は5Vが標準的な動作電圧です。まずは5Vのときに何Hzまで動作するのかを確認します。
クロック周波数が1Hzの状態からどんどん周波数を高くします。これが今10Hzです。問題なく動いてはいそうですね。こんな感じでどんどん高くして、こちらが今50Hz。動いていそうなことは分かるのですが、肉眼では追えないのでオシロスコープを使います。
では実際にやっていきます。今100Hzで動作していますが、問題なく動いていそうです。上から順番にクロック、プログラムカウンタ、レジスタの状態です。波形で見てみると分かりやすいですよね。
クロックがまず1発目入ったときにADD A,1されて、レジスタの値が1になると。それと同時にプログラムカウンタの値も1になりますと。次のクロックの立ち上がりのときにどうなるかというと、JMP 0になります。そうするとプログラムカウンタは0になると。レジスタは特に操作されていないので、1の状態を続けています。次のクロックの立ち上がりが入ると、レジスタAに1が加算されますので、レジスタAは0になると。繰り上がりは特に用意されていません。プログラムカウンタは1になると。その動作をひたすら続けています。
周波数をさらに高くして1kHzにします。今1kHzです。良さそうですね。こちらは次10kHz。これも問題なく動いていそうです。さらに周波数を高くして100kHz。良いですね。さらに高くして今1MHzです。結構高くなってきましたね。それでもこのように動いてしまっています。
ただ波形は結構なまってきたりしています。この辺りがトランジスタの設計が効いてくるポイントかなと思います。さらに周波数を高くしていきます。こんな感じでかなりなまってきて、0Vまで下がっていない箇所があります。
さらに高くして3.0MHz。一応動いてはいますけど、結構ギリギリな感じです。3.1MHz、ダメですね。3.1MHzのところでレジスタの値がおかしくなったりだとかしています。そのため電源電圧が5Vで動作するのは3.1MHzまでということになります。
では次やることは何かというと、電源電圧を上げていきます。6Vです。なんか動き始めましたね。このとき周波数は何MHzまで上がるかというと、このぐらいですね。3.7MHzまでは上がります。
さらに電源電圧を高くして、次は7Vです。一応動きますね。周波数もさらに高くして、周波数は4.3MHzです。
さらに電源電圧を高くして、次は8V。見る対象の波形を少なくした方がCPUの動作に与える影響は少なくなりますので、プログラムカウンタの値は今から見ないようにします。見るのはクロックの入力とレジスタの状態だけです。そうしますとだいぶ周波数も高く出来ます。影響が少なくなったからです。プログラムカウンタの値を見なくなったら、入力電圧8Vのときで、クロック周波数は8.4MHzまで動作するようになりました。
一応トランジスタ自体の動作は今回8Vまでは保証されています。リプルだとかサージも含めた電圧なので、配線などそういうのを含めると、なんか8V超えてそうな気もしますけれども、とりあえず動いているので大丈夫ですね。
次はさらに電圧を高くして10Vいきましょう。周波数は8.4MHzからどんどん高くしていって、10.0MHzが限界ですね。10.1MHzにすると、ところどころ変な動作していますよね。
さらに入力電圧を高くして11Vにします。そうすると消費電力が一気に増えるんですよね。10Vのときだいたい65mWぐらいの電力消費ですが、電源電圧を11Vにすると170mWぐらいまで増えます。入力の周波数はどうなるかというと、さらにオーバークロックは出来ますが、10.4MHzとかそのぐらいです。
さらに電源電圧を上げるとどうなるかというと、12Vにすると、やばい。電源電圧11Vのときは166mWぐらいの電力消費ですが、12Vにすると、このように一気に0.5Wぐらいまで増えます。これはちょっとトランジスタ壊れそうですね。実際サーモグラフィーで温度を確認しても、そこそこ発熱している様子が確認出来ます。
今回は他の回路も相乗りになっているので、その回路も実は電源供給をされているので、この辺りも効いてきそうですが、なんかヤバそうなんでこのぐらいにしておきます。
ちなみに今回の回路ですが、このように1ビットCPUまでの配線長がかなり長いです。このようなブレッドボードではなくて、プリント基板で専用の回路を設計すれば、動作周波数はもう少し高く出来そうな気がします。
というわけで、1ビットCPUをASIC化しましたという動画でした。CPUの動作としてはLチカぐらいしか出来ないですが、半導体の設計やレイアウトを勉強するには面白い題材かと思います。参考にしたリンクは概要欄にまとまっていますので、気になる人はぜひチェックしてみてください。
もしこの動画が役に立ちましたら高評価、また何か気になることがありましたら、ぜひコメントも残してみてください。それでは最後までご視聴いただき、ありがとうございました。
記事公開
