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();
}
}