トランジスタでCPUをつくろう!
トランジスタで8080をつくってしまおうというまさにびっくり仰天、狂気のプロジェクトです!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
見事にできましたら、もちろんTK−80モニタを乗せて、それからBASIC、CP/Mを走らせましょう!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
[第399回]
●4MHzでADD、SUBが正しく実行されません(2)
前回からの続きです。
ロジアナで確認したところADD命令の実行時にALU回路からの出力にかなり激しい乱れがあることがわかりました。
MCLKが立ち下がってからALUから出力される値が落ち着くまでに300ns近くかかっています。
4MHzではADD命令、SUB命令が正しく実行されないのはそれが原因でした。
最初は回路のどこかの不具合でノイズ的な動作をしているのかと思ったりしたのですが。
落ち着いてよくよく考えてみるとクロックに関係なくその乱れた波形が同一波形に見えることからするとこれはノイズなどではなくて必然的にそのようになる理由があるに違いないと思えるようになりました。
そういうことならばその理由を追求するしかありません。
そこはまたロジアナの出番です。
そうそう。
ALU回路は入力が変化するとそれに伴って出力も変化する回路でした。
最初はALU回路の「出力」が乱れていると思ったのでしたがそうではなくて入力が変化しているのかもしれません。
そのあたりに注目してロジアナで確認してみました。
PROBE00はMCLKです。
CPUクロック2MHzで確認してみました。
MCLKはその1/2の1MHzになります。
1周期は1μsです。
MYCPU4TRの命令はMCLKが立ち下がったときにメモリーから命令コードを読むことから開始されます。
PROBE01はアドレスA0です。
MCLKが立ち下がってからアドレスが出力されるまでに40nsかかっています。
ずっと下の方PROBE11はD0です。
ADD A,Bの命令コードは40ですからD0は0です。
アドレスが出力されてからメモリからデータが出力されるまでに120nsかかっています。
この256RAMは”−70”のはずなのですがちょっと遅いようです。
かっての日立や富士通のメモリなどはめちゃくちゃ優秀でそれこそ超オーバースペックだったのですが、まあ今時の海外メーカー製のローコスト品ならばこんなものでしょう。
むむむ。
どうやら謎が解けてきたようです。
ここまででMCLKが立ち下がってからすでに160ns経過しています。
PROBE10は74HC157相当回路のBレジスタ/外部データセレクト信号(Bdsel)です。
やっと命令がデコードされてその結果必要な信号線がアクティブになってきました。
D0=0になってからBdsel信号がHになるまで50nsかかっています。
PROBE06はAレジスタのビット0出力です。
PROBE07はBレジスタのビット0出力です。
A=3、B=5ですからそのビット0はともに1です。
PROBE08はBレジスタの後ろの74HC157相当回路のビット0出力です。
Bdsel信号によってメモリからの出力データとBレジスタの出力データが切り換わって出力されています。
PROBE09はその後ろのEXOR回路のビット0出力です。
この値がALU回路のビット0の入力になります。
ということはこの値(PROBE09)によってALUの出力は変化することになります。
そういうことか!
PROBE02はALU回路のビット0の[1]回路(NAND)の出力です。
PROBE06(Aレジスタ)とPROBE09(B/dラインのEXOR)とのNANDなのでPROBE09の変化に伴って0→1→0というように変化しています。
この動きがさらに上位ビットの加算にも影響して、ALUの出力の乱れとして見えていたのでした。
立ち上がりはPROBE09と同時ですが立ち下がりは10ns遅れています。
PROBE03はそのNAND回路の後ろ[2]のインバータ回路です。
PROBE02の反転出力です。
PROBE04は後段のhalf adderの[8](NOR)の出力です。
[第395回]のロジックシンボルで表現した回路図ではここが[3]になっていますが[8]の誤記です。
ここは後段ですから前段のPROBE03よりも少し遅れます。
しかし前段の[4](NOR)を経由していることから考えるととわずか10nsの遅れは立派です。
PROBE05は[8]の後ろの[9](NOR)の出力です。
[8]よりも10ns遅れて反転していますがなんたってトランジスタロジックであることを考えればこれも立派でしょう。
さてこうしてADD A,Bの動作を確認してみますと。
当初はALU回路の遅れが大きいと思ったのですが、実際にはALU回路自体の遅れはそれほどでもないことがわかりました。
ALU回路としては最初の入力はPROBE09の出力がHになったところからです。
上のロジアナ画像では1780nsのところです。
ALU回路のビット0からの出力はPROBE05の出力がLになったところです。
1810nsです。
入力から出力まで30nsです。
ALU回路ではビット0の出力が順次上のビットに伝えられていきます。
前回のロジアナの画像で見るとその遅れはビット毎に10nsです。
ということはALU回路としてはデータの入力から出力が確定するまでの処理時間は30ns+30ns=60nsです。
速いじゃありませんか。
うむむむ。
当初はALU回路が遅いと思ったのですが、そういうことではありませんでした。
ここまででわかったことを整理してみます。
(1)MCLKの立ち下がりからアドレスが出力されるまでの時間は40ns
(2)そのあとデータがメモリから出力されるまでの時間は120ns
(3)そのあとBレジスタの出力データがALU回路に正しく入力されるまでの時間は70ns
(4)ALU回路の計算時間は60ns
(1)から(4)の合計は290nsになりますから前回の結果と一致しています。
ALU回路からの出力が激しく乱れているように見えたのは、最終的にALU回路の出力が確定するまでに入力データの変動などがそのまま出力に反映されるためで、ノイズや誤動作ではありませんでした。
ということになると、これだけ時間がかかるのは必然的なので仕方がないことになります。
つまり。
残念ながらCPUクロック4MHzは諦めるしか仕方がないという結論です。
しかし。
ここで諦めてしまわないのが私のしつこいところです。
次回に続きます。
トランジスタでCPUをつくろう![第399回]
2021.9.8upload
前へ
次へ
ホームページトップへ戻る