KL5C8012について(ZBK開発セット付属「ZBKボードハードウェア説明書」からの抜粋です)
KL5C8012は川崎製鉄がZ80A互換CPUをコアにして、パラレルI/O、シリアルI/O、プログラマブルカウンタ、MMU、割込みコントローラを加えて1個のLSIにまとめたものです。CPU部分はZ80Aと同じ働きをするので、Z80Aのために書かれたプログラムをそのまま実行することができます。
CPUクロックは10MHzですが独自のアーキテクチャにより高速に命令を実行するため、Z80Aの40MHzに相当するといわれています。しかし最高速で実行するためにはメモリも高速で動作するものが必要で、コストアップは避けられません。そのためZB10K〜ZB28K、ND80Kではメモリアクセス時(およびI/Oアクセス時)にウェイトを挿入して、普及品のメモリやI/O素子を接続できるように考慮してあります。それでもZ80Aの18〜20MHzに相当する速度が得られます。当社のZ80A利用ボードのクロックが4MHz〜6MHzであることからみても、そのスピードが驚異的であることが理解できると思います。
KL5C8012は内蔵しているパラレルI/Oだけでも8ビット×5ポート=40ビットもあり、これも驚異的といえます。ポートは3ポートが82C55、2ポートがZ80PIO相当の機能でありこれもユーザーにとってなかなか得がたい機能といえます。パラレルI/OとIC端子を共用しているとはいえ、このほかになんと16ビットのタイマー/カウンタが5チャネルと1チャネルのUSART(シリアルインターフェース)まで備えています。USARTは8251に比べてコントロールがはるかに容易で、もちろんZ80SIOよりはずっと使いやすくできています。
さらに16レベルの割り込みコントローラと最大512KBのメモリ空間をアクセスできるMMU(メモリマネジメントユニット)まで内蔵しています。
なおZBK開発セットはKL5C8012のパラレルI/Oやタイマー/カウンタの機能を一部モニタプログラムで使用しており、ユーザーが全機能を使用することはできません。特にROM WRITERを接続した場合にはパラレルI/Oのほとんどをシステムが使用します。
以下の説明中、システムクロックは10MHzです(ZB10K〜ZB28K、ND80Kは20MHzクリスタルを使用しており、システムクロックはその1/2になります)。
1. パラレルポートA
Z80PIO相当の機能をもつ8ビット×2ポートのパラレルI/Oポートです。82C55と異なり1ビットごとに入力、出力を設定できます。
ポート0は端子名P00〜P07、ポート1はP10〜P17で、I/Oアドレスは2CH〜2FHです。
2CH ポート0、P00〜P07データ
2DH ポート0方向制御レジスタ
2EH ポート1、P10〜P17データ
2FH ポート1方向制御レジスタ
2. パラレルポートB
82C55相当の機能をもつ8ビット×3ポートのパラレルI/Oポートです。パラレルポートBとは異なり、上位4ビット、下位4ビツトごとに入力、出力を設定します。3ポートとも82C55のCポートの機能をもち、出力に設定したポートに対しては、他のビットに影響を与えず1ビットのみの出力を行うことができます。
ポート0は端子名P20〜P27、ポート1はP30〜P37、ポート2はP40〜P47で、I/Oアドレスは30H〜33Hです。
30H ポート0、P20〜P27データ
31H ポート1、P30〜P37データ
32H ポート2、P40〜P47データ
33H 方向制御レジスタ
3. タイマ/カウンタA
プログラマブルな16ビットのダウンカウンタで、コントロールワードアドレスにコントロールワードを書き込むことで動作します。チャネル0とチャネル1の2組があり、全く同じ機能をもっています。
I/Oアドレスは下の通りです。
28H チャネル0カウンタ
29H チャネル0コントロールワード
2AH チャネル1カウンタ
2BH チャネル1コントロールワード
3.1 入出力端子
[XCLK0][XCLK1]
外部クロック入力。カウント動作はXCLKの立下りで行われます。モード設定でシステムクロックを選択しているときは、XCLKは使用されません。XCLK0はチャネル0、XCLK1はチャネル1の端子(以下の説明でも同じルールで名前がついています)。
[GATEA0][GATEA1]
この信号がONのときだけカウンタ動作をします。またはトリガ信号として働きます。パルス幅/周期測定モードでは測定対象の信号を入力します。
[OUTA0][OUTA1]
モードの指定により、分周出力、ワンショット出力、ストローブ出力、測定完了出力になります。リセットによりクロックと非同期にLになります。
[注記]各信号端子はパラレルポートと端子を兼用しています。
XCLK0=P11
XCLK1=P13
GATEA0=P10
GATEA1=P12
OUTA0=P34
OUTA1=P35
各端子をパラレルポートではなくてカウンタ用に使用するためには端子機能の設定が必要です。
3.2 動作モード
4種類の動作モードがあります。
3.2.1 分周モード
ダウンカウンタに初期値を与えることでカウント動作を開始し、カウント値が0になるとOUT出力が変化し、カウンタに初期値を再読込しダウンカウントを繰り返します。カウント中に新しい初期値が与えられるまでは今までの初期値が繰り返し再読込されます。カウント中に新しい初期値が与えられてもすぐに再読込はされません。カウント値が0になってから新しい値が初期値として読み込まれます。
モード設定によりカウント初期値はFFFFHになりOUT出力はLになります。OUT出力は0カウントの度にHとLが交互に出力される(トグル出力)か1クロック幅のパルス出力かいずれかを選択できます。
カウント0のタイミングで割り込みを発生させることができます。
GATE入力=Hの期間はカウントイネーブルでGATE入力=Lの期間はカウントしません。
GATE入力のパルス幅はH、Lともにシステムクロックの2サイクル以上が必要です。
初期値として与えることのできる値は0001H〜FFFFHです。
3.2.2 パルス幅変調(PWM)モード
周期は一定(4通りの中から選択)でH期間のパルス幅がカウント初期値+1になるパルスを繰り返し出力します。周期はカウンタクロックの2のN乗+1(N=6,8,10,12)の4通りから選択します。2の6乗+1=41Hです。以下同様に101H、401H、1001Hになります。Hパルス幅はこの値を超えることはできませんから、与えることのできるカウント初期値の最大値はそれぞれ003FH、00FFH、03FFH、0FFFHになります。最小値は0001Hです。
モード設定によりOUT出力はLになり初期値を与えるとOUT出力=Hになってダウンカウントを開始します。カウンタの値が0になるとOUT出力=Lになり残りの周期期間中Lを維持します。1周期期間が終わるとカウンタ初期値を再読込しOUT=Hにして前記動作を繰り返します。カウント中に新しい初期値が与えられてもすぐに再読込はされません。カウント値が0になってから新しい値が初期値として読み込まれます。
GATE入力=Hの期間はカウントイネーブルでGATE入力=Lの期間はカウントしません。
GATE入力のパルス幅はH、Lともにシステムクロックの2サイクル以上が必要です。
3.2.3 パルスモード
トリガ入力によりダウンカウントを開始しカウント0でOUT出力が変化します。次のトリガが入力されるまでカウンタ動作は停止します。
カウント初期値を与えることでカウントを開始するソフトトリガと、GATE入力信号の立ち上がりでカウントを開始するソフトトリガがあり、モード設定で選択できます。
OUT出力はモード設定でHになります。カウント開始でLになり、カウント0でHになるワンショット出力と、カウント0で1クロック幅のLパルスを出力するストローブ出力のいずれかを選択できます。またOUT出力のH、Lが前記の逆になるリバースモードを選択することもできます。
ソフトトリガではGATE入力=Hの期間のみカウント動作をします。
ソフトトリガではカウント中に新しい初期値が与えられると次のクロックでカウンタに初期値をロードしすぐにカウントを開始します。
ハードトリガではカウンタ初期値は次に新しい初期値が与えられるまでは、もとの値を保持しています。カウント中に次のトリガが発生すると(GATEに新しい立ち上がり信号が入力されると)、カウンタに初期値を再読込してダウンカウントを再スタートします。カウント中に新しい初期値が与えられてもすぐには再読込されず、次のトリガが発生したときにカウンタに再読込されダウンカウントがスタートします。ハードトリガ選択時のトリガ間隔はカウンタクロックの1サイクル以上が必要です。
ソフトトリガ選択時のGATE入力のパルス幅はH、Lともにシステムクロックの2サイクル以上が必要です。
カウンタ初期値として与えることのできる値は0001H〜FFFFHです。
3.2.4 パルス幅/周期測定モード
GATE端子に入力される信号のパルス幅、または周期を測定し、測定が完了するとOUT出力にシステムクロック1サイクル分の幅のパルスを出力します。
測定する期間はGATE入力信号の@立ち上がりから立下りまでA立ち上がりから次の立下りまでB立ち下がりから立上りまでC立ち下がりから次の立下りまでのいずれかが選択できます。また1回のみの測定と繰り返し測定の選択もできます。連続測定モードではカウンタアドレスからは測定完了した最後の測定値が読み出されます。つまりパルス幅/周期測定モードではカウント中のカウンタの値ではなくてカウンタバッファの値が読み出されることになります。読み出される値は測定期間中にカウントしたカウンタクロック数です。カウント中の値を読み出すことはできません。
GATE入力のパルス幅はH、Lともにシステムクロックの2サイクル以上が必要です。
このモードでは初期値の設定はできません。モードセットによりFFFFが初期値としてセットされます。GATE設定条件に合致するパルスの入力によりカウントダウンを開始します。停止条件に合致するパルス入力によりカウントを停止し、データレジスタにカウンタ値の補数を送ります。次のGATE入力パルスによりふたたびFFFFがセットされ、カウントダウンを繰り返します。
4. タイマ/カウンタB
プログラマブルな16ビットのプリスケーラ付ダウンカウンタで、コントロールワードアドレスにコントロールワードを書き込むことで動作します。チャネル0〜2の3組があり、基本的には同じ機能をもっています。
ダウンカウントされるクロックはシステムクロックをプリスケーラで分周したクロックを入力します。
I/Oアドレスは下の通りです。
20H チャネル0カウンタ
21H チャネル0コントロールワード
22H チャネル1カウンタ
23H チャネル1コントロールワード
24H チャネル2カウンタ
25H チャネル2コントロールワード
[注意1]
ND80Kではチャネル2はLEDのダイナミックドライブのために割り込み発生用カウンタとして使用しています。そのためND80Kのユーザーがチャネル2を使用することはできません。
[注意2]
チャネル1はKL5C8012内蔵シリアルインターフェース(RS232C)のクロックとして使用しています。ユーザーが232Cを利用するときはチャネル1をその他の用途に使うことはできません。
[注意3]
チャネル0はトレース機能の割り込み発生用カウンタとして使用しています。ユーザーがトレース機能を利用するときはチャネル0をその他の用途に使うことはできません。
4.1 入出力端子
[GATEB0][GATEB1][GATEB2]
この信号がONのときだけカウンタ動作をします。GATEB0はチャネル0、GATEB1はチャネル1、GATEB2はチャネル2の端子(以下の説明でも同じルールで名前がついています)。
GATEはシステムクロックの4分周を入力クロックとするとき以外は使えません。
[OUTBP0][OUTBP1][OUTBP2]
モードの指定により、分周出力、PWM出力になります。リセットによりクロックと非同期にLになります。
[OUTBS0][OUTBS1][OUTBS2]
4システムクロック幅のストローブを出力します。
[SYNC]
システムクロックを4分周した信号です。この信号の立ち上がりエッジでGATE入力がサンプリングされます。
[注記]
各信号端子はパラレルポートと端子を兼用しています。
GATEB0=P00
GATEB1=P01
GATEB2=P02
OUTBP0=P36
OUTBP1=P32
OUTBP2=P33
OUTBS0=P30
OUTBS2=P37
SYNC=P31
OUTBS1端子はありません。
各端子をパラレルポートではなくてカウンタ用に使用するためには端子機能の設定が必要です。
4.2 動作モード
4種類の動作モードがあります。
4.2.1 連続カウントモード
ダウンカウンタに初期値を与えることでカウント動作を開始し、カウント値がFFFFになるとOUTP出力とOUTS出力が変化し、カウンタに初期値を再読込しダウンカウントを繰り返します。カウント中に新しい初期値が与えられるまでは今までの初期値が繰り返し再読込されます。カウント中に新しい初期値が与えられてもすぐに再読込はされません。カウント値がFFFFになってから新しい値が初期値として読み込まれます(ダウンカウントの終了値は0ではなくてFFFFです)。
モード設定によりOUTP、OUTS出力はLになります。カウント初期値の書き込みによりダウンカウントが開始されOUTP出力はHになります。OUTP出力は0カウントの度にHとLが交互に出力されます(トグル出力)。OUTSは0カウント時に4システムクロック幅のHパルスを出力します。
OUTP、OUTS出力はモード設定で前記説明のHとLを入れ替えた出力にすることができます。
カウント0のタイミングで割り込みを発生させることができます。
GATE入力=Hの期間はカウントイネーブルでGATE入力=Lの期間はカウントしません。
初期値として与えることのできる値は0001H〜FFFFHです。
4.2.2 単発カウントモード
カウント初期値を与えることでダウンカウントを開始しカウント0でOUTP、OUTS出力が変化します。次のカウント初期値が与えられるまでカウンタ動作は停止します。
OUTP、OUTS出力はモード設定でLになります。OUTPはカウント開始でHになり、カウント0でLになります。OUTSは0カウント時に4システムクロック幅のHパルスを出力します。
カウンタ初期値として与えることのできる値は0001H〜FFFFHです。
4.2.3 パルス幅変調(PWM)モード
カウント初期値によって与えられるパルス幅とパルス周期によって決定される繰り返しパルスをOUTPから出力します。
パルス幅はデータの上位8ビットで与え、周期は下位8ビットで与えます。
パルスを決定するカウント動作は上位8ビットと下位8ビットが独立して行われます。すなわち設定値の(上位8ビット+1)×カウンタ入力クロックがパルス幅になり、(下位8ビット+1)カウンタ入力クロックが周期になります。
モード設定によりカウンタは停止し、OUTP、OUTS出力はLになります。
カウント初期値の書き込みによりカウント動作を開始します。
パルス幅データ>=周期データのときはOUTP=Hのままになります。
カウント初期値の再読込は下位バイトカウンタが0になったときに行われます。カウント途中に初期値を書き込んでもすぐにカウンタには読みこまれず、下位バイトが0になった時点で新しい設定値が読みこまれます。
カウンタ初期値として与えることのできる値は上位、下位ともに01H〜FFHです。
4.2.4 ウォッチドッグタイマ(WDT)モード
特殊な使い方で通常は使用しないため、説明を省略します。
5. シリアルインターフェース
KL5C8012は1チャネルのシリアルインターフェースをもっています。232Cのレベル変換回路を外につけることで他の機器やパソコンとの間で232Cを利用したデータの送受信を行うことができます。詳細についてはZBK−V3BASIC操作説明書を参照してください。
6. 割り込みコントローラ
KL5C8012(Z80A)は8080の割り込みモード(モード0)の他に融通性の高い割り込みとしてモード2をサポートしています。割り込みは高度のプログラムテクニックが必要でハードウェアの知識も必要です。特に複数の異なる回路から同時に割り込みが発生したときなど、処理の順番などより複雑な制御が必要になります。
KL5C8012内蔵の割り込みコントローラは簡単なコマンド操作で内蔵のカウンタやパラレルポートからの割り込み信号をうまく交通整理してくれます。
8080ファミリの割り込みコントローラなどの汎用コントローラとは異なり、KL5C8012内蔵の機能ユニットからの割り込みをコントロールするように特化していますが、多くの場合その方が処理が簡単に済むので有利です。
優先順位のついた16レベルの割り込みに対応しています。16本の割り込みはカウンタ/タイマ、シリアルインターフェースの他、パラレルポートからの8本の割り込み入力に対応しています。それぞれから発生する割り込みはまず割り込みコントローラに取り込まれ、優先順位にしたがってCPUにINT信号を送るとともにそれぞれに対する割り込みプログラムアドレスを示す割り込みベクタを送ります。その後も割り込みコントローラはCPUのバスを監視していて、割り込みプログラムの終了を示すRETI命令コードの実行を確認するとその割り込みの終了処理を行い、待たせていたより低位の割り込みがある場合にはその割り込みを許可してそのための処理を行います。
プログラミングとしては、個々の必要な割り込みプログラムを書いて、そのエントリアドレスを示す割り込みテーブルを用意して、そのアドレスを割り込みコントローラに与えるだけで準備が完了します。あとは必要なタイミングで個々の割り込みに対する許可、不許可を割り込みコントローラに与えれば割り込み処理はオートマチックに実行されます。
6.1 割り込み番号
KL5C8012は下記16個の割り込みをサポートしています。
割り込み要求元
IR[15] タイマ/カウンタBチャネル2OUTS出力
IR[14] タイマ/カウンタBチャネル1OUTS出力
IR[13] タイマ/カウンタBチャネル0OUTS出力
IR[12] タイマ/カウンタAチャネル1OUT出力
IR[11] タイマ/カウンタAチャネル0OUT出力
IR[10] USART(シリアルインタフェース) TXEMPTY出力
IR[9] USART(シリアルインタフェース) RXRDY出力
IR[8] USART(シリアルインタフェース) TXRDYPIN出力
IR[7] 外部入力P07/IR7
IR[6] 外部入力P06/IR6
IR[5] 外部入力P05/IR5
IR[4] 外部入力P04/IR4
IR[3] 外部入力P03/IR3
IR[2] 外部入力P02/IR2
IR[1] 外部入力P01/IR1
IR[0] 外部入力P00/IR0
[注意]
IR[0]〜IR[7]はパラレルポートP00〜P07と端子を共用しています。P00、P02〜P07は開発セットでシステムが使用しているため、ユーザーが利用できるのはIR1のみです。
IR0〜IR7の割り込みを使用しないで、パラレルポートを出力として使う場合は、対応するIR入力をマスク状態に設定してください。
6.2 割り込みコントローラのレジスタとI/Oアドレス
以下のレジスタが有ります。
I/Oアドレス OUT(書き込み) IN(読み出し)
34H LERL/PGRL ISRL
35H LERH/PGRH ISRH
36H IMRL IMRL
37H IVR/IMRH IMRH
7. MMU(メモリマネジメントユニット)
KL5C8012(Z80A)がメモリをアクセスする命令は16ビット長です。16ビットでは0000H〜FFFFHの64KBのメモリアドレスしかアクセスできません。KL5C8012は最大512KBのメモリ空間を内蔵のMMUの助けを借りてアクセスすることができます。MMUはバンク切り替えという方法で512KBのメモリアドレスの中から任意の64KBをCPUのアクセスできるメモリ空間に割り当てます。
[注記]
ZB10K〜ZB28K、ND80Kはハードウェアの都合でROM128KB、RAM128KBの合計256KBをアクセスできる回路になっています。
MMUはI/Oアドレス00H〜07Hに割り当てられたレジスタによってバンクメモリをコントロールします。
8.(省略)
9. I/Oアクセスタイミング
I/Oアクセス(2ウェイト時)
EIORDパルス幅 約300nsec
EIOWRバルス幅 約280nsec
10. 命令実行時間
KL5C8012はZ80A(4MHz、6MHz)に比べて10MHzとCPUクロックとしても約倍速になりますが、さらに独自のアーキテクチャによって実行時間が短縮されており、Z80Aで4クロックかかっていた命令は1クロックで実行されます。
プログラムで正確なパルスを作りたいときなど、命令の実行時間を計算してパルス幅を求めます。
10MHzの1クロックは100nsecです。たとえば2クロックの命令は200nsecで実行されることになりますが、ZB10K〜ZB28K、ND80Kではメモリアクセスに1クロックウェイトしていますから、その命令のメモリアクセス数(バイト数)分だけのクロックタイムが加算されます。その上にI/Oアクセス命令はI/Oリードライト時に+1クロックウェイトしていますからその分も加算されます。