aboutsummaryrefslogtreecommitdiff
path: root/src/memory_unit.v
diff options
context:
space:
mode:
authorFlavian Kaufmann <flavian@flaviankaufmann.ch>2024-05-05 14:37:31 +0200
committerFlavian Kaufmann <flavian@flaviankaufmann.ch>2024-05-05 14:37:31 +0200
commit5392b3d94038963a7121f391ad1b5075a5e32b8e (patch)
treec9f53d71a2837c78d919cceb76cbc922782c2088 /src/memory_unit.v
parent1751c689d2005345b420d43584d7668c0ca93f6c (diff)
downloadriscv_cpu-5392b3d94038963a7121f391ad1b5075a5e32b8e.tar.gz
riscv_cpu-5392b3d94038963a7121f391ad1b5075a5e32b8e.zip
added memory unit
Diffstat (limited to 'src/memory_unit.v')
-rw-r--r--src/memory_unit.v58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/memory_unit.v b/src/memory_unit.v
new file mode 100644
index 0000000..7eb435b
--- /dev/null
+++ b/src/memory_unit.v
@@ -0,0 +1,58 @@
+module memory_unit #(
+ parameter N = 32
+)(
+ input clk,
+ input rst,
+ input we,
+ input [N-1:0] addr,
+ output reg [N-1:0] data_read,
+ input [N-1:0] data_write
+);
+
+reg we_ram;
+wire [N-1:0] data_read_ram, data_read_rom;
+
+ram #(.N(N), .SIZE(1024)) ram(
+ .clk(clk),
+ .rst(rst),
+ .we(we_ram),
+ .addr(addr[N-17:0]),
+ .data_read(data_read_ram),
+ .data_write(data_write)
+);
+
+rom #(.N(N), .SIZE(1024)) rom(
+ .clk(clk),
+ .rst(rst),
+ .addr(addr[N-17:0]),
+ .data_read(data_read_rom)
+);
+
+// 0000 0000 Reserved
+// 0000 FFFF
+//
+// 0001 0000 ROM
+// 000F FFFF
+//
+// 0010 0000 RAM
+// FF0F FFFF
+//
+// FF10 0000 Reserved
+// FFFF FFFF
+
+
+always @(*) begin
+ we_ram = 0;
+ if (addr[N-1:N-16] == 16'h0000) begin
+ data_read <= 0;
+ end else if (addr[N-1:N-16] >= 16'h0001 && addr[N-1:N-16] <= 16'h000F) begin
+ data_read <= data_read_rom;
+ we_ram = we;
+ end else if (addr[N-1:N-16] >= 16'h0010 && addr[N-1:N-16] <= 16'hFF0F) begin
+ data_read <= data_read_ram;
+ end else if (addr[N-1:N-16] >= 16'hFF10 && addr[N-1:N-16] <= 16'hFFFF) begin
+ data_read <= 0;
+ end
+end
+
+endmodule