CPUについて学び,実際に創ってみた
2021-07-26
はじめに
昨年から積読として本棚にいた「CPU の創りかた」という本を取り出して,CPU について学んだ後,実際に IC チップや抵抗などの電子部品を半田付けをしてラーメンタイマーを作成するところまでやってみたので,学んだことなどについて書いてみたいなと思い,この記事を書くことにしました.
本を読んでいたのは四月上旬から五月下旬位だった気がしてます.勉強会で知り合った方と二週間間隔で輪読をしながら進めていくという形をとりました.本を読み終わった後は,各自で既に購入していた電子部品などを半田付けして自分の場合は七月中旬にラーメンタイマーが完成したという流れでした.
読み終わったので作ります
— はる茶 / Haruki Tazoe 🍒 (@jdkfx) May 22, 2021
適当にタグつけて作っていく過程をあげていこう#jdkfx_td4 pic.twitter.com/Mr2L0OwfyO
完成!!やったあああ!!
— はる茶 / Haruki Tazoe 🍒 (@jdkfx) July 11, 2021
#jdkfx_td4 pic.twitter.com/mGxTLY6WMd
完成した CPU,通称「TD4」の写真です.
本の内容としては,それほど難しいというわけでもないのですが,すぐに理解できるような内容でもなく,何度か噛みしめるように読むことで理解が深まっていった気がします.
半田付けについては中学生の頃に授業で作成した手回しラジオ以来だったことと,半田付けする必要のある電子部品の数が多いということもあって,集中力が試されるので,難易度としてはこちらのほうが高かった気がします.
また,基板についてですが,ユニバーサル基板などを利用して回路図から自分で実装するのは初心者には厳しいなということで,Booth にて dip-factory 様が販売されておられるこの TD4 を実装するために作られたプリント基板を利用して作成しています.こちらで購入できます.
TD4 という CPU について
作成した TD4 について,それぞれの場所がどのような処理を行っているのか詳しく説明していこうと思います.
電子工作などについては初心者なので,本の内容を引用したり,初心者なりに本の内容を解釈して書いていますので,間違っていることがありましたら教えてください.
リセットとクロック
- リセット回路
以下,電圧が Low であることを表す L として記述し,電圧が High であることを表す H として記述します.
今回作成した TD4 では,L 信号が送信されるとリセットされるような仕様になっており,一般的なコンピューターと同じように,電源がオンになったら一時的に L 信号を出力する回路を用意しています.
リセットが行われる仕組みとしては,まず電源がオンになることによってコンデンサの電圧が上昇をはじめ,バケツに水を溜めるようにコンデンサの中に電力が溜まっていきます.そこでリセット回路に繋がるように設置したスイッチを押すことでバケツに溜まった水が放出されるように電圧が下がっていき(所謂放電状態になる),電圧が 0V になることで L 信号を出しリセットが行われるという流れです.
- クロック回路
先述のリセット回路を利用して,電圧が溜まり H 信号が流れたあと,放電を行い L 信号が流れるという流れを繰り返すことで L 信号と H 信号のクロック信号が流れるようになります.
このクロック信号をこれまでは手動でスイッチをポチポチして行っていたのを発振回路を利用することによって,1Hz のクロック回路としてクロック信号が流れるようになっています.
ROM
TD4 では ROM を DIP スイッチで自作しており,CPU 側が 8bit を読み込み単位として ROM に少しずつ記憶されている番地を指定する信号であるアドレスバスや,吐き出されるデータを流す信号であるデータバスなどの内容を読み込ませてもらってるという流れになっています.
ちなみに,DIP スイッチとダイオードを沢山はんだ付けする作業に骨が折れます.
レジスタ
TD4 は 4bitCPU であり,演算とデータ移動は 4bit 単位で行われます.そして,演算用のレジスタは A と B の二つで構成されています.
これらのレジスタにいい感じの命令を書き込み転送させるようにしています.
ALU とプログラムカウンタ
- ALU
TD4 では ALU を加算器を代用して処理を行うような仕様になっています.加算器は言葉の通り足し算をする回路のことです.
既に実行できるようになっている転送命令のデータの流れに ALU を割り込ませることで演算命令が追加されました.
ちなみに,加算器を ALU として代用していることによって加算しかできない状態になっており,あるレジスタから他のレジスタへ転送するような命令を実行すると,途中に加算器を使っていることによってレジスタにオペレーションコード以外のイミディエイトデータが追加されて他のレジスタに転送されてしまうので,そこらへんをいい感じにするためにイミディエイトデータを
0000
としておけばいい感じになってレジスタに転送されるようになっています.
- プログラムカウンタ
CPU は実行する命令がどこのアドレスに格納されているかを把握する必要があり,現在の命令のアドレスを指し示す役割を担うのがプログラムカウンタです.
また,このプログラムカウンタは,ROM に格納された命令を上から順番に読み込んでいき,その命令が完了するたびにカウントアップすることによって実現しています.
ほかにも,プログラムカウンタは単純にカウントアップするだけではなく,CPU がジャンプ命令を実行した際に指定された番地へ飛ぶことも可能です.
- I/O ポート
TD4 では 4bit の出力ポートを備えており,データを出力すると 1 や 0,もしくは H 信号や L 信号などが出力されるようになっています.
プログラムから LED を付けたり消したりするためには,レジスタの出力に直接くっつけることで出力として目に見える形にしています.
入力ポートについては上記の出力ポートを実装する過程でいい感じに実装されちゃいます.(理解できなかったので是非本で確認してみてください.)
命令デコーダ
ROM に格納されているオペレーションコードを取り出し,オペレーションコードから実行部への指示に変換する回路のことを命令デコーダといい,命令デコーダの指示で CPU の各部が動作するようになっています.
本の挿絵にも書かれていましたが,友達に「温泉に行きたい」と言われたので旅館の予約や新幹線の予約などをこちらで指示してあげるようなイメージです.中間管理職であり,オペレーションコードの言いなりという感じです.
終わりに
CPU を自分で作ってみることによって,CPU がどんなことを行っているのか体系的に学習することが出来たので良かったと思いました.
また,コンピュータサイエンス分野の学習に繋がることも沢山得られたので,コンピュータサイエンス分野に興味のある方におススメしたい一冊だなと感じました.