CPUをつくろう -プログラムカウンタとデータセレクタ編1-

プログラムカウンタ

次に読み出すメモリのアドレスを指定する装置。クロックパルスを入力する度に指し示すアドレスを進めて行く。

今回のCPUは0〜3の計4アドレスなので、クロックを入力する度に0〜3をカウントアップする回路を作る。

フリップフロップ

カウンタはフリップフロップという回路を使って作る。フリップフロップにはいくつかの種類があるが、今回はDフリップフロップを用いる。フリップフロップについての詳細は今後の「レジスタ編」で説明する。

Dフリップフロップとは以下のような回路となる。NOT、AND、ORの論理回路を組み合わせた構成になっている。

入力DとCLK、出力Qがある。この回路のCLKにクロックパルスを入力すると、クロックの立ち上がり(LoからHiに切り替わる瞬間)にDに入力された値を記憶し、Qに出力する。

このDフリップフロップは以下のような記号で表す。

カウンタを作る

Dフリップフロップをつかって2bitのカウンタを作る。2bitのカウンタとは、00,01,10,11の2bitの値をカウントするということ、つまり0〜3をカウントアップするカウンタのこと。

2bitのカウンタは以下の構成で作る。CLKにクロックパルスを入力する度にbit1、bit0の出力が0,0、0,1、1,0、1,1と変化する。

最後にカウンタが動作する様子を示す。クロックの立ち上がりに合わせてbit1、bit0の値が変化するのが分かる。

CPUをつくろう -仕様編-

仕様を決めよう

仕様を決めよう と言ってもほぼ書籍の通りだけど、1bitに簡略化した為に機能がいくつか減っている。

まずハードの仕様

  • レジスタ:Aレジスタ(1bit)、Bレジスタ(1bit)
  • ROM:5bit幅×4
  • ROMアドレス:0b00 ~ 0b11
  • 入力:1bit
  • 出力:1bit

まずレジスタだが、当然1bitである。

そして書籍ではキャリーフラグもあり、このフラグを見てアドレスをジャンプするのだが、今回の1bitCPUはレジスタが1bitなのでデータ長も1bitである。ということは…0か1しか表現できない。ということは…ジャンプ先のアドレスは0か1しかない。 これではジャンプ命令の意味がないため、今回はキャリーフラグは見ない。

よってフラグレジスタは実装しない!

次にROMアドレスだが、これは0b00(10進数の0)から0b11(10進数の3)までにした。なぜなら…プログラムカウンタを作るの楽だからである。 さすがに0か1の2アドレスは寂しすぎるし、4アドレスとした。

つぎは命令仕様

  • 命令長:5bit(オペコード4bit、オペランド1bit)

オペコードというのは下に書く各種命令のこと。オペランドは下に書くIm:イミディエイトデータのこと。

  • 命令の種類:以下に命令を示す。命令名:命令コード:意味という順で列挙する。
MOV A, Im0b0011ImをAレジスタに転送する
MOV B, Im0b0111ImをBレジスタに転送する
MOV A, B0b0001BレジスタをAレジスタに転送する
MOV B, A0b0100AレジスタをBレジスタに転送する
ADD A, Im0b0000AレジスタにImを加算する
ADD B, Im0b0101BレジスタにImを加算する
IN A0b0010入力ポートからAレジスタに転送する
IN B0b0110入力ポートからBレジスタに転送する
OUT A0b1001Bレジスタから出力ポートへ転送する
OUT Im0b1011Imを出力ポートへ転送する
NOPADD A, 0何もしない

あ…あと、加算命令ADDは0+0、0+1、1+0しか出来ない。1bit CPUだから。

ブロック図

これから作るCPUのイメージ図を作る。かなりお粗末な図だが、なんとなくのイメージはできるかと。

CPUをつくろう -構想編-

CPUを理解しよう

仕事でマイコンのプログラミングをしているのだが、レジスタやスタック、メモリ等がどうやって動いているのかを詳しく知らないということに気づいた。(まぁ気づくことは気づいていたが知らなくても何とかなった)

昔アセンブラを少し勉強しようとしたことはあったが、はやりここはソフトだけでなく回路がどう動くのか原理から知らなくては!

という感じで本を手に取った。これです↓

渡波都さん著 「CPUの創りかた」

まずこの本でCPUとは何ぞやを理解していきたい。

どんなCPUをつくるか

どんなCPU?といってもこの本の通りにつくることにするのだが、一つ二つ難点が…

  • この本で紹介しているICには入手しづらいモノがある
  • 実際に回路を組むのは面倒だ…(配線とかたいへん)
  • 動きを理解するためなら、もう少しシンプルなCPUでもいいのでは?

ということで、つくるのは

まず1bit CPUとする! (書籍のは4bitだけど、そんなにつくるのは大変そうだから笑)

そしてSpice等のシミュレータでつくる!(これなら間違ってもすぐ直せるしコピペも楽だ笑)

これで方向性が決まった。次はCPUの仕様から。