標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第173回]

●ついに、完成してしまいましたよー!

今回から、いよいよCPUの中心部、ALU回路について、説明を始めるつもりだったのですけれど、その前に、この辺でちょいと一息入れておきましょう。

前回も書きましたように、まだやっと二の丸くらいまで攻略しかかったところです。山登りなら、やっと八合目付近です。

しかし、ですね。本当を言いますとですね。
説明の方はなかなか遅々としてはかどりませんが、バックグラウンドの方では、実は、もう完成してしまっているのです。

そうなのですよ。
じつは、少し前に、本丸まで攻略してしまいました、のです。

CPUの回路については、全部実装を完了して、全命令回路について、一通りの動作テストも完了しています。
前回お見せした、命令リストの空白になっている命令も全部、完了です。

ANDもORもADDもSUBも、そしてあのDAAも、です。
INT(interrupt、割り込み)も成功しましたよ!
マシン語コードFFのRST7についてのみですけれど、ちゃーんと動作しましたよ!

そのあたりも、これから少しずつ皆様にご披露申し上げていきますね。
それは、今後のお楽しみということで。

本日、皆様にお見せするのが、これ!

●ああ堂々の、DMA、7segLEDのダイナミックドライブ表示ですよ!

リキが入っていますから、いつもより、少し画像サイズが大きいです。

こうやって、見ていると、何か、感動してしまいますねぇ。
とうとう、と言いますか、ついに、と言いますか、「やったぁ!」という感じですね。

7segLEDが加わると、一段と引き立って見えますね。ほんと、感動です。

7segLEDの表示回路については、[第120回]から数回にわたって説明をしました。
年末が迫っていて、早く基板を仕上げなくては、と、あせってしまったため、TK80の回路は、かなり「やっつけ」のところが多く、基板が出来てきてから、相当手直しが必要でした。
そのあたりも、いずれ説明をいたします。

7segLEDの表示は、ダイナミックドライブです。
こうやって写真で見ても、8個のLEDは同時に点灯しているように見えますが、実際には1秒間に数百回、1桁ずつ順番に点灯させているのです。
しかも、表示させている数字は、その毎回の点灯に合わせて、メモリ(RAM)から、直接、表示データを読み出して、点灯表示させているのです。
このあたりは[第121回]で詳しく説明しています。

09.3.1追記(ここから)
TTL回路での7segLED表示は、大抵は、74LS47(BCD to 7segment decoder & driver)などを使います。
その場合、0〜9の数字の表示はできますが、A〜Fは表示できません。
まあ、もともと7segLEDでA〜Fを表示させるのは、ムリがあるのですが、そこは多少のムリは承知でなんとかそれらしく読める工夫をしています。

メモリと7segLEDの表示データとの関係です。


[第120回][第124回]にある、7segmentLED表示回路図は、最終的にいろいろ変更しましたので、現在の回路は回路図とは異なっています。それについては、いずれ説明をするつもりです。
ただ、上の図の配置と、回路図の7segLEDの配置が左右逆になっていましたので、そのことについてはとりあえずここで訂正しておきます。回路図の74LS145のpin1からの出力は、左端の7segLEDに入り、pin9の出力は右端の7segLEDに入ります。

16進数を7segLEDに表示するには、デコーダを使わず、メモリデータのビットをそのまま7segLEDのセグメントに割り当てています。


16進数からセグメント表示データへの変換は、プログラムで行います。
いまはまだ、変換プログラムはありません。
FFF8〜FFFFに、トグルスイッチをパチパチやって、直接表示データを書き込みました。

書き込んだデータです。

FFF8 06  ”00000110” −−−1
FFF9 5B  ”01011011” −−−2
FFFA 4F  ”01001111” −−−3
FFFB 66  ”01100110” −−−4
FFFC 77  ”01110111” −−−A
FFFD 7C  ”01111100” −−−b
FFFE 39  ”00111001” −−−C
FFFF 5E  ”01011110” −−−d
09.3.1追記(ここまで)

メモリから表示データを読み出す動作には、CPU回路は関与していません。
CPUの命令動作によって、メモリから表示データを読み出すのではなくて、7segLED表示回路が、勝手にメモリにアクセスして、表示データを読み出します。

CPU以外の周辺回路が、直接メモリにアクセスしますから、こういう動作を、DMA(direct memory access)と言います。
一般的にDMAと言う場合、短い間、CPUの動作を、一旦、停止させておいて、その間にメモリをアクセスすることを言う、のが多いのですけれど、この「つくるCPU」に搭載した、TK80回路のDMAは、CPUを停止させることなく、CPUがメモリをアクセスしていない、その隙間の時間をねらって、メモリにアクセスしています。
こういう方法をサイクルスチール(cycle steal)と言います。

この方式の場合、7segLED表示のために、1秒間に何百回も、メモリからデータが読み出されているのですが、それでも、CPUの実行には、全く影響がありません。

実は、この写真は、CPU回路に、あるプログラムを実行させているところを撮影したものです。
それは、下のプログラムです。

●実行中のプログラムです

0000 AF      XRA A
0001 47      MOV B,A
0002 4F      MOV C,A
0003 57      MOV D,A
0004 5F      MOV E,A
0005 67      MOV H,A
0006 6F      MOV L,A
0007 3C      INR A (4)
0008 C20700  JNZ 0007 (6)or(4)
000B 0C      INR C (4)
000C C20700  JNZ 0007 (6)or(4)
000F 04       INR B (4)
0010 C20700  JNZ 0007 (6)or(4)
0013 2C       INR L (4)
0014 C20700  JNZ 0007 (6)or(4)
0017 24       INR H (4)
0018 C30700   JMP 0007 (6)

●プログラムの実行時間を計算してみましょう

プログラムは以前にも使ったことのある、同じようなテストプログラムです。
H、L、B、C、Aを直列につないで作った、40ビットのバイナリカウンタです。
実行時間の計算は以前にも説明をしていますから、簡単に式と結果だけを書くことにします。

まず最初にAレジスタが00〜FFまで256回カウントするのにかかる時間は、
(4+6)×256−2=2558μsです。

Cレジスタが1回カウントするのにかかる時間は、
2558+4+6=2568μsですから
Cレジスタが256回カウントするのにかかる時間は、
2568×256−2=657406μsです。

Bレジスタが1回カウントするのにかかる時間は、
657406+4+6=657416μsです。

各レジスタの値を見てみましょう。
レジスタの位置は、写真の下から2列目の左から、Hレジスタ、Lレジスタ、その上の列の左から、D、E、B、C、Aレジスタです。
今回はD、Eレジスタは使っていません。
Cレジスタ、Aレジスタは速すぎて、全点灯しているようにしか見えません。
Bレジスタは9A、Lレジスタは10、Hレジスタは06を表示しています。

H、L、Bをまとめて表示すると、06109Aという値になります。
時間の計算をするために、これを10進数に直します。
397466になります。

スタートしてから、この写真を撮ったときまでの、経過時間を計算してみましょう。
0.657416×397466=261300.508(秒)
になります。

261300秒は、何時間でしょうか?

なんと、72時間35分です!

実は、スタートしたのは2月22日15時22分0秒で、写真を撮影したのは2月25日15時57分0秒でした。
おお。ちょうど72時間35分。ぴったりです。

その間も7segLED回路は休むことなく、メモリをアクセスして、表示データを読み出してダイナミック表示を行っていたのですけれど、計算結果からわかるように、CPUの実行にはわずかの影響も与えてはいません。
自分から言うのも、なにですけれど、すごい!(自画自賛)
2009.2.28upload
2009.3.1追記

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