標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第383回]

●やっとMYCPU80のプリント基板ができてきました

ご予約いただいておりました分のMYCPU80基板がやって出来てきました。
組立てに必要なパーツはすでにそろっていますので、あとはプリント基板の修正作業と説明書のプリントアウト(ページ数が多いのでなかなか大変です)が終わればお送りすることができます。
ご予約いただいておりました皆様には、メールにてご連絡を差し上げましたが、念のため下記にお振込先をご案内いたしますのでよろしくお願いいたします。
お振込みいただく金額は、MYCPU80組立キット代金、税込合計49350円です。
郵便振替口座 00810−0−45961 (有)中日電工
宛てにお振込みくださいますようお願いいたします。

●8ビットCPUのブロック図

今回検討中の8ビットCPU回路のブロック図です。


比較のためにMYCPU80のブロック図もお見せすることにいたします。
MYCPU80のブロック図は[第233回]にもありますが、このときは一部のレジスタ回路のみで、省略しているところがありました。
それでは上の8ビットCPU回路のブロック図と対比しながら説明するのに不都合がありますから、以下にあらためてMYCPU80の全ブロック図をお見せします。

●MYCPU80のブロック図



レイアウトの都合でPC(プログラムカウンタ)とSP(スタックポインタ)が、8ビットCPUでは図の下部に位置しているのに対して、MYCPU80では図の上部に位置しています。
図が大きいのでブラウザで見ながら比較するのは厄介かもしれません。適宜、図をコピーしてプリントアウトなどしていただいて比較してください。

MYCPU80では、PCH、PCL、SPH、SPL、H、L、WKH、WKLはアドレスバスにも出力を行いますが、8ビット内部バスを介してデータの読み出し、書き込みをおこなうため、出力ゲートをアドレスバス用と内部データバス用の2個もっています。

ここのところが、8080では内部データバスに対してデータの読み出し、書き込みを行い、アドレスバスに対しては内部データバスの値を一旦ラッチしてから、外部アドレスバスに出力しているようです(本当のところははっきりしませんが)。

まあ、8ビットCPUですから、内部データバスは当然8ビット。なので16ビットのアドレスバスに出力するには、内部データバスを介して、2回に分けてラッチして出す、ということになります。それが当たり前の考え方です。
たとえば、PCHLのようにHLレジスタからPCに16ビットのアドレスデータを送る場合でも、当然内部バスを使って、8ビット2回に分けて送ります。

●今回の8ビットCPUは一部16ビットバスです

MYCPU80の基板設計(作図)がほぼ終わってから、もったいないことをしていたことに気がつきました。
8本の内部データバスのほかに「外部」アドレスバス16本がHLレジスタ、WKレジスタ、SP、PCの間を結構な幅で基板を占有して走っています。
確かに普通のCPUならば「外部」アドレスバスです。
ですけれどMYCPU80にとっては、基板内部の配線なのですから、外部ではなくて、内部アドレスバスであるとも言えるのではないか。
こいつをただ出力だけのアドレスバスとしてしか使わないというのはもったいない話です。
そこで、このアドレスバスを16ビットの「内部」データバスとしても利用してしまおう、と考えました。

最初にお見せした今回の8ビットCPUのブロック図と、MYCPU80のブロック図を見比べてみてください。
今回の8ビットCPUでは、PCもSPも8ビット内部データバスにはつながっていません。
読むのも書くのも「外部」アドレスバスに対してのみ行います。

しかしデータバスは8ビットです。
メモリからのデータは8ビットなのですから、それをいきなり16ビットバスに送るわけにはいきません。
そこで、8ビットデータバスと16ビットアドレスバスの間で橋渡しをするレジスタが必要になってきます。
それがDAレジスタとADレジスタです。

DAレジスタはデータバスからデータを読み込んでラッチし、DA(H)、DA(L)の2つのレジスタを合わせて16ビット幅にして、16ビットバス(アドレスバス)に送り出します。
PCやSPは、この16ビットのデータを一度に書き込むことができます。
またPCやSPから16ビット幅で読み出したデータは、AD(H)、AD(L)レジスタに書き込まれてから、8ビットずつ2回に分けて8ビットデータバスに送り出します。

このように配置することで、余計な配線を省くことができるのと同時に、いままで16ビットのアドレスデータを8ビット2回に分けて読み書きしていたところが、16ビットで1回の読み書きで済みますから、それだけ回路も簡単になる道理です。

●レジスタも有効利用を考えます

MYCPU80ではローテイト命令のためのシフトレジスタやINR、DCR命令のためのUP/DOWNカウンタが、汎用のレジスタと独立して存在していて、それらのレジスタは、ただその目的のためだけに使われていました。
ALU回路の”A”レジスタ、”B”レジスタも同様です。
これももったいない話ですので、制約つきであっても、汎用レジスタとしても利用可能にすることを考えました。
レジスタ数を減らした分を、それで多少でも補おうというわけです。
INR、DCRのためのUP/DOWNカウンタはALUの”A”レジスタにあわせてしまい、かつALUのみではなくて、汎用のレジスタAとしても使えるように考えました。

●シフトレジスタは使いません

そして、もうひとつ、今回の8ビットCPUでは、ローテイト命令のためのシフトレジスタは無くしてしまいました。
シフトレジスタがなくて、どうやってローテイト命令を実行するのか?
については、ちょっと時間がなくなってしまいましたので、次回に説明をいたします。

●4ビットCPUのブロック図です

8ビットCPUのブロック図をお見せして、概略を説明しましたので、ことのついでに4ビットCPUのブロック図もお見せいたします。


内部データバスが8ビット→4ビットに、外部アドレスバスが16ビット→8ビットになったこと(およびそれにともなって8ビットレジスタが4ビットレジスタになったこと)を除いては、基本的には、8ビットCPUと同じです。
ただ8ビットCPUでは、外部データバスも内部データバスもともに8ビットであるため、外部、内部の間には双方向ゲート(74HC245)があるだけでしたが、4ビットCPUでは、そのところを8ビット←→4ビットの間の橋渡しをしなければならないので、ちょっと複雑な回路になっています。
ブロック図だけを見ていても、はてな、ということでわかりづらいかもしれません。
いずれ、具体的に回路図をお見せしながら、説明をしていくつもりです。
2009.11.18upload

前へ
次へ
ホームページトップへ戻る