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

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第320回]


●CPU内部クロックを外部クロックの倍にする

前回からの続きです。
Z8S180は、初期状態では外部から供給するクロック(または外付けするクリスタル)の周波数は内部で実際にCPUが使用する周波数の倍、ということになっています。
当初私はZ8S180が日立のHD64180のセカンドソースである、と認識しておりましたので、クロック周波数についてはそれ以上何も考えることはありませんでした。

しかしその後にあらためてZ8S180の英文MANUALを読んでみますと、現行のZ8S180はHD64180のセカンドソースを越えてZilog社が独自の改良を加えたバージョンアップ版であるらしいことがわかってきました(SL1960版を除く)。
その改良はCPUクロックにも加えられていました。
内蔵I/Oレジスタ1EHの説明によると、ビット7を1にすることで、内部クロックを外部クロックの倍にできる、と書いてあります([第318回])。

しかし実際にそのようにしてテストしてみましても、内部クロックは外部クロックの倍にはなりませんでした。
ただ外部クロックと同じ周波数になることは確認できました。
もともと内部周波数は外部周波数の1/2ということでしたから、それが外部周波数と同一になれば、確かに「2倍」のパフォーマンスではあります。

ですが、それにしては can double the internal clock speed from the speed of the external clock という表現はどうにも不適切に思えます。
その文章はどう読んでも「内部周波数は外部周波数の倍にできる」としか読めません。
「内部周波数を従来の倍にできる」というように理解するには無理があります。

さらには具体的な数値をあげて、
This feature only operates effectively with frequencies of 10−16MHz(20−32MHz internal). 
とも書かれています。

こうなると疑心暗鬼でありまして、ひょっとして10MHzがかなりシビアな値であって、正確にその範囲にないと、「倍」にはなってくれないのではないか、などと疑ったりしました。

実はそのほかにも、もうひとつ気になる記述がありました。

Z8S180の端子機能の説明のところで、PHIについて下のように書かれています。


[出典]Zilog社 Z8S180 PRODUCT SPECIFICATION

ここには、The frequency of this output may be one−half,equal to,or twice the crystal or input clock frequency.
とはっきり書かれています。
one−half と equal to はわかりました。
するとあとひとつ、やっぱり twice というのが必ずあるはず、ということになります。
I/Oレジスタ1EH以外に、どこかにもうひとつ、CPUクロックに関係しているレジスタがあるのではなかろうか?
そう思ってMANUALをひっくり返して調べてみましたら。
やっとみつかりました。

こんなところに、書いてありました。

●I/Oレジスタ1FH


[出典]Zilog社 Z8S180 PRODUCT SPECIFICATION

内蔵I/Oレジスタ1FHのビット7を1にすると、内部クロックが外部クロックとイコールになる、のだそうです(この1FHもオリジナルのHD64180にはありません)。
それでやっと疑問は解消できましたけれど。
そういうことなら、レジスタ1EHとレジスタ1FHとを並べて説明するとか、ひとこと注記をつけて、関連するレジスタ、とかなんとかとしてほしいものでありますねえ。
ちなみに1FHの説明は引用しましたZ8S180 PRODUCT SPECIFICATIONの38ページにありまして、1EHの説明はそれよりもずっと後ろの52ページに書かれています。
うむむ。
CPU CONTROL REGISTERなんだから最初にしっかり読めよ、ということなのでありましょうか。

さて。
そういうことでありまして、どうやら内蔵レジスタ1EHと1FHのビット7をともに1にすれば、内部クロック周波数を外部入力クロック周波数の倍にすることができそうだ、ということがわかりました。
さっそく試してみることにいたします。
最初は前回と同じように、レジスタ1EHのビット7のみを1にして、内部クロックが外部クロックと同じになることを確認したうえで、次にレジスタ1FHのビット7も1にして、内部クロックが外部クロックの倍になることを確認してみます。

その確認は前述のPHI端子をオシロで見ることで簡単に確認できるのでありますが、せっかくですので82C55A−2からHLパルスを出力するプログラムを作って、それを実行してその出力波形をオシロで見てみることにいたします。
簡単なプログラムですから、実際にはパネルスイッチから16進数コードを直接入力して実行しましたが、その入力したプログラムにつきましては参考までに下にプログラムリストとしてお見せすることにいたします。

最初に実行したのはこちらのプログラムです。

2013/2/15  16:15  e80ck.txt
END=901E
              	ORG $9000
              ;
9000 AF       	XOR A
9001 013200   	LD BC,$0032
9004 ED79     	OUT (C),A
9006 0E36     	LD C,36
9008 ED79     	OUT (C),A
900A 3EBF     	LD A,BF
900C 0E1E     	LD C,1E
900E ED79     	OUT (C),A
              ;
9010 3E88     	LD A,88
9012 D3FB     	OUT (FB),A
9014 3E02     LOOP:LD A,02
9016 D3FB     	OUT (FB),A
9018 3E03     	LD A,03
901A D3FB     	OUT (FB),A
901C C31490   	JP LOOP
              ;
              ;END
LOOP         =9014  

レジスタ1EHのビット7だけを1にしました。
こちらが実行結果です。



E−80(仮称)ミニコンはディップスイッチの設定によって、CPUクロックを選択することができます。
外部クロックとして10MHz(内部クロック5MHz)を選択するつもりで、間違えて8MHz(内部クロック4MHz)を選択してしまいました。
ですので初期状態でしたら4MHzでの動作になります。
今回はレジスタ1EHのビット7を1にしましたから、8MHzでの動作になっているはずです。
L出力の期間は6+11=17クロックでH出力の期間はそこにJP命令のが加わりますから6+11+9=26クロックになります。
8MHzの1クロックは0.125μsですから、
Lの期間は 0.125×17=2.125(μs)
Hの期間は 0.125×26=3.25(μs)
になります。
上の写真を見ますと、計算通りの出力になっているようです。

●内部クロック=外部クロック×2プログラム

次に下のプログラムを実行しました。

2013/2/15  16:15  e80ck2.txt
END=9024
              	ORG $9000
              ;
9000 AF       	XOR A
9001 013200   	LD BC,$0032
9004 ED79     	OUT (C),A
9006 0E36     	LD C,36
9008 ED79     	OUT (C),A
900A 3EBF     	LD A,BF
900C 0E1E     	LD C,1E
900E ED79     	OUT (C),A
9010 3E80     	LD A,80
9012 0E1F     	LD C,1F
9014 ED79     	OUT (C),A
              ;
9016 3E88     	LD A,88
9018 D3FB     	OUT (FB),A
901A 3E02     LOOP:LD A,02
901C D3FB     	OUT (FB),A
901E 3E03     	LD A,03
9020 D3FB     	OUT (FB),A
9022 C31A90   	JP LOOP
              ;
              ;END
LOOP         =901A  

今度はレジスタ1EHと1FHのビット7を1にしました。
下が実行結果です。



外部入力クロックは先ほどと同じ8MHzです。
今回は内部クロックは外部クロックの倍の16MHzになったはずです。
16MHzの1クロックは0.0625μsです。
Lの期間は 0.0625×17=1.0625(μs)
Hの期間は 0.0625×26=1.625(μs)
になります。
そのようになっているようですが、ちょっと見難いようですね。

スケールを倍にしてみました。



大体そんな数値になっているようですね。

次は外部クロックを10MHz(内部クロック5MHz)にしてみました。
以後のテストはレジスタ1EHと1FHのビット7を共に1に設定しています。
下が実行結果です。



内部クロックは20MHzになったはずです。
20MHzの1クロックは0.05μsです。
Lの期間は 0.05×17=0.85(μs)
Hの期間は 0.05×26=1.3(μs)
になります。
確かに。
写真を見ますと、ちゃんとそのようになっています。

ディップスイッチの設定では、以上のほかに外部クロック4MHz(内部クロック2MHz)も選択できます。
ことのついでですから、それもテストしてみました。
下はその実行結果です。



外部クロックが4MHzですから、内部クロックは8MHzになったはずです。
8MHzの1クロックは0.125μsですから、
Lの期間は 0.125×17=2.125(μs)
Hの期間は 0.125×26=3.25(μs)
になります。
上の写真を見ますと、計算通りの出力になっているようです。

以上のテストでは、外部入力クロックとして、4MHz、8MHz、10MHzの3通りを選択して、レジスタ1EHと1FHのビット7をともに1にすることで、内部クロックを8MHz、16MHz、20MHzにすることができました。
さて、そうなりますと[第318回]でちょいと疑問でありました以下の記述なのですが、
This feature only operates efectively with frequencies of 10−16MHz(20−32MHz internal).

efectivelyをonlyと合わせて「有効に」と訳すと、誤解してしまいます(でもそういう意味に取ってしまいそうです)。
ここは「効果的に」とでも訳すべきなのでしょう。

上で行ないましたテストでは、外部クロックが10MHz以下であっても設定は有効に働きました。
つまりonlyは制約や限定を意味しているのではなさそうです。

Z8S180には33MHz版もありますから、20MHz、33MHzで使う場合に、20MHzクリスタルはともかくとしまして、それ以上の周波数のクリスタルや32MHz、33MHzのクリスタルはちょいと入手しづらいと思います。
そのような場合に10MHz〜16MHzのクリスタルが使えるというのは、確かに「効果的」です。
それに比べますと、それ以下の周波数、たとえば10MHz〜16MHzのときに5〜8MHzのクリスタルが使えたとしてもさほどうれしくはありますまい(おそらくは10〜16MHzのクリスタルのほうが楽に入手できるはずですから)。

おそらく上の英文は、そのようにCPUクロックが20MHz〜32MHzのときには、10MHz〜16MHzのクリスタルを使うことができるので、コストパフォーマンスが上がりますよ、という意味なのだと思います(それ以下の周波数のときにこの機能を使うメリットは余り無いかもしれません、という意味も含んでいるようです)。

なにはともあれ、これでやっと一件落着です。
あ。
まだもう少し書き残したことがありました。
それにつきましては次回にて。

ワンボードマイコンでCP/Mを![第320回]
2013.2.16upload

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