目次

命令デコーダ

 TD4は、ROMから命令とデータを1バイトで引出し
 命令から各回路の制御信号を生成します。

 ニモニックと機械語の対応を見てみます。

 レジスタファイルはA、B、C、Dと4個あります。
 このレジスタファイルに、ALUの出力を格納するのが
 コンピュータの動作そのものになります。

 各命令の動作を分解して眺めてみます。

 MOV A,Im

  ゼロとImの値を、加算器(ALU)で加算してレジスタAに格納。

  レジスタAにデータを格納するので、74LS193のロード端子を
  'L'にするように信号を生成します。

  命令を2進数で表示すると、上のニブルは0011。
  上の2ビット00はレジスタAのロード端子に与える
  信号を生成し、下の2ビット11はセレクタ信号に。

  上の2ビット00から74LS193の制御信号を生成します。



  ImはROMのデータで、データセレクタは命令ニブルの
  下の2ビット11を入力して、"0000"を出力します。
  これで、加算器の入力の一方にはROMの出力、他は
  セレクタの出力である"0000"を使うこと。

  セレクタ信号には、00、01、10、11のうち、11を
  与えます。



 MOV A,B

  ゼロとレジスタBの値を、加算器(ALU)で加算してレジスタAに格納。

  レジスタAにデータを格納するので、74LS193のロード端子を
  'L'にするように信号を生成します。

  命令の上ニブルは0001で、上の2ビット00はMOV A,Imと同じ。
  セレクタ信号に下の2ビット01を与えるので、レジスタBの
  出力をALUの入力に伝達するとわかります。

  命令の下ニブルは、0000で加算器のもう一方の入力なので
  レジスタBとゼロを加えレジスタAに格納するとなります。



 ADD A,Im

  レジスタAとImの値を、加算器(ALU)で加算後、レジスタAに格納。

  これをレジスタ、セレクタ、ROMの出力で考えてみます。

  命令は上ニブルが0000で、上の2ビット00はレジスタAに
  加算器であるALUの出力を格納となります。
  下の2ビット00はセレクタ出力を、レジスタAの値とします。



 IN  A

  レジスタAに、入力データをそのまま格納。
  レジスタAに、入力データとゼロの加算結果を格納。

  これをレジスタ、セレクタ、ROMの出力で考えてみます。

  命令は上ニブルが0010で、上の2ビット00はレジスタAに
  加算器であるALUの出力を格納すると解釈できます。
  下の2ビット10はセレクタ出力を、入力に接続となります。

  セレクタは、入力の4ビットを指定して伝達する回路を
  実現していることに。



 MOV B,Im

  ゼロとImの値を、加算器で加算してレジスタBに格納。

  レジスタBにデータを格納したいので、74LS193のロード
  端子を'L'にする信号を生成します。



  ImはROMのデータで、データセレクタは命令ニブルの
  下の2ビット11を入力して、"0000"を出力します。
  これで、加算器の入力の一方にはROMの出力、他は
  セレクタの出力である"0000"を使うこと。

  セレクタ信号には、00、01、10、11のうち、11を
  与えるようにします。

  命令の上ニブルは、0111になっています。
  上の2ビット01はレジスタBのロード端子に与える信号を
  生成し、下の2ビット11はセレクタ信号になります。



 MOV B,A

  ゼロとレジスタAの値を、加算器で加算してレジスタBに格納。

  レジスタBにデータを格納するので、74LS193のロード
  端子を'L'にするよう信号を生成します。

  命令の上ニブルは、0100で上の2ビット01はMOV B,Imと同じ。
  セレクタ信号に下の2ビット00を与えるので、レジスタAの
  出力をセレクタでALUに伝達すると考えられます。

  命令の下ニブルは、0000で加算器のもう一方になっているため
  レジスタAとゼロを加え、レジスタBに格納します。



 ADD B,Im

  レジスタBとImの値を、加算器で加算しレジスタBに格納。

  これをレジスタ、セレクタ、ROMの出力で考えてみます。

  命令の上ニブルは0101で、上の2ビット01はレジスタBに加算器
  の出力を格納となります。
  下の2ビット01はセレクタの出力が、レジスタBの出力となります。



 OUT Im

  ゼロとImの値を、加算器で加算しレジスタCに格納。

  これをレジスタ、セレクタ、ROMの出力で考えてみます。

  命令の上ニブルは1011で、上の2ビット10はレジスタCに加算器
  の出力を格納と解釈します。
  下の2ニブル11はセレクタの出力で、ゼロになります。

  ROMの出力とゼロを加算器の入力にするので、ゼロと加算
  した値は、ROMの出力そのものになります。回路は以下。



 OUT B

  ゼロとレジスタBの値を、加算器で加算しレジスタCに格納。

  これをレジスタ、セレクタ、ROMの出力で考えてみます。

  命令の上ニブルは1001で、上の2ビット10はレジスタCに加算器
  の出力を格納と解釈します。
  下の2ビット01はセレクタの出力が、レジスタBの値となります。

  レジスタBの値とゼロを加算器の入力にするので、ゼロと加算
  した値は、レジスタBの値そのものになります。



 IN  B

  レジスタBに、入力データをそのまま格納。
  レジスタBに、入力データとゼロの加算結果を格納。

  これをレジスタ、セレクタ、ROMの出力で考えてみます。

  命令の上ニブルは0110で、上の2ビット01はレジスタBに
  加算器の出力を格納と解釈します。
  下の2ビット10はセレクタの出力が、入力からの転送となります。

  セレクタは、入力の4ビットを指定して伝達します。



 JMP Im

  無条件分岐命令は、プログラムカウンタ(レジスタD)にIm値を
  格納することと同じです。

  ROMのデータにゼロを加えて、レジスタDに格納します。

  これをレジスタ、セレクタ、ROMの出力で考えてみます。

  命令の上ニブルは1111で、上の2ビット11はレジスタDに加算器
  の出力を格納と解釈します。
  下の2ニブル11はセレクタの出力で、ゼロになります。



 JNC Im

  条件分岐命令は、キャリービットが0ならプログラムカウンタ(レジスタD)に
  Imの値を格納します。

  JNC命令の上ニブルは1110で、上の2ビット11はレジスタDに加算器
  の出力を格納と解釈します。ただし、このキャリービットが1なら
  レジスタDのロード端子には、'H'を与えます。

  分岐命令では、レジスタDに値を格納する条件を考えます。

  命令 キャリー 
    1111     0      -> レジスタDにImの値を格納する
    1111     1      -> レジスタDにImの値を格納する
    1110     0      -> レジスタDにImの値を格納する
    1110     1      -> レジスタDにImの値を格納しない

  レジスタDにImの値を格納する条件は、命令の上ニブルの中の
  下の2ビットとキャリーの組み合わせが関係してきます。

  110、111、100のときに74LS193のロード端子に'L'を出力します。

  デコーダICの定番である74LS139を使い、レジスタD用制御
  信号は、次の回路で実現します。




目次

inserted by FC2 system