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

●キーマトリクス回路の説明です

なんだかここのところ、CPUから離れて、本題からややずれたお話になってしまっています。
でも、乗りかかった船です。
もうしばらく脱線したままで行きたいと思います。

今回はキーマトリクス回路の説明です。
キーマトリクス回路は[第120回]で7segLEDと一緒になった回路図をお見せしました。

でも、もう一度、キーマトリクス回路のみ切り取ってお見せします。



7segLEDの表示回路は、RAMに置かれた表示データをDMA(ダイレクトメモリアクセス)という方法でCPUの動作と並行して読み出して、ダイナミック表示を行うというものでした。
しかし、キー入力回路は、プログラムでアクセスしたときだけ、どのキーが押されているか、という情報をCPUに伝えます。

7segLEDの表示は読んでいる途中で、勝手に消えてもらっては困りますから、ずっと消えないで表示している必要があります。
しかしキーからの入力は、人間が操作したときだけ、そのことをCPUに伝えればよいのですから、キー入力回路は、勝手に動作するのではなくて、プログラムによってアクセスするような回路になっています。

ではどうやってキーが押されたことを認識するのか、というと、OUT命令とIN命令を使って、どのキーが押されたかを知るように回路が組んであります。

回路図の左下の74HC138の部分はアドレスデコーダ回路です。
アドレスの下位8ビット(本当はA7〜A2の6ビット)から、IN、OUT命令のためのI/Oアドレスをデコードしてセレクトされたラインをアクティブにします。

そういえば、74HC138も何回か登場していますが、その動作については説明していなかったように思います。
自分ではずっと使っているいわば定番のICばかりですから、つい説明することを忘れてしまいます。

●74HC138のデータシート(部分)です

74HC138とともに74HC238もレジスタのセレクト回路やCPUのマシンクロック(Tn、Mn)生成回路などで使いました。
74HC138は選択された出力がLになるのに対して、74HC238はH出力になるというところが異なっていますが、その他の動作は全く同じです。

A0〜A2の3ビットの入力、000〜111をデコードして、0〜7の8本の出力ラインのうちの一本を選択してアクティブにします。
いわゆる3to8デコーダですが、74HC138(74HC238も同じ)の便利なところは、A0〜A2のほかに、負論理入力2本(E1、E2)と正論理入力1本(E3)の3入力を選択に加えることができるところです。
これをうまく利用すると、このIC1個だけで、I/Oやメモリのセレクト回路ができてしまいます。
(真理表のA0にバーがついていますが、メーカーのミスプリントだと思います。A0〜A2は負論理入力ではありません)

74HCのデータシートで使われている端子名は、74LSで一般的だった端子名とは異なっているようです。
「つくるCPU」の回路図では以前からなじみのある端子名を使っています。
データシートと回路図で端子名が異なってしまうのも困ったものですが、余り名前にはとらわれずに、基本的な動作について理解するようにしてください。
データシートでE3、E2、E1、A2、A1、A0とあるのは、回路図では、G1、G2B、G2A、C、B、Aに相当します。

キーマトリクス回路では、各端子に順にA7〜A2を接続しています。
A7=1、A6=0、A5=0のときに、A4〜A2の3ビットをデコードした出力がアクティブになりますから、8本の出力線につながった回路は8Xと9Xのいずれかのアドレスが割り当てられることになります。
アドレスのA1、A0はデコードされていませんから、たとえば80Hでも81Hでも、82Hでも83Hでも同じ出力ライン(Y0)がアクティブになります。

キーマトリクス回路ではY7出力が、74HC175のCK入力と74HC244のG入力につながっています。
Y7は9CH〜9FHのときにアクティブになります。
回路図をよく見ると、74HC175に行くラインは、IOWRとのANDをとった出力になっているのに対して、74HC244のラインはIORDとのANDをとった出力になっています。
IN命令とOUT命令が同時に実行されることはありませんから、このように同じI/Oアドレスに入力回路と出力回路を割り付けても問題はありません。

INとOUTとで別のアドレスを割り付けた場合でも、必ずIORDかIOWRとのANDをとるようにしなければなりません。
I/Oアドレスはアドレスバスの下位8ビットだけを使います。
上位8ビット(A15〜A8)はデコードしていませんから、もしIORDやIOWRでANDをとっていないままI/O回路のセレクトを行うと、メモリをアクセスしているのに、I/O回路まで誤ってセレクトされてしまいます。
実はこのことはメモリアドレスのデコード回路でも同じことが言えます。
メモリ回路で上位8ビットをフルデコードしていても、MEMRD、MEMWRとともにメモリをアクセスするような回路にしておかないと、メモリをアクセスしていないのにメモリからデータバスにデータが出てきてしまう危険があります。

さて話しをもとに戻します。
74HC175にはDフリップフロップが4個入っています。CKは共通です。
4個のDフリップフロップのうち3個を3ビットのラッチとして使っています。
キーマトリクス回路では、まずキーの横のラインのどれかをLにしておいてから、74HC244に対してIN命令を実行することで、どのキーが押されたかを知るように考えてあります。
IN命令が実行されるときまで、横のラインのどれかは必ずLになっていなければなりませんから、ラッチが必要なのです。

74HC244はGがアクティブのときだけ、ゲートのINとOUTがつながります。
74HC244は8ビットですから、8個のキーの情報しか読むことができません。
しかしキーをマトリクス状に配置して、横のラインでつなぐことによって、8個以上のキーの情報を読むことができるようになります。

横一列にならんだ8個のキーはデータバスのD0〜D7の各ビットに対応しています。
キーが押された位置に対応したビットのみ0になって読み出されるので、どのキーが押されたかがわかるのです。
74HC175にはデータバスのD0〜D2がつながっています。
74HC244に対するIN命令にさきだって、74HC175に対してD0〜D2のどれかだけが0になるようなデータをOUT命令で与えておくと、そのビットに対応する横のラインだけがLレベルになるので、そのライン上に配置されたキーのみが押されたときに、74HC244に入力される縦ラインをLにします。
そこでまず74HC175に対してD0のみを0にするようなデータ(たとえばFEH)を出力しておいて、74HC244に対するIN命令を実行します。
つぎにD1のみが0であるようなデータ(たとえばFDH)を74HC175に出力しておいてから、74HC244に対してIN命令を実行します。
最後に、D2のみが0であるようなデータ(たとえばFBH)74HC175に出力しておいてから、74HC244に対してIN命令を実行します。
このようにして得られる3組の8ビットデータの各ビットのどこが0になっているかを調べれば、どのキーが押されているかがわかります。

なお74HC175の出力ラインにダイオードが入れてあるのは、縦ライン上のキーを同時に2個押したようなときに、出力同士がショートするのを避けるためです。

2008.12.8upload

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