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

●Z80版TK80の回路

今回もHIDプログラムについての説明はお休みさせていただいて、前回の続き、Z80版TK80ボードについての説明を致します。

Z80は機械語コードレベルでは8080と完全な(上位)互換性を有しています。
8080のために書かれた機械語のプログラムは全く手直しすることなく、そのまま実行することができます。
ですから、前回、写真をお見せしましたように、MYCPU80(8080互換)回路で動作しているTK80モニタROMを実装して、TK80と同じ動作をさせることができたのです。

といいましても、それはあくまでソフトウェア上のことで、ハードウェア回路まで同じ、というわけにはいきません。
8080は+5Vのほかに+12Vおよび−5Vの3電源が必要で、さらにCPUに供給するクロックもΦ1、Φ2の2相クロックが必要で、おまけにそのクロックは+5Vではなくて、+12Vである必要がありました(0Vから+12VまでフルスイングするMHzクロックなんて、もうとても涙なくしては語れません、でした)。

なんとも扱いにくいCPUだったわけですが、それに比べるとZ80は+5V単一電源で動作し、CPUクロックも+5Vの単相クロックで動作しますから、そのことだけでも、ハードウェア回路の上では8080とZ80は全く異なっています。
というか、アドレスラインが16本でデータラインが8本である、ということのほかは、8080とZ80は全く共通点がない、と言ったほうが適切なほど、ハードウェアの上では両者は異なっていました。

当然のことながら、メモリやI/Oに対しても、回路は8080とZ80では異なってくるのですけれど、それはまあ許容の範囲です。
TK80の回路をZ80で考えるうえで、問題になってくるのが、7segmentLEDの表示回路と、プログラムのステップ動作の回路です。

あ。それについて、説明する前にまず、今回設計したZ80版TK80の全体の回路をまずお見せすることにいたしましょう。

●Z80CPU回路

まずはZ80周辺の回路図です。

図の左下部分がステップ回路です。
これについてはのちほど説明をいたします。

●ROMおよびRAM回路

ROMおよびRAM回路はMYCPU80の回路とほとんど同じです。



●I/O回路

I/O回路も基本的にはMYCPU80の回路と同じです。



MYCPU80と異なっているのは、まず82C55が追加されていることと、シリアル入出力がUSBではなくてRS232C信号になっている点です。
それとプリンタ出力(回路の一番上部分)があることです。

●5×5キーボード回路

ここはMYCPU80の回路と全く同じです。



●7セグメントLED表示回路

7セグメント表示回路は、MYCPU80の回路と似ていますが、動作の仕組みは異なっています。



MYCPU80は、LED表示データをラッチするのに、命令の「隙間」を利用して、いわゆる「サイクルスチール」方式で行っていました。
これに対して、TK80はKHzオーダーでCPUを一時停止させて、その間にメモリからLED表示データを読み出してラッチする、という回路になっていました。
今回のZ80版TK80も、そのTK80の方式と同じ考え方の回路です。
TK80と同じようにタイマーICの555を使ってBUSRQ(バスリクエスト信号)を発生させます。

555は今でも現役なのですね。ちょっと驚きです。
MYCPU80では、CPUの側でサイクルスチールのための回路を用意しましたから、BUSRQのための信号は適当なデューティで良かったため、74HC04を利用したRC発振回路を使いましたが、今回のZ80に対するBUSRQ信号は、数百Hzの発振周波数が必要で、なおかつ非常に幅の狭いパルスが必要ですので、それをゲートICで作り出すのはちょっと面倒です。
ということで、TK80と同じように555を使うことにしました。

参考までに。555のデータシート(の一部)です

●LMC555のデータシート(一部)


[出典]National Semiconductor社LMC555datasheet

555は出力パルスのHとLの幅を外付抵抗とコンデンサの値から簡単に求めることができるので、今回のような用途にはまことに有難いICです。
データシートにありますように、出力パルスのHの期間(t1)は、t1=0.7×(RA+RB)×Cで求められます。
Ln2≒0.7です。
またLの期間(t2)は、t2=0.7×RB×Cで求められます。

今回の回路では、RA=200KΩ、RB=2.2KΩ、C=0.01μFですから、
t1=0.7×202200×0.01≒1400(μs)
t2=0.7×2200×0.01≒15(μs)
になります。

実際に測定した555からの出力波形です。

●555の出力波形


1.4msには少し足りないようです。1.2ms程度のように見えます。

Lの部分を拡大してみました。


もう少し拡大してみます。

こちらも15μsには足りません。12μsくらいです。
ごくフツーのセラミックコンデンサですから、まあこんなものでしょう。

ところで、なぜこんな信号が必要なのでしょうか?

7セグメント表示回路については[第120回][第122回]で説明をしています。
ちょいとおさらいをしますと、8桁分の7セグメントLEDはいつも全部の桁が点灯しているのではなくて、1秒間に数百回という速さで1桁ずつ切り換えて点灯させているのです。
このような表示方法をダイナミック点灯(ダイナミックドライブ)といいます。
それに対して常時全桁を表示させる方法をスタティック点灯(スタティックドライブ)といいます。

ダイナミック点灯は、表示を切り換えるための回路が必要になりますが、TK80の回路では、表示データはメモリに置いていますから、メモリからデータを表示回路に送るところは、全桁同時には行えません。
一度には一桁分の表示データしか読み出すことができませんから、ダイナミック表示のほうが都合がよいのです。

さて、では、一体どのくらいの速さで表示を切り換えたらよいのでしょうか。
ダイナミック点灯は人間の目の残像現象を利用しています。
実際にはLEDの各桁は1/8の期間しか点灯していないのですが、その繰り返しを速く行うと、人間の目では常時点灯しているように見えてしまいます。
もちろん、繰り返しの速度を遅くしていくと、ちらつきを感じるようになります。
大体1秒間に20〜30回以上の点滅回数になると、ちらつきはほとんど感じなくなるようです。
それを少し多めに考えて、1秒間に50回以上繰り返すことにします。
すると、その1回の間に8桁を順次点灯させなければいけませんから、各桁を点灯させるためのパルスは50×8=400Hz以上の周波数が必要になります。

今回の555の出力パルスは、1/0.0012≒830Hzですから、この半分の周波数でもよいことになりますが、まあこのくらいのほうが安全サイドということになります。
ちょっとアバウトなのですが、じつはこれには抵抗とコンデンサの値が関係しているのです。

たとえば400Hz程度の出力パルスを得ようとすると、抵抗かコンデンサの値を現行の2倍にする必要があります。
抵抗については200KΩはちょっと大きすぎるかなあと思いつつ仕方なく使ったので、これを400KΩにする、というのはちょっと考えたくはありません。
コンデンサを0.02μFにすることは可能なのですが、じつは最近セラミックコンデンサが市場から消えてきています(なんなのでしょうか?なにかほんとに日本はちょっとおかしいのではありませんか?)。
そういう中では、セラミックコンデンサの種類は極力しぼりたい、と考えています。
私がスタンダードで使っているセラミックコンデンサは、22pF、56pF、100pF、270pF、1000pFと、今回の0.01μFなので、そこに0.02μFを追加したくはない、という「お家の事情」があるのです。

そういうようなわけで、周波数は800Hz程度になったのですが、問題はLの期間の長さです。
この期間(上のオシロでの観測結果では12μs)には、どのような意味があるのでしょうか。
というところで、本日は時間が無くなってしまいました。
この続きは、また次回にいたします。
2010.2.13upload

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