A. SHERAR

DESARROLLO DE SISTEMAS DIGITALES

PROTOTIPOS EN ELECTRONICA Y SOFTWARE

RAM - TEST

ENVIAR UN MENSAJE

INICIO  -  ANTERIOR  SIGUIENTE

 

Sistema para gestión de memorias RAM estáticas de acceso paralelo.

Consiste en:

 

SIGUIENTE

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INICIO  -  ANTERIOR  -  SIGUIENTE 

 

CARACTERISTICAS

El generador de direcciones es una cascada de 4 contadores de 4 bits 74XX163, que permite direccionar desde 0 hasta 65535.

Dispone de entradas de Reset (/RST) y Clock (CLK), y una señal de retorno para indicar el desborde de 32767 (OVR).

Dispone de entradas de control para habilitación del chip (/CS) y para selección de grabacion o lectura (/WR).

La placa admite memorias flash o CMOS en zócalos de 28 o de 32 pines, y con capacidades de hasta 64 kB.

Está pensado para experimentar con diferentes estrategias de direccionamiento y para extensión a varios módulos de 32kb cada uno.  

 

SIGUIENTE

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INICIO  -  ANTERIOR  -  SIGUIENTE

 

CIRCUITO

El primer esquema está limitado a memorias de 32 kB.

El bit 15 del contador se usa como indicador de desborde (OVR = OVer Run). Este bit se debe cablear externamente a un circuito de habilitación del CLK, o bien tomar de referencia por el software para limitar el recorrido del contador a la condición OVR = 0. Cuando el contador llegue a 32768 pondrá OVR = 1, y entonces debe inhibirse la entrada del CLK. 

Se ha cableado el bit 0 del contador sobre el bit 14 de la memoria, previendo modificaciones del uso de este bit en el futuro

Para direccionar memorias de 64 kB se debe conectar el registro completo de salida del contador (16 bits) a los bits de dirección de la memoria. En este caso para generar una señal de OVR en la cuenta 65535 se deberá llevar la señal de la patilla 15 a la entrada de un flip-flop (divisor de frecuencias) o efectuar la operación por software. Nótese la necesidad de poder resetear este flip-flop adicional.

La asignación de patillas en el puerto paralelo es la siguiente:

Función Patilla (DB25) Registro
/WR 1 Control
/CS 14 Control
CLK 16 Control
/RST 17 Control
OVR 15 Estado
D0-D7 2 a 9 Datos
GND 18 a 25 (común)

 

CONTADOR

Se analizaron los circuitos que se muestran en las figuras 1 y 2, los dos esquemas sugeridos en la hoja de datos del SN74XX163. 

Se ha elegido implementar el segundo ya que con más de una etapa no se pierde performance a frecuencias altas (f ~ 30 MHz).

 

 

INICIO  -  ANTERIOR  -  SIGUIENTE

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INICIO  -  ANTERIOR  -  SIGUIENTE

 

PROGRAMA

El sistema de comunicación se inicializa identificando el puerto paralelo. 

Para inicializar la memoria se envian las señales: 

  /CS <- 1,    /WR <- 1, 

y se configura el puerto de tal modo que inicialmente el registro de datos sea una entrada. Esto se hace con la rutina ram_setup.  

La patilla OVR es el bit 15 del contador, que se pone en 0 al efectuar un reset. Esto se logra con la secuencia:

    CLK <- 0,    RST <- 0,    CLK <- 1,    RST <- 1

Como los contadores 74XX163 son sincrónicos, en esta operación la cuenta va a h0000 durante la subida de CLK, y OVR queda en 0. 

Durante el conteo normal la patilla RST debe mantenerse en 1. El contador solamente avanza una cuenta cuando recibe una subida de CLK, en la forma:

    CLK <- 0,    CLK <- 1

Al llegar al valor h8000 la patilla OVR se pone en 1 indicando que se ha alcanzado la cuenta 32768 (de aquí el nombre OVerRun).

Para las memorias de 32 KB, que no emplean el bit 15, esto es equivalente a volver a la dirección h0000, y el bit OVR en 1 sirve como señal de desborde de la memoria, y se debe efectuar un RST. 

En algunos programadores de EEPROM se conecta este bit OVR con la patilla /WR de modo que luego del ciclo de escritura, cuando OVR = /WR <- 1, automáticamente la memoria quede bloqueada para escribir.

En las memorias de 64 KB, el bit 15 es parte de la dirección y para acceder a la memoria completa no se debe resetear el contador cuando OVR <- 1. En tal caso se debe detectar el fin de la memoria mediante un divisor luego del bit 15, sea con un chip adicional o mediante software.

Para comandar la memoria se ha fijado intenamente la patilla /OE (not output enable) en 0, lo que deja las salidas permanentemente accediendo al bus de datos. Para evitar colisiones con el registro de datos del puerto bidireccional de la PC, con quien debe compartir el bus, se gestionan las señales /CS y /WR como sigue:

Para lectura de la RAM (rutina ram_read):

Para grabación en la RAM (rutina ram_write):

(*) como mínimo el tiempo de acceso para grabación.  

Para abandonar el sistema se debe enviar las señales: 

  /CS <- 1,    /WR <- 1, 

y reconfigurar el puerto como salida mediante la rutina ram_exit

INICIO  -  ANTERIOR  -  SIGUIENTE

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INICIO  -  ANTERIOR

 

CODIGO FUENTE

El código desarrollado para los experimentos se basa en las rutinas que se reproducen a continuación, codificadas en lenguaje C.

 

MACROS EMPLEADAS EN EL CODIGO
#define WR_DIS outp(pcont, (inp(pcont) & 0xfe) )
#define WR_ENA outp(pcont, (inp(pcont) | 0x01) )
#define CH_DIS outp(pcont, (inp(pcont) & 0xfd) )
#define CH_ENA outp(pcont, (inp(pcont) | 0x02) )
#define CLK_HI outp(pcont, (inp(pcont) | 0x04) )
#define CLK_LO outp(pcont, (inp(pcont) & 0xfb) )
#define RST_HI outp(pcont, (inp(pcont) & 0xf7) )
#define RST_LO outp(pcont, (inp(pcont) | 0x08) )
#define DATAIN outp(pcont, (inp(pcont) | 0x20)) // PC(5)=HI
#define DATAOUT outp(pcont, (inp(pcont) & 0xdf)) // PC(5)=LO

FUNCIONES de RETARDO

// Para operaciones de debug
// Una vez terminadas las pruebas se elimina del código
// o se la precede con "//"
void dly()
{
delay(100);
}

// Para ajustar el tiempo de acceso al chip
void DELAY(int tiempo)
{
delay(tiempo); // Se ajusta el tiempo por ensayo y error
// Depende de la velocidad del procesador de la PC
}



 Para inicializar el sistema

 void ram_setup()
 {
 // El chip queda deshabilitado ( /CS = 1)
 CH_DIS; dly();
  // La lectura queda habilitada ( /WR = 1) 
 WR_DIS; dly(); 
  // El puerto de datos queda configurado como entrada
 DATAIN; dly(); 
 }

 

 Para cerrar el sistema

 void ram_exit()
 {
 // El chip queda deshabilitado ( /CS = 1)
 CH_DIS; dly();
  // La lectura queda habilitada ( /WR = 1) 
 WR_DIS; dly();
  // El puerto de datos queda configurado como salida
 DATAOUT; dly();
 }

 

 Para leer de la posición actual

 int ram_read(void)
 {
 int val=0;
 // El puerto de datos está configurado como entrada
 // La lectura está habilitada ( /WR = 1) 
 // El chip se encuentra deshabilitado ( /CS = 1)
 // 
 CH_ENA; dly();    // Habilita chip
 val = inp(pdata); // Lee el valor en el puerto
 CH_DIS; dly();     // Deshabilita chip

 
return(val);        // Devuelve el valor leido
 }

 

 Para grabar en la posición actual

 void ram_write(int val)
 {
 
// "val" es el valor a escribir en el puerto
  // 
  // El puerto de datos está configurado como entrada
  // La lectura está habilitada ( /WR = 1) 
 // El chip se encuentra deshabilitado ( /CS = 1)
 //
 WR_ENA; dly();    // Habilita grabación /WR = 0
                         // y deshabilita salidas
 DATAOUT;dly();   // Convierte el puerto en salida
 outp(pdata,val);  // Escribe el valor en el puerto
 CH_ENA; dly();    // Habilita chip: /CS = 0
 DELAY(T_ACCESO);dly();     // Espera el tiempo de acceso para grabación
 CH_DIS; dly();     // Deshabilita el chip ( /CS = 1)
 DATAIN;dly();      // Convierte el puerto en entrada
 WR_DIS; dly();    // Habilita lectura ( /WR = 1) 
 }

OTRAS FUNCIONES UTILES

void reset_address()// Para poner el contador a cero
{
CH_DIS; dly(); // Deshabilita chip: /CS = 1
CLK_LO; dly(); // Baja el CLK y se prepara
RST_LO; dly(); // Baja el RST
CLK_HI; dly(); // Sube el CLK y activa el reset
RST_HI; dly(); // Sube el RST
}

void step_address() // Para avanzar una posición en el contador
{
CH_DIS; dly(); // Deshabilita chip: /CS = 1
CLK_LO; dly() // Baja el CLK y se prepara
CLK_HI; dly() // Sube el CLK y avanza una cuenta
}

 

INICIO  -  ANTERIOR


 

Hosted by www.Geocities.ws

1