読者です 読者をやめる 読者になる 読者になる

幼女でもできる自作CPUチップ (3)

電子工作 自作LSI

 第1回の記事

ourfool.hatenablog.com

でおおまかな設計フローを示し、

第2回の記事では仕様設計をおこなった。

ourfool.hatenablog.com

 今回は、フローに示したもののうち、アーキテクチャ設計について書いていく。

 前回、どのようなCPUをつくるか、つまり仕様を固めたので、今回はその仕様を満たすよう具体的な内部構成を決めていく。

 しかし構成を決めるに先立って、前回前々回とすっかり失念していた重要な作業をおこなわなければならない。CPUの命名である。IntelさんのCPUにCore i7 ○○とかCeleron○○とかつよい名前がついているように、今回つくるCPUにもここで名前をつける。

 今回のCPUは「自らレイアウトする(Layout-Originally)5bitのCPU」であるから、シンプルに「LO5」という名称でいこうと思う。無難で単純な命名ではあるが、なんとなく心地よい響きだ。

 まず、LO5のデータパスを以下にしめす。データパスとはCPU内部のデータの流れを図に示したものをいう。

f:id:ourfool:20150503222139p:plain

 前回の記事は「幼女でもできる」と銘打った割に不親切でメモ的な内容になってしまったので、ここでいろいろと動作を補足しておく。

 5bitのCPUであるから、データは5bit単位でやりとりされる。入出力(Input, Output)も5bitである。Input, Outputは5bitのデータが並列に送られる。つまり実際には5本の信号線があり、各々が0 or 1のデジタル信号を送る。他の信号線も同様である。複数の信号線を1本で表現していることは、斜線+○bitという表記であらわしている。

 一般的なパソコンのメモリ(RAM)にあたるものはLO5に存在せず、代わりにROMだけが存在する。これは一般的なパソコンでいうところのハードディスクであるとかSSDにあたる。ふつう高速なRAMに一旦プログラムを持ってきてから実行するところを、遅いROMから直接持ってきて実行しているという感じである*1

 変なかたちのブロックはALUといって、計算をする部分である。ここに送られたデータ同士の演算をおこない、その結果を出力する。レジスタはデータをたくわえる部分。たくわえられたデータ同士で演算をおこない、その結果を再びたくわえる、ということを繰り返し、出力を変化させていくことができる。

 ALUへの入力データ選択(SelectData)、ALUの機能選択(SelectALU)、ALUの出力したデータの行き先(Load○)はROMに保存されたプログラムにしたがって決まる。ROMのどこに保存されたプログラムを実行するかは、Addressによって決まる。

 ROMなどの外部回路との接続も図に示すと、下のようになる。

f:id:ourfool:20150503225832p:plain

 ROMに保存された命令は、オペコード+イミディエイトデータという構成で、全て合わせて10bitとなっている。10bitのうち、前半5bitのオペコードは命令の演算内容を表し、後半5bitのイミディエイトデータ(ImData)は命令に用いる値を表している。たとえば、「レジスタAの値に5を足す」という命令を考えると、「レジスタAの値に○○を足す」をオペコードが表し、「5」をImDataが表している*2

 オペコードごとに異なった演算を実行するには、ALUへの入力データと出力先のレジスタを、各オペコードに応じて適宜選択する必要がある。したがって、オペコードに対応して選択のための信号を生成する、命令デコーダが必要になる。

 もろもろ鑑みて、デコーダの真理値表は以下のように決めた。実際の回路では、以下の真理値表を満たすような論理回路から成るデコーダをROMの出力につなぎ、ALU、レジスタの選択信号をつくる。

f:id:ourfool:20150503180010p:plain

 ここでニーモニックとは命令にわかりやすい名前をつけたものである。LO5は全21種類の命令を持っている。貧弱だが、算術演算(ADD、SUB)、論理演算(AND、OR、NOT)、ジャンプ(JMP、JNC)を一通り備えているし十分満足とする。なお、このようなCPUの命令体系は命令セット(instruction set architecture, ISA)と呼ばれる。これは普通のパソコン等でいうと、x86とかARM*3とかなんとかその辺の語彙にあたる。

 コンピュータの話ではRISCとかCISCとかいう言葉がよく出てくるが、これは命令セットの設計手法の話である。ざっくり言うと、命令の種類が少ないのがRISC、多くて複雑なのがCISCで、x86CISC、ARMはRISCというのが入門講義の模範的な解答(?)である。

 LO5はというと、別にReduced Instruction Set Computerでもなく、かといって、Complex Instruction Set Computerなはずもないので、なんとも言えない。いま勝手に作った言葉でいうとYowai Instruction Set ComputerでYISCくらいがしっくりくる。

 さて、あらためて真理値表をまとめてみると、どうもやっぱり面倒そうな気がしてくるのだが、まあなんとか実装できるということにしておく。気休め程度に工夫を加えたオペコードが、劇的な簡単化をもたらすに違いない。

*1:ここでの解説はおおむね「感じ」である。技術的には結構おかしなことを言っている部分もあるので注意されたい。

*2:ふつうは「オペランド」なるものがある。LO5にも一応オペランドっぽい部分はあるのだが、デコーダ回路論理の都合で微妙に複雑なことになっている。

*3:ただしARMという言葉は多義であって、常に命令セットアーキテクチャのことだけを示すわけではない。