summaryrefslogtreecommitdiff
path: root/rtl/legacy_gfx/gfx_cmd.sv
diff options
context:
space:
mode:
Diffstat (limited to 'rtl/legacy_gfx/gfx_cmd.sv')
-rw-r--r--rtl/legacy_gfx/gfx_cmd.sv125
1 files changed, 125 insertions, 0 deletions
diff --git a/rtl/legacy_gfx/gfx_cmd.sv b/rtl/legacy_gfx/gfx_cmd.sv
new file mode 100644
index 0000000..29b6e21
--- /dev/null
+++ b/rtl/legacy_gfx/gfx_cmd.sv
@@ -0,0 +1,125 @@
+`include "gfx/gfx_defs.sv"
+
+module gfx_cmd
+(
+ input logic clk,
+ rst_n,
+
+ input cmd_addr cmd_address,
+ input logic cmd_read,
+ cmd_write,
+ input cmd_word cmd_writedata,
+ output cmd_word cmd_readdata,
+
+ input logic vsync,
+
+ output logic swap_buffers,
+ enable_clear,
+ start_clear,
+ output rgb24 clear_color,
+
+ output logic program_start,
+ output cmd_word program_header_base,
+ program_header_size,
+
+ output cmd_word fb_base_a,
+ fb_base_b
+);
+
+ rgb24 next_clear_color;
+ logic do_start_clear, next_start_clear, next_enable_clear, next_swap_buffers;
+
+ struct packed
+ {
+ logic[4:0] mbz;
+ logic start_frame,
+ enable_clear,
+ swap_buffers;
+ rgb24 clear_color;
+ } readdata_scan, writedata_scan;
+
+ assign cmd_readdata = readdata_scan;
+
+ assign writedata_scan = cmd_writedata;
+ assign readdata_scan.mbz = 0;
+ assign readdata_scan.clear_color = clear_color;
+ assign readdata_scan.enable_clear = enable_clear;
+ assign readdata_scan.swap_buffers = swap_buffers;
+
+ assign do_start_clear = writedata_scan.start_frame && writedata_scan.enable_clear;
+
+ always_ff @(posedge clk or negedge rst_n)
+ if (!rst_n) begin
+ start_clear <= 0;
+ enable_clear <= 0;
+ swap_buffers <= 0;
+
+ next_start_clear <= 0;
+ next_enable_clear <= 0;
+ next_swap_buffers <= 0;
+
+ program_start <= 0;
+
+ fb_base_a <= 0;
+ fb_base_b <= 0;
+ end else begin
+ start_clear <= 0;
+ program_start <= 0;
+
+ if (vsync) begin
+ start_clear <= next_start_clear;
+ enable_clear <= next_enable_clear;
+ swap_buffers <= next_swap_buffers;
+
+ next_start_clear <= 0;
+ end
+
+ if (cmd_write)
+ unique case (cmd_address[2:0])
+ `GFX_CMD_REG_ID: ;
+
+ `GFX_CMD_REG_SCAN: begin
+ next_enable_clear <= writedata_scan.enable_clear;
+ next_swap_buffers <= writedata_scan.swap_buffers;
+
+ if (!next_start_clear)
+ next_start_clear <= do_start_clear;
+ end
+
+ `GFX_CMD_REG_HEADER_BASE: ;
+
+ `GFX_CMD_REG_HEADER_SIZE:
+ program_start <= 1;
+
+ `GFX_CMD_REG_FB_BASE_A:
+ fb_base_a <= cmd_writedata;
+
+ `GFX_CMD_REG_FB_BASE_B:
+ fb_base_b <= cmd_writedata;
+
+ default: ;
+ endcase
+ end
+
+ always_ff @(posedge clk) begin
+ if (vsync)
+ clear_color <= next_clear_color;
+
+ if (cmd_write)
+ unique case (cmd_address[2:0])
+ `GFX_CMD_REG_ID: ;
+
+ `GFX_CMD_REG_SCAN:
+ next_clear_color <= writedata_scan.clear_color;
+
+ `GFX_CMD_REG_HEADER_BASE:
+ program_header_base <= cmd_writedata;
+
+ `GFX_CMD_REG_HEADER_SIZE:
+ program_header_size <= cmd_writedata;
+
+ default: ;
+ endcase
+ end
+
+endmodule