Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module RAM(
- input csRAM, weRAM,
- input [11:0] address,
- inout [3:0] data);
- reg [3:0] data_out;
- reg [3:0] memory [0:4095];
- assign data = (csRAM && !weRAM) ? data_out : 4'bzzzz;
- // Reading from RAM
- always @ (address or csRAM or weRAM) // Siempre que la dirección o los bits de configuración cambien ejecute el código
- if (csRAM && !weRAM)
- data_out = memory[address];
- // Writing to RAM
- always @ (address or csRAM or weRAM or data) // Como la memoria es asíncrona debemos revisar también si se está cambiando el dato en el puerto (data)
- if (csRAM && weRAM)
- memory[address] = data;
- endmodule
- module tb();
- reg cs, we;
- reg [11:0] address;
- reg [3:0] rData;
- wire [3:0] data;
- /*
- El funcionamiento de la RAM es en ambas direcciones: leer y escribir.
- Por lo tanto lo que conectemos en el puerto inout 'data' debe poder colocarse
- en alta impedancia y también en un valor estable.
- Es posible asignar 4'bzzzz a rData para que el puerto inout tenga alta impedancia.
- Y luego asignar 4'b0101 (o cualquier otro valor) para que el puerto inout
- reciba un dato como tal.
- */
- assign data = rData;
- RAM DUT (cs, we, address, data);
- initial begin
- cs = 0; we = 0; address = 12'd0; rData = 4'b0000;
- $monitor("cs: = %b we = %b address = %b data = %b", cs, we, address, data); // Es importante que lo que monitoreemos sea la variable 'data' y no 'rData' porque queremos ver lo que le escribimos a la RAM y luego lo que leemos de ella
- #1
- $display("----- Escribir a la RAM -----");
- cs = 1; we = 1; address = 12'd0; rData = 4'b1100;
- #1
- cs = 1; we = 1; address = 12'd1; rData = 4'b0011;
- #1
- cs = 1; we = 1; address = 12'd10; rData = 4'b0101;
- #1
- cs = 1; we = 1; address = 12'd255; rData = 4'b1010;
- #1
- $display("------- Leer de la RAM ------");
- cs = 1; we = 0; address = 12'd10; rData = 4'bzzzz; // Importante colocar 'rData' en alta impedancia para que la RAM pueda escribir en el wire 'data'. Si no se hace algunos valores salen en 'x' porque hay contención.
- #1
- cs = 1; we = 0; address = 12'd0;
- #1
- cs = 1; we = 0; address = 12'd255;
- #1
- cs = 1; we = 0; address = 12'd1;
- end
- endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement