From ec2f4c0e20aaa130359630299362d03ce41d585c Mon Sep 17 00:00:00 2001 From: Alejandro Soto Date: Mon, 20 Nov 2023 16:23:17 -0600 Subject: rtl/gfx: implement program header command registers --- rtl/gfx/gfx_cmd.sv | 60 +++++++++++++++++++++++++++++++++++++++-------------- rtl/gfx/gfx_defs.sv | 5 +++++ 2 files changed, 50 insertions(+), 15 deletions(-) (limited to 'rtl/gfx') diff --git a/rtl/gfx/gfx_cmd.sv b/rtl/gfx/gfx_cmd.sv index 28fd4b1..40e2ccb 100644 --- a/rtl/gfx/gfx_cmd.sv +++ b/rtl/gfx/gfx_cmd.sv @@ -16,9 +16,16 @@ module gfx_cmd output logic swap_buffers, enable_clear, start_clear, - output rgb24 clear_color + output rgb24 clear_color, + + output logic program_start, + output cmd_word program_header_base, + program_header_size ); + rgb24 next_clear_color; + logic do_start_clear, next_start_clear, next_enable_clear, next_swap_buffers; + struct packed { logic[4:0] mbz; @@ -28,17 +35,15 @@ module gfx_cmd rgb24 clear_color; } readdata_scan, writedata_scan; - assign readdata_scan.clear_color = clear_color; + 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 writedata_scan = cmd_writedata; - - assign cmd_readdata = readdata_scan; - - rgb24 next_clear_color; - logic next_start_clear, next_enable_clear, next_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 @@ -49,21 +54,35 @@ module gfx_cmd next_start_clear <= 0; next_enable_clear <= 0; next_swap_buffers <= 0; + + program_start <= 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; end - if (cmd_write) begin - next_enable_clear <= writedata_scan.enable_clear; - next_swap_buffers <= writedata_scan.swap_buffers; + if (cmd_write) + unique case (cmd_address[1:0]) + `GFX_CMD_REG_ID: ; - if (!next_start_clear) - next_start_clear <= writedata_scan.start_frame && writedata_scan.enable_clear; - end + `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; + endcase end always_ff @(posedge clk) begin @@ -71,7 +90,18 @@ module gfx_cmd clear_color <= next_clear_color; if (cmd_write) - next_clear_color <= writedata_scan.clear_color; + unique case (cmd_address[1: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; + endcase end endmodule diff --git a/rtl/gfx/gfx_defs.sv b/rtl/gfx/gfx_defs.sv index 20102a4..fa297e6 100644 --- a/rtl/gfx/gfx_defs.sv +++ b/rtl/gfx/gfx_defs.sv @@ -188,6 +188,11 @@ typedef logic[`GFX_LANE_ADDR_BITS - 1:0] vram_lane_addr; typedef logic[5:0] cmd_addr; typedef logic[31:0] cmd_word; +`define GFX_CMD_REG_ID 2'b00 +`define GFX_CMD_REG_SCAN 2'b01 +`define GFX_CMD_REG_HEADER_BASE 2'b10 +`define GFX_CMD_REG_HEADER_SIZE 2'b11 + typedef struct packed { logic[$bits(cmd_word) - $bits(vram_insn_addr) - `GFX_INSN_SUBWORD_BITS - 1:0] pad; -- cgit v1.2.3