Almost lost technologies

ここは昔の CPU を用いた工作記事を書くために用意しました。

TMS99105 のタイミング(承前)

前回の問題点を考慮し、2点見直しました。

  1.  メモリへの /RD をステータス信号と CLK から前倒し生成する。 30nS くらい早くなる。
  2.  シリアル系の IO を READ でも 1wait 入れる。

その結果、F244 → GAL16v8A-7 に変更です。ピンに余裕ができたので BUSAK 信号も生成し、回路はこうなりました。

f:id:efialtes_htn:20210103231631p:plain

SYS18-TMS99105 CPU board (1)

次に、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 を引いてくればいい。

f:id:efialtes_htn:20210103232121p:plain

TMS99105 メモリリード 新タイミング(1grid 5.1nS: 24MHz の 1/8)

IO系は、以下の通り。リードに 1WAIT 入れたので 3MHz 対応品でも問題がないです。3MHz 品と 4MHz 品は書き込みのセットアップは規定では違いがないので、これ以上は IOCLK に多少の遅れを噛ませるぐらい。

f:id:efialtes_htn:20210103233944p:plain

99105 1WAIT I/O (1grid 10.2nS: 24MHz の 1/4)

これでもう一度配線変更部の見直しです。