summaryrefslogtreecommitdiff
path: root/rtl/gfx/gfx_mem.sv
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2023-11-14 07:00:11 -0600
committerAlejandro Soto <alejandro@34project.org>2023-11-14 07:48:53 -0600
commit8b188d47eab923fb152eae475c86b378d0d5ebee (patch)
treee80fc954f4c31d68e10317c582846690ef46c1d2 /rtl/gfx/gfx_mem.sv
parent46c00a3ea411b2987f762959e4a051b80357d127 (diff)
rtl/gfx: implement memory interface
Diffstat (limited to 'rtl/gfx/gfx_mem.sv')
-rw-r--r--rtl/gfx/gfx_mem.sv70
1 files changed, 70 insertions, 0 deletions
diff --git a/rtl/gfx/gfx_mem.sv b/rtl/gfx/gfx_mem.sv
new file mode 100644
index 0000000..4b671be
--- /dev/null
+++ b/rtl/gfx/gfx_mem.sv
@@ -0,0 +1,70 @@
+`include "gfx/gfx_defs.sv"
+
+module gfx_mem
+(
+ input logic clk,
+ rst_n,
+
+ input logic mem_waitrequest,
+ mem_readdatavalid,
+ input mem_word mem_readdata,
+ output mem_addr mem_address,
+ output logic mem_read,
+ mem_write,
+ output mem_word mem_writedata,
+
+ input logic rop_write,
+ input mem_word rop_writedata,
+ input half_coord rop_address,
+ output logic rop_waitrequest,
+
+ input logic fb_read,
+ input half_coord fb_address,
+ output logic fb_waitrequest,
+ fb_readdatavalid,
+ output mem_word fb_readdata
+);
+
+ // Esto está mal, hay que reescribirlo totalmente
+
+ logic lock, lock_rop, select_rop, wait_state;
+
+ assign fb_readdata = mem_readdata;
+ assign fb_readdatavalid = mem_readdatavalid;
+
+ assign mem_writedata = rop_writedata;
+
+ assign wait_state = (mem_read || mem_write) && mem_waitrequest;
+
+ always_comb begin
+ select_rop = !fb_read;
+
+ if (lock)
+ select_rop = lock_rop;
+
+ mem_read = 0;
+ mem_write = 0;
+ fb_waitrequest = 1;
+ rop_waitrequest = 1;
+
+ if (select_rop) begin
+ mem_write = rop_write;
+ mem_address = {6'd0, rop_address};
+
+ rop_waitrequest = mem_waitrequest;
+ end else begin
+ mem_read = fb_read;
+ mem_address = {6'd0, fb_address};
+
+ fb_waitrequest = mem_waitrequest;
+ end
+ end
+
+ always_ff @(posedge clk or negedge rst_n)
+ lock <= !rst_n ? 0 : wait_state;
+
+ always_ff @(posedge clk)
+ if (wait_state)
+ lock_rop <= select_rop;
+
+endmodule