シンプルZ80マイコン(6)
2025.09.12
ここは、あとで使うかもしれないから(拡張とか)、直接+5Vにつなぐんじゃなくてプルアップ抵抗を入れておこう。そうすれば後からスイッチをつないだりするのに便利よな。
・・・そんな感じで進めていくと、どんどん部品が増えてきます。シンプルから遠ざかります。
いまから作ろうとしている物のイメージというか目標を決めて、これはこの用途にしか使わないから余計なものは付けないという割り切り、決心が必要です。
フリーランニングから始めて、そこから最低限必要なものを足していくのもよいでしょう。
Z80だけを動かしてみます。ブレッドボードに差し込む。
+5V、GNDをつなぐ。
CLKをつなぐ。
INT, NMI, WAIT, BUSREQ, は使わないので+5Vにつなぐ。
出力ピンとなるアドレス(A0-15)と、HALT,MREQ,IORQ,RD,WR,BUSACK,M1,RFSHは開放でOK。
データバス(D0-7)は出力になる事もあるから、壊さないようにとりあえず1KΩの抵抗を通してGNDにつなぐ。これはNOP(00h)を入力することになります。
あとはRESETで、とりあえず簡易的なリセット回路で良いので、よくみかけるあれをつないでおきます。(抵抗、コンデンサ、ダイオード)
アドレスピンのどれかにLEDをつなぎます。A14か15あたりなら点滅が見やすいかもしれません。
さあ、あとは電源をつなぐだけ。
アドレスの変化を目で見ることができるでしょう。
基本的には、このままの回路でいいやとなります。
割り込み使わないからINTとNMIは+5V直結
WAITも使わない、DMAはリセットだけにするからBUSREQも使わない。+5V直結
・・・そんな感じで進めていくと、どんどん部品が増えてきます。シンプルから遠ざかります。
いまから作ろうとしている物のイメージというか目標を決めて、これはこの用途にしか使わないから余計なものは付けないという割り切り、決心が必要です。
フリーランニングから始めて、そこから最低限必要なものを足していくのもよいでしょう。
Z80だけを動かしてみます。ブレッドボードに差し込む。
+5V、GNDをつなぐ。
CLKをつなぐ。
INT, NMI, WAIT, BUSREQ, は使わないので+5Vにつなぐ。
出力ピンとなるアドレス(A0-15)と、HALT,MREQ,IORQ,RD,WR,BUSACK,M1,RFSHは開放でOK。
データバス(D0-7)は出力になる事もあるから、壊さないようにとりあえず1KΩの抵抗を通してGNDにつなぐ。これはNOP(00h)を入力することになります。
あとはRESETで、とりあえず簡易的なリセット回路で良いので、よくみかけるあれをつないでおきます。(抵抗、コンデンサ、ダイオード)
アドレスピンのどれかにLEDをつなぎます。A14か15あたりなら点滅が見やすいかもしれません。
さあ、あとは電源をつなぐだけ。
アドレスの変化を目で見ることができるでしょう。
基本的には、このままの回路でいいやとなります。
割り込み使わないからINTとNMIは+5V直結
WAITも使わない、DMAはリセットだけにするからBUSREQも使わない。+5V直結
シンプルZ80マイコン(5)
2025.09.12
DMAについて
この場合のDMAは、我々がトグルスイッチ等から(アドレス、データ指定して)RAMに書き込んだり、逆にアドレスを指定してRAMから読み出してLED表示するといった、手動の操作をさします。
RESETをL固定にした場合と、BUSRQをLにした場合では信号の変化に違いがあります。
(RESET)
アドレスバス: ハイインピーダンス
データバス: ハイインピーダンス
MREQ: H
IORQ: H
RD: H
WR: H
(BUSRQ)
アドレスバス: ハイインピーダンス
データバス: ハイインピーダンス
MREQ: ハイインピーダンス
IORQ: ハイインピーダンス
RD: ハイインピーダンス
WR: ハイインピーダンス
ハイインピーダンスというのはLでもHでもない開放状態になるので、もし何かのICが接続されていて入力が不定になると困る場合、プルアップかプルダウン抵抗を追加しなければなりません。
BUSRQの場合、Z80が自分以外にバスを明け渡しています。RD,WRも自由に操作してくれという感じですね。
一方、RESET中のMREQ等はHレベルで、完全に明け渡したのではありません。
RESETの場合、MREQ等についてはプルアップ抵抗不要で済むわけです。
RESET=LでZ80のアドレス、データバスがハイインピーダンスになっても、すぐにDMA回路がドライブするから、これらは不定になりません。
この場合のDMAは、我々がトグルスイッチ等から(アドレス、データ指定して)RAMに書き込んだり、逆にアドレスを指定してRAMから読み出してLED表示するといった、手動の操作をさします。
RESETをL固定にした場合と、BUSRQをLにした場合では信号の変化に違いがあります。
(RESET)
アドレスバス: ハイインピーダンス
データバス: ハイインピーダンス
MREQ: H
IORQ: H
RD: H
WR: H
(BUSRQ)
アドレスバス: ハイインピーダンス
データバス: ハイインピーダンス
MREQ: ハイインピーダンス
IORQ: ハイインピーダンス
RD: ハイインピーダンス
WR: ハイインピーダンス
ハイインピーダンスというのはLでもHでもない開放状態になるので、もし何かのICが接続されていて入力が不定になると困る場合、プルアップかプルダウン抵抗を追加しなければなりません。
BUSRQの場合、Z80が自分以外にバスを明け渡しています。RD,WRも自由に操作してくれという感じですね。
一方、RESET中のMREQ等はHレベルで、完全に明け渡したのではありません。
RESETの場合、MREQ等についてはプルアップ抵抗不要で済むわけです。
RESET=LでZ80のアドレス、データバスがハイインピーダンスになっても、すぐにDMA回路がドライブするから、これらは不定になりません。
シンプルZ80マイコン(4)
2025.09.11
シンプルに仕上げたいと思えば部品を減らしたくなるものです。
しかしI/Oまで付けないと、動かした結果を見たり、何らかの入力ができなくて困ります。
じゃあ、8255でもくっつけようか、となります。
そこでアドレスデコーダが必要になると考えるでしょう。
でも、本当にそれだけ(8255を1個)しか接続しないという条件ならば、アドレスデコーダを省略してもとりあえず使えます。
Z80の/IORQ信号を、8255の/CSに直接つないでしまう。これなら単純にI/Oアクセスで8255が選ばれます。アドレスは全部8255の4バイトずつの繰り返しで埋め尽くされます。
8255でなくても、入力のバッファと出力のラッチをたとえばLS244とLS273あたりで・・・さらに若干のロジックが必要になりそうです。結局ICは何個必要になるか。それなら8255を1個使ったほうが楽でしょう。
クロックの発振回路は、
市販のオシレータ(通称:銀水晶 ・・・ってセーラームーンか)が手軽でしょう。
近頃あまり5V用は売ってないようです。特価処分で安かったりします。
Z80Aのクロックに合わせてたとえば4MHzにします。
低い周波数でもとにかく発振していればよいなら、色々な発振回路がありますのでそれが視野に入ります。
なるべくシンプルに簡単に楽をして作れるように工夫します。
さて、続くのでしょうか。
しかしI/Oまで付けないと、動かした結果を見たり、何らかの入力ができなくて困ります。
じゃあ、8255でもくっつけようか、となります。
そこでアドレスデコーダが必要になると考えるでしょう。
でも、本当にそれだけ(8255を1個)しか接続しないという条件ならば、アドレスデコーダを省略してもとりあえず使えます。
Z80の/IORQ信号を、8255の/CSに直接つないでしまう。これなら単純にI/Oアクセスで8255が選ばれます。アドレスは全部8255の4バイトずつの繰り返しで埋め尽くされます。
8255でなくても、入力のバッファと出力のラッチをたとえばLS244とLS273あたりで・・・さらに若干のロジックが必要になりそうです。結局ICは何個必要になるか。それなら8255を1個使ったほうが楽でしょう。
クロックの発振回路は、
市販のオシレータ(通称:銀水晶 ・・・ってセーラームーンか)が手軽でしょう。
近頃あまり5V用は売ってないようです。特価処分で安かったりします。
Z80Aのクロックに合わせてたとえば4MHzにします。
低い周波数でもとにかく発振していればよいなら、色々な発振回路がありますのでそれが視野に入ります。
なるべくシンプルに簡単に楽をして作れるように工夫します。
さて、続くのでしょうか。
シンプルZ80マイコン(3)
2025.09.11
アドレスとデータの操作スイッチ
トグルスイッチを並べたものを良く見かけます。
フロントパネルにLEDと共に並べると格好良いかもしれませんが、加工は大変だし、値段もそれなりにかかります。
当時の自分が選んだのはDIPロータリースイッチ(16進数)
たとえば秋月で売っている販売コード102276のようなもの。
自分が買ったのはオムロンの製品で、当時はかなり高価でした。確か600円かそれ以上。
何も知らずに買ってきたが、じつは正論理と負論理を間違えて失敗した。
論理が逆じゃないかと。
対策としては、バッファを論理の異なるものに替える。たとえばLS541とLS540とか。
当時どうしたっけ。
DIPスイッチの信号をプルアップしてCOMをGNDに落とすんじゃなくて、プルダウンでCOMは+5Vにしたっけ。もう忘れてしまいました。
LS541で思い出したが、私が就職したばかりの頃、先輩方から
「そんな便利なICを使うなんてナマイキだ」
「LS244と245でなんとかしろ」
などと言われたものでした。(なんでそんな制約を受けないといけないのか、意味がわかりません)
もしトグルスイッチで構成する場合、スイッチを上下どっちにした時に0か1か、そんなところまで細かく考えて実施する必要があります。慣れた人にはそんなの当たり前かもしれませんが、なかなか最初は気づかなくて、あれっ逆じゃないかと、初めて作ってから気づくものです。
DIPロータリースイッチは、組み上がった後で後悔しました。
あれは本来、頻繁にぐるぐる回す物じゃないんです。
プログラムをひたすら入力しながら、こんなにぐるぐる回していたら早く壊れそうな感じがしました。
だから、おすすめしません。
トグルスイッチを並べたものを良く見かけます。
フロントパネルにLEDと共に並べると格好良いかもしれませんが、加工は大変だし、値段もそれなりにかかります。
当時の自分が選んだのはDIPロータリースイッチ(16進数)
たとえば秋月で売っている販売コード102276のようなもの。
自分が買ったのはオムロンの製品で、当時はかなり高価でした。確か600円かそれ以上。
何も知らずに買ってきたが、じつは正論理と負論理を間違えて失敗した。
論理が逆じゃないかと。
対策としては、バッファを論理の異なるものに替える。たとえばLS541とLS540とか。
当時どうしたっけ。
DIPスイッチの信号をプルアップしてCOMをGNDに落とすんじゃなくて、プルダウンでCOMは+5Vにしたっけ。もう忘れてしまいました。
LS541で思い出したが、私が就職したばかりの頃、先輩方から
「そんな便利なICを使うなんてナマイキだ」
「LS244と245でなんとかしろ」
などと言われたものでした。(なんでそんな制約を受けないといけないのか、意味がわかりません)
もしトグルスイッチで構成する場合、スイッチを上下どっちにした時に0か1か、そんなところまで細かく考えて実施する必要があります。慣れた人にはそんなの当たり前かもしれませんが、なかなか最初は気づかなくて、あれっ逆じゃないかと、初めて作ってから気づくものです。
DIPロータリースイッチは、組み上がった後で後悔しました。
あれは本来、頻繁にぐるぐる回す物じゃないんです。
プログラムをひたすら入力しながら、こんなにぐるぐる回していたら早く壊れそうな感じがしました。
だから、おすすめしません。
シンプルZ80マイコン(2)
2025.09.11
コンピュータとは、すなわち配線なり。
とにかく配線が大変だと思えば良いです。
トランジスタ百万個とか数千万個を集積・・・と聞きますが、実際にはトランジスタ等の素子同士をつなぐ配線のほうが多くの面積を占めていると思います。
昔、通っていた学校には汎用機(メインフレーム)があり、後ろの穴からのぞきこむと、ラッピング線がたくさん接続されていました。CPUを構成する基板が何枚もささっていて、これらをお互いに接続する為のバックプレーンの配線です。
4ビット、8ビット、16ビット、32ビット、64ビット、ということは、それだけ配線の数が増えるということです。
64ビットを手配線することを想像すれば、データ8本、アドレス16本のZ80なんか楽だと思うことにしましょう。(今後も時々思い出しながら配線すると、難行苦行も難なくこなせるかも)
さて、本に載っていた簡単マイコン回路の課題を書きます。
あの頃は何も知らず、書いてある通りに作るしかありませんでした。
就職してから上司に聞いてみると、わけのわからない事を言われて頭がパンクしました。
そのレベルに追いつくまでずいぶん時間を要しましたが、いまでは下記のように説明できます。
この回路の課題
■リセット回路
(1)立ち上がりが遅い場合、/RESETがバタついてZ80が不安定になる事がある。
シュミットトリガ74LS14等を通して入力する事。
(2)この回路では瞬間的な電圧低下に対してリセットがかからない場合がある。
放電用としてDがついているけれど短時間にON/OFFされると放電しきれずリセットがかからない場合がある。
実験的には構わないが、リセットIC(電圧検出)を付けること。
(3)リセットスイッチSW1で電解コンデンサをショートしているので、瞬間的に大電流が流れ、接点を傷める。
SW1と直列に数十Ωを接続すること。
■制御信号/MREQ、/WR
ダイオードを通している為、その順方向電圧によりLレベルが持ち上がるのでノイズマージンが低下する。
Lレベルが持ち上がりすぎると正常に動作しないことがある。
もしどうしてもダイオードを使うならショットキーダイオードを使用することが望ましい。
当時は最初ダイオードで試してなぜかうまくいかず(ほかの原因もあったでしょうけれど)、結局はICをいくつか使った回路にしてようやく動きました。
■DMA
BUSREQとBUSACKを使うやり方が多いと思うけど、単純にZ80にリセットをかけ続ける(Lレベル継続)とバスが開放されるので、アドレス・データスイッチからDMAが可能となる。
これでRAMに直接プログラムを書いたり読んだりする。
BUSREQでバスを開放させた場合と、RESETをかけ続けてバスを開放させた場合での違いについて、データシートの記述を良く確認して比較してみる。
MREQ, RD, WRの信号がハイインピーダンスになるか、Hレベルになるか、そういった違いもあったような気がする。(年数経過で忘れた。要確認)
■クロック
そのマイコンが対応できる最大の周波数にしたくなるのが人の性
それ以上にしてみたくなる人の性
さらに、どこまでいけるか試してみたくなるのも人の性
実験で動かしてみるだけなら遅いクロックで十分。
それでも人間より速い。
かえって遅くしたほうが、目で動きが追えるので面白い。
注意:NMOS版Z80では最低動作周波数がある。内部がダイナミック回路になっているため。
CMOS版では手動クロックでも動作可能。
押しボタンの信号をチャタリング処理して、クロックとして与える。
1クロックずつの動作を追ってみるのも勉強になる。
NMOS版ではクロックの入力条件が本来は厳しい。
おそらく内部でクロックをたくさん分配しているから負荷が重たいのだろうけど、いろんな製作例を見ても、厳密にはほとんど条件を満足していないようです。
それでもとりあえず動いています。
■DMA部
スイッチ側のアドレス・データにはバッファを入れる。/RESET=Lの時だけバッファをイネーブルする。
■そのほか
バスにプルアップ抵抗を入れるべきかどうか。入れておくと良い。
参考値10KΩで、コモンタイプの抵抗アレイ8素子入が使いやすい。
バスの使用条件でハイインピーダンスになる場合があるなら入れるべき。/RESET=Lの時とか、BUSREQ=Lの時とか。
とにかく配線が大変だと思えば良いです。
トランジスタ百万個とか数千万個を集積・・・と聞きますが、実際にはトランジスタ等の素子同士をつなぐ配線のほうが多くの面積を占めていると思います。
昔、通っていた学校には汎用機(メインフレーム)があり、後ろの穴からのぞきこむと、ラッピング線がたくさん接続されていました。CPUを構成する基板が何枚もささっていて、これらをお互いに接続する為のバックプレーンの配線です。
4ビット、8ビット、16ビット、32ビット、64ビット、ということは、それだけ配線の数が増えるということです。
64ビットを手配線することを想像すれば、データ8本、アドレス16本のZ80なんか楽だと思うことにしましょう。(今後も時々思い出しながら配線すると、難行苦行も難なくこなせるかも)
さて、本に載っていた簡単マイコン回路の課題を書きます。
あの頃は何も知らず、書いてある通りに作るしかありませんでした。
就職してから上司に聞いてみると、わけのわからない事を言われて頭がパンクしました。
そのレベルに追いつくまでずいぶん時間を要しましたが、いまでは下記のように説明できます。
この回路の課題
■リセット回路
(1)立ち上がりが遅い場合、/RESETがバタついてZ80が不安定になる事がある。
シュミットトリガ74LS14等を通して入力する事。
(2)この回路では瞬間的な電圧低下に対してリセットがかからない場合がある。
放電用としてDがついているけれど短時間にON/OFFされると放電しきれずリセットがかからない場合がある。
実験的には構わないが、リセットIC(電圧検出)を付けること。
(3)リセットスイッチSW1で電解コンデンサをショートしているので、瞬間的に大電流が流れ、接点を傷める。
SW1と直列に数十Ωを接続すること。
■制御信号/MREQ、/WR
ダイオードを通している為、その順方向電圧によりLレベルが持ち上がるのでノイズマージンが低下する。
Lレベルが持ち上がりすぎると正常に動作しないことがある。
もしどうしてもダイオードを使うならショットキーダイオードを使用することが望ましい。
当時は最初ダイオードで試してなぜかうまくいかず(ほかの原因もあったでしょうけれど)、結局はICをいくつか使った回路にしてようやく動きました。
■DMA
BUSREQとBUSACKを使うやり方が多いと思うけど、単純にZ80にリセットをかけ続ける(Lレベル継続)とバスが開放されるので、アドレス・データスイッチからDMAが可能となる。
これでRAMに直接プログラムを書いたり読んだりする。
BUSREQでバスを開放させた場合と、RESETをかけ続けてバスを開放させた場合での違いについて、データシートの記述を良く確認して比較してみる。
MREQ, RD, WRの信号がハイインピーダンスになるか、Hレベルになるか、そういった違いもあったような気がする。(年数経過で忘れた。要確認)
■クロック
そのマイコンが対応できる最大の周波数にしたくなるのが人の性
それ以上にしてみたくなる人の性
さらに、どこまでいけるか試してみたくなるのも人の性
実験で動かしてみるだけなら遅いクロックで十分。
それでも人間より速い。
かえって遅くしたほうが、目で動きが追えるので面白い。
注意:NMOS版Z80では最低動作周波数がある。内部がダイナミック回路になっているため。
CMOS版では手動クロックでも動作可能。
押しボタンの信号をチャタリング処理して、クロックとして与える。
1クロックずつの動作を追ってみるのも勉強になる。
NMOS版ではクロックの入力条件が本来は厳しい。
おそらく内部でクロックをたくさん分配しているから負荷が重たいのだろうけど、いろんな製作例を見ても、厳密にはほとんど条件を満足していないようです。
それでもとりあえず動いています。
■DMA部
スイッチ側のアドレス・データにはバッファを入れる。/RESET=Lの時だけバッファをイネーブルする。
■そのほか
バスにプルアップ抵抗を入れるべきかどうか。入れておくと良い。
参考値10KΩで、コモンタイプの抵抗アレイ8素子入が使いやすい。
バスの使用条件でハイインピーダンスになる場合があるなら入れるべき。/RESET=Lの時とか、BUSREQ=Lの時とか。