前回の問題点を考慮し、2点見直しました。
- メモリへの /RD をステータス信号と CLK から前倒し生成する。 30nS くらい早くなる。
- シリアル系の IO を READ でも 1wait 入れる。
その結果、F244 → GAL16v8A-7 に変更です。ピンに余裕ができたので BUSAK 信号も生成し、回路はこうなりました。
次に、PLD を順に載せます。
------>8------------>8------------>8------------>8----------
Name U99KCTL0;
Partno KF007016;
Date 21/01/02;
Revision 01;
Designer efialtes_htn;
Company E. Design;
Assembly System 18 TMS99105 decorder 0;
Location U08;
Device g20v8;
/* *************************************************************** */
/* System 1Q IO decorder Glue logic */
/* */
/* *************************************************************** */
/* target device GAL20V8-15 */
/* *************************************************************** */
/** inputs **/
Pin 1 = CLK;
Pin 2 = ale;
Pin 3 = !mem;
Pin 4 = !we;
Pin 5 = bst1;
Pin 6 = bst2;
Pin 7 = bst3;
Pin 8 = !rdi;
Pin 9 = !wait;
Pin 10 = busak;
Pin 11 = a15;
Pin 13 = !oe;
Pin 14 = !romw;
Pin 23 = rsv1;
/** outputs **/
Pin 15 = !inta;
Pin 16 = !ie;
Pin 17 = bg;
Pin 18 = sio;
Pin 19 = sio2;
Pin 20 = rsv2;
Pin 21 = clk2;
Pin 22 = rdyo;
/* logic equations */
is_rdy = (!sio & !sio2 & !a15 & !mem & !bst1 & bst2 & bst3) #
(!sio & mem & !a15 & romw);
inta = !mem & bst1 & !bst2 & bst3;
ie = a15 & !mem & !bst1 & bst2 & bst3;
sio.d = is_rdy;
sio2.d = sio & !mem;
rdyo = (!sio & mem & !a15 & romw) # wait # (sio & !a15 & !mem & !bst1 & bst2 & bst3);
bg = (!mem & a15 & !bst1 & bst2 & bst3 & !ale) # (mem & rdi) # (mem & we);
clk2.d = !clk2;
inta.oe = !busak;
ie.oe = !busak;
ioclk.oe = 'b'1;
rdyo.oe = 'b'1;
------>8------------>8------------>8------------>8----------
Name U99KCTL1;
Partno KF007017;
Date 21/01/02;
Revision 01;
Designer efialtes_htn;
Company E. Design;
Assembly System 18 TMS99105 decorder 1;
Location U09;
Device g16v8;
/* *************************************************************** */
/* System 1Q IO decorder Glue logic */
/* */
/* *************************************************************** */
/* target device GAL16V8-10 or faster */
/* *************************************************************** */
/** inputs **/
Pin 1 = CLK;
Pin 2 = !mem;
Pin 3 = rwi;
Pin 4 = !we;
Pin 5 = bst1;
Pin 6 = bst2;
Pin 7 = bst3;
Pin 8 = a06;
Pin 9 = !rdi;
Pin 11 = a15;
Pin 13 = alsel;
/** outputs **/
Pin 18 = !meo; /* external mreq signal */
Pin 17 = !rdo; /* external read signal */
Pin 16 = !wro; /* external write signal */
Pin 19 = ioclk;
Pin 15 = busak;
Pin 14 = !serrq;
Pin 12 = !parrq;
/* logic equations */
serrq = !a15 & alsel & !a06 & !mem & !bst1 & bst2 & bst3;
parrq = !a15 & alsel & a06 & !mem & !bst1 & bst2 & bst3;
busak = !mem & bst1 & bst2 & bst3;
rdo = rdi # (rwi & CLK & mem) # (rwi & CLK & a15 & !bst1 & bst2 & bst3);
wro = we;
meo = mem;
ioclk = !mem & !a15 & we;
rdo.oe = !busak;
wro.oe = !busak;
meo.oe = !busak;
busak.oe = 'b'1;
ioclk.oe = 'b'1;
serrq.oe = 'b'1;
parrq.oe = 'b'1;
------>8------------>8------------>8------------>8----------
タイミングは、RDとIO関連のみ出します。これでもギリギリくらいかなぁ。負荷が軽いので TTL 関連は typ を使うと一応計算上は、
166.66nS/2 - 7nS(GAL) - 12nS(typ LS241) - 20nS(ROM) - 4nS (F245) - 30nS(CPU setup) = 10.5nS(margin)
程度。CPU からの /RD が遅いとバッファ制御が厳しいですが、そうなら GAL 出力側の BUS 向け /RD を引いてくればいい。
IO系は、以下の通り。リードに 1WAIT 入れたので 3MHz 対応品でも問題がないです。3MHz 品と 4MHz 品は書き込みのセットアップは規定では違いがないので、これ以上は IOCLK に多少の遅れを噛ませるぐらい。
これでもう一度配線変更部の見直しです。