トランジスタでCPUをつくろう!
トランジスタで8080をつくってしまおうというまさにびっくり仰天、狂気のプロジェクトです!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
見事にできましたら、もちろんTK−80モニタを乗せて、それからBASIC、CP/Mを走らせましょう!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
[第373回]
●クロックエッジの検出
前回からの続きです。
カウンタの動作をさせるためには、カウントデータを保持しているデータラッチ回路にクロックが入力されたときに、その立ち上がり、立ち下がりのエッジで次のカウントのためのデータをラッチする必要があります。
入力クロックの立ち上がり、立ち下がりのエッジというのは、概念としては時間幅を持たない一瞬の時ということになりますが、たとえば74HCシリーズのデータラッチなどでもデータシートを見ますと入力信号は入力クロックの立ち上がりまたは立ち下がりの前後数ns〜十数nsの間安定している必要があるとの記載があります。
そういうことから考えてみればクロックエッジのタイミングで幅の狭いパルスを発生させて、そのパルスによってデータをラッチするということでもよさそうです。
しからばクロックエッジで幅の狭いパルスをどうやって発生させるかということなのですが、そこのところがなかなかに難題でありました。
これが74HCなどのロジックICそのものでしたら微分回路を考えれば幅のせまいパルスは容易に得られます。
最初は私もそれを考えたのですが、トランジスタ回路ではうまくありませんでした。
トランジスタでもごく普通の使い方をしている回路ならばそれなりに働くのかもしれませんが、MYCPU4TRの回路は2SA1015と2SC1815をペアにして、かつ51KΩという比較的大きなベース抵抗を使い、さらに22PFという小さなコンデンサをスピードアップコンデンサとして用いた回路が基本になっています。
おそらくその大きな抵抗+スピードアップコンデンサが入力段にあることが微分回路の場合問題になってしまうようです。
なぜかというあたりを追求することは全く無駄ではないでしょうし、そこにはそれなりの原因があるとは思います。
しかし今の私の場合、要は動く回路であってくれれば微分回路でも積分回路でも全く構いません。
ですので微分回路が駄目ならそのことにこだわって深入りするのではなくて、駄目なら他のことを考えればよいということになります。
おお。
微分がだめなら積分があるさ。
ということで最終的に煮詰まったPC(プログラムカウンタ)のラッチ信号回路です。
入力クロックの一方をR(抵抗)とC(コンデンサ)によって遅延させて、それともとの入力信号とのANDをとることで幅の狭いパルスを得ています。
点線の上段はPC0ビット(アドレスラインのうちのA0出力)回路のための信号回路で下段はPC1〜PC3ビット(同A1〜A3出力)回路のための信号回路です。
実はJMP命令のためのアドレスデータの書き込み機能が必要なために回路が複雑になっています。
クロックの立ち上がりエッジ、立ち下がりエッジのときの動作を考える上ではアドレスデータの書き込み機能のための回路(PCWR_信号の回路)は邪魔でしかありません。
そこで回路を簡単にするためにひとまずはPCWR_信号の回路を外して考えてみることにします。
すると下図のようにかなり簡単な回路になります。
このようにすると初段のPC0の回路と次段以降のPC1〜PC3の回路は同じ回路であることが見えてきます。
どこが違うかといいますとPC0回路はラッチ信号を得るための入力信号がシステムクロック(MCLK)であるのに対してPC1以降の回路はそれぞれその段の前段の信号を入力信号にしているところだけです。
回路からの出力信号はCKupL、CKupH、CKdnL、CKdnHの4本です。
CKupは入力信号の立ち上がりのときに出力される幅の狭いパルスでCKdnはそれとは逆に入力信号の立ち下がりのときに出力される幅の狭いパルスです。
信号名の後ろについているLは2SA1015をアクティブにするために短い間だけLレベルになるパルスであることを示しています。
逆にHは2SC1815をアクティブにするために短い間だけHレベルになるパルスであることを示しています。
回路を簡略化するために立ち上がりエッジでパルスを出力するための回路と立ち下がりエッジでパルスを出力するための回路の遅延回路に同じ回路を利用しています。
これは手前味噌ですけれど我ながらうまいアイデアだと自画自賛しています。
それで。
立ち上がりと立ち下がりで同じ遅延回路を使っているために見た目では動作がわかりにくい回路になっています。
立ち上がりと立ち下がりではパルスが出力されるタイミングが異なるだけで、働きとしては全く同じです。
そこでその働きをさらに理解しやすくするためにPC0のCKdn回路のみを取り出しました。
実はCKdn回路は入力信号の立ち下がりのときにパルスが出力される回路ですが、回路としては信号の「立ち上がり」のときにパルスが出力される回路になっているためにMCLKをインバータで反転させた信号を回路の入力信号にしています。
本日は時間がなくなってしまいました。
次回に続きます。
トランジスタでCPUをつくろう![第373回]
2021.7.10upload
前へ
次へ
ホームページトップへ戻る