diff options
| author | Julian Blake Kongslie | 2022-05-22 17:09:03 -0700 |
|---|---|---|
| committer | Julian Blake Kongslie | 2022-05-22 17:09:03 -0700 |
| commit | 085e5ceac41833f197c6cebda1c0ec925c59fb8b (patch) | |
| tree | f8dd4565b12e78bab2070d839074e81d91359d8a /hdl/mem_arbiter.sv | |
| parent | Only sample RS232 signals once per clock; use a delayed flop internally. (diff) | |
| download | multipdp8-085e5ceac41833f197c6cebda1c0ec925c59fb8b.tar.xz | |
Two-cycle memory arbiter, enabling 16 PDP-8s @ 50MHz.
Diffstat (limited to '')
| -rw-r--r-- | hdl/mem_arbiter.sv | 24 |
1 files changed, 11 insertions, 13 deletions
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; |
