Tanuki_Bayashin’s diary

電子工作を趣味としています。最近はラズベリーパイPicoというマイコンを使って楽しんでいます

【自作CPU】1bitCPUを組んでみた

※なにか気になる点がありましたらコメント欄にご記入ください。また、工作や回路を製作する場合には、細かい作業などに対して、細心の注意を払われるようお願いいたします。

【目次】

1.はじめに

4bitCPUを組んでみたので、それではと言うことで1bitCPUを組んでみました。(今回はブレッドボードで組みました)

写真1 組んでみた1bitCPU

これも次の参考図書に書かれていて(参考図書内p.181)、それを具現化した(CLK/RST信号のための回路とROMを付け加えました。ROMは総容量4bitです(笑))ぐらいの製作記です。

(以下の図書では「TD4」と呼ばれる4bitの自作CPUについて、詳しく解説している内容となっています)

図1 参考図書

筆者の同類のブログ記事です。
tanuki-bayashin.hatenablog.com

tanuki-bayashin.hatenablog.com

2.回路図

回路図を図2,3に示します。

図2 回路図その1(ROM、メイン部)
図3 回路図その2(電源、CLK/RST部)

2.1 そもそも1bitCPUって何

ほとんどの部分は、参考図書内のTD4がもとになっています。

とは言え1bitCPUとは何かについて簡単に触れたいと思います。

1bitCPUなのでデータの長さは1bitです。つまり2進数表示で1桁です。そしてアドレスも1bitです(アドレス空間を広げることもできますが、今回は1bitとします)。なのでアドレスの値は0と1の2値のみとなります。

またCPUであるからには命令がないと、意味を成しません。なので命令に当たるbit数を1bitとします。(図4参照)

図4 ニモニックとオペランド

少し整理すると、データは命令1bitとデータ1bitなので実は2bitになります。言葉がややこしいので言い換えると、命令のことをニモニック、またここでデータとよぼうとしているのはオペランドと計算機の世界では呼んでいます。(筆者もあまり詳しくないです。汗)

つまり、ニモニック(命令)が扱う具体的な数値などに当たるものであるオペランドの長さが1bitなので、今回作ろうとしているCPUを1bitCPUと呼ぼうとしている訳です。

先を見ていくともう少しわかってくると思います。

2.2 メイン部の回路

ではどのような命令を考えていけばいいのでしょうか。実は1bitのCPUでできることはあまりありません。(オイ!)

参考図書とそっくり同じになるのですが、メモリにあるデータを計算機の内部(レジスタなどと呼びます。ここではレジスタAとします)に取り込むMOV命令(英語の”move”から取ったもの。「ムーブ」と発音)、後はレジスタAの内容を反転させるNOT(そのまま「ノット」と発音します。なんの講座なんだか)ぐらいです。

反転とは値が0のときは1に、1のときは0とすることを言います。MOV以外の命令となるとこれくらいになってしまいます。でも計算しているし、コンピュータらしくなってきました(よね?)。

ということで命令をまとめると表1のようになります。

表1 命令の説明

MOVを見て見るとIm(イミディエイト・データ、要はD0のこと)をレジスタAに移動させる、と言うことを意味しています。

NOTの場合は、レジスタAの内容を反転させます。反転させるだけでは意味がないので、その結果をレジスタAに上書きします。

こうしてみると、オペランドは2つ取ることもあり、D0のみではない場合がありました。しかし、オペランドを2つ取るような場合でも、2つのオペランドはどちらも1bitなので1bitCPUと呼ぼうと思います。
(かえって混乱しますね)

これらの動きをする回路を示すと図5のようになります。

図5 メイン部の回路図、変更前

ここでCLKとあるのはクロック信号です。CPUの動きを1ステップずつ動作させるためのものです。また/RSTとあるのはリセットです。ローすなわち0の値となると出力であるQの値が0となります。また、Dとあるのは入力で、1クロックごとにDの値がQに出力されます。/QとあるのはQの反転です。/Sはローのとき、出力を1とする端子ですが、ここでは使わないので5Vにつないでおきます(1としておきます)。またQのことを上で述べていたレジスタAと呼ぶことにします。
(決まりごとが多くてスミマセン。汗)

すると図5のとき、D1が0であるなら74HC04の出力が1となるので、上のAND回路が有効となりImの値(D0)がANDの出力に出てきます。それがORを通ってラッチ回路のDに入るので、1クロック後にはレジスタAに現れます。

逆にD1が1のときは下のAND回路が有効となり、するとANDにつながれた/Qの値がANDの出力からORを通りDへ行き、最終的にレジスタAへと値が代入されるという訳です。つまりQの値が、Qの反転された値に置き換わっています(NOT Aが実行されます)。

回路の変更

ここで現実的な問題が出てきます。図5の回路でもいいのですが、つかう論理ゲートの種類を変更します。(図6)

図6 回路図の変更

ここでANDの出力とORの入力にそれぞれNOTの回路を入れます。NOTが2個ずつなので、論理は元のままになります。論理回路では”〇”をつけてNOTを示すことがあります。すると2個のANDはNANDに置き換わりました。

またORでは、入力側にNOTが付いています。この形は実はNANDゲートと同じ働きになることが知られています(ド・モルガン律)。これにより2種類のゲートが1種類で済むようになりました。

好みにもよりますが使うICの数を減らしたいときにこのような置き換えをすることがあります。

こうして表1で示した通りに、命令のセットを実際の回路に落とし込仕込むことができました。この部分の回路は図2と同じです。

2.3 ROMの回路

図7 ROMの部分の回路図

ROMの回路を図7に示します(図7 再掲)。まずアドレスA0の信号ですが、クロック信号からメイン部で見たラッチを通って出てきています。ラッチでは/Qの信号がDに入っています。こうすることにより、このラッチの出力はクロックの立ち上がりごとに0→1→0→‥と0と1を繰り返します。こうしてアドレスの0と1を切り替えています。

またこれにより、メイン部で命令が実行されるのとアドレスが切り替わるのが同じタイミングになっています。逆にこうしないと、アドレスの値が勝手に進んでしまい、命令がうまく実行されなくなります。(大事です)

またROMの中身はDIPスイッチで構成しています。4bitのスイッチを使っていますが、右2bitがアドレス0、左2bitがアドレス1のデータに当たります。アドレス0と1を切り替えているのはスイッチからつながるダイオードのアノード端子(ー)で、この値をを0とすることで有効となります。

アドレス1側は/Qの信号を使っていて、アドレス0とアドレス1が競合しないようにしています。

そしてDIPswの上側を10KΩでプルアップしており、スイッチオンで0、オフで1となります。しかしこれだと都合が悪いので、NOT回路を付け、D1とD0の1と0の値をスイッチのオン・オフと連動させています。(オフのとき0、オンのとき1)

2.4 CLK、/RST信号

図8 CLK/RST部の回路図

図8のCLKの回路は、Manualの場合は押しボタンswを押すことで1クロック信号が発生します。Normalの場合は74HC14を使った発信回路により、VRの値に応じた周波数でクロック信号が発生します。

/RST信号の場合は、押しボタンswを押すと出力がローとなり回路全体にリセットが働きます。スイッチをオン・オフするときにはチャタリングと言って、多くのノイズが発生するのですが、74HC14と言うゲートはシュミットトリガ―と呼ばれ、チャタリングの発生を吸収する働きがあります。また、スイッチのまわりの抵抗やコンデンサーによってもノイズは吸収されています。

また、/RSTの信号がローのときにLEDがONとなるように、/RSTの出力から見てLEDは74HC14の1段前に配置してあります。

(より詳しい説明は、1章の参考図書に譲ります)

2.5 電源部の回路図

図9 電源部の回路図

図9の回路は電源を示します。電源ICを介して5Vを発生しています。

また、回路図の下にある0.1μFのコンデンサーはバイパスコンデンサと呼ばれ、各論理ICの電源ピンの近くに接続します。ブレッドボードでも入れており、ICを安定して動作させるのに必要となるコンデンサーです。

3.動作のようす

さてこのCPUでできることは何があるでしょうか。

考えられるのは次の2つくらいです。
① Lチカ
アドレス 命令
0    MOV A Im
1    MOV A Im
Imにそれぞれ0,1をセットすることで、1ステップごとにレジスタAの値は0と1の値を繰り返します。

今回の回路ではアドレス1の次はアドレスは再び0へと戻るので、レジスタAの出力として0と1が交互に現れます。よってLチカが実現されるという訳です。

② Lチカ
アドレス 命令
0    NOT A
1    NOT A

起動した状態ではレジスタAの値は0です。なので、0行目でAは0から1へ、1行目では1から0へとレジスタAの値が変化します。
よってこちらの命令でもLチカが実現されました。

(ちなみにこちらのプログラムの場合、D0の値は0でも1でも関係ありません)

動作している様子を示します。(中央辺りの黄色いLEDがレジスタAを示しています)
youtu.be


他には①でどちらのImにも0または1をセットすることも可能です。(プログラムとして意味があるかは別です)

しかし、これによってCPUの最小単位が実現できました。大したことない感じですが、世界で初めて作った方はさぞかし感動したのではないかと思います。

4.まとめ

1bitCPUについて書き記しました。
CPUの1番基本となる動作かと思います。
足がかり的な意味合いで書いたといった感じです。



最後までお付き合い下さり、ありがとうございます。