diff options
| author | Alejandro Soto <alejandro@34project.org> | 2024-05-05 17:34:22 -0600 |
|---|---|---|
| committer | Alejandro Soto <alejandro@34project.org> | 2024-05-05 17:38:27 -0600 |
| commit | 081a8a3ba8bfe036f31da53f9c041a2caa30fce2 (patch) | |
| tree | 7d712b67d3dc1ad3d37041562774ba3c4e5a7f49 /rtl/legacy_gfx/gfx_cmd.sv | |
| parent | e5b64ea353678baabd16d245fcfaa3384e1acf8f (diff) | |
rtl/legacy_gfx: rename gfx -> legacy_gfx
Diffstat (limited to 'rtl/legacy_gfx/gfx_cmd.sv')
| -rw-r--r-- | rtl/legacy_gfx/gfx_cmd.sv | 125 |
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 |
