From 1929bbe3cc0d66e2585d7c71fe357acb2d5eec7e Mon Sep 17 00:00:00 2001 From: David Anderson Date: Sun, 8 Sep 2024 09:26:59 -0700 Subject: [PATCH] vram/VRAM: at last, a video RAM, with all the gubbins --- vram/VRAM.bsv | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 vram/VRAM.bsv diff --git a/vram/VRAM.bsv b/vram/VRAM.bsv new file mode 100644 index 0000000..d22c2f7 --- /dev/null +++ b/vram/VRAM.bsv @@ -0,0 +1,99 @@ +package VRAM; + +import Connectable::*; +import GetPut::*; +import ClientServer::*; +import Vector::*; +import FIFOF::*; +import SpecialFIFOs::*; + +import MemArbiter::*; +import VRAMCore::*; + +// Re-exports from VRAMCore +export VRAMAddr, VRAMData, VRAMRequest(..), VRAMResponse(..); + +export VRAMServer(..); +export VRAM(..), mkVRAM; + +typedef Server#(VRAMRequest, VRAMResponse) VRAMServer; + +// mkArbitratedVRAMServers expands a VRAMServer port into multiple +// ports through the use of a MemArbiter. +module mkArbitratedVRAMServers(VRAMServer ram, MemArbiter#(n, VRAMAddr) arb, Vector#(n, VRAMServer) ifc) + provisos (Min#(n, 1, 1), + Alias#(port_idx, UInt#(TLog#(n)))); + Vector#(n, FIFOF#(VRAMRequest)) requests <- replicateM(mkBypassFIFOF()); + Vector#(n, FIFOF#(VRAMResponse)) responses <- replicateM(mkBypassFIFOF()); + Reg#(Maybe#(port_idx)) awaiting_response[2] <- mkCReg(2, tagged Invalid); + + (* fire_when_enabled *) + rule request_ports; + for (Integer i=0; i