The RAM chips I have are NEC uPD424400-70. They are 1M x 4-bit FPM DRAM chips. The package is 26-pin SOJ.
Apple IIgs is a 16-bit computer. The processor is 65C816 and its data bus is 8-bit wide. The RAM card is 4MB in size. The memory is divided to 4 rows. Each row is 1M x 8-bit . So, each row consists of two RAM chips. There are totally 8 RAM chips.
The computer has a memory expansion slot. It provides all the required control signals to interface the computer to DRAM chips. The computer also handles the DRAM refresh. So, the design of the RAM card is quite simple.
- Small size. To reduce the cost of PCB
- All supporting circuit is integrated to one GAL22V10 PLD
Memory Expansion Slot Signals
Here is the description of the expansion slot of signals
|FRA0-FRA9||10 bit multiplexed RAM address. Connect to address bus of DRAM chips directly|
|CROW0, 1||2 bits select 1 of 4 RAM rows|
|/CRAS||Row address strobe for DRAM|
|/CCAS||Column address strobe for DRAM|
|FR/W||Write enable to RAM. This signal requires additional handling. See details below|
|D0-D7||Data bus. Connect to I/O of RAM chips directly|
|/CSEL||Signals goes high when reading from RAM. The signal is inverted and then connected to /OE of RAM chips.|
|MSIZE||Tell the computer the row size. = High for 256k, = Low for 1M. It is connected to ground.|
|14M, PH2CLK, A10-A15||Not used by the RAM card|
/CRAS and /CCAS Demultiplexing
The /CRAS and /CCAS signals must be demultiplexed to separate /RAS and /CAS for each row. It can be done by 74F139 IC.
The FR/W signal cannot be connected to DRAM /WE directly. Here is the problem
During normal read/write operation, the /RAS signal goes active (low) first. Then, /CAS signal goes active. During DRAM refresh cycle, it is the other way round. The /CAS goes active before /RAS. It is call /CAS before /RAS Refresh. But 4M-bit RAM chip has one additional requirement. The /WE must switch to high before /RAS goes active. But FR/W signal provided by IIgs does not follow this specification. The state of FR/W is undetermined during refresh cycle. So, additional circuit is needed to detect refresh cycle and set /WE to high.
DRAM Refresh Detector
The first thing we need is a circuit to detect the refresh cycle. Here is the timing diagram.
The idea is to use a transparent latch. /CRAS is the latch input. /CCAS is the trigger. When /CCAS is high, the output of the latch equals to input. When /CCAS switches from high to low, the input is latched. During normal read/write operation, /CRAS is low when /CCAS switches from high to low. But during refresh cycle, /CRAS is high when /CCAS switches to low. When /CCAS returns to high, the latch is released.
Here is the first version of the circuit. During refresh cycle, the latch output is high and /WE is set to high.
If version 1 is implemented with GAL22V10, it needs two output pins. So, I tried to further simplify the circuit.
During normal operation, the FR/W signal is already valid before the latch is triggered. So, the circuit can be changed to this.
A transparent latch can be built from a multiplexer (MUX). And a multiplexer can be built from logic gates. So, the circuit becomes
The circuit is further simplified to:
This is the final version and it is implemented in GAL22V10.
I used WinCUPL to compile the logic of GAL22V10 PLD. The software can be downloaded from Atmel website for free. The software is very buggy and it crashes all the time. But it can do the job. The programmer I used is Genius G540.
It is a 3-pin jumper. If pin 1 and 2 are connected together. The RAM /OE signal is connected to and controlled by GAL. If pin 2 and 3 are connected, it is tied to ground. When I designed the PCB, I was not sure that the refresh detection circuit would work. So, I added this jumper such that I can change the configuration of GAL if necessary.
Since the detection circuit works...Read more »