diff options
| -rw-r--r-- | gfx_hw.tcl | 2 | ||||
| -rw-r--r-- | rtl/gfx/gfx.sv | 26 | ||||
| -rw-r--r-- | rtl/gfx/gfx_fix_floats.sv | 49 | ||||
| -rw-r--r-- | rtl/gfx/gfx_fix_vertex.sv | 64 |
4 files changed, 137 insertions, 4 deletions
@@ -83,6 +83,8 @@ add_fileset_file gfx_fifo_overflow.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_fifo_overf add_fileset_file gfx_mem.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_mem.sv add_fileset_file gfx_persp.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_persp.sv add_fileset_file gfx_persp_vertex.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_persp_vertex.sv +add_fileset_file gfx_fix_floats.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_fix_floats.sv +add_fileset_file gfx_fix_vertex.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_fix_vertex.sv add_fileset_file gfx_sp.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_sp.sv add_fileset_file gfx_sp_isa.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_sp_isa.sv add_fileset_file gfx_sp_file.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_sp_file.sv diff --git a/rtl/gfx/gfx.sv b/rtl/gfx/gfx.sv index 6bead44..32364b3 100644 --- a/rtl/gfx/gfx.sv +++ b/rtl/gfx/gfx.sv @@ -62,18 +62,36 @@ module gfx .* ); + logic fix_ready, fix_valid; + raster_xyzw fix_vertex_a, fix_vertex_b, fix_vertex_c; + + gfx_fix_floats fix + ( + .in_ready(fix_ready), + .in_valid(0), //TODO + .out_ready(persp_ready), + .out_valid(fix_valid), + .in_vertex_a(), //TODO + .in_vertex_b(), //TODO + .in_vertex_c(), //TODO + .out_vertex_a(fix_vertex_a), + .out_vertex_b(fix_vertex_b), + .out_vertex_c(fix_vertex_c), + .* + ); + logic persp_ready, persp_valid; raster_xyzw persp_vertex_a, persp_vertex_b, persp_vertex_c; gfx_persp perspective ( .in_ready(persp_ready), - .in_valid(0), //TODO + .in_valid(fix_valid), .out_ready(raster_ready), .out_valid(persp_valid), - .in_vertex_a(), //TODO - .in_vertex_b(), //TODO - .in_vertex_c(), //TODO + .in_vertex_a(fix_vertex_a), + .in_vertex_b(fix_vertex_b), + .in_vertex_c(fix_vertex_c), .out_vertex_a(persp_vertex_a), .out_vertex_b(persp_vertex_b), .out_vertex_c(persp_vertex_c), diff --git a/rtl/gfx/gfx_fix_floats.sv b/rtl/gfx/gfx_fix_floats.sv new file mode 100644 index 0000000..fe3ab21 --- /dev/null +++ b/rtl/gfx/gfx_fix_floats.sv @@ -0,0 +1,49 @@ +`include "gfx/gfx_defs.sv" + +module gfx_fix_floats +( + input logic clk, + rst_n, + + input vec4 in_vertex_a, + in_vertex_b, + in_vertex_c, + input logic in_valid, + output logic in_ready, + + input logic out_ready, + output logic out_valid, + output raster_xyzw out_vertex_a, + out_vertex_b, + out_vertex_c +); + + logic stall; + + gfx_pipeline_flow #(.STAGES(`FP_FIX_STAGES + 1)) flow + ( + .* + ); + + gfx_fix_vertex fix_a + ( + .in_vertex(in_vertex_a), + .out_vertex(out_vertex_a), + .* + ); + + gfx_fix_vertex fix_b + ( + .in_vertex(in_vertex_b), + .out_vertex(out_vertex_b), + .* + ); + + gfx_fix_vertex fix_c + ( + .in_vertex(in_vertex_c), + .out_vertex(out_vertex_c), + .* + ); + +endmodule diff --git a/rtl/gfx/gfx_fix_vertex.sv b/rtl/gfx/gfx_fix_vertex.sv new file mode 100644 index 0000000..728f3b6 --- /dev/null +++ b/rtl/gfx/gfx_fix_vertex.sv @@ -0,0 +1,64 @@ +`include "gfx/gfx_defs.sv" + +module gfx_fix_vertex +( + input logic clk, + + input vec4 in_vertex, + input logic stall, + + output raster_xyzw out_vertex +); + + fixed x, y; + raster_xyzw fixed_vertex, corrected; + fixed[`FLOATS_PER_VEC - 1:0] fixed_vals, corrected_vals, skid_vals; + + assign out_vertex = skid_vals; + assign fixed_vertex = fixed_vals; + assign corrected_vals = corrected; + + assign x = fixed_vertex.xy.x; + assign y = fixed_vertex.xy.y; + + genvar i; + generate + for (i = 0; i < `FLOATS_PER_VEC; ++i) begin: components + gfx_fp_fix fix + ( + .in(in_vertex[i]), + .out(fixed_vals[i]), + .* + ); + + gfx_skid_buf #(.WIDTH($bits(fixed))) skid + ( + .in(corrected_vals[i]), + .out(skid_vals[i]), + .* + ); + end + endgenerate + + always_ff @(posedge clk) + if (!stall) begin + /* x * `GFX_X_RES / 2 + * = x * 320 + * = x * 64 * 5 + * = (x * 5) << 6 + * = (x * (4 + 1)) << 6 + * = ((x << 2) + x) << 6 + * + * y * `GFX_Y_RES / 2 + * = y * 240 + * = y * 16 * 15 + * = (y * 15) << 4 + * = (y * (16 - 1)) << 4 + * = ((y << 4) - y) << 4 + */ + corrected.zw <= fixed_vertex.zw; + corrected.xy.x <= ((x << 2) + x) << 6; + corrected.xy.y <= ((y << 4) - y) << 4; + end + +endmodule |
