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

●メモリ回路について

このブロックについては、本当はもうすこし後で説明をするつもりだったのですが、メールをいただいてしまいましたので、順番を変更して、説明することにしました。

[第130回]を読まれた方から、メモリ回路について、ご質問のメールをいただきました。
内容は2点です。
ひとつは、RAMのアドレスについて、もうひとつはアドレス、データの入力スイッチ回路について、です。

●RAMとROMのアドレス選択

「つくるCPU」を企画した当初は、純粋にCPU回路のみで基板を作り、その周辺のメモリ回路とか、入出力回路は別基板にするつもりでした。
しかし、CPU基板が超巨大になってしまい、ここまで大きくなってしまったからには、この際のせれるものなら何でものせてしまおう、ということでRAM回路ばかりか、ついにはTK80用の回路までもが、基板上に鎮座してしまうという、なんとも恐ろしい企画へと、変貌してしまいました。

ただTK80用の回路まで動くようにするとなると、完成するのはいつのことになるかわからなくなってしまいます。
そこで、とりあえずはRAMだけで動作するようにしておいて、その後にROMが完成したら、ROMでも動くようにする、という2段構えの機能として考えることとしました。

CPUはアドレスの先頭番地0000からプログラムの実行を開始しますから、RAMのみで動作するためには、当然RAMのアドレスも0000番地から始まることになります。
RAMは32Kバイトの62256タイプの使用を考えていますから、RAMアドレスは0000〜7FFFになります。
ところが、ROMも実装もするということになると、ROMのアドレスは当然0000〜7FFFにしなければなりません。またその場合にはRAMアドレスは8000〜FFFFにすることになります。

そこで、[第130回]で説明しましたように、ROMの無いときにはRAMを全てのアドレスでアクセス可能にしておいて、ROMを実装したときには、ROMが0000〜7FFFで、RAMが8000〜FFFFになるように、ショートピンで選択できるように考えました。
RAMのみの場合には、0000〜7FFFと8000〜FFFFのエリアが完全に重なっていますから、0000番地をアクセスしても8000番地をアクセスしても、同じメモリセルが選択されることになります。

それじゃ都合が悪いんじゃないの?
とお考えの方もみえるかもしれませんが、そうでもありません。これが結構便利なのです。

0000番地がRAMなのですから、将来ROMにしたいプログラムを、RAM上でデバッグできてしまう、というまことにありがたいしかけなのです。
windowsやC言語全盛の今日では、「それがいったいなんなのさ?」と言われてしまいそうですが、8ビットのCPUをアセンブラレベルやマシン語で扱っていた方なら、そのありがたさはご理解いただけると思います。

アドレスに重なりがある(イメージが発生する)とはいっても、通常、プログラムは0000番地から後ろに向かって作成していきますし、逆にスタックやワークエリアなどのデータエリアは、FFFFから前に向かって割り当てていきますから、よほど大きなプログラムやデータを扱わない限り、実用上の問題はありません。
そのようにして、RAM上でデバッグして完成させたプログラムを、バイナリコードのまま、そのままROMに焼くだけで、実行可能なプログラムROMが出来あがってしまいますから、0000番地と8000番地が重なっていた方がかえって都合がよいのです。

そのようにするための、ショートピン回路は([第130回]で紹介済みですけれど)、下図のようになります。

RAMだけのときは、図のようにショートピンを下側につけるか、無しにします。
ROMも実装するときには、ショートピンを上側にします。

以上が[第130回]で紹介した、RAMおよびROMのセレクト回路だったのですが、そこで(長々お待たせしました)、やっとのことで、いただいたメールのご質問の内容のお話になります。

「ROMがあるときにRAM onlyにする場合には、ROMを外さなければいけませんか?外さないと、RAMとROMが喧嘩してしまうと思いますが…」

「はい。その通りです」
RAM onlyですから、文字通りROMが無いときの仕様ですから、ROMを実装してしまったら、もうそれは用済みということで…。
ですから、どうしてもRAM onlyにしたい場合には、当然ROMは、外していただきませんと…。

うう…。
そう…、ですよね。それは、そうなのですけれど…。
いや、しかし、たしかに、お尋ねのように、ひょっとすると、そのようにしたいときも、あるかもしれません。

このように、自分ひとりで考えていると、意外と気がつかないことでも、ひと様の知恵を借りることで、気づかされることも多くあるように思います(「アマチュアデジタリアン」様、ご質問のメールを有難うございました)。

という次第で、ここは下図のように改良することにしました。


RAMだけか、またはROMがあってもRAMのみをセレクトしたい場合には、ショートピンをつけないようにします。
RAMとROMをともにアクセス可能にする場合には、図のようにショートピンを2個使います。

●アドレス、データ入力スイッチの件

これも、回路図のその部分を切り取って、再掲します。

ここで、ご質問のメールです。

「この回路では、SWが2個以上ONになっていると、アドレスバス、データバスの、そのラインがショートしてしまうと思うのですが…」

その通りです。
実は、基板が出来上がってきて、SWを実装するまで、完全に失念していました。
ここは、下図のようにするべきでした。

なんともお恥ずかしい限りです。
でもまあ、メールをいただいたのが、自分でこの間違いに気づいたよりも後だったのが、まだしも幸いでした。
もしも、全く気づかないでいて、メールをいただいてはじめて気づいたとしたら、それはもう、完全にへこんでしまって、多分1週間くらいは、何もする気にならなかったかもしれません。
ひょっとしたら、何もかも忘れてしまいたくて、あの白犬おとうさんのように、旅に出てしまったかも…(こういうタイムリーなジョークは時が経つと、意味不明になってしまいますね。何年か先を見越して今から注をいれておきますよ。「筆者注。2008年当時に人気だったコマーシャルの犬です」)。

間一髪で気づくことは気づいたのですけれど、
えーっ、今更ここに24本もダイオードを追加するなんて、ちょっと、それは、もう勘弁してほしいなぁ。

「プログラムやデータを入力し終わったら、RUNさせる前には、全てのスイッチをOFFにすることを忘れないでください」

そうそう。そう注意書きをつけておけば、よいじゃありませんか。ぜひともそういうことに、してしまいましょう。
そういうことで、めでたし、めでたし、というつもりになっていたのですけれど、そしたら、ご質問のメールをいただいてしまいましたのでありました…(テンモウカイカイソニシテモラサズ)。

あらためて反省してみますと、せっかくTK80までのせてしまおう、というのに、この回路のままでは、余りに恥ずかしいじゃありませんか。
そこで、ここについても、ダイオードを24本、追加することにいたしました。

●アドレス、データ入力スイッチとメモリ(RAM)を実装したところの写真(スキャナ利用)です



しっかし、よく写っていますね。感心します。
ガラスのほこりまで、はっきり写ってしまっています。
トグルSWの背が高いので、ガラス面からは25mmも離れているのですが、ここまではっきり写るとは、驚きです。
参考までに、使用機種も書いておきましょう。
使用しているスキャナは、EPSONのES6000HSです。

なんでも一般にスキャナで使われているCCD方式だと、このように「被写界深度」に余裕があって、分厚い本をスキャンした場合でもぼやけることなく、はっきりした画像が得られるのだそうですね。
安価なプリンタに付属しているスキャナはCIS(密着光学系というんだそうです)方式といって、こちらはガラス面に密着させないと、ぼけてしまうのだそうです。

ご覧いただいている通り、メモリのバックアップ用に乾電池をつないでテストしました(ここまでやると、オンボードのボタン電池の方がいいかなぁ、などとまた、考えなくてもいい、余計なことを思いついてしまったりします)。

実はメモリのバックアップについても、またまた思わぬ事態が発生して、大変だったのですけれど、それについては次回以降にお話いたします。
なんだか新春早々、トラブル続きで、ほんとメゲてしまいます。

●RAMセレクト用のショートピンです



●スイッチの裏側に追加したダイオードです



●追加変更後の回路図です


MEMRDにもダイオードが入っています。データを入力するためにCPUをホルト(停止)させてしまうと、MEMRDもハイインピーダンスになってしまうので、メモリからのデータが読み出せなくなってしまいます。
データ入力モードにしたときは、常時メモリからデータが出力されるようにするために、このようにしました。
こうすると、SWを使ってデータを入力するときに、RAMからの出力とぶつかってしまうのですが、書き込んでしまうまでの間ですから、それほど気にすることはありません。

あ。メモリからデータを読み出すときは、当然のことながら、データ入力用のスイッチは全部OFFにします(これは、仕方がありません)。

MEMWRに74HC126が追加してあります。メモリバックアップのテストの過程でこのようになりました。
この74HC126はバックアップのためだけに使っていて、3/4は余っていたのですから、有効利用しようというわけです。

●トランジスタとダイオードが直列に…

改良後の回路図のようにすると、スイッチONのときでも、ダイオードが0.6Vでシリコントランジスタが0.6Vなので、合計すると1.2Vくらいになってしまって、ちょいとLレベルの電圧が高くなってしまって、まずいのでは…。
などと心配してしまったのですけれど、どうやらそれは考え違いだったようです。

シリコントランジスタの0.6Vの「浮き上がり」というのは、ベース、エミッタ間の電圧のことで、コレクタ、エミッタ間の電圧については、シリコントランジスタの場合でも、しっかりとトランジスタがONになっていれば、ほとんど0Vになるようです。

図の回路でスイッチをONにして、RAMの端子部分の入力電圧を測定してみたところ、ダイオード1個分の約0.6Vでした。
これなら何の心配もありません。めでたし、めでたし、です。
2009.1.9upload

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