1994年に川崎製鉄(LSI事業部)から高性能な8ビットマイクロコントローラーが発売されてちょっとした話題になりました。 まず最初に出たのがKL5C8012で、オブジェクトレベルでZ80互換のコアCPU KC80に、パラレル、シリアル、カウンタ・タイマ、RAMなどを1チップに集積して100pinQFPに納められています。ここまで書くと各社から出ている何の変哲もないZ80互換のマイクロコントローラみたいですが、ひとつ注目される点があります。それは後にして、とりあえずKL5C8012の概要を。
コアCPU | KC82 (KC80+MMU) |
パラレルI/F | 40ビット(一部他の機能とピンを共用) |
シリアルI/F | 1チャネル(8251互換) |
カウンタ・タイマ | 5チャネル |
割り込みコントローラ | 16レベル (内部8+外部8) |
外部バスI/F | アドレス 19ビット データ 8ビット |
内蔵RAM | 512バイト |
その他 | クロック発振回路、デバッガ接続ピンなど |
電気的仕様 | 動作周波数:0~10MHz 消費電力:125mW (@10MHz) |
これ以外にも、DMACやDRAMコントローラ、HDLCシリアルI/Fなどいろいろなペリフェラルを集積したタイプや、コアCPUを抜き出してZ80コンパチブルにしたものなどが出ているようです。
さて、話題の中心にもなった KL5C8012の宣伝文句であるローパワー・ハイスピードですが、確かにうなずける性能となっています。まず、コアCPU KC80のスピードですが、これは同クロックの Z80比で平均4倍の速度となっています。つまり 10MHz動作の KC80は Z80 40MHz!!に相当するというわけですね。消費電力の方は、最高速動作(10MHz)において 125mW (5V 25mA)となっています。
KC80の命令の実行クロック数は、命令長に強く依存するようで、ほとんどが命令コードの読み込み、データの読み書きに費やされています。これに加え命令の最後のクロックで次のオペコードがプリフェッチされますので、1つの命令が最少1クロックで実行されます。このような低CPI化によりZ80比で平均4倍の性能を出しているというわけです。
ただし、命令実行サイクルの殆どがメモリアクセスで占められているので、ウェイトが入ると(普通入れて使うんですけど)、とたんに性能がガタ落ちになってしまうのが弱点です。
KL5C8012を実際に使うとなると、最低でもROMは外付けになります。メモリインターフェースモードには外部にアドレスデコーダを接続するモード(マキシムモード)のほかに、メモリチップを直結(ROM/RAMを1個づつ)できるモード(ノーマルモード)があります。メモリ回路の設計が楽そうですが、高速クロックではタイミング的に非常に厳しいです。1命令が最少1クロックと高速なのはいいのですが、それに伴いバスサイクルも最小1クロックとなってるからです。
実際、最高速(10MHz)で走らせた場合 ROMに要求されるTACC/TOEは、それぞれ43ns/21nsです。さらにデコーダの遅れも計算しなければなりませんが、ノーマルモードではこのタイミングがそのままROMに要求されます。こんなROMは普通では入手困難ですので、まずウェイトの挿入を考えることになります。プログラマブルウェイト機能で1WS入れてみると143ns/121nsとなり、120nsクラスのROMが使えるようになります。しかし、低CPIであるため、1WS入れただけでも動作速度が半分程度になってしまいます。
こんどは0WSとしてクロックを下げた動作を考えてみます。動作クロックを6.144MHzとした場合は、74ns/52nsとなり、一般的な70nsクラスのROMが使えます。でも、内蔵RAMが常に0Sであることを考えると、スタックや頻繁にアクセスするワークエリアを内蔵RAMに置いて高速クロックでROMに1WS入れた方がいいかもしれません。この辺は、プログラミングにまで関わってくることなので、うまく見極める必要がありそうですね。
最近は、キャッシュメモリ用に15~20nsクラスの高速SRAMが安価に出回っています。これを利用して、起動時にROMをRAMにコピーしてRAM上で実行すれば最高速度でも容易に0WSを実現できます。また、プログラムがリロケータブルでなくても、SRAMにコピーした部分をMMUでマッピングし直せるので、特別な外付け回路無しにシャドーROMのような使い方も可能です。
また、内蔵 RAMが常に0WSであることを利用して、サブルーチンを一時的に内蔵RAMにコピーして内蔵RAMでプログラムを実行するという手もあります。この方法は、内蔵RAMに余裕があって、サブルーチン内での実行時間がコピーに要する時間より十分に長い場合に有効です。まぁ10MHz/1WSでもZ80-20MHz以上の速度だし120nsのROMでいけますので、そこまでカリカリにチューニングする事はないと思いますが....。なお、KL5C80A16/20はRAMを内蔵していません。
内蔵のウェイトコントローラですが、これはあまりきめ細かな設定はできません。物理メモリ領域を2分割しているだけで、それぞれの設定にも若干の制限があります。メモリは0WSか1+nWS、I/Oは1WSか2+nWSです(nは外部回路からの追加)。また、KL5C8012にはDRAMリフレッシュコントローラが無いので、DRAMをつなぐのは困難でしょう。KL5C8016はDRAMコントローラを内蔵しているので直結可能です。
KL5C8012の全ての入出力端子(一部除く)にはプルアップが入っているので、端子をオープンにすると"H"レベルに固定されます。これにより空きピン処理の手抜きができます。
デバッグツールとしてはバグファインダーという簡易ICEのようなものが用意されています。これはKL5C8012に内蔵されているデバッグ回路を使ってハード的にデバッグ(ROMエリアにブレークポイントを設定できたり)できるというものですが、マキシムモードで使えないとかターゲットシステムのROMの代わりにRAMを載せる必要があるなど、かなり制限があります。もちろんフル機能のICEもあるようです。
KL5C8012及びそのファミリーについてもっと詳しく知りたい場合は、次に挙げる資料を参照すると良いと思います。
わたしもKL5C8012を使ったボードマイコンを作ってみました。実際の使用例としてまとめてありますので、こちらもご覧ください。