X680x0用10M RAMボードの制作



はじめに

という訳で、X68用の外部メモリとして、30pinのSIMMを使ったボードを 作ってみたいと思います。 実は巷に流れている奥山氏の物と回路的には全く同じです。 トランジスタ技術にも掲載されていたことがあります。 最近では、「XSIMM10」なんていう、全く同機能なボードも発売されているのですが。 そういった意味では、あまり価値が無いかもしれませんが、ハードウェアの勉強を兼ねて 作ってみるのも面白いと思います。
成功の秘訣としては「ほんの少しの知識と根気」です。 素人の方でもなんとか出来るのではないかと考えてます。 一応クロックアップ機にも対応という形になっています。 私のEXPERT(17MHz)でもNoWaitで動作中です。

回路図

.PSファイルです。落としていってください。この後の説明は回路図が無いと わかりにくいかもしれません。
回路図はここ

気になる値段

合計 7000円+α

値段的には、まあこんなものだと思います。 SIMMの値段が入っていませんので注意してください。 SIMMはアクセスタイムは80ns程度で良いようです。パリティはあってもなくてもかまいません。 うまくいけば全て込み20000円程でフル実装です。メモリも安くなりました。

パリティビット

パリティビットというのは、誤り符号用のビットで、1バイト中にHighの数が 偶数個または奇数個あるかを記憶しておくものです。 通信なんかではよく出てきます。 IBM/PC用にはこのパリティが付いていますが、Mac用にはありません。 今回このビットは使わないので、どちらかというと無い方が良いと思われますが、 別にそれほど関係ないと思います。

材料の注意点

X68用の基板は、現在ではあまり手に入らないようです。大阪・日本橋、東京・秋葉原辺り でないと手に入らないかもしれません。大阪の共立電子では通信販売も行なっているようで、 近くにパーツ屋が無い方は連絡してみるのもいいでしょう。
斜めのSIMMソケットは、二つ分が一緒になったタイプです。 PROなどスロットに余裕のある方は、立て型ソケットでも良いでしょう。 立て型の方が少し安いですが、スロットは二つ分占領します。
ICですが、ASタイプのものはFタイプのものでもかまいません。 また158は157でもかまいません。 74ALS04は74LS04でも多分大丈夫でしょう。74LS07は7407でもかまいません。
このボードはGALを使っています。 卑怯と言われようが、何と言われようが、GALを使います。 秋葉原のT-ZONEというパーツショップでは、GALの書き込みサービス(有料)を 行なっているようです。
抵抗ですが、20個ほど用意しておいてください。抵抗値は数十Ωでいいはずです。 集合抵抗の方は、3.3k〜10kの間で良いと思います。
積層コンデンサも20個ほどいると思われます。電解コンデンサも二個程あったらいいな。 ICソケットですが、素人ほど必要だと思います。 私はいつも全てICソケットを使っています。 安いバンディ製でも丸ピンの高いやつでもかまいませんが、 やはり高い方が色々な点で優秀です。しかし、ICより高い可能性がありますので 注意してください。GALだけは丸ピンってのでも良いですけど。

第一段階

まずは電源とGNDを配線します。 X68側のカードエッジの配列は、X68の取説に載っていますので、そちらを参考にしてください。 共立電子で買った基板は、電源とGNDが基板の周りをぐるっとまわっている パターン付きなので、楽に配線できます。 SIMMのピン配列ですが、次のようになっています。

123456789101112131415
VCCCASDQ0A0A1DQ1A2A3GNDDQ2A4A5DQ3A6A7
161718192021222324252627282930
DQ4A8A9A10DQ5WEGNDDQ6NCDQ7Q8RASCA8D8VCC

VCCというのが電源です。後半のQ8 CA8 D8というのは、パリティ用のピンです。 これは4MSIMMのものですが、1MSIMMでは19番がNCになっています。 NCというのは、NonConectの略で、何にも繋っていないという意味です。 ICの電源は1番ピンの向かい側、GNDはその対角線上の端のピンです。
さて、電源・GNDの配線が終わった所で、バイパスコンデンサ(略してパスコン)を 取り付けます。これは、IC等の電源とGNDの間にコンデンサを取り付け、 ノイズを減少させる物です。 コンデンサは直流を流しません。しかし、ノイズ等により電源・GNDの電位が変化した時、 その変化分をコンデンサが吸収する仕組になっています。クッションの様な働きです。 電源・GNDの大元には、電解コンデンサを取り付けておいた方が良いかもしれません。 電解コンデンサには、極性と対圧限界があるので注意してください。 GNDの方に、「−」表記があるものを取り付けてください。 対圧の方は、6.3V程度で良いと思います。容量は330μFを使いました。 そこまで配線を行なえば、テスターで電源とGNDがショートしていないか確かめてください。 具体的にいうと、抵抗レンジにして電源とGNDにピンを付けます。 コンデンサがついている関係上、一瞬針が振れます。 抵抗値がほぼ無限大になればOKです。 が、ソケットを付けずにICを直接半田付けしてしまった場合、 抵抗値は無限大にはなりませんので気をつけてください。 この場合は、抵抗値が0でなければ良いと考えます。

第二段階

後は回路図通り配線するだけです。 この時、SIMMのアドレス・CAS・RAS・WEには、ソケットのピンと信号線の間に抵抗を 配線してください。 これは、ダンピング抵抗と呼ばれるもので、ノイズやアンダー等を除くものです。 アンダーやオーバーというのは、信号線の先にたくさんのチップが接続されていた場合、 信号変化時に非常に大きなノイズができることをいいます。
SIMMの場合、上記の信号線には、8チップの場合8つものチップが 信号線の先にぶら下がっています。 データ線の場合は繋ってるチップが一つですので、取り付ける必要はありません。 しかし、抵抗値が大きくなるにつれ、信号の伝播遅延が出ます。 しかしまあ、数十Ωなら大丈夫でしょう。 データバスは集合抵抗でプルアップしておきましょう。無くてもかまいませんが。 取り付け位置は、74AS245とSIMMの間でかまいません。
配線が終了したら、配線一本一本をチェックします。 また、配線だけでなく、隣通しの線が繋っていないか、電源やGNDと短絡していないかも チェックしておきましょう。 これは二〜三回チェックしておいた方が良いでしょう。 断線、半田付け不良等を完全に無くしてください。 これを怠ると、後からのデバッグが非常に困難です。

プルアップ

プルアップとは、信号を(抵抗を通して)電源と繋ぐことを言います。 どうして途中に抵抗を通すかというと、信号がLowレベル(0V)の時、抵抗が無いと 電源とGNDが短絡してしまいます。これを避けるために抵抗がついている訳です。 で、この抵抗には絶えず電流が少しながら流れています。 そのため弱い信号なんかの電流を補給し、強い信号に変えることができるのです。 また、信号をHigh固定にしたい場合、電源を直接繋いでも良いのですが、 本体電源ON・OFF時には、規定電圧以上の電圧がかかる可能性があります。 そういった場合のために、抵抗を入れておくこともあります。

各ICの役割

74AS245は、いわゆるバスバッファです。 トライステート出力で、本体とボード上のデータバスの内容を繋いだり切ったりする 働きをします。どんな拡張ボードにも付いています(あたり前ですが)。 何故かというと、データバス上のデータがぶつかると困るからです。 本体のI/Oからデータが出ているのに、ボード上のRAMのデータが本体のデータバスにのると 非常に危険です。出力がぶつかると壊れる素子があるかもしれません。
74AS158は、アドレスセレクトに使います。 二つの信号を片方づつ出力します。これは、DRAMの仕様ですので、後述します。
74ALS04は、タイミング生成に使っています。 信号が04を通る時間を使って、タイミングを作っています。 かなり良くない例です。本当はちゃんとしたディレイ素子を使わなければいけないのですが、 手軽さでこっちを選んでしまいました。
74LS07は、DTACK信号のためだけに使う、オープンコレクタ出力のバッファです。 これは、信号自体は変化しません。DTACK信号は直接繋ぐとまずいので、 間に07を挟んでいます。
GALですが、片方はアドレスデコードに使っています。 アドレスバスの最上位から、SIMMをアクセスするかどうかを決めています。 もう片方は様々なSIMM用の信号等を作っています。 普通のTTLでは4〜5個になる物も、GALでは一個で済みます。

バッファ

信号内容を変えないで出力するものをバッファ、信号内容を反転するNOTの役割をするものを インバータといいます。 また出力状態も、スリーステイト(3-STATE)・オープンコレクタ・トーテムポール等が あります。

GALのプログラミング

今回のボードでは、様々な信号の作成にはGALを使用しています。
最初のGALでは、アドレスバスの上位を使ってアドレスデコードに使っています。 アドレスが$200000〜$9FFFFFまでの間だとSIMM_1の方をアクセスするためにRAM1の信号を、 $A00000〜$BFFFFFまでの間だとSIMM_2の方をアクセスするためにRAM2の信号を作ります。 この部分を変えることによって、1MSIMMを4枚にでも変更は可能です。
もう一つのGALでは、SIMM用の信号とアドレスセレクタ、DTACK、リフレッシュ等の 信号を生成しています。
GALのプログラムリストというのは、GALをプログラムするために人間に分かりやすいように 書かれたファイルで、それをコンパイルすることによってJEDECファイルにします。 GALを焼く場合、このJEDECファイルが基本となっています。 このファイルを焼いてくれる所へ持って行くことによって、希望のGALを焼いてもらえます。 等価回路図では、全て正論理で描かれています。 ハードに長けた人だと非常に見にくいでしょうが、勘弁してください。
GAL用JEDECファイルと等価回路(.PS)はここ

RAM

一般のRAMの種類は大きく分けてD(Dynamic)RAMとS(Static)RAMの二種類あります。 SRAMはトランジスタで出来ているのですが、DRAMはコンデンサで出来ているために 放って置くとどんどん電荷が無くなってしまい、内容が無くなってしまいます。 このためDRAMは、リフレッシュといわれる定期的に再書き込み行なう動作をしなくては いけません。
SRAMの方はリフレッシュは必要ありません。が、DRAMより高価で発熱量も多く 集積率も上がらないため、大容量メモリではDRAMを使います。 しかしSRAMの方が高速アクセスが可能なため、キャッシュメモリとしても使われています。

DRAMの信号とアクセス方法

DRAMには様々な信号が必要になります。これはDRAMへのアクセス方法によるもので、 仕方がありません。
RAMをアクセスするには、アドレスを与えてデータを受け取る、またはデータを書き込むという 動作で良い訳です。
DRAMにはアドレス線は、使用される本数の半分しかピンはありません。 出力が1ビットの場合、256kビット(32kバイト)のDRAMには9本しかアドレス線はありません。 では、どうやってアドレスを受け渡すかというと、アドレスを二つに分けてしまいます。 これは、DRAM内部でのアクセスする際のアドレスの与え方が、ColumnとRowに別れているからです。 メモリ空間を正方行列と考えるとColumnをいうのは列でRowは行にあたります。 Row時のアドレスをDRAMのアドレスに与えた場合、今のアドレスがRowのアドレスだと DRAMに教える信号がRAS(RowAddressStrobe)といいます。Culumnアドレスだと 教える信号はCAS(ColumnAddressStrobe)といいます。 アドレスの与える順番は決まっていてRowアドレスの方を先にします。 このアドレスを切り替える役目をしているのが、アドレスセレクトICで、今回では74AS158を それとして使っています。
読み込み時のアクセス方法を書いてみると
1・RowアドレスをDRAMのアドレス線に出力する。
2・DRAMにRowアドレスが出ていることを知らせる(RASをアクティブに)。
3・ColumnアドレスをDRAMのアドレス線に出力する。
4・DRAMにColumnアドレスが出ていることを知らせる(CASをアクティブに)。
5・データを取り出す。
6・RAS CASをノンアクティブにする。
DRAMがアドレスと取り込む時期は、RAS CASがアクティブになった瞬間に、取り込むので その後にアドレスが変化してもかまいません(CASは変化すると駄目なRAMもあります)。 現在の状態が、書き込みなのか読み込みなのかを教える信号として、WE(WriteEnable)があります。 これがアクティブの時は書き込み時、そうでない時は読み込み時となっています。 DRAMには書き込みモードが二つあります。今回はEarlyWriteというものを使います。 これはアドレスを与える前にWEをアクティブにしておく方法です。WEをCASの後に出す DelaiedWriteというものもあります。
アドレスの与え方は読み込みの時と同じです。CASがアクティブになった時に、 データがDRAMに取り込まれます。

リフレッシュ

前述したようにDRAMは放っておくと中身が消えてしまいます。 そこで一定期間ごとにリフレッシュをしてやらなくてはなりません。
こいつはとても面倒で、リフレッシュ中はCPUがメモリをアクセスしたくてもできません。 今回は、本体が出しているリフレッシュ信号をそのまま使用しています。 リフレッシュが必要になる時間がDRAM毎に異なりますが、本体用のが最低限らしいので、 大丈夫だと思います。
リフレッシュにも種類があるのですが、今回はCAS Before RASという方法を取ります。 これは普通にアクセスする時は、RASの方を先にアクティブにするのですが、 CASを先にアクティブにするとDRAMが自分で勝手にリフレッシュモードに入ってくれ、 RASを下げることによってリフレッシュが完成します。 ですから、外部信号で行なうことは、CASとRASをアクティブにすることだけです。 この時アドレスは関係ありません。
昔はRAS Onlyリフレッシュといって、Rowアドレスを回路が与えてRASだけをアクティブにする 方法でした。これだと、Rowアドレスを全て変化させてリフレッシュを行なわなくてはいけません。 一回だけだとそのRowアドレスのところしかリフレッシュしてくれないからです。 CAS Before RASでは、DRAMが内部にカウンタを持っているため勝手に全部してくれます。 Z80ではM1サイクル(命令解読周期)にリフレッシュ用にRowアドレスが順番に 出ています。またその内容はRレジスタに入っています。

X68の信号

単純なRAMボードを作るといっても本体からの信号を使っていろいろ制御してやらなくては いけません。
データバスとアドレスバスは、その名の通りデータとアドレスの通り道です。 で、そのデータとアドレスの内容が現在バス上にのっていると68kが周辺に知らせるのが、 AS(AddressStrobe)・UDS(UpperDataStrobe)・LDS(LowerDataStrobe)の信号です。
68kはワードアクセス(2バイト)が基本となっているので(だからワードなんですが)、 アドレスのA0はありません。ですから、最小アクセス単位が1ワードになってしまいます。 1バイトだけ読み書きしたい場合は、UDS LDSの信号を制御することで実現しています。
そして周辺がデータを受け取ることが出来た事を、または受け渡すデータの準備が出来たことを 68kに知らせる信号がDTACK(DataTransferACKnowledge)です。 68kは4クロックを基本周期としているのですが、3クロック目までにこのDTACKが アクティブにならないと(周辺が返さないと)、68kは周辺がデータを受け取ったり作ったりするのを 待ちます。これがいわゆるwaitが入るというやつです。
遅いメモリだと、データが確定するまで時間がかかるので、この状態でwaitを入れます。 しかし、いつまで経ってもDTACKが返ってこないと、68kはバスエラーを起こしてしまいます。 本当はこのように、データの準備が出来てからDTACKを返さなくてはいけないのですが、 今回のボードではそんなことはお構い無しに返しています。 こうするとどんな場合でもNoWaitで動作するのですが、メモリ側が遅いと全然違う 内容を読んだり書いたりしてしまいます。 こうならないために、ボード側でしっかりとデータを読み書きさせないといけません。
今回のボードでリフレッシュ関係の信号は、本体が本体メモリのために使っている信号を そのまま使用しています。 INH2という信号は、本体メモリをリフレッシュしている時に出る信号だそうです。

アクセスタイミング

DRAMをアクセスする上で、非常に大事な要因にタイミングというのがあります。 これが一般の人がDRAMを接続するのを妨げています。 そこで、非常に簡単なタイミング表を使って説明したいと思います。
まず、ASの立ち下がりからGAL一個の伝播遅延分でRASがアクティブになります。 今回使うGALが最大25nsの遅延ということなので、15ns遅れると仮定しましょう。 RASからCASまでの間の時間をRAS-CAS遅れ時間をいい、数十nsの時間必要とします。 また、その間にアドレスを変化させます。 このRAS-CAS遅れ時間の生成に、ALS04を三段通して遅延を作っています。 規格表などで30ns程度の時間を作ることができます。 またGALを通るので、合わせて45nsの時間があり、十分だと思われます。 DRAMからデータが出力されるのは、RASがアクティブになってからアクセスタイム分、 後になってからのことです。いわゆる速いRAMというのは、このアクセスタイムが短い 物のことを言います。
タイミング表では、10MHzのものでも15MHzのものでも結構余裕があることがわかります。 が、DRAMは一度読み出すとそのメモリ内容は消えてしまいます。 そのため、DRAM自身がその消えたところを修復するのですが、その修復にかかる時間を プリチャージタイムといいます。これは、RASがHighになってから次にRASがLowに なるまでの最短時間を表わし、アクセスタイムが80nsのDRAMでは60ns程度のはずです。 15MHzで1クロックは66.7nsです。RASがHighになってASがLowになるまでが、 ほぼ1クロックですので、こう考えると結構危ないなとも思えます。
1クロックが60nsになるのは、16.6MHz程度です。 まあ、多少はマージンがあるでしょうから、80nsのメモリで動かせるのは17MHz程度まででしょうか。 アクセスタイムやプリチャージタイム自身はDRAMの種類によって違いますから、 はっきりとは言えませんが。 どうしてもデータが不安定になる場合(たぶん高クロック時になると思いますが)、 残念ながらWAITをいれることになります。 これはDTACK出力をRASと同じに設計しているのを、CASと同じに出るように変更するだけで うまくいきます。 これで、データ出力に間に合わない時だけWAITが入ります。 やはり安定動作するにこしたことはありません。

リフレッシュタイミング

リフレッシュの方のタイミングも必要です。 これは本体側のリフレッシュに併せているので、ボード側ではCASの後にRASを出す程度の タイミングを生成します。 これも04を三段通すことで遅延を作り出しています。
この辺りのCAS-RAS時間等はDRAMによって異なりますので、だいたいで作ってしまってます。 物によってはALS04では短過ぎるかもしてません。そんな時はLS04で試してみてください。

チェック

配線を完了し基板上のチェックをおえたら、いよいよ接続します。
まずSWITCH.X等でメモリを12Mに設定して、立ち上げ直します。
どうでしょうか、MEMFREEで驚く程メモリがありますか?
そこで、メモリチェックプログラムを走らせ、メモリ化けが無いかどうか調べます。 次はメモリチェックが厳しいといわれているSX-WindowやOS-9を立ち上げてみましょう。 これでちゃんと立ち上がった方のボードは大丈夫です。 おめでとうございます。

トラブルシューティング

電源を入れて、本体が不思議な動作になってしまった場合、すぐに電源を切りましょう。 その時、前の電源で落ちない可能性があります。そんな時は、後ろの電源を切るかコンセントを 素早く抜きましょう。
変な匂いや火花が出た場合も同様にします。 しかし、その場合には二度と立ち上がらないかもしれませんが・・・
不運にも駄目だった方への今後の対策ですが、次のような症状の場合が上げられます。
症状対策
電源を入れると「びー」という音がする。 電源がショートしています。あれ程注意しろと言ったのに。
電源を入れるとディスプレイが31kHzにならずに止まってしまう。前電源で落ちない。 DTACK関係がおかしい可能性があります。GNDに落ちてるかもしれません。
「リセットしてください」と出る。 データバスバッファがおかしい可能性があります。IDDIRやGなどの信号がおかしいかも。 SRAM常駐物がおかしい場合もありますので、OPT.1を押して立ち上げてもみます。
メモリチェックでバスエラーがでる。 DTACKが返ってきていません。その辺をチェックしましょう。
メモリチェックでひっかかった。 一番最初のアドレスの場合($200000)、デバッガを使ってメモリ内容を見てみましょう。
FFFFしかない場合、制御信号線がおかしいです。バスバッファまたはRAMが動作していません。
エラーが途中のアドレスで出て来る場合、タイミング・ノイズ等の問題です。 コンデンサを増やしてみたり、ダンピング抵抗の値を変えてみましょう。
一つのアドレスに書き込むと違うアドレスまで変わってしまう場合、 アドレス線がおかしいです。アドレス線を十分調べましょう。 デバッガを使えば、どのアドレスが悪いのかもわかるはずです。

それから

動いたといっても少しの間は、試験運用期間としてメモリをいろいろといじめてみましょう。 それでも完全動作している場合、完成だといっても良いと思います。
ただ、半年間は安心してはいけません。ある日突然動かなくなることもあります。 たいていの場合、半田付け不良のようですが。
ということで、次は何に挑戦しましょうか・・・


X680x0のコーナーに戻る

KFB00023@にふてぃ