Files
MipsPipelineProcessor/PipelineProcessor.srcs/sources_1/new/DataMemory.v

149 lines
7.3 KiB
Verilog

`timescale 1ns / 1ps
module DataMemory (
input clk,
input reset,
input [31:0] address,
input write_enable,
input [31:0] write_data,
output [31:0] read_data,
output [31:0] bcd_hardwire
);
parameter integer MEM_SIZE_IN_WORD = 64;
parameter integer START_ADDRESS = 32'h00000000;
localparam integer StartAddressInWord = START_ADDRESS / 4;
reg [31:0] memory_data[MEM_SIZE_IN_WORD + StartAddressInWord - 1 : StartAddressInWord];
assign bcd_hardwire = memory_data[StartAddressInWord+4];
assign read_data = memory_data[address[31:2]];
integer i;
initial begin
for (i = StartAddressInWord; i < 24 + StartAddressInWord; i = i + 1) begin
memory_data[i] <= 32'h00000000;
end
for (
i = 72 + StartAddressInWord; i < MEM_SIZE_IN_WORD + StartAddressInWord; i = i + 1
) begin
memory_data[i] <= 32'h00000000;
end
memory_data[StartAddressInWord+24] <= 32'h0000002F;
memory_data[StartAddressInWord+25] <= 32'h000018D0;
memory_data[StartAddressInWord+26] <= 32'h00003A27;
memory_data[StartAddressInWord+27] <= 32'h00004786;
memory_data[StartAddressInWord+28] <= 32'h0000C94D;
memory_data[StartAddressInWord+29] <= 32'h000064CA;
memory_data[StartAddressInWord+30] <= 32'h00008027;
memory_data[StartAddressInWord+31] <= 32'h0000C8C3;
memory_data[StartAddressInWord+32] <= 32'h0000E08B;
memory_data[StartAddressInWord+33] <= 32'h00006E15;
memory_data[StartAddressInWord+34] <= 32'h0000AA22;
memory_data[StartAddressInWord+35] <= 32'h00002E07;
memory_data[StartAddressInWord+36] <= 32'h00009F23;
memory_data[StartAddressInWord+37] <= 32'h00002F2B;
memory_data[StartAddressInWord+38] <= 32'h00004227;
memory_data[StartAddressInWord+39] <= 32'h0000022C;
memory_data[StartAddressInWord+40] <= 32'h00009776;
memory_data[StartAddressInWord+41] <= 32'h00009477;
memory_data[StartAddressInWord+42] <= 32'h0000AAF5;
memory_data[StartAddressInWord+43] <= 32'h000080BE;
memory_data[StartAddressInWord+44] <= 32'h00002CC7;
memory_data[StartAddressInWord+45] <= 32'h00009D7D;
memory_data[StartAddressInWord+46] <= 32'h00000F95;
memory_data[StartAddressInWord+47] <= 32'h0000E060;
memory_data[StartAddressInWord+48] <= 32'h00002137;
memory_data[StartAddressInWord+49] <= 32'h0000A5E5;
memory_data[StartAddressInWord+50] <= 32'h00001C49;
memory_data[StartAddressInWord+51] <= 32'h0000C308;
memory_data[StartAddressInWord+52] <= 32'h00001A04;
memory_data[StartAddressInWord+53] <= 32'h00005F99;
memory_data[StartAddressInWord+54] <= 32'h0000124C;
memory_data[StartAddressInWord+55] <= 32'h0000ABB3;
memory_data[StartAddressInWord+56] <= 32'h00000E87;
memory_data[StartAddressInWord+57] <= 32'h00005E55;
memory_data[StartAddressInWord+58] <= 32'h00002197;
memory_data[StartAddressInWord+59] <= 32'h00000AA4;
memory_data[StartAddressInWord+60] <= 32'h0000F7FE;
memory_data[StartAddressInWord+61] <= 32'h00007F32;
memory_data[StartAddressInWord+62] <= 32'h0000C5A5;
memory_data[StartAddressInWord+63] <= 32'h0000D87C;
memory_data[StartAddressInWord+64] <= 32'h0000E996;
memory_data[StartAddressInWord+65] <= 32'h00007345;
memory_data[StartAddressInWord+66] <= 32'h00009213;
memory_data[StartAddressInWord+67] <= 32'h000076EE;
memory_data[StartAddressInWord+68] <= 32'h0000260B;
memory_data[StartAddressInWord+69] <= 32'h0000E0D8;
memory_data[StartAddressInWord+70] <= 32'h0000D9CA;
memory_data[StartAddressInWord+71] <= 32'h00003B9F;
end
always @(posedge clk) begin
if (reset) begin
for (i = StartAddressInWord; i < 24 + StartAddressInWord; i = i + 1) begin
memory_data[i] <= 32'h00000000;
end
for (
i = 72 + StartAddressInWord; i < MEM_SIZE_IN_WORD + StartAddressInWord; i = i + 1
) begin
memory_data[i] <= 32'h00000000;
end
memory_data[StartAddressInWord+24] <= 32'h0000002F;
memory_data[StartAddressInWord+25] <= 32'h000018D0;
memory_data[StartAddressInWord+26] <= 32'h00003A27;
memory_data[StartAddressInWord+27] <= 32'h00004786;
memory_data[StartAddressInWord+28] <= 32'h0000C94D;
memory_data[StartAddressInWord+29] <= 32'h000064CA;
memory_data[StartAddressInWord+30] <= 32'h00008027;
memory_data[StartAddressInWord+31] <= 32'h0000C8C3;
memory_data[StartAddressInWord+32] <= 32'h0000E08B;
memory_data[StartAddressInWord+33] <= 32'h00006E15;
memory_data[StartAddressInWord+34] <= 32'h0000AA22;
memory_data[StartAddressInWord+35] <= 32'h00002E07;
memory_data[StartAddressInWord+36] <= 32'h00009F23;
memory_data[StartAddressInWord+37] <= 32'h00002F2B;
memory_data[StartAddressInWord+38] <= 32'h00004227;
memory_data[StartAddressInWord+39] <= 32'h0000022C;
memory_data[StartAddressInWord+40] <= 32'h00009776;
memory_data[StartAddressInWord+41] <= 32'h00009477;
memory_data[StartAddressInWord+42] <= 32'h0000AAF5;
memory_data[StartAddressInWord+43] <= 32'h000080BE;
memory_data[StartAddressInWord+44] <= 32'h00002CC7;
memory_data[StartAddressInWord+45] <= 32'h00009D7D;
memory_data[StartAddressInWord+46] <= 32'h00000F95;
memory_data[StartAddressInWord+47] <= 32'h0000E060;
memory_data[StartAddressInWord+48] <= 32'h00002137;
memory_data[StartAddressInWord+49] <= 32'h0000A5E5;
memory_data[StartAddressInWord+50] <= 32'h00001C49;
memory_data[StartAddressInWord+51] <= 32'h0000C308;
memory_data[StartAddressInWord+52] <= 32'h00001A04;
memory_data[StartAddressInWord+53] <= 32'h00005F99;
memory_data[StartAddressInWord+54] <= 32'h0000124C;
memory_data[StartAddressInWord+55] <= 32'h0000ABB3;
memory_data[StartAddressInWord+56] <= 32'h00000E87;
memory_data[StartAddressInWord+57] <= 32'h00005E55;
memory_data[StartAddressInWord+58] <= 32'h00002197;
memory_data[StartAddressInWord+59] <= 32'h00000AA4;
memory_data[StartAddressInWord+60] <= 32'h0000F7FE;
memory_data[StartAddressInWord+61] <= 32'h00007F32;
memory_data[StartAddressInWord+62] <= 32'h0000C5A5;
memory_data[StartAddressInWord+63] <= 32'h0000D87C;
memory_data[StartAddressInWord+64] <= 32'h0000E996;
memory_data[StartAddressInWord+65] <= 32'h00007345;
memory_data[StartAddressInWord+66] <= 32'h00009213;
memory_data[StartAddressInWord+67] <= 32'h000076EE;
memory_data[StartAddressInWord+68] <= 32'h0000260B;
memory_data[StartAddressInWord+69] <= 32'h0000E0D8;
memory_data[StartAddressInWord+70] <= 32'h0000D9CA;
memory_data[StartAddressInWord+71] <= 32'h00003B9F;
end else begin
if (write_enable) begin
memory_data[address[31:2]] <= write_data;
end
end
end
endmodule