summaryrefslogtreecommitdiff
path: root/hdl
diff options
context:
space:
mode:
authorJulian Blake Kongslie2022-05-22 17:09:03 -0700
committerJulian Blake Kongslie2022-05-22 17:09:03 -0700
commit085e5ceac41833f197c6cebda1c0ec925c59fb8b (patch)
treef8dd4565b12e78bab2070d839074e81d91359d8a /hdl
parentOnly sample RS232 signals once per clock; use a delayed flop internally. (diff)
downloadmultipdp8-085e5ceac41833f197c6cebda1c0ec925c59fb8b.tar.xz
Two-cycle memory arbiter, enabling 16 PDP-8s @ 50MHz.
Diffstat (limited to 'hdl')
-rw-r--r--hdl/defs.svh2
-rw-r--r--hdl/mem_arbiter.sv24
2 files changed, 12 insertions, 14 deletions
diff --git a/hdl/defs.svh b/hdl/defs.svh
index 3206764..f4590c8 100644
--- a/hdl/defs.svh
+++ b/hdl/defs.svh
@@ -5,7 +5,7 @@
5 5
6`define PDP_ADDRESS_BITS 15 6`define PDP_ADDRESS_BITS 15
7 7
8`define NUM_PDPS 2 8`define NUM_PDPS 16
9 9
10`define UART_BYTE_BITS 8 10`define UART_BYTE_BITS 8
11 11
diff --git a/hdl/mem_arbiter.sv b/hdl/mem_arbiter.sv
index a48f96d..1404a54 100644
--- a/hdl/mem_arbiter.sv
+++ b/hdl/mem_arbiter.sv
@@ -34,6 +34,12 @@ module mem_arbiter
34 end else begin 34 end else begin
35 if (ram_ready) ram_valid = 0; 35 if (ram_ready) ram_valid = 0;
36 36
37 if (!ram_valid && hold_valid[selector]) begin
38 ram_valid = 1;
39 ram_data = hold_data[selector];
40 hold_valid[selector] = 0;
41 end
42
37 if (hold_valid == 0) begin 43 if (hold_valid == 0) begin
38 if (command_ready && command_valid) begin 44 if (command_ready && command_valid) begin
39 hold_valid[0] = 1; 45 hold_valid[0] = 1;
@@ -54,25 +60,17 @@ module mem_arbiter
54 end 60 end
55 61
56 if (hold_valid != 0) begin 62 if (hold_valid != 0) begin
57 automatic bit ram_was_valid = ram_valid;
58 for (int i = 0; i < `NUM_PDPS+1; ++i) begin 63 for (int i = 0; i < `NUM_PDPS+1; ++i) begin
59 automatic int j = selector + i; 64 automatic int j = selector + i;
60 if (j > `NUM_PDPS) j = j - (`NUM_PDPS+1); 65 if (j > `NUM_PDPS)
61 if (!ram_valid && hold_valid[j]) begin 66 j -= `NUM_PDPS+1;
62 ram_valid = 1; 67 if (hold_valid[j]) begin
63 ram_data = hold_data[j]; 68 selector = j;
64 hold_valid[j] = 0; 69 break;
65 end 70 end
66 end 71 end
67 if (ram_valid && !ram_was_valid) begin
68 if (selector == `NUM_PDPS)
69 selector = 0;
70 else
71 ++selector;
72 end
73 end 72 end
74 73
75
76 command_ready = hold_valid == 0; 74 command_ready = hold_valid == 0;
77 for (int i = 0; i < `NUM_PDPS; ++i) 75 for (int i = 0; i < `NUM_PDPS; ++i)
78 pdp_ready[i] = hold_valid == 0; 76 pdp_ready[i] = hold_valid == 0;