[comp.sys.amiga.hardware] A1000 Expansion bus interface question - tristates fights ??

<LEEK@QUCDN.QueensU.CA> (12/12/90)

I am in the processing of interfacing a Seagate SCSI controller (ST-01 , a
8-bit PC/XT or AT interface).  I basically uses the R/W*, UDS*, AS*, A23-A21
to generate the RD* and WR* signals.  The board has a 74LS245 buffer to the
data bus and it is enabled as soon as it sees RD* or WR* goes active.

The board has 128 bytes of static rams on it, so I decided to write a test
program to use the ram to test out the interface I built.  The only time
the data was not read back correctly was when the test vector was 0xff.  I
assume that it is some sort of tristate fights between the 74LS245 and the
1000's internal buffer.  I sort of fixed the problem by delaying UDS*, but
the hack violates the timing for XRDY that is generated by the board after
RD* or WR* goes active. (This signal is used to sync the CPU for blind SCSI
data transfer - not used in onboard ram).  This violates the rule that XRDY
should rise withing 60ns after AS* goes active.

Is that  why the A500/A2000 tech. manual (P.21 Data Driver Timing) says that the
backplane drivers must not be turn on until the rising of S4, (P.47 Paragraph 3,
Slave Bus Timing) reminds that as in the expansion architecture, data drivers
should not turn on during a read cycle until S4.

One interesting thing I observe is that when the ram test code is in 32-bit ram
on the Frances board, it work fine.  It is only having problems with the code
in chip ram (for both 68020 and 68000).  Would adding an extra 74LS245 buffer
that only turns on after S4 between the Amiga and the board fix the 'problem' ?

Thanks in advance...

K. C. Lee
Elec. Eng. Grad. Student

P. S. Test vectors I uses are all 0's, all 1's, travelling 0 and 1.
      Board address is at 0x00ef8000

daveh@cbmvax.commodore.com (Dave Haynie) (12/18/90)

In article <90346.092432LEEK@QUCDN.QueensU.CA> LEEK@QUCDN.QueensU.CA writes:

>The board has 128 bytes of static rams on it, so I decided to write a test
>program to use the ram to test out the interface I built.  The only time
>the data was not read back correctly was when the test vector was 0xff.  I
>assume that it is some sort of tristate fights between the 74LS245 and the
>1000's internal buffer.  

Not really likely.  Where did you locate the board, in memory?  

>I sort of fixed the problem by delaying UDS*, but the hack violates the 
>timing for XRDY that is generated by the board after RD* or WR* goes active.
>(This signal is used to sync the CPU for blind SCSI data transfer - not used 
>in onboard ram).  This violates the rule that XRDY should rise withing 60ns 
>after AS* goes active.

That's a pretty hard and fast timing contraint, too.  I managed to rederive
the same basic constraint myself when I did the bus controller for the A3000,
in which I started over from scratch for a number of the expansion bus
functions.  On a normal expansion board, you'll have different signals for
board select and data bus enable.  The board select signal is always fed out
as SLAVE*, and if necessary, makes a good XRDY too.

>Is that  why the A500/A2000 tech. manual (P.21 Data Driver Timing) says that 
>the backplane drivers must not be turn on until the rising of S4, (P.47 
>Paragraph 3, Slave Bus Timing) reminds that as in the expansion architecture,
>data drivers should not turn on during a read cycle until S4.

It's always a good idea to follow that suggestion, wait for S4 (or DOE if 
you're on the backplane), though it's a little more important when you're on
a real backplane, since there are buffers driving the backplane, rather than
just the 68000 as on the A1000's connector edge.  These buffers, which 
separate the expansion backplane from the motherboard (what I call local) bus,
are biased to point out toward the expansion bus normally, for both address
and data.  It's only when a slave device actually responds and a read is in
progress that the data buffers point toward the local bus.  So in order to
avoid contention with the data buffers, as well as any other slave device,
it's good to wait until S4/DOE time to turn on.  Data needs to be stable 
at least 10ns prior to the S6/S7 clock transition, and held at least until
AS*/DS* are negated on reads.  Writes are pretty easy; data is valid 40ns
before DS* falls, and hangs out until 40ns after AS*/DS* are negated.

>One interesting thing I observe is that when the ram test code is in 32-bit 
>ram on the Frances board, it work fine.  It is only having problems with the 
>code in chip ram (for both 68020 and 68000).  Would adding an extra 74LS245 
>buffer that only turns on after S4 between the Amiga and the board fix the 
>'problem' ?

It does sound like you're getting some interference on the local bus with
your board.  The extra buffering couldn't hurt, and will at least make your
problem hunting easier if it doesn't solve the problem -- with it, you'll
have a very precise knowledge of when the local data bus can and can't be 
affected by your board.  If you still have problems, at least you can at
that point rule out contention.  Make real sure your XRDY timing is on, too,
if you need it, since a late XRDY will not guarantee you a wait state.

>K. C. Lee

>P. S. Test vectors I uses are all 0's, all 1's, travelling 0 and 1.
>      Board address is at 0x00ef8000

Sounds like a safe place to put it, anyway.

-- 
Dave Haynie Commodore-Amiga (Amiga 3000) "The Crew That Never Rests"
   {uunet|pyramid|rutgers}!cbmvax!daveh      PLINK: hazy     BIX: hazy
		"I can't drive 55"	-Sammy Hagar