¿Usando la SDRAM de 16 bits con el bus de 8 bits?

1

Tengo un diseño con un SDRAM de 8 bits que deseo reemplazar con uno de 16 bits, el problema es que no me quedan muchos pines para conectar todo el bus de datos de 16 bits. ¿Es posible acceder a toda la memoria con un 8 bits? bus de datos ?

El ram ( IS42S16800E ) está organizado como 4096 filas x512 columnas x16 bits por banco, usando una columna de 9 bits, solo puedo acceder a la mitad del ram , esto es aceptable si tengo que, sin embargo, intenté usar 10 bits para la dirección de columna , y funcionó, hice una prueba de memoria y puedo leer / escribir en cada ubicación, pero no estoy seguro ¿Cómo / por qué funciona esto? Si lo comprendo correctamente, solo debería usar 9 bits para la dirección de la columna. Entonces, ¿esto depende de la organización de este ram específico? ¿O es así como todo SDRAM funciona internamente?

Actualizar:

Arregle mi prueba de memoria (gracias a Dave Tweed) y esta vez falla, al escribir en la base + 0 se superpone con la base + 512, lo que significa que el décimo bit se ignora y se ajusta a 0. Si uso 9 bits La dirección de la columna todavía puedo acceder a la mitad del ram.

Aquí está mi prueba de ram:

uint8_t pattern = 0xAA;
uint8_t antipattern = 0x55;
uint32_t mem_size = (16*1024*1024);
uint8_t * const mem_base = (uint8_t*)0xC0000000;

/* Test data bus */
for (uint8_t i=1; i; i<<=1) {
    *mem_base = i;
    if (*mem_base != i) {
        BREAK();
    }
}

/* Test address bus */
for (uint32_t i=1; i<mem_size; i<<=1) {
    mem_base[i] = pattern;
    if (mem_base[i] != pattern) {
        BREAK();
    }
}

/* Check for aliasing (overlaping addresses) */
mem_base[0] = antipattern;
for (uint32_t i=1; i<mem_size; i<<=1) {
    if (mem_base[i] != pattern) {
        printf("address bus overlap %p\n", &mem_base[i]);
        BREAK();
    }
}

/* Test all ram locations */
for (uint32_t i=0; i<mem_size; i++) {
    mem_base[i] = pattern;
    if (mem_base[i] != pattern) {
        BREAK();
    }
}
    
pregunta mux

3 respuestas

2

Si tiene un dispositivo que emite 16 bits y desea utilizar todo su almacenamiento, en teoría, lo que puede hacer es:

  • en la dirección de lectura, tome la salida de 16 bits obtenida de las líneas de dirección A1..AN y pásela a través de un banco de multiplexores 2x1, para pasar de 16 a 8 líneas. Su línea A0 para controlar estos multiplexores, de modo que, en efecto, su línea A0 selecciona cuál de las dos mitades de 8 bits de los 16 bits se pasan a su bus de datos.

  • en la dirección de escritura, necesita algunos búferes que conduzcan cada una de sus 8 líneas a uno de los dos pines de datos posibles en la ROM según la dirección A0.

Estas dos direcciones se pueden combinar en una usando multiplexores bidireccionales. Por ejemplo, el interruptor mux / demux / bus de ON Semiconductor 74FST3257 proporciona cuatro muxes bidireccionales 2x1. Con un par de estos, puede encaminar 8 puntos en un lado a una selección de dos conjuntos diferentes de 8 puntos en el lado opuesto, según la línea A0.

Esto es lo suficientemente complicado como para que te envíe una parte de memoria de 8 bits en primer lugar.

    
respondido por el Kaz
0

4096 filas son 12 bits de espacio de direcciones, 512 columnas son 9 bits de espacio de direcciones, y 4 bancos son 2 bits de espacio de direcciones, así que, sumados, eso es 23 bits, que es 8 388 608 direcciones.

La hoja de datos describe el IS42S16800E como un 8 megas X 16 RAM, así que con su 9 bits de direcciones de columna para poder acceder a toda la matriz.

    
respondido por el EM Fields
0

¿No estás seguro de cuál es el problema? Solo citaré las partes de la hoja de datos que mencionan / explican el comportamiento:

  

Cada banco de 33,554,432 bits se organiza como 4,096 filas por 512 columnas por 16 bits o 4,096 filas por 1,024 columnas por 8 bits.

El tamaño físico de la RAM es fijo, por lo tanto, si sus datos tienen la mitad del tamaño que puede almacenar el doble, o para ser más precisos: puede almacenar el doble de palabras de 8 bits que puede almacenar de 16 bits. .

  

Entradas A0-A9 (x8); A0-A8 (x16) proporciona la ubicación de la columna inicial.

Lo que significa que usa 10 pines de dirección en modo de 8 bits (x8) y 9 pines de dirección en modo de 16 bits (x16). Entonces, lo que probaste está realmente definido en la hoja de datos y está absolutamente bien.

Algunas SDRAM tienen la opción de funcionar en un modo de 8 bits o de 16 bits, lo que significa que para esos dispositivos siempre se puede usar la memoria RAM completa. Otros SDRAM no tienen esa opción y si los usa con un bus de datos de 8 bits no está usando la memoria completa. Supongo que depende de cómo funcionan exactamente sus decodificadores de direcciones internas.

    
respondido por el og1L

Lea otras preguntas en las etiquetas