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


KL5C80A12マイコンボードの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
KL5C80A12はZ80互換の高速高性能8ビットマイクロコントローラです。
残念なことに数年前に生産中止になってしまいました。
しかし当社ではKL5C80A12を使った組込みマイコンボードはまだ健在です。
そのKL5C80A12を使ったND80Z3.5上位互換マイコンボードの製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第17回]


●KL5C80A12の実行速度

KL5C80A12はZ80互換CPUをコアにして、PIOやタイマーなどの周辺機能を含めてワンチップLSIにまとめたものです。
CPUクロックは10MHz(外付けクリスタルは20MHz)です。
ND80Z3.5(ND80ZV)は6MHzですから、その約1.7倍の実行速度が期待できそうと思われるかもしれませんが、KL5C80A12の実力はそんなものではないのです。

前回までの作業でTIME$が使えるようになったので、それを利用してKL5C80A12の実行速度を確認してみることにしました。
比較するためにまずはND80Z3.5(ND80ZVも同じ)でテストプログラムを作って実行してみました。

BASICでFOR NEXT文を10万回実行しました。
1分16秒かかりました。
10万回を76秒ですからFOR NEXT文の1回は760μSかかったことになります。
見かけ上は整数値ですが実際には実数計算(浮動小数点計算)を行なっていますから、インタプリタとしては、まあこんなものでしょう。

同じ計算を今度はKL5C80A12でやってみました。

画面右側が今回の試作基板での実行画面です。
同じ計算を26秒で実行しました。
KL5C80A12は10MHzですが、6MHzのZ80の3倍の速度で実行したことになります。
つまり10MHzのKL5C80A12の実行速度はZ80CPUの約20MHz相当といえましょう。
おお。
なるほどKL5C80A12はすごいじゃないか!

いえ。
ちょっと待ってください。
上でも書きましたが、KL5C80A12の実力はこんなものじゃないのです。
それについてはあとで説明することにしまして、まずはなぜKL5C80A12がそれほど速いのかについて、簡単に説明を。
うう。
ちょっと面倒なので、当社のZBKシリーズ用開発セットの付属説明書から、一部を引用いたします。

KL5C8012はZ80の命令を全く同じように実行するのですが、命令を実行するクロック数が異なっているのです。たとえば LD B,C という命令をZ80は4クロックで実行しますが、KL5C8012は1クロックで実行してしまうのです。当社で供給しているZ80ボードのCPUクロックは4MHzか6MHzです。これに対してKL5C8012のCPUクロックは10MHzです。KL5C8012は4MHzのZ80Aに対して実に10倍速で動作するのです。

そういうことなのです。
上の引用以外にも驚異的な例として、たとえば16ビット加算命令ADD HL,XXをZ80は11クロックで実行しますが、KL5C80A12はなんと1クロックで実行してしまいます。
実際KL5C80A12のマニュアルでは「Z80の4倍速」である、と書いてあります。

しかし。
注意深い読者様ならば、ここで疑問に思われるかもしれません。
そうだとすると、上のテスト結果ではちょっと時間がかかりすぎているのではないか?
Z80の4倍速ということなら40MHz相当ということなので、それなら上のテストプログラムなら10秒ちょっとで実行できてもよいのではないか?

その通りなのです。
実はKL5C80A12はその説明の通り、余りに高速なので、そのままの速度で実行するとメモリのアクセスタイムが追いつかない場合が出てきてしまいます。
そこでこの試作基板に搭載しているシステムプログラムでは、メモリや周辺I/Oにアクセスするときは、1クロック分のウェイトをかける設定にしてあります。
たとえば本来ならLD R,R’を1クロックで実行するところを、1クロックのウェイトを追加して2クロックで実行するようにしてあります。
この設定はKL5C80A12の内部システムレジスタSCR1に与える値によって決定されます。
SCR1の値はソフトウェアによって書き換え可能でリセット後は「1ウェイト追加モード」になります。

うむ?
ソフトウェアによって設定可能?
今これを書いていて思いつきました。
そういうことならば。
ちょっとROMのアクセスタイムが心配だけれど、ノンウェイトで実行できないだろうか?

●KL5C80A12をノンウェイトで実行してみる

思いついたならば、さっそく実行してみることです。
ええ。
さっそく実行してみました。
自画自賛ですけれど、こういう場合にZB3BASICシステムは実に便利だと思います。
SCR1はI/Oアドレス3Bです。
そのビット7とビット6を1にするとノンウェイトになります。

まずはノーマルモード(1ウェイト)で実行しました。
実行時間は25秒です。
次にI/OアドレスにC1を出力しました。
OTはZB3BASICのマシン語コマンドで、そのままマシン語のOUT命令を実行します。
このほかBASICのOUT文をダイレクト実行して
OUT $3B,$C1
とすることもできます。
これでノンウェイトになりました。
そのあと同じテストプログラムをもう一度実行しました。
今度は13秒で実行できました!

今回はテストのためあえてノンウェイトで実行しましたが、この速度は保証できません。
実装するROMによってはアクセスタイムが不足してエラーが発生する可能性があります。
またシステムプログラムには必要に応じて時間待ちのループをソフトウェアで行なっているところがあって、そういうところが倍速になってしまうとシステムがハングアップしたりエラーが発生する可能性があります。

でもまあ、こういうテストは、やってみると楽しいものですよね。

KL5C80A12マイコンボードの製作[第17回]
2018.2.9upload

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