KM-Z80(MZ-80K互換マイコン)回路図編
2012年5月16日
先日紹介したKM-Z80の回路について、少し説明します。
KM-Z80は、ICとして以下のものを用いています。CPLDについてはPLCCパッケージのものが、その他のICについてはDIPパッケージのものが、Digi-Keyあたりで手に入ると思います。
CPU: Z84C00 (Z80 CPU; Zilog)
RAM: 62256 (32 Kbytes static RAM, Cypress)
Timer: 82C54 (8253 upper compatible; Intersil)
CPLD: EPM3032ALC44-10N (Altera)
Microcontrollers: PIC12F683, PIC18F25K22, PIC18f14K22, PIC18F14K50 (Microchip)
用いたZ80は、本来10 Mhzで動く能力を有していますが、MZ-80Kのクロックスピードにあわせるため、2 Mhzで使用しています。RAM は、32 Kbytes のものを用いていますが、そのうち、4 Kbytesを仮想ROMとして、別の 4 Kbytes をキャラクターディスプレイ用に用いているので、KM-Z80 の中で実際にRAMとして使用可能なのは、24 Kbytesです。
MZ-80Kでは、コプロセッサとしてI/O用に8255、タイマー用に8253を用いていますが、これらの代わりに、PIC18F14K22と82C54を用いました。PIC18F14K22の中で、8255の動作をエミュレートしています。82C54は8253のアッパーコンパチブルなので、そのまま用いています。
キャラクターディスプレイは、汎用ロジックやCPLDなどで構築すると複雑なので、代わりにPIC18F25K22で実装しました。ここの部分が KM-Z80 のミソと言っても良いでしょう。これの開発途中で試作品として出来たのが、以前紹介した、PIC18F14K50を用いたキャラクターディスプレイです。
では、順に説明していきます。回路図は、クリックすれば拡大表示されると思いますが、もしされない場合、右クリックで「画像を表示」などしてください。見難ければ、ダウンロードファイルの中のschematic.pdfを参照してください。
電源とクロック
電源は、特に説明は要らないでしょう。500-1000 mA の7805で十分です。7805は、定格ぎりぎりまで流すと電圧低下を起こしますが、CMOSで回路を組んであるので、総電流量が 100 mAほどにしかならないため、気にする必要はありません。クロック作成用には、PIC12F683を用いました。16 Mhzの水晶発振子を付けて、PIC内部で2 Mhz, 31.25 Khz, 30 hzのクロックを作成して、出力しています。100 Ωの抵抗は、ダンピング抵抗です。これを入れておいたほうが、クロックが安定します。この、水晶による発振ですが、色々と難しい問題があるらしく、ちょっとしたことで発振したり、安定しなかったりするようです。現在、ユニーバーサル基板に半田付けした物を作成中ですが、水晶発振子ではなく16 Mhzの発振器を用いて、そのクロックをPIC18F683の2番ピンに入れるような形になりそうです。その場合、R1, X1, C2, C3は、はずします。
CPUとRAM
主にTTLを用いて作成されていた昔のマイコンでは、CPUのすぐ外に、74LS245などのバッファーを取り付けるのが常套手段でしたが、CMOSで構築しているので、省略しています。リフレッシュラインは、使用するからではなく使用しないから、CPLD用に出力しています。具体的には、CPLD内部で、RFSHがアクティブのときはMREQを無視するようにしています。CPUとRAMの間は、ほとんどの部分でアドレスラインとデーターラインを直結しているだけですが、A13だけは、CPLDからのシグナルがRAMに入っています。これは、RAMの最後の 4 Kbytes を、アドレス0xD000からのキャラクターディスプレイ用に割り当てているためです。また、書き込み用の信号(WR-RAM)もCPUからではなくCPLDからとなっていますが、これは、最初の4 Kbytesの部分をROMとして扱うため、その部分の書き込みを禁止しているためです。
CPLDとPIC18F14K50
CPLDの主な役割は、アドレスデコーダーで、それぞれのアドレスごとに、RAM/PIC18F25K22/PIC18F14K22/82C54への選択信号を作成しています。PIC18F14K50が付属していますが、これはsa89_aさんのUSB-Blasterもどきを利用したCPLD書き込み機能のためと、PS/2キーボードとの連絡のためです。CPLDへの書き込みが終了すればそちらは必要ありませんから、KM-Z80完成品の中では、PS/2キーボードからの信号を受け取って、それを、8255をエミュレートするPIC18F14K22にシリアル通信で送るのが仕事です。それと、CPLDは3.3Vで動かしています。このため、5Vから3.3Vに変換するためのレギュレーターを入れています。このCPLDは入出力が5Vトレラントなので、Z80その他の5V駆動のICと直接接続することが出来ます。
CPLDの内部は、次のような回路になっています。
本来はVHDLかVerilogで記述すればすっきりするのでしょうが、今回は汎用ロジックの代替として使用しているので、このような回路として構築しました。上のほうがアドレスデコーダー。一番下が、サウンド作成用のフリップフロップです。その少し上、A10とA11を出力している部分ですが、ここは、リセット時にモニターROMの内容をRAMに書き込むために用いています。その更に上のフリップフロップは、KM-Z80内部アドレス0xE008のI/Oポートです。サウンドのON/OFFに利用されます。
キャラクターディスプレイ
PIC18F25K22で構築しています。ビデオ信号の作成には、2本のI/Oポートを用い、0V, 0.3V, 1.0Vの信号を作成することで行っています。NTSCビデオ信号の作成には、ChaNさんのサイトの「RS-170A NTSCビデオ信号タイミング規格の概要」と、後閑さんのサイトの「ビデオ出力のオシロスコープ」が非常に参考になりました。また、フォントについては、まるくん(さん)のMZ700WIN For Windowsのものを使わせていただいています。PIC18F25K22とZ80との連絡は、パラレルインターフェースで行い、書き込みだけを認識しています(Z80への読み出しは、RAMから行われます)。Z80からアドレス0xD000-0xDFFFへの書き込み信号が来ると、割り込みがかかって、アドレスラインとデーターラインを読み取り、PIC内部の該当部分のRAMを書き換えるという仕組みです。この処理はソフトウェア的に行われていますが、PICが64 Mhzの速度で動いているために、2 MhzのZ80からのシグナルの処理が間に合っている感じです。割り込み処理の間、ビデオ信号の作成が出来ませんので画像が乱れますが、同様のことはオリジナルのMZ-80Kでも起こります。それを再現しようとしたわけではありませんが、期せずして、このようになりました。
タイマーと8255相当部分
82C54周りは、ほとんどそのままです。8255の代わりにPIC18F14K22を用いています。40ピンもある8255の代替として、20ピンしかないPIC18F14K22で足りたのは、キーボードにPS/2キーボードを用いたため、MZ-80Kでは12本もあったキーボードとの連絡線が、2本で済んだためです。実際にはPS/2キーボードとの間にPIC18F14K50(CPLD部分の回路図に記載)を介していますが、そのPIC18F14K50との連絡も2本のポートしか使っていません。Z80とPIC18F14K22の間は、キャラクターディスプレイと同じように、パラレルインターフェースです。ただし、読み出しと書き込みの両方に対応していて、それぞれhigh priority interruptとlow priority interruptの2種類の割り込みを用いています。これについても、64 Mhzの実行速度をフルに用いることで、Z80との連絡が可能になっています。カセットテープインターフェース部分は、LOAD/SAVEのラインが共通で、ポートB4を用いています。LOADの際はA/Dコンバーターを用い、マイクロフォン用の微弱な電圧変化を読み取っています。SAVEの際は、5Vから0.17Vに電圧を落としています。それから、82C54のOUT2にMOSFETが繋がっていますが、これは74HC04や74HC14などのインバーターで代替可能です。Z80のINT入力に10 KΩのプルアップ抵抗が入っていることに注意してください。
120528 追記
「タイマーと8255相当部分」の回路図を、ver 1.1のものに差し替えました。
KM-Z80は、ICとして以下のものを用いています。CPLDについてはPLCCパッケージのものが、その他のICについてはDIPパッケージのものが、Digi-Keyあたりで手に入ると思います。
CPU: Z84C00 (Z80 CPU; Zilog)
RAM: 62256 (32 Kbytes static RAM, Cypress)
Timer: 82C54 (8253 upper compatible; Intersil)
CPLD: EPM3032ALC44-10N (Altera)
Microcontrollers: PIC12F683, PIC18F25K22, PIC18f14K22, PIC18F14K50 (Microchip)
用いたZ80は、本来10 Mhzで動く能力を有していますが、MZ-80Kのクロックスピードにあわせるため、2 Mhzで使用しています。RAM は、32 Kbytes のものを用いていますが、そのうち、4 Kbytesを仮想ROMとして、別の 4 Kbytes をキャラクターディスプレイ用に用いているので、KM-Z80 の中で実際にRAMとして使用可能なのは、24 Kbytesです。
MZ-80Kでは、コプロセッサとしてI/O用に8255、タイマー用に8253を用いていますが、これらの代わりに、PIC18F14K22と82C54を用いました。PIC18F14K22の中で、8255の動作をエミュレートしています。82C54は8253のアッパーコンパチブルなので、そのまま用いています。
キャラクターディスプレイは、汎用ロジックやCPLDなどで構築すると複雑なので、代わりにPIC18F25K22で実装しました。ここの部分が KM-Z80 のミソと言っても良いでしょう。これの開発途中で試作品として出来たのが、以前紹介した、PIC18F14K50を用いたキャラクターディスプレイです。
では、順に説明していきます。回路図は、クリックすれば拡大表示されると思いますが、もしされない場合、右クリックで「画像を表示」などしてください。見難ければ、ダウンロードファイルの中のschematic.pdfを参照してください。
電源とクロック
電源は、特に説明は要らないでしょう。500-1000 mA の7805で十分です。7805は、定格ぎりぎりまで流すと電圧低下を起こしますが、CMOSで回路を組んであるので、総電流量が 100 mAほどにしかならないため、気にする必要はありません。クロック作成用には、PIC12F683を用いました。16 Mhzの水晶発振子を付けて、PIC内部で2 Mhz, 31.25 Khz, 30 hzのクロックを作成して、出力しています。100 Ωの抵抗は、ダンピング抵抗です。これを入れておいたほうが、クロックが安定します。この、水晶による発振ですが、色々と難しい問題があるらしく、ちょっとしたことで発振したり、安定しなかったりするようです。現在、ユニーバーサル基板に半田付けした物を作成中ですが、水晶発振子ではなく16 Mhzの発振器を用いて、そのクロックをPIC18F683の2番ピンに入れるような形になりそうです。その場合、R1, X1, C2, C3は、はずします。
CPUとRAM
主にTTLを用いて作成されていた昔のマイコンでは、CPUのすぐ外に、74LS245などのバッファーを取り付けるのが常套手段でしたが、CMOSで構築しているので、省略しています。リフレッシュラインは、使用するからではなく使用しないから、CPLD用に出力しています。具体的には、CPLD内部で、RFSHがアクティブのときはMREQを無視するようにしています。CPUとRAMの間は、ほとんどの部分でアドレスラインとデーターラインを直結しているだけですが、A13だけは、CPLDからのシグナルがRAMに入っています。これは、RAMの最後の 4 Kbytes を、アドレス0xD000からのキャラクターディスプレイ用に割り当てているためです。また、書き込み用の信号(WR-RAM)もCPUからではなくCPLDからとなっていますが、これは、最初の4 Kbytesの部分をROMとして扱うため、その部分の書き込みを禁止しているためです。
CPLDとPIC18F14K50
CPLDの主な役割は、アドレスデコーダーで、それぞれのアドレスごとに、RAM/PIC18F25K22/PIC18F14K22/82C54への選択信号を作成しています。PIC18F14K50が付属していますが、これはsa89_aさんのUSB-Blasterもどきを利用したCPLD書き込み機能のためと、PS/2キーボードとの連絡のためです。CPLDへの書き込みが終了すればそちらは必要ありませんから、KM-Z80完成品の中では、PS/2キーボードからの信号を受け取って、それを、8255をエミュレートするPIC18F14K22にシリアル通信で送るのが仕事です。それと、CPLDは3.3Vで動かしています。このため、5Vから3.3Vに変換するためのレギュレーターを入れています。このCPLDは入出力が5Vトレラントなので、Z80その他の5V駆動のICと直接接続することが出来ます。
CPLDの内部は、次のような回路になっています。
本来はVHDLかVerilogで記述すればすっきりするのでしょうが、今回は汎用ロジックの代替として使用しているので、このような回路として構築しました。上のほうがアドレスデコーダー。一番下が、サウンド作成用のフリップフロップです。その少し上、A10とA11を出力している部分ですが、ここは、リセット時にモニターROMの内容をRAMに書き込むために用いています。その更に上のフリップフロップは、KM-Z80内部アドレス0xE008のI/Oポートです。サウンドのON/OFFに利用されます。
キャラクターディスプレイ
PIC18F25K22で構築しています。ビデオ信号の作成には、2本のI/Oポートを用い、0V, 0.3V, 1.0Vの信号を作成することで行っています。NTSCビデオ信号の作成には、ChaNさんのサイトの「RS-170A NTSCビデオ信号タイミング規格の概要」と、後閑さんのサイトの「ビデオ出力のオシロスコープ」が非常に参考になりました。また、フォントについては、まるくん(さん)のMZ700WIN For Windowsのものを使わせていただいています。PIC18F25K22とZ80との連絡は、パラレルインターフェースで行い、書き込みだけを認識しています(Z80への読み出しは、RAMから行われます)。Z80からアドレス0xD000-0xDFFFへの書き込み信号が来ると、割り込みがかかって、アドレスラインとデーターラインを読み取り、PIC内部の該当部分のRAMを書き換えるという仕組みです。この処理はソフトウェア的に行われていますが、PICが64 Mhzの速度で動いているために、2 MhzのZ80からのシグナルの処理が間に合っている感じです。割り込み処理の間、ビデオ信号の作成が出来ませんので画像が乱れますが、同様のことはオリジナルのMZ-80Kでも起こります。それを再現しようとしたわけではありませんが、期せずして、このようになりました。
タイマーと8255相当部分
82C54周りは、ほとんどそのままです。8255の代わりにPIC18F14K22を用いています。40ピンもある8255の代替として、20ピンしかないPIC18F14K22で足りたのは、キーボードにPS/2キーボードを用いたため、MZ-80Kでは12本もあったキーボードとの連絡線が、2本で済んだためです。実際にはPS/2キーボードとの間にPIC18F14K50(CPLD部分の回路図に記載)を介していますが、そのPIC18F14K50との連絡も2本のポートしか使っていません。Z80とPIC18F14K22の間は、キャラクターディスプレイと同じように、パラレルインターフェースです。ただし、読み出しと書き込みの両方に対応していて、それぞれhigh priority interruptとlow priority interruptの2種類の割り込みを用いています。これについても、64 Mhzの実行速度をフルに用いることで、Z80との連絡が可能になっています。カセットテープインターフェース部分は、LOAD/SAVEのラインが共通で、ポートB4を用いています。LOADの際はA/Dコンバーターを用い、マイクロフォン用の微弱な電圧変化を読み取っています。SAVEの際は、5Vから0.17Vに電圧を落としています。それから、82C54のOUT2にMOSFETが繋がっていますが、これは74HC04や74HC14などのインバーターで代替可能です。Z80のINT入力に10 KΩのプルアップ抵抗が入っていることに注意してください。
120528 追記
「タイマーと8255相当部分」の回路図を、ver 1.1のものに差し替えました。
コメント
e.naka (2012年12月14日 05:39:30)
8254と14K22が手に入りません。
後者はともかく前者のPIC18での代替版が欲しい。
後者はともかく前者のPIC18での代替版が欲しい。
Katsumi (2012年12月16日 18:54:51)
e.nakaさん、こんにちは。
8254のPICでのエミュレーションはずいぶん考えたのですが、簡単ではないんですよ。
部品の入手先ですが、ここではどうでしょうか?
http://www.digikey.jp/product-detail/ja/CP82C54Z/CP82C54Z-ND/936155
http://www.digikey.jp/product-detail/ja/PIC18F14K22-I%2FP/PIC18F14K22-I%2FP-ND/2125559
あるいは、PIC32MX150F128Bを使ったバージョンを制作中なので、それが完成するまで待っていただくかですね。
http://www.rad51.net/blog/mycom/index.php?itemid=876
8254のPICでのエミュレーションはずいぶん考えたのですが、簡単ではないんですよ。
部品の入手先ですが、ここではどうでしょうか?
http://www.digikey.jp/product-detail/ja/CP82C54Z/CP82C54Z-ND/936155
http://www.digikey.jp/product-detail/ja/PIC18F14K22-I%2FP/PIC18F14K22-I%2FP-ND/2125559
あるいは、PIC32MX150F128Bを使ったバージョンを制作中なので、それが完成するまで待っていただくかですね。
http://www.rad51.net/blog/mycom/index.php?itemid=876