筆者引っ越したりしたので1ヶ月ほど経っていましてあんまり覚えてない、、。)しかし、足し算「だけ」できるCPUよりは、足し算「も」できるCPUを作りたいですよね。加算器でええやん、CPUちゃうやん、って言われてしまいそうですし、、。「こんなことやってます!」って取り組みを発表したりしてますし、、。募集要項を確認してみてください!!(あっ、そろそろ本題に戻りますね)というわけで、今回は足し算「も」できるALUを作っていきます!!2.命令を「分かる」ために必要な要素とは?CPUを作るにあたって、命令を「分かる」ために必要な要素を考えてみましょう。引き算を命令Bとしておけばよさそうでしょうか。(ついでにCPUっぽく、命令001と命令010(2進数)にしておきましょうか。)・足し算引き算だけじゃなく、プログラムを少し勉強するとif文みたいなのが出てきますよね。「加算減算でない別種の命令」が必要という感じでしょうか。(if文みたいなのをA-1,足し算をB-1,引き算を(引き算は足し算と似てる感じなので)B-2として、これもCPUっぽく、001-001、010-001、010-010という風に書いておきますか。)・命令を出すとなったら、出した命令の順番を覚えておきたくなりませんか?なりますよね?そう、なるんですよ(ゴリ押し、でもなるでしょ?)。順番・時系列を「カウント」しておくものが必要になります。(1回目が足し算、3回目が引き算なら、01:010-001、11:010-010、みたいな感じ。)・そういえば、足し算や引き算をしたら、結果を保存する必要がありますね。高校・大学の講義を受けているのであれば、「メモリ」にデータを保存し、メモリが格納されている番地のようなもの(アドレス)が宛先として指定可能である、って習ったかもしれません。命令をカウントするには命令そのものを保存しておく必要がありますね。(メモリは市販PCで8GBとか16GBとか言われるくらいなので、今回はめっちゃ大きくて命令は全部保存できるとしましょう。)・もっと詳しい講義を取っていた方は、CPUがメチャクチャ計算が速い理由として、CPUが「レジスタ」と呼ばれるメモリぽいものを持っており、保存できる量は少ないものの爆速で計算できる、ということまで知っているかもしれません。(レジスタは量↓で速度↑、メモリは量↑で速度↓というイメージです。気になる方はトランジスタとキャパシタ、SRAMとDRAMについて調べてみてくださいね。結果を「レジスタ7」に入れるとするなら、01:010-001-011-101-111、とかって表せますかね。y=5にしておいてからx+y=8にしてるなら、3とか5とかの「値そのものを保存する場所」がありませんでした。結果を「レジスタ6」に入れるとするなら、01:010-001-011-101-110、とかって書けそう?ってことは、レジスタは2~3個必要で、値そのものは0~1個必要そうですね。)・さっきから(カッコ)でCPUぽく作っていましたが、0,1だけで命令を作ってるから、1bitでもズレたらヤバそうですね。「命令全体は○○bit」って決めておいたほうが良さそうですね。(せっかく010-001-011-101-111とか010-001-011-101-110としたから、この例なら15bitにしておけば良さそう?1bit左にずらして100-010-111-011-110とかになったら、違う命令になってしまう、、。・命令そのものには「全体の長さ」「命令を大きく分類」「似た命令をさらに分類」「値を持っておくレジスタ×2~3個」「値そのもの×0~1個」があれば、命令を正しく「分かる」ことができそうですね。(もしあなたが「ホントに見落としたもの・不要なものはないんですか?」と疑問を持ったようであれば、問題なく。後でちゃんと伏線回収(という名の予定調和)してるので、ちゃんと必要十分になってますよ。聞いたことあるかもしれません。0-1Vの波形が来る時、100段階に量子化したら0.01V刻みで0-1Vの範囲を表現できる、とか。(0.23Vが来たら23を表示しておく、なんてことができるの、すごいですよね。2.5Vより上だったら1とかで表現できそうですね。1.8Vになってるようですね。上だったら1,とかをやっていそうです(たぶん)。その3.3Vやら1.8Vやらを使って、USBもHDMIも使えるように(いい感じに裏で)なっているみたいですね。あ、そうそう、PCの電源もやっていることはほぼ同じですね。他のチップ)を作ってくれてるはずです。4.ALUをChiselでつくってみた!サンプルコード:筆者のGitHub今回はCPU-2でやってます。cloneしてきて、CPU-2中でtestが動けばOKです。できる方はどんな手を使ってもよいので、どうぞ。・筆者の個人的ポイント:実はChiselに必要なJavaの環境が使えるか確かめるプログラムを少し変えてみました。ほとんどGPT生成なのですが。筆者のメモ置き場として、ね。筆者はこうやりました(参考までに、筆者はWindows11を使っています。上手くいかない場合はインターネットや友人に相談してみてくださいね。outが割り振られているイメージですね。a,bの値が出てくるかもしれませんね。commandが1(符号なし8bit)のときはa(符号なし32bit)とb(aと同じ)を足す、という感じですね。「数値そのもの」が入っているわけではないです。とあるエルフさんが「魔法はイメージの世界」とか言っていましたが、「CPUもイメージの世界」なのかもしれませんね。6(6KB)で、「カウントするもの」は32bitで用意。「値そのもの×0~1個」は32bitで用意。・筆者の個人的ポイント:適宜このプロジェクトの(今のとこ)公式ドキュメントも見てみてください。今回のプロジェクトでは1回目が足し算、2回目が引き算なら、000...0000001(→カウンタは32bitで1bit目から48bit取り出す):00001-001-00010-00011-00100-000...001(→00001001からはじまる48bitの命令)と、000...0110001(→次は49から48bit取り出す):00001-010-00010-00011-00100-000...001(→00001010からはじまる48bitの命令(例))がメモリに入っている感じ。命令をメモリにロードする際、なぜか逆順(reverse)にしてるのは、「リトルエンディアン」「ビッグエンディアン」が関係しています。