2017-09-01 20:28 — asano
カテゴリー:
先日のμPD71037とともにμPD71054も出てきましたので、今回はこれを取り上げたいと思います。
NECのμPD71054C、Intel 8253の改良版の8254をVシリーズ向けにCMOS化したものになります。「-10」が付いていないところをみると8MHz版のようですね。
以前8253と8254の違いがわからないと書きましたが、主な変更点はクロック(CPUクロックではなくタイマ・カウンタとしてのクロック)上限が2.6MHzから8MHz/10MHzに向上したことと、Read-Back Commandが追加されたことの2点でした。Read-Back Commandはカウント値・ステータスをまとめて読み出すためのものです。
この手のカウンタ・タイマにおいてカウンタ値を読み出すのは意外と厄介なことなのです。大抵(Z80 CTCのような例外もありますが)バス幅よりもカウンタのビット長の方が長いので読み出しは複数回に分けて行なわれます。そうすると次のような問題が発生します。
例えば8ビットバスでカウンタが16ビットあるとします。カウンタ値は8ビットずつ2回に分けて読むことになります。
もしカウンタ値が255でL→Hの順に読み出すとすると、まず下8ビットの255が読まれ続いて上8ビットの0が読まれます。これを合わせて255という正しいカウンタ値が読み出されます。
ところが下8ビットを読んだ直後にカウントが起きたらどうなるでしょうか? 下8ビットは既に255を読んでいます。続いて上8ビットを読むときにはカウンタ値は256になっているので1が読まれます。これをあわせると511になってしまいます。カウント直前の255になるか直後の256になるかは目を瞑るとしても、511は受け入れられません。
もしカウンタ値が255でL→Hの順に読み出すとすると、まず下8ビットの255が読まれ続いて上8ビットの0が読まれます。これを合わせて255という正しいカウンタ値が読み出されます。
ところが下8ビットを読んだ直後にカウントが起きたらどうなるでしょうか? 下8ビットは既に255を読んでいます。続いて上8ビットを読むときにはカウンタ値は256になっているので1が読まれます。これをあわせると511になってしまいます。カウント直前の255になるか直後の256になるかは目を瞑るとしても、511は受け入れられません。
この問題を解決するためにいくつかの方法が考えられ、以下の方法がよく使われます。
- 読み出す瞬間だけカウントを止める
読み出すたびにカウントしそこなうリスクがあるので、それが許容される場合に使われます。8253のデータシートにも1つの方法として提示されています。 - 読み出す直前にカウンタ値をラッチする
8253のように明示的にラッチコマンドを出す必要があるもの、下8ビットを読み出すと同時に自動的に上8ビットをラッチする(あるいは逆)もの等があります。8254のRead-Back Commandでは複数のカウンタを同時にラッチ可能になり、カウンタを複数つなげて長いカウンタを作るのが容易になりました。
さらにカウントが遅いRTC (Real Time Clock)などでは以下のような方法もありました。
- 更新ビットを使う
RTCによってはカウントが発生すると立つビットが用意されているものもありました。これをリセットしておいてから読み出しを実行します。読み出し終了後にこのビットを確認し、立っていたら正しく読めなかった可能性があるので再度読み出します。カウントが発生したら次は1秒後なので2度目の読み出しは成功します。 - 2回読み出す
2回読んで値が等しければ正しく読み出せています。異なった場合はもう一度読み直します。上と同様に1秒以内なら2度目は成功します。
参考文献・関連図書:
uPD71054データシート, NEC.
8253/8253-5データシート, Intel.
関連項目:
コメントを追加