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

●メモリ(ROMとRAM)と入力スイッチの回路図です

ROMは8ビット32KバイトのUVEPROM(紫外線消去型リードオンリーメモリ)の27C256を実装可能な配線にしました。
RAMは27C256と同じ容量(8ビット32Kバイト)の62256型を使います。
62256と言えば日立のHM62256が代表格でしたが、日立だけではなく、最近は国内のメーカーはどこも作っていないようです。
国内では製造していない、という点では27C256も同じです。
今のところ、まだ何とか輸入品が入手できますが、さて、将来はどうでしょうか。
まことに心もとない気持ちです。

●ROMのアドレスとRAMのアドレス

ROMのCE(チップイネーブル)端子には、アドレスバスの最上位ビットA15が直接つながっています。
A15=0のときにROMがアクティブになります。
つまりROMのアドレスは0000〜7FFFの32Kバイトです。

一方、RAMについては、回路図左端中ほどにある、ショートピンをアドレスバスの最上位ビットA15の反転出力ラインとショートして、A15=1のときにRAMがアクティブになるようにします。
RAMのアドレスは8000〜FFFFの32Kバイトになります。

当然のことながら、ROMにはあらかじめプログラムを書いておかなければ、何の役にも立ちません。
このROMには、とりあえずは、あとから追加した「TK80」回路のためのモニタプログラムを入れる予定ですが、それはいわば応用で、今回の「つくるCPU」の機能としては必須のものではありません。

というわけで、ROMがなくても、RAMだけでも使えるように考えてあります。
CPUはアドレスの0000番地からスタートします。
ROMとRAMを実装する場合には、0000番地は必ずROMに割り当てます。
その回路のままでは、ROMを外したら、CPUは動いてくれません(RAMアドレスは8000〜FFFF)。

そこで、RAMだけの場合には、さきほどのショートピンをGND側にショートして、RAMのCE端子を常時アクティブにします。
こうすることで、アドレスに関係なく、どのアドレスでもRAMが選択されることになります。

ROMとRAMをともに実装する場合には、ROMもRAMも32Kバイトですから、合計するとちょうど64Kバイトになって、0000〜FFFFの全アドレスをカバーします。
しかしRAMだけだと半分の32Kバイトしかカバーできません。

0000番地は必須なので、ROMと同じようにCEにA15を接続して、0000〜7FFFの範囲を割り当てるということもできます。
それでもよいのですけれど、するとRAMだけのときに作ったプログラムは、将来ROMを実装したときには、RAM上では使えなくなってしまいます(ワークエリア、スタック領域やジャンプ先、CALL先アドレスなどを、0000〜7FFFの範囲から、8000〜FFFFの範囲に直さなければならない)。
また、プログラムは将来ROM化したいので0000〜7FFFに置きたいけれど、ワークエリアなどは8000〜FFFFのRAMエリアに置きたい、ということもあると思います。

RAMのCEをGNDにショートして、A15が0でも1でも、同じRAMがアクセスされるようにしておくことで、そのような目的にも利用することができるようになります。
図右のように、0000〜7FFFに実装されている(と限定してしまうのはおかしいのですが)RAMが、別のアドレス(8000〜FFFF)でもアクセスできる場合、8000〜FFFFは0000〜7FFFのイメージとしてアクセスされている、という言い方をします。

この場合には、図のように、A15(アドレスの最上位ビット)が異なっているだけで、残りは同じであるようなアドレス(たとえば789A番地とF89A番地)は、同じ領域がアクセスされることに注意しなければなりません。
789A番地を含む範囲にプログラムがあって、そのプログラムがデータエリアとしてF89A番地を書きかえるようなプログラムを書くと、自分で自分自身のプログラムを破壊してしまいます。

●プログラム&データ入力スイッチ

「TK80」回路用のモニタROMを実装すれば、RAMにプログラムやデータを書くために、5×5個のキースイッチを利用して、16進数(0〜F)で入力することができます。
しかしRAMだけしかない場合には、そんな器用なことはできませんから、CPUをホールトさせておいて、アドレスもデータも全部2進数で入力しなければなりません。

さきほどの回路図の下部にズラリと並んでいるのが、そのスイッチです。
コストを押さえるために、アドレスの上位ビット、A15〜A4はディップスイッチにしてあります。
アドレスのA3〜A0と、データバスのD7〜D0にはトグルスイッチを使います。
このスイッチでアドレスとデータをセットしておいて、この回路図にはありませんが、メモリWRITE用のプッシュスイッチを押すことで、RAMにプログラムやデータを書き込みます。

スイッチのGND側はトランジスタのコレクタにつながっています。
RAMに書き込むときには、スイッチが必要ですが、プログラムをCPUが実行するときには、スイッチが邪魔になります。
スイッチが直接GNDにつながっていると、スイッチが1個でもONになっているままで、プログラムをCPUが実行しようとしても、アドレスでもデータでも、スイッチがONになっているビットはつねに”0”のままなので、CPUが誤動作してしまいます。
そうならないように、RAMに直接スイッチからプログラムやデータを書き込む場合、別のスイッチでCPUをホールトさせますが、そのスイッチがONのときだけ、このトランジスタがONになってアドレス、データ入力用のスイッチが有効になるようにしてあります。

●せっかくなので、RAMはバックアップしておきたい…

いいかげんにしておかないといけないのですけれど、あれも、これもと、どんどん追加していきたくなってしまいます。
ですけれど、できれば、やっぱりこれは、つけておきたい、です。

せっかく苦労してRAMにデータやプログラムを書いておいても、電源を切ると全部消えてしまいます。
RS232Cの機能ものせるつもりですが、PICと交信するためにもプログラムが必要です(このプログラムのことを、「イニシャルローダ」とか「ブートローダ」などといいます)。

電源を入れるたびに毎回、スイッチをパチパチやるのは大変です。
「TK80」は、2進コードではなくて、16進数で入力できるだけ、はるかに楽だったはずなのですが、それでも長いプログラムになると毎回書き込むのは大変だったと思います。カセットテープレコーダを利用したとしても、なにしろ110ボーなのですから、やっぱり、大変だったでしょう。
で、「TK80」のマニアルには、乾電池でRAMをバックアップする方法が記載されていました。

「乾電池を電源と並行につないでおけば、いいだろう」って、そんな簡単なわけにはいきません。

上図(1)は、電源とバックアップ用のバッテリを単純に接続した例です。これがまずいことはすぐにおわかりのことと思います。
電源(Vcc)は+5Vですが、通常バックアップ電源はそれよりも低い(CMOS・RAMのデータ保持電圧は2V程度)ので、すると5Vからバッテリへ「充電電流」が流れてしまいます。
乾電池の種類によっては、発熱とか破裂の危険がありますから、これはいけません。
それにVccがバッテリ電圧に引っ張られてVcc電圧が低下してしまいます(当然その分、過電流が流れて危険です)。

そこで図(2)のように、Vccからバッテリへの電流を阻止する向きにダイオードを入れることが必須になります。
そのようにダイオードを入れておけば、危険だけは回避できますが、まだ問題は残ります。

図(3)のように、電源がOFFになると、バッテリからRAMへ、データ保持電流が流れます。
このとき、もし電源(Vcc)側になにもないと、バッテリからRAMに保持電流が流れるだけではなくて、Vccのラインを通じて、全回路にバッテリから電気が供給されてしまいます!
そんなことなら、最初から電源を使わないで、全部バッテリで駆動した方が手っ取り早いことになります(今回の「つくるCPU」の回路の場合、それはいくらなんでも、ムリでしょう)。

そのようなことにならないためには、図(4)のように、もう1本、電源側にもダイオードが必要になります。

●RAMのバックアップはCEの禁止が必要

そのように、ダイオードをラインに入れることで、電源とバッテリの関係はうまくいきます。
しかし、それだけでは、まだ足りません。
バッテリのバックアップ時には、RAMのCE(チップイネーブル)を禁止しておく必要があります。

8080は+5Vだけではなくて、+12Vや−5Vの電源が必要だったため、なかなかに大変でした。
Z80は+5V単一電源動作になったため、電源の負担はずっと減りました。
それでも電源電圧が+5Vを大きく割り込むと、正常に動作できなくなります(昔のZ80のマニアルにはVcc=5V±5%と書いてあります)。
電源のON/OFF時にCPUがRAMに誤アクセスしてデータを壊してしまう可能性があります。
そのようなことがないように、電源のON/OFF時の過渡的な電圧のときにRAMのCEを禁止して、CPUからのアクセスを無効にしておく必要があります。

なお、今回の「つくるCPU」の回路はCMOSですから、だいたい+2V近くまで動作するはずです。
とは言っても2V近くまで水晶発振が維持できるかわかりませんし、電源電圧が2V以下になれば、まともに動作しなくなる点では、Z80などのCPUと同じことが言えます。

TK80のマニアルを見ますと、RAMのCEにプロテクトスイッチがついていて、バッテリバックアップを行うときには、電源OFFに先だって、CPUが暴走しないように、まずリセットスイッチを押しながら、プロテクトスイッチをONにするように、と書いてあります。
そうしておいてから、電源を切ります。
電源ONのときには、先に電源を投入してから、リセットスイッチを押しながら、プロテクトスイッチを解除します。

うーん。実に、面倒くさい!

●プロテクトスイッチの代わりに、トランジスタを使います

今回の「つくるCPU」のRAMバックアップ回路では、もっとスマートに(なんたって「電子回路」なのですから)、スイッチなどを使わないで、オートマチックにやってしまいます。

上の回路図から、その部分だけ取り出して、再掲します。

トランジスタとバスバッファ74HC126を使います。
74HC126は3ステートのバスバッファで、今回の「つくるCPU」の回路でもたくさん使っています。
図の1pinをHにすると、ゲートの入力信号がそのまま出力されますが、1pinをLにすると、出力はハイインピーダンスになります。
74HC126は14pinのICに4ゲート入っていますが、そのうちの1ゲートを使います。
この74HC126はRAMのCEをしっかりガードしなくてはいけませんから、電源はRAMのバックアップ電源(B+)につなぎます。「つくるCPU」のボードの中で、RAMと、この74HC126だけが、バッテリによってバックアップされることになります。

74HC126のゲートをON/OFFする役目を担うのが、その上にあるトランジスタ(PNP型、2SA1015など)です。
このトランジスタの目的は、電源電圧が一定電圧(3〜4V)以下になったら、74HC126をOFFにすることです。
一般にシリコントランジスタのベース・エミッタ間電圧(VBE)は約0.6Vで一定になることがよく知られています(昔よく使われたゲルマニウムトランジスタは違います)。
この値は温度によって変化しますが、今回のようにアバウトな値でよいような目的には、この上なく重宝します。
制御出力つきのツェナーダイオード、といった感じです。

回路の動作を説明しましょう。
Vccが+5Vのときは、トランジスタのエミッタからベースを通って、抵抗の4.7KΩを経由して、GNDにベース電流が流れます。
そのため、エミッタ・コレクタ間が導通するので、74HC126の1pinはH(+5V)になり、ゲートはONになります。
しかし回路をよく見ると、トランジスタのベースには4.7KΩだけではなくて、それと1KΩでVccとGND間を分圧したものがベースにつながっています。
トランジスタのベース・エミッタ間の抵抗値は小さいので、1KΩをショートするように働きます。
別の見方からすれば、ベース電流が4.7KΩに流れることで、4.7KΩと1KΩの接合点の電位が押し上げられる、とも言えます。
そのようになった結果、ベース電位がVccに接近してしまうと、シリコントランジスタは動作しなくなってしまいます(エミッタ・ベース間に0.6V以上の電圧が必要です)。
すると、ベース電流が流れなくなり、ベース電位は低くなります。
そこでちょうどエミッタ・ベース間が0.6Vになるところで回路が安定することになります。

ところで、Vccがどんな値でも、エミッタ・ベース間電圧は0.6Vになるか、というと、そんなことはありません。
上の理屈から、トランジスタが完全にOFFでベース電流が全く流れない状態のときの、ベース電位が一番低く(つまりエミッタ・ベース間電圧が最大)、その値はVccを1KΩと4.7KΩで分圧したものになります。
ベース電流が流れれば流れるほど、ベース電位は高く(エミッタ・ベース間電圧は小さく)なります。

ということは、Vccを1KΩと4.7KΩで分圧して得られる値とVccの差が0.6V以下になってしまうようなVccになると、もはやシリコントランジスタは機能せず、したがって74HC126ゲートはOFFになります。
このときのVccの値(Voffとします)を計算で求めることは、ちょっと難しそうです。
トランジスタが完全にOFFになっている、という仮定なら、計算することができます。
0.6:Voff=1:(1+4.7)ですから、
Voff=0.6×5.7=3.42V

ところが、少しでもベース電流が流れてしまうと、トランジスタのエミッタ・ベース間抵抗が1KΩと並列につながっていることになるので、1KΩよりも小さい値になってしまいます。
さらに、この値は温度によっても影響を受けるでしょうし、抵抗の誤差も関係してきます。

もうひとつ、別のファクターも考慮する必要があります。
Vccが低くなるにつれて、74HC126の電源電圧も低くなります(ここにはB+が供給されますが、Vccがうんと低くなってバッテリに切り換わるまでは、Vcc−ダイオードの電圧降下(0.6V)です)。
Vccが低くなると、スレッショルド電圧(Vccの2分の1)も低くなります。

トランジスタはいきなりOFFになるのではなくて、過渡的な傾きを持ってOFFになっていきます。
このトランジスタの動作とVccが低下していくなかでの、74HC126をOFFするための1pin入力のスレッショルド電圧の低下の関係は、うーん、ちょいと複雑で、よく、わかりません。
わからないときは、試してみることが一番です。

簡単な回路を作って実験してみた結果、Vccが3.5V以下になるあたりで、74HC126ゲートの出力が影響を受け始め、3Vぐらいでゲート出力がOFFになりました。
案ずるより産むが易しです。

74HC126の出力がハイインピーダンスになると、そのラインは抵抗でB+にプルアップしてありますから、RAMのCEがHになって、RAMへのアクセスが無効になります。
2008.12.22upload

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