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

●MVI命令の説明です

MVI命令は、Move Immediateの略語からきたニーモニックで、Immediateは、直接の、すぐ近くの、ただちに、というような意味です。
命令コードに続く8ビットのデータ(命令コードのすぐ次のメモリアドレスにあるデータ)を、指定するレジスタ(またはメモリM)に書き込みます。

MVI命令の回路図は、[第40回]でMOV命令と一緒になった回路図をお見せしました。
MOV命令はMEMWRのタイミングを整理したおかげで、ずいぶん簡単になりました。
しかしMVI命令は残念ながら、それほど簡単にはなりません。
それでもゲートがいくつか節約できました。
MOV命令の回路も変わってしまったことですし、この際、MVI命令だけにして、もう少し見やすく描き直してみました。



MVI命令の命令コードは、 00ddd110 です。
命令コードのビット7とビット6が、ともに0で、さらにビット2〜ビット0が”110”になっています。
回路図ではOP7とOP6をインバートしてANDで受け、それとOP2〜OP0=”110”のときにHになる3入力AND(74HC11)の出力とを次段のANDで受けています。
こうすることで、00xxx110のときのみMVI命令の回路が選択されるようになります。

この部分を書いていて、もとの回路にミスがあったことに気がつきました。
もとの回路では、MVI命令はOP7、OP6がともに0であれば選択されるようになっていました(OP2〜OP0=”110”の条件が落ちていました)。
今はまだMOVとMVI命令だけしか実装していませんので、何の問題もおきませんが、第2、第3の基板をつなぐと、00xxxxxxというコードの他の命令とぶつかって誤動作することになります。
回路図を訂正するとともに、基板の配線も直しました。

MVI命令の説明の続きに戻ります。
dddはデータを書き込むレジスタを指定する3ビットの値000〜111です。
ddd<>110のときはレジスタにデータを転送する命令になります。MVI r,I8です。
ddd=110のときはメモリMにデータを書き込む命令になります。MVI M,I8です。

MOV命令の回路はmemRD、memWRのタイミングをregRD、regWRと同じにしたため、それ以前の回路では、MOV r,r’とMOV r,MとMOV M,rと3つの回路に分かれていたのが、まとめて1つの回路になってしまいました。
MVI命令の回路は、レジスタにデータを転送するMVI r,I8と、メモリにデータを転送するMVI M,I8の2つに分かれていますが、MOV命令と違ってMVI命令の回路は、残念ながら1つにすることはできません。

MVI r,I8とMVI M,I8はターゲットがレジスタかメモリかという点では、MOV r,r’とMOV M,rとの相違と同じように思われてしまいますが、じつは、MVI r,I8とMVI M,I8はMOV命令よりも大きな相違点があるために、1つの回路にはできないのです。
その相違点については、MVI M,I8の説明のなかであきらかにしていきます。

MVI r,I8の回路は、MVI M,I8の回路にほとんど含まれてしまいます。
しかし両方を一度に説明するよりは、やはり、まず簡単なMVI r,I8から説明をはじめた方が、より理解しやすいと思います。
そこで、上の回路図をさらに分解して、まずはMVI r,I8だけについて、先に説明することにいたします。

●MVI r,I8の回路図です

 
いつものように、タイミングチャートを見ながら考えていきます。

●MVI r,I8のタイミングチャートです



MVI r,I8の動作は、MOV r,Mとほとんど同じです。
MOV r,Mのタイミングチャート([第45回])と比べてみてください。
どこが違うかというと、MOV r,Mでは、HLレジスタでアドレスを指定するメモリMのデータをレジスタに転送するのに対し、MVI r,I8は、PC(プログラムカウンタ)で示すメモリアドレス(じつはMVI命令の次のアドレス)のデータをレジスタに転送する、というところが違っています。
タイミングチャートを比較してみると、MOV r,MのタイミングチャートではHLselになっているところが、MVI r,I8ではPCselになっています。

MVI r,I8の回路図の右上にPCselを出力しているところがあります。
ここでPC(プログラムカウンタ)の値が外部アドレスバス(A0〜A15)に出力されます。
s2〜s0はOPコードのビット2〜ビット0がそのまま(”110”)出力されますが、これはMVI M,I8で使うために、MV r,I8でも、そうなっているのですが、MVI r,I8ではs2〜s0は利用されません。

MOV r,Mの回路では、s2〜s0が”110”のときに、regRDがアクティブになると、その期間HLselがアクティブになってメモリMが選択されました。
MVI r,I8ではregRDはアクティブにしないので、HLselはアクティブにされません。

もうひとつ、MOVとMVIとで異なっているところがあります。
MOV r,MはHLレジスタで指定するメモリアドレスを参照するだけで、プログラムカウンタの値とは関係がありませんでしたが、MVI r,I8はプログラムカウンタが示しているアドレス(MVI命令の次のアドレス)のデータを読み込みます。
プログラムカウンタはその値で示すメモリアドレスのマシン語命令コード、またはデータを読むたびに、カウンタを+1ずつカウントアップしなければいけません(そうすることで、次のOPコードフェッチのタイミングには、次のメモリアドレスから命令コードを読み込むことができます)。

そこでMVI回路では、regWRが終了してから1マシンクロック後のT5の終わりのタイミングで、プログラムカウンタを+1するように、T5の期間、PCincパルスを出力します。
2008.8.27upload

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