ワンボードマイコンをつくろう!(パソコンの原点はここから始まった)
TK80ソフトコンパチブル!8080、Z80マシン語からBASICまでこれ1台でこなせます
当記事は2009年11月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 2011.6.26
前へ
次へ
目次へ戻る
ホームページトップへ戻る
☆それは特注品の試作から始まりました
TK80コンパチブルで、その上中日電工オリジナルのND80Zとしても動作するというZ80CPUのワンボードマイコンを企画し、その開発準備をしていたところに、ND80Zの特注品の開発依頼をいただきました。

[第4回]

●Z80版TK80のLED表示(DMA)回路(続き)

前回はタイマーIC555の出力パルスの説明の途中で終わってしまいました。
TK80の7セグメントLED表示はDMA(Direct Memory Access)を利用したダイナミック点灯を行っています。
8桁のLEDの表示データはRAMのアドレスFFF8〜FFFFにあります。
メモリの1バイトのデータが7セグメントLEDの1桁に対応していて、データの各ビットが7セグメントLEDの各セグメントに対応しています。

555から出力される数百Hzのパルスによって、毎秒数百回、ほんのわずかな時間だけ、CPUの実行を中断して、メモリから強制的に読み出した表示データを、7セグメントLED表示回路にラッチします。
CPUの実行を中断して、メモリから直接表示データを読み取るために、Z80のBUSREQ端子にパルスを入れます。
このBUSREQ信号が、前回説明の途中で終わってしまった、555からのL信号パルスなのです。

Z80はBUSREQ端子をLにすると、その間は命令の実行を中断し、アドレスバス(A15〜A0)、データバス(D7〜D0)、MREQ、IOREQ、RD、WR、RFSHの各出力をハイインピーダンスにします。
BUSREQが受け付けられたことを示す信号として、BUSAKがLになります。

外部の回路(ここでは7セグメント表示回路)は、BUSREQにL信号を入れて、それが受け付けられて出力されるBUSAK信号(CPUからのバス制御線がハイインピーダンスになったことを示す信号)を利用して、RAMに強制的にアドレス信号を出力するとともに、MREQ、RD信号も外部から送ることによって、CPUを介さずにメモリから直接データを読み出します。
これがDMA(Direct Memory Access)といわれる所以です。
今回の7セグメントLED表示回路では、A2〜A0のみ強制的に変化させます。
残りのA15〜A3は抵抗でVccにプルアップしてありますからA2〜A0以外は1になります。
ですからこの期間はRAMにはアドレスとしてFFF8〜FFFFが与えられます(RAMのそのアドレスが7セグメントLED表示データバッファになっています)。

さてそこで、いよいよ、前回説明の途中になっていました、Z80のBUSREQに入力される、555からの出力信号のLの期間の根拠についての説明です。
BUSREQ信号がLである期間中はZ80はお休みしてしまいますから、この期間はできるだけ短くする必要があります。
しかし余り短くて、Z80がBUSREQ信号を受け付けてくれなくては、7セグメントLEDに表示データをラッチすることができませんから、それでは困ります。
では、Z80は命令を実行していながら、どのようなタイミングでBUSREQ信号の状態を確認するのでしょうか。それがわかれば、それをもとにして、BUSREQ信号のLの期間の長さを求めることができます。

じつは、このBUSREQのタイミングについて、私はちょっと勘違いをしていました(恥)。
BUSREQ信号は、各命令の最後のクロックで受け付けられるのだ、と思い込んでしまっていました。
Z80にはかなり実行時間がかかる命令(クロック数が多い命令)があります(19クロック〜23クロックの命令がいくつかあります)。そうすると、そういう命令を実行してもBUSREQを受け付けられるようにするには、今回の回路のCPUクロックは4MHzなので、1クロックは0.25μsですから、BUSREQのL信号幅は少なくとも6μsは必要になる計算です。

555のパルス発生回路には、誤差の大きいセラミックコンデンサを使いますから(ここはアバウトでも構わない回路です)、その倍程度の値になるように、抵抗とコンデンサの値を決めたのでした。

ところが、それ(Z80のBUSREQは各命令の最後のサイクルで認識されるということ)が私の勘違いだったのです。
念のためにと思って、Z80のデータシートを確認したところ、その間違いに気がつきました。

Z80のデータシートについては、現在でもZilog社のホームページからダウンロードすることができます。
データシートだけではなくて、Z80そのものも、Zilog社は、まだ生産しているようです。

●Zilog社のホームページ

Zilog社のホームページ(http://www.zilog.com)です。



Products→Microcontrollers→Classic Productsの順にアクセスすると、Z80が紹介されているページになります。


Z80は、世界のエンジニアたちの間で今もポピュラーである(is still popular with engineers worldwide)と、堂々の宣言です。

私は思うのですけれど、よく日本の技術はアメリカを抜いたとか、世界有数の経済大国である、などということを耳にするたびに、どうもそれは違っているのではないか、日本は今も昔もずっと背伸びばかりしている、底の浅い国なのではないか、と、そういう気がしてならないのです。

あれほど一世を風靡したはずのZ80でさえ、日本ではNECも東芝もシャープも、とうの昔に生産を中止してしまいました。でもZilogはまだこうやって生産しているのですよねえ。
生産しているということは、ちゃんと需要もある、ということです。
日本じゃそういうものを作っても、使う人がいない、ということでしょうか。
秋葉原も多分同じようなものだと思いますが、当地名古屋の大須も、かってあれほど電子電気街としてにぎわったものが、いまや昔日の面影がどこにもない、ということと根は全く同じだと思います。

さすがアメリカです。
今も昔も日本は到底アメリカには敵わないなあ、という気がします。

いやおそらくZilog社だって、いまどきZ80を生産したところで、それがどれだけ利益に貢献するか、それほどの需要はアメリカにだってない、のではないかと思います。
でもZilog社は生産を続けているのです。
そこにアメリカの底力というか、多様性を見るような気がします。

日本の企業(近年の)は、あまりに利益本位になりすぎているように思えます。
産業を支えている、社会に貢献している、という自負心を失ってしまっているのではないでしょうか?
まあ、その点については、日本だけではなくて、アメリカだって似たようなものかもしれませんが(ねえ。ビ○・○イツくん)。
昔は今ほど豊かではありませんでしたが、人にも、企業にも、もう少しゆとりがあったように思います。

あ。つい横道にそれてしまいました。
Z80のデータシートです。

●Z80のデータシート


[出典]Zilog社Z84C00 Product Specification

データシートといっても、30ページ程度の簡単なものです。
このデータシートの中から、まずはBUSREQ端子についての説明を見てみましょう。

●Z80の端子の説明

その説明はほかの端子と合わせて1ページにおさまっていますから、そこのところの1ページをそのままお見せすることにいたします。

[出典]Zilog社Z84C00 Product Specification

でもこの説明だけでは、信号のタイミングについてはわかりません。
今度はBUSREQ信号のタイミングについて見てみます。

●BUSREQのタイミング



[出典]Zilog社Z84C00 Product Specification

おお。ここに書いてありました。
the rising edge of the last clock period of any machine cycle
と書いてあります。

Z80のマシンサイクル(machine cycle)は3または4クロックから成っています。
Z80でのマシンサイクルとは、OPコードフェッチサイクルやメモリREAD、メモリWRITE、あるいはI/O READ、I/O WRITEなどの各サイクルのことをいいます。
OPコードフェッチサイクルはどの命令にも必ずありますが、命令によっては、OPコードフェッチサイクルのあとに1つまたは2つののメモリREAD、メモリWRITEサイクルが続くものもありますし、I/O READ、I/O WRITEサイクルが続くものもあります。

ここで、参考までに、各マシンサイクルについても見てみることにします。

●OPコードフェッチサイクル

OPコードフェッチサイクルは、CPUがメモリから命令コード(OPコード)を読み込むマシンサイクルです。

[出典]Zilog社Z84C00 Product Specification

ちょっと見にくいですが、T1〜T4の4クロックであることがわかります。
最初のマシンサイクルであるということで、Z80ではこのサイクルをM1サイクルとも言います。
そのことを示す信号としてM1が出力されます。
なおZ80は8080の命令コードを全て含んだうえで、残された未定義のコードに、多くの追加された命令を割り当てる方法として、2バイトのOPコードを定義しています。
その2バイトのOPコードを含む命令では、このM1サイクルも2回実行され、M1信号も続けて2回出力されます。

またZ80は、ダイナミックRAMのリフレッシュ機能も備えていて、そのために、M1マシンサイクルの期間に、ダイナミックRAMへのリフレッシュ信号が出力されます。
RFSHは、その期間であることを示す出力です。

ダイナミックRAMは、限られたメモリスペースの中で大容量化を実現するために、スタティックRAMが通常4〜6個程度のトランジスタで1メモリセルを構成するのに対して、1トランジスタと1キャパシタ(コンデンサ)で構成されていて、1という情報は、その小さなコンデンサに蓄えた電荷によって維持されています。
このコンデンサは非常に微小なものなので、わずか数ms程度しか値を保持することができません。
また、その値を読み出すときに、コンデンサが放電されてしまうので、読み出すと同時に同じ値を再書き込みする必要があって、ダイナミックRAMはそのための回路を自前で備えています。

その読み出し動作によって自動的に再書き込み動作が行われる機能を利用して、数msごとにダミーの読み出しをダイナミックRAMに対しておこなうことを、リフレッシュといいます(これはわかりやすくするための説明で、正確にいうと、リフレッシュ動作と通常のREAD動作は異なっています)。
このリフレッシュによって、ダイナミックRAMはデータを保持していますので、電源が切れたり、あるいはなんらかのトラブルでリフレッシュが行われないと、ダイナミックRAMのデータは消失してしまいます。

パソコンのメモリもダイナミックRAM(略してDRAM、ディーラムなどといいますね)ですから、電源を切るとRAM上の全てのデータは失われてしまいます。そのために電源を切る前に必要なデータはハードディスクに保存する必要が出てきますし、電源を入れたら、毎回ハードディスクからプログラム(WindowsなどのOSプログラム)をダイナミックRAMにロードする必要があるのです。

なお、一般的にZ80などの回路に使用するRAMはダイナミックRAMではなくて、リフレッシュの必要がないスタティックRAMです。
スタティックRAMも電源がOFFになったら、データは消えてしまいますが、リフレッシュが不要なので、データを保持するための電圧を電池などで与えるようにすることで、電源OFFの間もデータを保持しておくことができます。

MYCPU80もスタティックRAMである、62C256互換品を搭載していて、3Vのボタン電池でデータのバックアップができる回路になっています。
今回設計したZ80版TK80でも同じ回路にしてありますから、ボタン電池でRAMのデータをバックアップしておくことができます。

さて、参考までにOPコードフェッチサイクル以外のメモリREAD、メモリWRITEサイクルとI/O READ、I/O WRITEサイクルについても見てみることにします。

●メモリREAD、メモリWRITEサイクル


[出典]Zilog社Z84C00 Product Specification

メモリREAD、メモリWRITEサイクルはT1〜T3の3クロックになっています。
図のTwは、外部からWAIT信号を与えたときに強制的に挿入されるクロックです。

●I/O READ(IN)、I/O WRITE(OUT)サイクル


[出典]Zilog社Z84C00 Product Specification

82C55などのI/O用LSIはメモリに比べてアクセスタイムがやや遅いものが多かったため、Z80では、IN、OUT関係のマシンサイクルは、強制的に1クロックが挿入されるようになっています。
そのため、I/O READ、I/O WRITEサイクルはT1、T2、TWA、T3の4クロックになります。

●BUSREQに必要な信号幅

BUSREQ信号のタイミングチャートの説明にありましたように、BUSREQ信号は、当初私が勘違いしていたように、各命令の最後で認識されるのではなくて、各マシンサイクルのそれぞれの最後のTクロックで認識されることがわかりましたから、すると、各マシンサイクルは3または4クロックですから、CPUクロックが4MHzの場合、1μsのパルス幅があればよいことになります。
しかし、それでは余りに余裕がありません。
で、ここはまあ2〜3μsもあれば十分、ということになります。

ということで、555のRBを2.2KΩにしていたところを、330Ωにして、7セグメントLEDがうまく表示されるかどうか確認してみました。

●BUSREQ信号の波形



やっと2μsほどのL信号です。
計算では、0.7×330×0.01≒2.3μsになります。
やっぱり計算よりも少し小さい値になっています。
で、7セグメントLEDの表示のほうなのですが、全く問題無く表示されました。

これで、RBは330Ωにしても、7セグメントLEDのダイナミック点灯は問題無く行われることが確認できました。
ただそれは、いうなれば限界を確認してみたまでのことで、ここまでパルス幅をしぼってしまって、コンデンサのばらつきや経年変化によって、LEDの表示が乱れるようなことになっては困りますから、ここはまあRB=1KΩ程度にしてもよいのではないか、と考えています(多分、約6μs)。
CPUをつくろう!第435回(2010.2.15upload)を再編集

ワンボードマイコンをつくろう![第4回]
2011.6.26upload

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