8155, 8156

8085用の周辺回路として、アドレスとデータがマルチプレクスされたバスに直接インターフェースできるLSI群をいくつかIntel社が発表しています。この8155や8156も、そのグループに含まれます。なお、MCS-48シリーズのシングルチップコンピュータや8088も外部にメモリやI/Oを増設するのに同じタイミングのマルチプレクスバスを使用するため、これらのLSIを容易に接続できます。
8155はRWMにI/Oやタイマを集積したもので、複数を同時に使用する際に便利なように、アドレスデコードのロジックだけ変更したバリエーションの8156があります。

8155 & 8156
上がIntel社の8155で、下がNEC社のuPD8156です。

このLSIの中には8 bitのポート2組と6 bitのポート1組、14 bitのダウンカウンタ1回路、256 ByteのRWMが組み込まれています。8085システムの場合、8085と8155の他にROMを何か接続すればメモリとI/Oを備えた最低限度のコンピュータシステムが完成します。

8155と8156のピン配置はこのようになっています。

       PC3  1     40 VCC
       PC4  2     39 PC2
  TIMER IN  3     38 PC1
     RESET  4     37 PC0
       PC5  5     36 PB7
TIMER OUT*  6     35 PB6
     IO/M*  7     34 PB5
 CE or CE*  8     33 PB4
       RD*  9     32 PB3
       WR* 10     31 PB2
       ALE 11     30 PB1
       AD0 12     29 PB0
       AD1 13     28 PA7
       AD2 14     27 PA6
       AD3 15     26 PA5
       AD4 16     25 PA4
       AD5 17     24 PA3
       AD6 18     23 PA2
       AD7 19     22 PA1
       VSS 20     21 PA0

8番ピンだけが8155と8156で異なっていまして、CE*となっているのが8155、CEが8156です。
あと、12番から20番ピンが8085と同じ配列になっていて、7, 9, 10, 11番ピンもI/Oピンのおかげでこの図の右側に来ていますが8085ではそれぞれ左側の34, 32, 31, 30番ピンに配置されていて、8085のすぐ横に8155/8156を並べると配線がすっきりするように考慮されています。なお、RESETは4番ピンですが8085ではすぐそばの3番ピンにRESET OUT端子があります。8085と直接接続すべき信号は(チップセレクトをどうするかは別にすれば)これですべてですから、確かに便利です。また、8048と接続する場合でも、4, 10 - 20番ピンは同じピン同士を接続するだけ、8155/8156の9番ピンは8048の8番ピンというのが番号違いになるのと、アーキテクチャの違いから8155/8156の7, 8ピンを8048の適当なI/O端子に接続することを除けば、やはりすっきりした配線となるように配慮されています。
PA0 - PA7, PB0 - PB7, PC0 - PC5が入出力ポートで、TIMER INとTIMER OUTがタイマ・カウンタ部の入出力端子です。PAとPBは8本単位で入出力方向を決定します。PCは6本単位で入出力方向を決定することもできますし、PAやPBのハンドシェーク信号や割り込み出力にもなります。
IO/M*がLレベルでCE信号が有効になれば、内部RWMの読み書きが行われます。IO/M*がHレベルでCE信号が有効なら内部I/Oレジスタへの読み書きが行われます。8085ではIN/OUT命令でアドレス上位にも下位と同じようにI/Oアドレスが出力されることを利用すれば、メモリとI/Oの選択にSN74LS138のようなアドレスデコーダ1個だけで簡単に済ますことができます。もちろん、アドレス空間にイメージが見えてもかまわないなら、A14とかA15を直接CE信号に接続してしまうことも可能ですけど。

内部レジスタを表にしました。
略称 アドレス 機能
C/S xxxx x000 コマンド(書き込み時)
ステータス(読み出し時)レジスタ
PA xxxx x001 ポートA汎用I/Oレジスタ
PB xxxx x010 ポートB汎用I/Oレジスタ
PC xxxx x011 ポートC汎用I/Oレジスタ
CLR(L) xxxx x100 カウント長下位
CLR(H) xxxx x101 カウント長上位とタイマモードの設定

アドレスは2進数で表記してあります。xは0/1のどちらでもかまわないことを意味します。

コマンドレジスタの意味は次のようになっています。

ビット 記号 意味
7 TM2 タイマコントロール
6 TM1 タイマコントロール
5 IEB ポートB割り込み許可(1: 許可、0: 禁止)
4 IEA ポートA割り込み許可(1: 許可、0: 禁止)
3 PC2 モードコントロール
2 PC1 モードコントロール
1 PB ポートB入出力方向(1: 出力、0: 入力)
0 PA ポートA入出力方向(1: 出力、0: 入力)

タイマコントロールとモードコントロールには、さらに説明が必要です。
タイマコントロールの意味は次のようになっています。

TM2 TM1 動作
0 0 カウンタ動作に影響しない
0 1 タイマ動作を停止する
1 0 ターミナルカウントに達すると停止
1 1 タイマ停止中ならモードとカウント長をロードしてただちに動作する
タイマ動作中ならターミナルカウント後にモードとカウント長をロードして再スタートする

モードコントロールとPCの機能はこのようになります。

C/S PC2 C/S PC1 モード 機能 PC5 PC4 PC3 PC2 PC1 PC0
0 0 モード1 入力モード 入力 入力 入力 入力 入力 入力
1 1 モード2 出力モード 出力 出力 出力 出力 出力 出力
0 1 モード3 制御+出力モード 出力 出力 出力 STB A* BF A INTR A
1 0 モード4 制御モード STB B* BF B INTR B STB A* BF A INTR A

モードの番号とコマンドレジスタのPC2とPC1の2進数読みが一致していないことに注意してください。入力モードと出力モードは単なるI/Oとして使うだけのモードですから説明は不要でしょう。モード3はPAをハンドシェーク付きI/Oとして使用し、PBを単なるI/Oポート、PC3 - PC5を出力ポートとして使用します。モード4はPAとPBをハンドシェーク付きI/Oとして使用するモードです。PBだけをハンドシェーク付きI/Oとして使用するモードはありません。ハンドシェークI/Oの入出力方向はコマンドレジスタのビット1とビット0で指定します。
BFはバッファフル出力で、STB*はストローブ入力です。INTRは割り込み要求出力となります。
ハンドシェーク入力の場合、STB*の立ち下がりでBFが立ち上がり、STB*の立ち上がりでポート入力が内部にラッチされて、INTRがHになります。。ポートレジスタからデータがCPUに読み出されるとINTRもクリアされてBFがLに戻ります。
ハンドシェーク出力の場合、CPUがポートレジスタに書き込むとINTRがクリアされBFがHになります。STB*の立ち下がりでBFがLになり、STB*の立ち上がりでINTRが有効になります。

ステータスレジスタの構成はこのようになっています。

ビット 記号 意味
7 X 未定義
6 TIMER INTR タイマ割り込み
5 INTE B ポートB割り込み許可(1: 許可、0: 禁止)
4 BF B ポートBバッファフル(1: フル、0: 空)
3 INTR B ポートB割り込み要求(1:あり、0: なし)
2 INTE A ポートA割り込み許可(1: 許可、0: 禁止)
1 BF A ポートAバッファフル(1: フル、0: 空)
0 INTR A ポートA割り込み要求(1:あり、0: なし)

TIMER INTRはタイマがターミナルカウントに達したときにセットされ、ステータスレジスタの読み出しかハードウェア的なリセットによってクリアされます。他のビットはハンドシェーク入出力のためのステータスとなっています。8155/8156には特に割り込み専用の信号はありませんから、割り込み要求信号としてTIMER OUT*を使用したときにだけ意味を持ちます。当然ながら、その場合の割り込み許可や禁止に関してはステータスレジスタのタイマコントロールビットでタイマ動作を変更することによって行います。

タイマに関係するレジスタは16 bitのカウント長レジスタ(CLR)ひと組だけです。このCLRの上位2 bitがタイマモードを表し、残り14 bitが設定値となります。TIMER IN信号に与えられた信号の立ち上がりエッジで設定値がひとつずつ減らされていき、値が1になってから0に変化するはずの瞬間にターミナルカウントとなります。カウンタに再ロードして周期波形を発生するタイミングはターミナルカウント時ですから、カウンタの値が0にはなりません。たとえば4を設定値とした場合、4, 3, 2, 1, 4, 3...というように変化します。シリアルインターフェースのビットレートジェネレータとして使用するなど、基準信号を分周するのにタイマ・カウンタを使う場合、分周値マイナス1ではなくて分周値をそのまま設定すればよいことになります。
タイマモードとタイマ・カウンタの動作の関係はこうなります。
CLR(15)
M2
CLR(14)
M1
動作
0 0 設定値の後半部で低レベル信号を出力する。
設定値nが偶数の場合にはn/2、奇数の場合には(n - 1)/2のクロック幅のLが出力される。
0 1 設定値の後半で低レベル信号を出力し、ターミナルカウント時には設定値を再ロードする。結果的に方形波が出力される。
1 0 最終値に達したときにクロック信号1周期分のパルスをひとつ出力する。
1 1 最終値に達したときにクロック信号1周期分のパルスを出力し、その後で設定値を再ロードする。周期的なパルス出力を得られる。

CLRを読み出してTIMER INに与えられたパルス数を求めることも可能ですが、単純に読み出しただけの値がパルス数にはなりません。ちょっと面倒な計算を必要とします。具体的な操作としてはこうなるようです。

  1. タイマカウントの停止。
  2. カウント長レジスタ(16 bit)の読み取り。
  3. 読み出したデータの上位2 bitのタイマモードビット相当分のクリア。
  4. キャリーをクリアした上で16 bit分のデータ全体を右へローテートする。
  5. キャリーが0なら読み取りデータが有効。キャリーが1なら読み取りデータ+元データ/2(元データが偶数)、読み取りデータ+ (元データ - 1)/2(元データが奇数)が有効。

ただし、元データが偶数のときには入力パルス数が1以上、奇数のときには3以上でないと正しく求められないということのようで。

Return to IC Collection.