`include "defines.v"
module Data_memory(
input [31:0] DmemAddr,//操作的地址
input DmemWrite,//写有效
input [31:0] DmemWrData,//要写的数据
input wire[5:0] ALUCtra,
input wire DmemRead,//读有效
output reg [31:0] DmemRdData //读出的数据
);
reg [31:0] DataMem[0:255];
wire[31:0] temp_data;
assign temp_data=(DmemAddr>>2);
initial begin //读数据,采用大端模式
$readmemh("Data",DataMem);
end
always @(DmemAddr,DmemWrite,DmemWrData,ALUCtra) begin
if (DmemWrite==1'b0 && DmemRead==1'b1) begin
case (ALUCtra)
`lb : begin
case (DmemAddr[1:0])
2'b00 :begin
DmemRdData<={{24{DataMem[temp_data][31]}},
DataMem[temp_data][31:24]};
end
2'b01 :begin
DmemRdData<={{24{DataMem[temp_data][23]}},
DataMem[temp_data][23:16]};
end
2'b10 :begin
DmemRdData<={{24{DataMem[temp_data][15]}},
DataMem[temp_data][15:8]};
end
2'b11 :begin
DmemRdData<={{24{DataMem[temp_data][7]}},
DataMem[temp_data][7:0]};
end
endcase
end
`lbu : begin
case (DmemAddr[1:0])
2'b00 :begin
DmemRdData<={{24{1'b0}},DataMem[temp_data][31:24]};
end
2'b01 :begin
DmemRdData<={{24{1'b0}},DataMem[temp_data][23:16]};
end
2'b10 :begin
DmemRdData<={{24{1'b0}},DataMem[temp_data][15:8]};
end
2'b11 :begin
DmemRdData<={{24{1'b0}},DataMem[temp_data][7:0]};
end
endcase
end
`lh : begin
case (DmemAddr[1:0])
2'b00 :begin
DmemRdData<={{16{DataMem[temp_data][31]}},
DataMem[temp_data][31:16]};
end
2'b10 :begin
DmemRdData<={{16{DataMem[temp_data][15]}},
DataMem[temp_data][15:0]};
end
endcase
end
`lhu : begin
case (DmemAddr[1:0])
2'b00 :begin
DmemRdData<={{16{1'b0}},
DataMem[temp_data][31:16]};
end
2'b10 :begin
DmemRdData<={{16{1'b0}},
DataMem[temp_data][15:0]};
end
endcase
end
`lw : begin
DmemRdData<=DataMem[temp_data];
end
`lwl : begin
case (DmemAddr[1:0])
2'b00 :begin
DmemRdData<=DataMem[temp_data][31:0];
end
2'b01 :begin
DmemRdData<={DataMem[temp_data][23:0],DmemWrData[7:0]};
end
2'b10 :begin
DmemRdData<={DataMem[temp_data][15:0],DmemWrData[15:0]};
end
2'b11 :begin
DmemRdData<={DataMem[temp_data][7:0],DmemWrData[23:0]};
end
endcase
end
`lwr : begin
case (DmemAddr[1:0])
2'b00 :begin
DmemRdData<={DmemWrData[31:8],DataMem[temp_data][31:24]};
end
2'b01 :begin
DmemRdData<={DmemWrData[31:16],DataMem[temp_data][31:16]};
end
2'b10 :begin
DmemRdData<={DmemWrData[31:24],DataMem[temp_data][31:8]};
end
2'b11 :begin
DmemRdData<=DataMem[temp_data];
end
endcase
end
endcase
end else begin
case (ALUCtra)
`sb : begin
case (DmemAddr[1:0])
2'b00 :begin
DataMem[temp_data][31:24]<=DmemWrData[7:0];
end
2'b01 :begin
DataMem[temp_data][23:16]<=DmemWrData[7:0];
end
2'b10 :begin
DataMem[temp_data][15:8]<=DmemWrData[7:0];
end
2'b11 :begin
DataMem[temp_data][7:0]<=DmemWrData[7:0];
end
endcase
end
`sh : begin
case (DmemAddr[1:0])
2'b00 :begin
DataMem[temp_data][31:16]<=DmemWrData[15:0];
end
2'b10 :begin
DataMem[temp_data][15:0]<=DmemWrData[15:0];
end
endcase
end
`sw : begin
DataMem[temp_data]<=DmemWrData;
end
`swl : begin
case (DmemAddr[1:0])
2'b00 :begin
DataMem[temp_data]<=DmemWrData;
end
2'b01 :begin
DataMem[temp_data][23:0]<=DmemWrData[31:8];
end
2'b10 :begin
DataMem[temp_data][15:0]<=DmemWrData[31:16];
end
2'b11 :begin
DataMem[temp_data][7:0]<=DmemWrData[31:24];
end
endcase
end
`swr : begin
case (DmemAddr[1:0])
2'b00 :begin
DataMem[temp_data][31:24]<=DmemWrData[7:0];
end
2'b01 :begin
DataMem[temp_data][31:16]<=DmemWrData[15:0];
end
2'b10 :begin
DataMem[temp_data][31:8]<=DmemWrData[23:0];
end
2'b11 :begin
DataMem[temp_data]<=DmemWrData;
end
endcase
end
endcase
DmemRdData<=0;
end
end
endmodule
cpu之Data_memory
最新推荐文章于 2023-01-18 18:12:05 发布