PCSYNTH ISA DAC Interface Card

I'm sure that many will wonder why I designed this interface as an 8 bit interface to a 16 bit DAC when it could have been a 16 bit interface. Allow me to explain why I did this. My first idea for this project was to use one or two parallel printer ports to drive the DAC. Software testing with various port cards revealed that port I/O is extremely slow. On the target machine, an AMD 5x86-133, each x86 IN and OUT instruction takes 1.5 µS to complete. A 44 KHz update rate equates to about 22 µS per DAC update. I worked out the sequence of required accesses to the DAC ports for strobe and Dac Data Bit load and it required 9 µS, worst case, of the 22 µS available. That's almost half!. The I/O port method was abandoned in favor of an ISA card design. This approach was selected over DMA programming of a sound card because each sound card type may require different software to drive it. Since this project is meant for others to also build, I decided to use a dedicated ISA DAC card instead of a sound card to eliminate the need to rewrite the program for different sound cards.

The schematic below depicts the 8 bit ISA card design.

Now for why it's 8 bit instead of 16 bit. I am not an EE, nor have I ever attempted to design and implement an ISA bus interface of any kind. Given that vast lack of experience, I wanted to do this in a way that cannot destroy the ISA bus. This will also make it safer and easier for others to build the device. In researching the technical specification of the ISA bus, I discovered that a 16 bit memory I/O operation requires that the slave device assert a signal onto the ISA bus to tell the system that it's capable of doing a 16 bit Dac Data Bit transfer. However, the 8 bit memory cycle requires no signal assertions at all to the bus, only signal reads. I felt safer working with the 8 bit design because the only connections that touch the ISA bus read signals and don't try to assert any. If the memory cycle is fast enough, it should not be a big hit to do two of them to build a 16 bit value in the DAC from two 8 bit writes.

The card requires two 8 bit writes to update the DAC, but this will be handled by the system automatically. Write 16 bits to address B8000 B0000 to write to the DAC latch. Double buffering may be added at a later time and strobing the second buffer to load the DAC would be a matter of accessing B8001B0001, either as a read or a write (no latch of any data is done, just a qualified address decode that operates the latch strobe. The address, B8000 B0000 was chosen because this address range was dedicated to the monochrome display adapter which is now obsolete.

Note that the LA address bits are not decoded and latched, only the SA address bits are used. This was done to simplify the interface card because it will be used with a standalone program that will not access memory outside of the first megabyte. It is possible that the DAC will generate random signals if a program is run that writes to locations whose address turns on the SA address lines to which the interface responds. Windows, for example.

For my prototype, I will build the ISA interface card on a dead EIDE controller from which I will remove all active semiconductor parts. I will "piggyback" a piece vectorboard onto the defunct ISA card and wire into it's bus connector.

The ICs used in the interface were chosen because I had them on hand.

The latch ICs may change type number if the 74HC373 is too slow.

Untested


At left is an image of the ISA DAC card, not finished. The address decoder shown in the above schematic is soldered onto the protoboard and wired to the bus. Power to the protoboard still needs to be wired and the decoder needs to be tested. The board that plugs into the ISA bus slot is a defunct ISA EIDE/multi-function board. I removed the two surface mount ICs which connect to the ISA bus and drilled holes in the ISA card and the protoboard. The two boards are held together by 2 nylon screws.

Pinout of Parallel 16/12 bit DB-25 female connector of ISA DAC card

DB25 pinName of Signal
1undefined
2Dac Data Bit 0
3Dac Data Bit 1
4Dac Data Bit 2
5Dac Data Bit 3
6Dac Data Bit 4
7Dac Data Bit 5
8Dac Data Bit 6
9Dac Data Bit 7
10Dac Data Bit 8
11Dac Data Bit 9
12Dac Data Bit 10
13Dac Data Bit 11
14Dac Data Bit 12 unused for 12 bit DAC
15Dac Data Bit 13 unused for 12 bit DAC
16Dac Data Bit 14 unused for 12 bit DAC
17Dac Data Bit 15 unused for 12 bit DAC
18-25Ground
      The ground pins are the same as for a printer port, these should already be connected to PC ground on the defunct ISA DAC substrate card.

06-26-05: Today, on a trip to All Electronics, I found a DB-25 male to DB-25 male cable, I checked it with their DMM and found it was wired with 25 wires, pin to pin. With this, I can make a cable that plugs into the printer DB-25 on the defunct ISA substrate card. The other end goes to a box with the analog electronics in it.
06-29-05: Had my son help me ohm out the cable to assign wire colors to pin numbers.
07-04-05: Completed assembly of ISA DAC address decoder. Tests good, however speed is disappointing at about 0.6 uS per single byte transfer. That's about 3 times faster than the I/O operation, but it's still brutally slow. Oh well, if I need to use a faster CPU, I have them.

Double Buffered ISA DAC Card Design

Untested
More complex address decode logic is required for this.