#include "defs.h"
#include "gates.h"
#include "decods.h"
#include "muxs.h"
#include "latches.h"
#include "srams.h"
#include <stdio.h>
#ifdef _SRAM_BIT_
#include "clock.h"
void main() {
FILE *data=fopen("data","w");
FILE *data_sdl=fopen("data.sdl","w");
int iters = 500;
WIRE
in = GND,
select = GND,
write = GND,
out = GND;
SRAM_BIT sbit;
fprintf(data,"in write select out");
while(iters--) {
Clock(iters,7,in);
Clock(iters,200,write);
Clock(iters,33,select);
sbit.run(in,select,write,out);
fprintf(data_sdl,"%3d %3d %3d %3d\n",in,write,select,out);
}
}
#endif
#ifdef _SRAM_16x4_
#include "clock.h"
#include "random.h"
void main() {
FILE *data=fopen("data","w");
FILE *data_sdl=fopen("data.sdl","w");
int
iters = 1000,
i;
WIRE
select = GND,
write = GND,
addr[4] = {GND,GND,GND,GND},
in[4] = {GND,GND,GND,GND},
out[4] = {GND,GND,GND,GND};
SRAM_16x4 sram;
fprintf(data,"select write addr[0] addr[1] addr[2] addr[3] in[0] \
in[1] in[2] in[3] out[0] out[1] out[2] out[3]");
while(iters--) {
Clock(iters,256,select);
Clock(iters,128,write);
for(i=0;i<4;i++) Clock(iters,1<<(i+5),addr[i]);
for(i=0;i<4;i++) Random(iters,15,in[i]);
sram.run(select,write,addr,in,out);
fprintf(data_sdl,"%4d%4d",select,write);
for(i=0;i<4;i++) fprintf(data_sdl,"%4d",addr[i]);
for(i=0;i<4;i++) fprintf(data_sdl,"%4d",in[i]);
for(i=0;i<4;i++) fprintf(data_sdl,"%4d",out[i]);
fprintf(data_sdl,"\n");
}
}
#endif
#ifdef _SRAM_16x4_B_
void main() {
int
iters = 1000,
i;
WIRE
select,
write,
addr[4],
in[4],
out[4];
SRAM_16x4 sram;
select=VCC; // Habilitamos la memoria para ser leida o escrita
write =GND; // Vamos a leer la memoria, no a escribir
// Direccionamos la posición 15
addr[3] = VCC; addr[2] = VCC; addr[1] = VCC; addr[0] = VCC;
printf("Simulación de una memoria SRAM con 16 palabras de 4 bits.\n");
printf("La memoria ha sido configurada para ser leida (select=1 y write=0).\n");
printf("Van a ser mostrados 25 iteraciones de simulación.\n");
printf("La dirección de memoria seleccionada es la 15.\n");
printf("El contenido de esta dirección es (memoria no inicializada):\n");
for(i=0;i<25;i++) {
printf("%5d",i);
sram.run(select,write,addr,in,out);
for(int j=3;j>=0;j--)
printf("%4d",out[j]);
printf("\n");
}
printf("Como se aprecia, la lectura de la memoria se produce en ... qué ciclo?\n");
printf("Ahora vamos a escribir sobre la dirección 15 la palabra 1010.\n");
printf("Usaremos 25 iteraciones de simulación para asegurarnos ");
printf("que la escritura se produce.\n");
printf("Como la memoria siempre se está leyendo pues está selecionada, ");
printf("presentaremos también el contenido del bus de salida.\n");
printf("Cuando este valga lo mismo que hay a la entrada, diremos que la ");
printf("memoria se ha escrito ...\n Cuántos ciclos tarda en escribirse?\n");
write = VCC;
in[3] = VCC; in[2] = GND; in[1] = VCC; in[0] = GND;
for(i=0;i<50;i++) {
printf("%5d",i);
sram.run(select,write,addr,in,out);
for(int j=3;j>=0;j--)
printf("%4d",in[j]);
printf(" |");
for(int j=3;j>=0;j--)
printf("%4d",out[j]);
printf("\n");
}
printf("Ahora vamos a tratar de modificar la palabra de la dirección \
de memoria\n");
printf("15, escribiendo ahora 0000. Sin embargo, haremos que la \
entrada \"write\"=0\n");
printf("para que la memoria no se habilitada para escritura.\n");
printf("Es de esperar en este caso el valor almacenado (1010) \
permanezca inalterable.\n");
printf("Esperamemos a ver si se produce la escritura durante 50 iteraciones.\n");
write = GND;
in[3] = GND; in[2] = GND; in[1] = GND; in[0] = GND;
for(i=0;i<50;i++) {
printf("%5d",i);
sram.run(select,write,addr,in,out);
for(int j=3;j>=0;j--)
printf("%4d",in[j]);
printf(" |");
for(int j=3;j>=0;j--)
printf("%4d",out[j]);
printf("\n");
}
printf("Simulación finalizada.\n");
}
#endif