cs147dv/memory.v
2024-10-01 10:39:56 -07:00

100 lines
2.9 KiB
Verilog

// Name: memory.v
// Module: MEMORY_64MB
// Input: DATA : Data to be written at address ADDR
// ADDR : Address of the memory location to be accessed
// READ : Read signal
// WRITE: Write signal
// CLK : Clock signal
// RST : Reset signal
// Output: DATA : Data read out in the read operation
//
// Notes: - 32 bit word accessible 64MB memory.
// - Reset is done at -ve edge of the RST signal
// - Rest of the operation is done at the +ve edge of the CLK signal
// - Read operation is done if READ=1 and WRITE=0
// - Write operation is done if WRITE=1 and READ=0
// - X is the value at DATA if both READ and WRITE are 0 or 1
//
// Revision History:
//
// Version Date Who email note
//------------------------------------------------------------------------------------------
// 1.0 Sep 10, 2014 Kaushik Patra kpatra@sjsu.edu Initial creation
//------------------------------------------------------------------------------------------
//
`include "prj_definition.v"
module MEMORY_WRAPPER(DATA_OUT, DATA_IN, READ, WRITE, ADDR, CLK, RST);
// parameter file
// Parameter for the memory initialization file name
parameter mem_init_file = "mem_content_01.dat";
// output list
output [`DATA_INDEX_LIMIT:0] DATA_OUT;
//input list
input [`DATA_INDEX_LIMIT:0] DATA_IN;
input READ, WRITE, CLK, RST;
input [`ADDRESS_INDEX_LIMIT:0] ADDR;
reg [`DATA_INDEX_LIMIT:0] DATA_OUT;
wire [`DATA_INDEX_LIMIT:0] DATA;
assign DATA = ((READ===1'b0)&&(WRITE===1'b1))?DATA_IN:{`DATA_WIDTH{1'bz} };
defparam memory_inst.mem_init_file = mem_init_file;
MEMORY_64MB memory_inst(.DATA(DATA), .READ(READ), .WRITE(WRITE),
.ADDR(ADDR), .CLK(CLK), .RST(RST));
initial
begin
DATA_OUT = 32'h00000000;
end
always @(negedge RST)
begin
if (RST === 1'b0)
DATA_OUT = 32'h00000000;
end
always @(DATA)
begin
if ((READ===1'b1)&&(WRITE===1'b0))
DATA_OUT=DATA;
end
endmodule
module MEMORY_64MB(DATA, READ, WRITE, ADDR, CLK, RST);
// Parameter for the memory initialization file name
parameter mem_init_file = "mem_content_01.dat";
// input ports
input READ, WRITE, CLK, RST;
input [`ADDRESS_INDEX_LIMIT:0] ADDR;
// inout ports
inout [`DATA_INDEX_LIMIT:0] DATA;
// memory bank
reg [`DATA_INDEX_LIMIT:0] sram_32x64m [0:`MEM_INDEX_LIMIT]; // memory storage
integer i; // index for reset operation
reg [`DATA_INDEX_LIMIT:0] data_ret; // return data register
assign DATA = ((READ===1'b1)&&(WRITE===1'b0))?data_ret:{`DATA_WIDTH{1'bz} };
always @ (negedge RST or posedge CLK)
begin
if (RST === 1'b0)
begin
for(i=0;i<=`MEM_INDEX_LIMIT; i = i +1)
sram_32x64m[i] = { `DATA_WIDTH{1'b0} };
$readmemh(mem_init_file, sram_32x64m);
end
else
begin
if ((READ===1'b1)&&(WRITE===1'b0)) // read operation
data_ret = sram_32x64m[ADDR];
else if ((READ===1'b0)&&(WRITE===1'b1)) // write operation
sram_32x64m[ADDR] = DATA;
end
end
endmodule