2017-12-05 22:00:47 +00:00
|
|
|
`ifndef RAM
|
|
|
|
|
`define RAM
|
|
|
|
|
|
|
|
|
|
module ram (
|
|
|
|
|
input clk,
|
|
|
|
|
|
2017-12-12 21:15:11 +00:00
|
|
|
/* memory bus */
|
|
|
|
|
input [31:0] address_in,
|
2017-12-06 08:01:51 +00:00
|
|
|
input sel_in,
|
2017-12-12 21:15:11 +00:00
|
|
|
output logic [31:0] read_value_out,
|
2017-12-05 22:00:47 +00:00
|
|
|
input [3:0] write_mask_in,
|
2017-12-12 21:15:11 +00:00
|
|
|
input [31:0] write_value_in
|
2017-12-05 22:00:47 +00:00
|
|
|
);
|
2017-12-05 22:45:39 +00:00
|
|
|
logic [31:0] mem [2047:0];
|
2017-12-06 08:01:51 +00:00
|
|
|
logic [31:0] read_value;
|
|
|
|
|
|
2017-12-25 23:12:55 +00:00
|
|
|
initial
|
|
|
|
|
$readmemh("progmem_syn.hex", mem);
|
|
|
|
|
|
2017-12-06 08:01:51 +00:00
|
|
|
assign read_value_out = sel_in ? read_value : 0;
|
2017-12-05 22:00:47 +00:00
|
|
|
|
|
|
|
|
always_ff @(negedge clk) begin
|
2017-12-26 14:15:12 +00:00
|
|
|
read_value <= {mem[address_in[31:2]][7:0], mem[address_in[31:2]][15:8], mem[address_in[31:2]][23:16], mem[address_in[31:2]][31:24]};
|
2017-12-05 22:00:47 +00:00
|
|
|
|
2017-12-06 08:01:51 +00:00
|
|
|
if (sel_in) begin
|
|
|
|
|
if (write_mask_in[3])
|
2017-12-26 14:15:12 +00:00
|
|
|
mem[address_in[31:2]][7:0] <= write_value_in[31:24];
|
2017-12-05 22:00:47 +00:00
|
|
|
|
2017-12-06 08:01:51 +00:00
|
|
|
if (write_mask_in[2])
|
2017-12-26 14:15:12 +00:00
|
|
|
mem[address_in[31:2]][15:8] <= write_value_in[23:16];
|
2017-12-05 22:00:47 +00:00
|
|
|
|
2017-12-06 08:01:51 +00:00
|
|
|
if (write_mask_in[1])
|
2017-12-26 14:15:12 +00:00
|
|
|
mem[address_in[31:2]][23:16] <= write_value_in[15:8];
|
2017-12-05 22:00:47 +00:00
|
|
|
|
2017-12-06 08:01:51 +00:00
|
|
|
if (write_mask_in[0])
|
2017-12-26 14:15:12 +00:00
|
|
|
mem[address_in[31:2]][31:24] <= write_value_in[7:0];
|
2017-12-06 08:01:51 +00:00
|
|
|
end
|
2017-12-05 22:00:47 +00:00
|
|
|
end
|
|
|
|
|
endmodule
|
|
|
|
|
|
|
|
|
|
`endif
|