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

トランジスタでCPUをつくろう!
トランジスタで8080をつくってしまおうというまさにびっくり仰天、狂気のプロジェクトです!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
見事にできましたら、もちろんTK−80モニタを乗せて、それからBASIC、CP/Mを走らせましょう!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆


[第426回]



●オープンコレクタ

久し振りに考えることになったトランジスタロジック回路でしたがやっと着地点に到達できたように思います。
その過程で思わぬ収穫がありました。
さてそれをどのように整理して書いていったらよいのか、何から先に書き始めたらよいのか迷ってしまいます。
普通の製作ノートでしたらとにかく日付順に書いていけばよいのですけれど(実際にノートはそのように書いていますけれど)。
なにしろあれこれ思いついて、それを思い付くままにテストをしたり検証したりという調子でやってきましたから、そしてノートもそのままの内容ですからとてもそのままをここに書くわけにはいきません。
さてどうしましょうか、ということなのですが。
ま。
なんとか整理しながら書いていくしかありませんでしょう。

まずは考えを整理するために過去記事をあらためて読み直すことから始めました。
それは[第411回]、バイナリカウンタを改良するということから始まったのでした。
およそ一ヶ月ほど前の記事です。
読み直してみますとなんだかあれこれ迷ってまとまりのない内容です。
それでもとにかくはカウンタ回路としてはそれまでRSフリップフロップ回路を2段使っていたところを1段で済ませるようにしましたから一応の成果はあったと思います。
せっかく改良回路を考えたのですからそれを試作基板として製作することにしました。
改良回路を考えるきっかけとなったバイナリカウンタ回路として使うための「TR74」を[第422回]で作図しました。
それまでのバイナリカウンタ回路に比べてRSフリップフロップ回路部分が簡単になっただけ使用するトランジスタ数が少なくなりましたがその一方でエッジトリガパルス発生回路を追加したためその分のトランジスタ数は削減できた分から差し引いて考えることになります。
バイナリカウンタの改良について考えていくなかで派生的に思いついたのはレジスタ回路です。
トランジスタCPU回路ではレジスタを多用します。
そのレジスタはまさにフリップフロップの集合体です。
8ビットのレジスタではフリップフロップ回路が8組も必要です。
8080をトランジスタで作ろうとすると主要な8ビットレジスタだけでA、B、C、D、E、H、Lの7レジスタもあります。
そのほかにも演算用のレジスタやプログラムカウンタなどを含めるとそこで必要なレジスタは相当な数になります。
CPUをトランジスタ化するうえでそのレジスタのところをどうするかということがずっと長い間の悩みの種でした。
そのレジスタ回路のRSフリップフロップを1段で済ませることができるということになれば「トランジスタ版8080プロジェクト」の実現に一歩近付くことになりましょう。
ありがたいことにカウンタ回路と違ってレジスタ回路はエッジトリガである必要はありません。
ちなみにMYCPU80Bではレジスタとして74HC373を18個も(!)使っています。
74HC373は8ビットのD型ラッチでエッジトリガではありません。
G=Hの間データは筒抜けになります。
レジスタとして使うならばそれでも構いません。
今回のバイナリカウンタ回路の改良によってRSフリップフロップを1段で済ませることができるようになったことはそのままレジスタ回路にも応用ができそうです。
しかもエッジトリガパルスを発生させる回路も不要ですからその削減効果は大きいことになります。
それを実際の回路で確認するために「1/2TR373」を[第423回]で作図しました。
その関連で以前作成した「74HC139組立キット」と「74HC126組立キット」の改良版として「1/2TR139」を[第424回]で、「TR125」を[第425回]で作図しました。

記事として書きましたのはそこまでですが、実はその過程でさらに一歩踏み込んでさらなるトランジスタ数の削減を試みることに挑戦をしました。
なんていいますと大げさになります。
はっきり言えばもっと早く思いつくべきことを単に思いつかなかっただけです。
それはともかくとしまして、そこで思いついたことは大きく分けて3つあります。
そのひとつが今回のテーマの「オープンコレクタ」です。
一般的なトランジスタロジック回路では出力がHのときもLのときもローインピーダンスです。
こんな回路です。

T1がONのときは出力がVcc電圧になりT2がONのときは出力がGNDレベルとなります。
どちらの場合も出力側の負荷に対して大きな電流を流すことができます。
T1とT2が同時にONになると両トランジスタを通してVccとGNDがショートすることになりますから常にどちらか片方のトランジスタしかONにならないような回路にします。
それに対してオープンコレクタは下の図のようにトランジスタが1個だけの回路です。

この回路もT2がONになったときは出力はGNDレベルになります。
その場合にはトランジスタが2個のときと同じ動作になります。
しかしT2がOFFのときにはT1がありませんから出力はハイインピーダンスになります。
通常は出力ラインに適当なプルアップ抵抗をつけてT2がOFFのときにはラインがHレベルになるようにします。
トランジスタが2個の回路との違いは出力がHのときはプルアップ抵抗を通した電流しか取り出せない、つまりHの時の出力インピーダンスが高いということです。
トランジスタロジック回路では通常はその出力の先にある入力回路のインピーダンスも高いはずですからHのときに出力インピーダンスが高いということは回路を考えるうえでそれほど妨げにはなりません。
ここで問題になるのはオープンコレクタではT2がOFFになったときの出力ラインの立ち上がりが遅くなってしまうという点です。
そのことについては[第24回]で書いています。
もう9年も前の記事です。
そこでは2SC1815のようなバイポーラトランジスタではなくて2N7000を使った回路として説明をしています。
この場合にはオープンコレクタではなくてオープンドレインになりますけれど動作としてはどちらも同じことです。
その場合の問題として出力の立ち上がりが遅いという点についても同じでそのことについては[第20回]で書いています。
このときはそのときの対策としてプルアップ抵抗を小さくすれば立ち上がりを速くすることができるが、するとトランジスタがONのときにプルアップ抵抗を通して余計な電流が流れてしまうためそれはできないと書いています。
それはいささか浅慮でありました。
通常トランジスタロジック回路は負論理で考えます。
つまりある回路が「アクティブ」なときにはその回路の電圧はLレベルであるように設計します。
いくらトランジスタを沢山使っていたとしてもそのうちの多くは通常は働いていなくて必要なときに必要な回路のみがアクティブになるというような回路になると思います。
ことにオープンコレクタ回路では信号がLのときに意味があるところに使うのが普通ですから、その回路が休んでいるときにはオープンコレクタの出力はHになるはずです。
まあ実際に全体の回路を組んで試してみなければはっきりと断言はできないのですけれど回路全体の消費電流についてはそれほど気にするほどのことではないのではと今は思っています。
それにしても。
プルアップ抵抗が2.2KΩのときの立ち上がりが200nsとはなかなかに速い値です。
このあたりのことはすっかり忘れてしまっていました。
今回は2SC1815を使って同じことを試してみました。
下の回路です。

プルアップ抵抗は1KΩです。
下は出力波形の画像です。

上側(CH1)はT2のベースに入れた入力クロックです。
下側(CH2)がコレクタの出力波形です。
立ち下がりはそれなりに速いのですが立ち上がりの遅延は2μs近くもあります。
さすがにこれでは使うことをためらってしまます。
あらためて2N7000の実力を認識しました。
しかし今更2N7000に戻るなんてことはできません。
当初はトランジスタCPU回路のシステムクロックをできれば4MHzにしたいなどと意気込んでいたのでしたがさすがに今はもう少し現実的な思考に変わりました。
今は「遅くたって動けばいいじゃん」なんて考えるようになりました。
しかししかし。
2μsも遅延するということになりますとクロックも1桁落とさなければならなくなります。
このときの入力クロックは周期が8μsですから125KHzです。
うーん。
それでもいかんことはないけれど…。

そもそも。
どうしてそんなことを考えるようになったかといいますと。
皆様ご承知の通りの昨今の円安です。
かっての電子立国、電子王国日本はどこへやら。
じつに情けない限りの有様であります。
実際半導体は言うに及ばず抵抗、コンデンサの類に至るまでその多くが海外からの輸入に頼らざるを得ない有様です。
この企画を思いついた当時は確か1ドルはまだ100円以下だったと記憶しています。
海外からの調達に際しては大体ドル価格を100倍すれば日本円での仕入れ価格になってなおおつりがくる状況でした。
それが今や5割アップです!!
いくらなんでもひどすぎます。
実際この状況がこの先も続くようでしたら販売価格の見直しをしないことにはそれこそ赤字になってしまいます。
ということで。
まだ計画の段階の当トランジスタCPUについても真剣にパーツの削減について考えるべきときにきていると思います。
全ての回路ではないとしてもたとえば2SA1015と2SC1815の2個のトランジスタを使っている回路を2SC1815だけのオープンコレクタ回路に置き換えることができたならば。
原価は半減することになります。
そのように考えてあらためてオープンコレクタに注目してみたのですけれど。
うーん。
やっぱり2μsも遅延してしまうのか。

今まで何回となく書いていることなのですが。
頭は生きているうちに使うものであります。
考えて考えて考え抜いたその先にこそ解決策が浮かぶのであります。
今回も過去記事を読んでおりますうちに。
突然。
「ひょっとしたら」
と思いついたことがあります。
2N7000を使った回路ではそのあとで2SA1015を使うという考えに行ってしまいました。
そのときはBS250の入手が難しいのでその代わりに2SA1015を使うというアイデアに落ち着いたのでしたが。
そのあたりのところを読み返してみて、どうしてそこまで考えたのに今一歩先に進まなかったのかという思いにかられます。
まあ当時はこれほどの円安になるなどと予想もしていなかったのでBS250の代わりに2SA1015を使う(トランジスタを2個使う点では同じ)という程度で納得してしまったのだと思います。

何を思いついてしまったのでありましょうか。
下はそのように思いついたあとのオープンコレクタ出力の波形です。

さきほどの波形に比べてびしっとした急峻な立ち上がりになりました。
立ち下がりもさらに急峻になりました。

入力クロックを2MHzにして水平時間軸も50ns/divにしてみました。

立ち上がりの遅延は1/2Vccのあたりで25ns程度です。
これはすごい!
これなら十分実用になりますでしょう。
ええ。
トランジスタは2SC1815ただ1個だけです。
間違いなくオープンコレクタ回路です。
プルアップ抵抗はさきほどと同じ1KΩです。
この波形を見たときには年甲斐も無く思わず叫んでしまいましたよ。
「やったぜ!ベイビー!」
立ち下がりのほうは10ns以下のように見えます。
もっともっともっと早く思いつくべきでありました。

というところで。
次回に続きます。

トランジスタでCPUをつくろう![第426回]
2024.3.8upload

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