次に作る予定なのは、プログラムカウンタ(PC)である。レジスタ、ALUは組み合わせなので動くが、PCは順序を考えなければならないのでできるか心配である。本質的に、1)次のステップでインクリメントする、2)JMPの時はアドレスを代入できる、の機能を持たなければならない。
いろいろ考えてみたのだが、結局、アドレスを保持するレジスタを2つ持っている必要があると思う。一つ目はPCレジスタそのもので、セレクタ(アドレスバスに接続するスイッチ)を一つ持つ。もう一つはIncrement(アドレスバスの値に+1する)の値を保持するINCレジスタで、これはセレクタを2つ持つ。8ビットの場合、セレクタ1個だけで2回路のリレーを4つ使ってしまうため、セレクタだけで計12個、8bitレジスタは1回路のリレー8個使うので計16個、さらにloadに計2個、Incrementはハーフアダーで1回路のリレー8個+2回路のリレー8個を使うため、PCだけで計46個のリレーを必要とする。ALU基板(44個)よりも多くのリレーを使ってしまうが、これ以上減らすアイデアを考え付かなかった。
実際には8bitフルのアドレッシングなど使わないだろうから、上位ビットのリレーを抜いて再利用すればいいだろうと思い製作にとりかかる。
ブロック図は上記の通り。JMPの際はZレジスタに退避しておいたデータをデータバス経由でアドレスバスにつないで、PCレジスタにロードする。データバスとアドレスバスをつなげるなんて??と思ったが、理屈では合ってるはず。絵ではbranchになっているが、名前はjmpにするべきだったな。
PCのインクリメントは、PCレジスタをアドレスバスに接続するとIncrementが+1してくれるので、それをINCレジスタに保持させ、次のステップでPCレジスタに転送する。うん、想定の中では動きそうだぞ。
0 件のコメント:
コメントを投稿