From 085e5ceac41833f197c6cebda1c0ec925c59fb8b Mon Sep 17 00:00:00 2001 From: Julian Blake Kongslie Date: Sun, 22 May 2022 17:09:03 -0700 Subject: Two-cycle memory arbiter, enabling 16 PDP-8s @ 50MHz. --- hdl/defs.svh | 2 +- hdl/mem_arbiter.sv | 24 +++++++++++------------- 2 files changed, 12 insertions(+), 14 deletions(-) (limited to 'hdl') 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 @@ `define PDP_ADDRESS_BITS 15 -`define NUM_PDPS 2 +`define NUM_PDPS 16 `define UART_BYTE_BITS 8 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 end else begin if (ram_ready) ram_valid = 0; + if (!ram_valid && hold_valid[selector]) begin + ram_valid = 1; + ram_data = hold_data[selector]; + hold_valid[selector] = 0; + end + if (hold_valid == 0) begin if (command_ready && command_valid) begin hold_valid[0] = 1; @@ -54,25 +60,17 @@ module mem_arbiter end if (hold_valid != 0) begin - automatic bit ram_was_valid = ram_valid; for (int i = 0; i < `NUM_PDPS+1; ++i) begin automatic int j = selector + i; - if (j > `NUM_PDPS) j = j - (`NUM_PDPS+1); - if (!ram_valid && hold_valid[j]) begin - ram_valid = 1; - ram_data = hold_data[j]; - hold_valid[j] = 0; + if (j > `NUM_PDPS) + j -= `NUM_PDPS+1; + if (hold_valid[j]) begin + selector = j; + break; end end - if (ram_valid && !ram_was_valid) begin - if (selector == `NUM_PDPS) - selector = 0; - else - ++selector; - end end - command_ready = hold_valid == 0; for (int i = 0; i < `NUM_PDPS; ++i) pdp_ready[i] = hold_valid == 0; -- cgit v1.2.3