<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tech-Blog on 森羅万象プロジェクト</title><link>https://shinrabansyo.github.io/blog/</link><description>Recent content in Tech-Blog on 森羅万象プロジェクト</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Mon, 01 Jan 0001 00:00:00 +0000</lastBuildDate><atom:link href="https://shinrabansyo.github.io/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>01-02_加算器をつくる</title><link>https://shinrabansyo.github.io/blog/1/01/01/01-02_%E5%8A%A0%E7%AE%97%E5%99%A8%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://shinrabansyo.github.io/blog/1/01/01/01-02_%E5%8A%A0%E7%AE%97%E5%99%A8%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B/</guid><description>&lt;p&gt;こんにちは！森羅万象プロジェクトです！&lt;/p&gt;
&lt;p&gt;今回は &lt;strong&gt;足し算だけできるCPU（の一部）&lt;/strong&gt; を作っていきたいと思います。&lt;/p&gt;
&lt;p&gt;（定期宣伝）&lt;br&gt;
ちなみにこの記事は、&lt;br&gt;
&lt;strong&gt;CPUを作ったことのない人の、&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;CPUを作ったことのない人による、&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;CPUを作ったことのない人のための記事&lt;/strong&gt;&lt;br&gt;
ですので、CPU入門・初心者の筆者と一緒に勉強していただけたらと思っています！！&lt;/p&gt;
&lt;p&gt;今回は、「加算器（Adder）」について、&lt;br&gt;
&lt;strong&gt;1.加算ができるモノ ≒ 低機能CPU？&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;2.足し算プログラムなんて作ったことあるよ？&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;3.物理的に足し算ができるCPUを作りたい！&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;4.加算器をChiselでつくってみた！&lt;/strong&gt;
に分けて説明していきます。&lt;/p&gt;
&lt;h1 id="1加算ができるモノ--低機能cpu"&gt;1.加算ができるモノ ≒ 低機能CPU？&lt;a class="td-heading-self-link" href="#1%e5%8a%a0%e7%ae%97%e3%81%8c%e3%81%a7%e3%81%8d%e3%82%8b%e3%83%a2%e3%83%8e--%e4%bd%8e%e6%a9%9f%e8%83%bdcpu" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;・CPUに必要なパーツについて、ChatGPTに聞いてみた（ものを要約した）ところ、以下のような要素があるとのことでした。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;演算処理ユニット（Arithmetic Logic Unit, ALU）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数値演算: 加算、減算、乗算、除算などの基本的な算術演算を実行。&lt;/li&gt;
&lt;li&gt;論理演算: AND、OR、NOT、XORなどのビット単位の論理演算を行う。&lt;br&gt;
（これらは全部NANDを組み合わせるだけでできる。NAND最強。）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;制御ユニット（Control Unit, CU）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;命令の解釈: プログラムから読み込んだ命令を解釈し、何を行う必要があるかを判断。&lt;/li&gt;
&lt;li&gt;命令の実行: 各種装置に対して命令を送り、実行を管理。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;レジスタ&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一時的なデータ保持: 処理中のデータや中間結果を一時的に保持。&lt;/li&gt;
&lt;li&gt;特定の機能を持つレジスタ: 命令ポインタ、ステータスレジスタなど。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;キャッシュメモリ&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;高速アクセス: 頻繁に使用されるデータや命令を一時的に保持し、高速なアクセスを可能にする。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;バスインターフェースユニット&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データ転送: CPUとメモリや他のデバイス間でデータを転送。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;命令セットアーキテクチャ（ISA）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;命令セット: CPUが理解できる命令のセット。このセットに基づいてプログラムはCPUに命令を出す。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;パイプライン処理&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;同時実行: 複数の命令を同時に処理することで、効率的な実行を実現。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;クロックとタイミング&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;システムクロック: CPUの処理速度を決定するタイミング信号。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;しかし、CPUの機能を全て個人で実装するにはノウハウや時間が足りない人も多いでしょう（作ったことない人でばなおさら）。ここでよく言われるのが、「足し算ができるCPUを作成できれば、それは究極的に機能を制限したCPUといえる」という話で、上の1.を作成しているとはいえるかもしれません。&lt;/li&gt;
&lt;li&gt;いきなりメモリ機能やクロック機能を作れと言われてもできる気がしない（？）し、開発の時に「とりあえず動作確認のために加算器を作ろう」という流れになったというメタ的な事情もありますので、今回は加算器を作成していきます（ということで納得してください、、）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="2足し算プログラムなんて作ったことあるよ"&gt;2.足し算プログラムなんて作ったことあるよ？&lt;a class="td-heading-self-link" href="#2%e8%b6%b3%e3%81%97%e7%ae%97%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0%e3%81%aa%e3%82%93%e3%81%a6%e4%bd%9c%e3%81%a3%e3%81%9f%e3%81%93%e3%81%a8%e3%81%82%e3%82%8b%e3%82%88" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;「足し算できるモノを作ってください」と言われたら、PythonやJavaでも作れます（筆者も大学講義でC言語とJavaやりました）。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Python&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Adder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 使用例&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;adder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Adder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;adder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;// Java
public class Adder {
 private int a;
 private int b;

 public Adder(int a, int b) {
 this.a = a;
 this.b = b;
 }

 public int execute() {
 return this.a + this.b;
 }
}

// 使用例
Adder adder = new Adder(3, 5);
System.out.println(adder.execute());
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;そこで、&lt;strong&gt;ChiselというDSL&lt;/strong&gt;の出番なわけです。&lt;br&gt;
ScalaはJavaベースなので、パッと見はJavaと同じように見えます。&lt;/p&gt;</description></item></channel></rss>