- ベストアンサー
電気回路の設計
Z80CPU(ザイログ社製)を使って64KバイトのUV-EPROM(TMS27C020)とSRAM(TC55257DFL)、あとは適当なI/O(M66500FP)を使うだけのマイコンを設計しています。メモリーマップの電気的な決め方とソフト的な決め方を教えて下さい。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
どの程度の知識をお持ちかわかりませんが、とりあえずお話してみましょう。 メモリも手元に資料がないので容量もわかりませんが、型番から推定して、ROMは2Mビット(256Kバイト。アドレス線が18本)、RAMは256Kビット(64Kバイト。アドレス線が16本)かと推定します。 Z80は、メモリ空間が64Kバイト(アドレス線が16本)しかありません。 慣例では、メモリ空間は、0000~7FFF(32Kバイト)をROMに、8000~FFFFをRAMに割り当てます。 この場合、ROMのアドレス線の上位3本とRAMの上位1本は0固定(グラウンド)とし、残りのA0~A14はz80の同じ番号のアドレス線につなぎます。CPUのA15は、そのままROMのCS(バー;負論理)につなぐとともに、NOTを介してRAMのCS(バー;負論理)につなぎます。これで、A15が0(アドレスが7FFF以下)のときはROMが、1のときはRAMがデータバスにデータを出しますね。 I/O用のチップもわからないのですが、Z80はアドレスバス下位8ビットがポートアドレス(256ポート)となりますので、例えば4ポートを持つI/Oチップの場合、A0.A1をI/OチップのA0.A1につなぎ、残りの6本とI/OREQ(バー;負論理)をNOTして、7入力NANDにつないでその出力をCS(バー;負論理)につなぐと、00H~03HのアドレスのI/Oになります。おっと、当然R/W'もつないでね。 なお、慣例として、次のようなアドレス割り当てをする方が多いようです。 0000H(ROM)~;単に0100Hにジャンプとだけ書く。 0100H(ROM)~;プログラム本体。 (これらの不自然な配置は、z80の「割込機能」を使うと、勝手に0038H付近にジャンプしてしまうので、この周辺を空けておくため。) 6000H(ROM)~;BIOSなどのサブルーチン類 FF00H~FFFFH;I/0のイメージ(写し)。特に出力は、CPUが自分で命令しておきながら、今どうなっているのかわからなくなっちゃうので、I/Oに出力したら、同じデータをこのアドレスに書き込んでおく。 また、意外と面倒なのがI/Oチップの初期化です。CPUは、電源を入れれば(リセットで)勝手に0000Hから命令を実行し始めますが、最近の高機能のI/Oチップは、あらかじめ指定されたアドレスに決まった命令を書き込まないと、出力としても入力としても使えないことが多いのです。このため、0100H(プログラムの開始直後)付近(又はサブルーチン領域)では、かなり長いプログラムをI/Oチップの初期化コマンドのために作るはめになっています。
その他の回答 (3)
- joshua01
- ベストアンサー率66% (222/333)
joshua01です。 albertparkさんのいわれるとおり、RAMのFFFF付近は、特に指定しない場合のスタッカに使ってました。自分の作ったもののマップをみたら、I/OイメージはF000H~F0FFHを使ってました。 各種変数はF100H以降に使ってました。
- albertpark
- ベストアンサー率10% (1/10)
電気的要件: ・複数のメモリICが重複するアドレスをつくらないこと。 ・デコードIC(または直接接続)で簡単にチップを選択できること。 ・デコードを簡単な回路ですませるにしても、I/O空間との重複も避けること。 ・メモリマップドI/Oを採用する場合は、そのアドレス領域にメモリを配置しないこと。 特に、I/Oポートについては、上位8ビットにCPUのAレジスタあるいはBレジスタの内容が出力されることにも留意。 ソフト的要件: ・CPUはリセット後に0000Hから実行するので、この部分をROMにすること。 ・0000H~0038HはRST命令、0066HはNMI割込みが使用します。 ・リセット後のスタックポインタの値は0000Hです。このため、最初にstack-inされる内容は、FFFEHに格納されます(変更すれば別ですが)。 ・バンク切替えによりメモリ空間を拡張する場合、特にROMを切り替える場合は切替えを行うコードの配置に注意すること。 くらいだと思います。 このため、一般的には↓の方の回答のような配置になりますね。 RAMについて明記してないようですが、 最終アドレス(FFFFH)がRAMになるように配置するのが普通のようです。 32Kバイトなら8000H~FFFFH、16KバイトならC000H~FFFFHとか。 これは、一般にスタック領域を~FFFFHに置くことによります。
お礼
有難う御座いました。よく分りました。
- nanashisan
- ベストアンサー率9% (16/172)
割り込みベクタがある下位アドレス側にROMを持ってくるのがよいと思う。 しかし、Z80のメモリー空間は64KBだから、メモリーをフルに使用しようとすれば、アドレスバスとCSに細工してバンク切換か? I/Oはメモリーと別空間にあるので特に気にしなくても良い。
お礼
有難う御座います。初めての設計なので、多いに助かりました。