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


16ビットマイコンボードの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使ってみるつもりで入手してそのまま置いてあった16ビットCPUのことを思い出しました。
AMD社のAM188です。
その名の通り、CPUコアは80188互換の16ビットCPUです。
そのAM188を使った16ビットマイコンボードの製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第57回]



●AM188EMのCLOCK(7)

下のリストのプログラムの一部を書き換えた2本のプログラムを実行して、その実行時間の差を求めたところ、計算上の命令の実行時間よりも多くの時間がかかっていることがわかりました。
それはなぜなのか?
当初はその理由がわからず、とうとうカメレオンロジアナまで引っ張り出してきて、波形を観測してみたのでした。
その波形をよくよく確認してみたところ、やっと謎が解けました。

2018/7/1  7:226  86cktst.LST
[00001]                     ;;; clock test for am188
[00002]                     ;
[00003]                         ORG=8000
[00004]                     ;
[00005] 8000  B080              MOV AL,80
[00006] 8002  E683              OUT 83,AL
[00007] 8004  32C0          LOOP:XOR AL,AL;3
[00008] 8006  E680              OUT 80,AL;9  +1.5us
[00009] 8008  E80C00            CALL T5US;7us <8017>
[00010] 800B  FEC8              DEC AL;3
[00011] 800D  E680              OUT 80,AL;9  +0.6us
[00012] 800F  E80500            CALL T5US;7us <8017>
[00013] 8012  FEC0              INC AL;3
[00014] 8014  EBEE90            JMP LOOP;14 <8004>
[00015]                     ;
[00016]                     ;5us timer clock 20MHz
[00017] 8017  B106          T5US:MOV CL,06
[00018] 8019  FEC9          T5US2:DEC CL;3
[00019] 801B  75FC              JNZ T5US2;13,,,16*6=96 0.05*100=5us <8019>
[00020] 801D  C3                RET;20  CALL=19,,,0.05+140=7us
[00021]                     ;
[00022]                     ;END
LOOP         =8004  T5US         =8017  T5US2        =8019  


下は[第55回]でお見せした、カメレオンロジアナでの記録波形の一部です。
問題のサブルーチンの先頭からRETするまでの波形です。


2400nsあたりでスタックへのPUSHが行なわれています。
スタックPUSH後の2700ns近辺からはT5USサブルーチンの続きが読み込まれています。
8018、8019、801A、801B、801Cです。
8017はスタックPUSH前に読み込まれています。
8017、8018がMOV CL,01です。
この命令は3クロックです。
上のチャートのどこで実行されているかはわかりませんが、8018の読み込み後であることは間違いありません。
8018の読み込みには4クロックかかっています。
その後の8019、801AはDEC CLです。
DEC CLも3クロックです。
この命令もどの時点で実行されているのかわかりませんが、801Aの読み込み後であることは間違いありません。
8019、801Aの読み込みには8クロックかかっています。
801B、801CはJNZ T5US2ですが、今回のプログラムはCLに01を入れていますから、DEC CLでZフラグが立つため、このJNZ命令はスルーされることになります。
スルーしたときのクロック数は4クロックです。
この命令もどの時点で実行されているのかわかりませんが、801Cの読み込み後であることは間違いありません。
801B、801Cの読み込みには8クロックかかっています。


801DがRETですが「先読み」によって、次の801Eが無駄に読み込まれています。
801D、801Eの読み込みには8クロックかかっています。

さて。
スタックPUSH後からスタックPOP前までの時間を確認すると、2600ns〜4200nsの間ですから1600ns(1.6μs)かかったことになります。
前にも計算しましたように、CPU内部での命令の実行時間はわずか10クロック0.5μsなのですが、その命令をメモリから読み込むために少なくとも28クロック(1.4μs)の時間が必要なのです。
これで謎が解けました。
実はこのことは[第55回]の終わりのところに書いていました。

「基本的にメモリからの読み込み時間(1回4クロック)がネックになっていて、内部でのトータルの実行クロック数が計算上はいくら短くても、必要なメモリからの総読み込みクロック数を下回ることはできない。」

そういうことだったのでした。
これにて一件落着です。

16ビットマイコンボードの製作[第57回]
2018.7.15upload

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