1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
`ifndef GFX_DEFS_SV
`define GFX_DEFS_SV
// Esto es arquitectural, no se puede ajustar sin cambiar otras cosas
`define FLOAT_BITS 16
`define FLOATS_PER_VEC 4
`define VECS_PER_MAT 4
// Target de 200MHz (reloj es 143MHz) con float16, rounding aproximado
`define FP_ADD_STAGES 10 // ~401 LUTs
`define FP_MUL_STAGES 5 // ~144 LUTs ~1 bloque DSP
`define FP_INV_STAGES 3 // ~178 LUTs ~1 bloque DSP
typedef logic[`FLOAT_BITS - 1:0] fp;
typedef fp vec2[2];
typedef fp vec4[`FLOATS_PER_VEC];
typedef vec4 mat4[`VECS_PER_MAT];
`define FP_UNIT 16'h3c00
typedef struct packed
{
fp x, y, z, w;
} attr4;
typedef logic[1:0] index4;
`define INDEX4_MIN 2'b00
`define INDEX4_MAX 2'b11
typedef logic[8:0] x_coord;
typedef logic[9:0] y_coord;
typedef logic[9:0] xy_coord;
typedef logic[18:0] linear_coord;
typedef logic[19:0] half_coord;
`define GFX_X_RES 640
`define GFX_Y_RES 480
`define GFX_LINEAR_RES (`GFX_X_RES * `GFX_Y_RES)
typedef struct packed
{
logic[7:0] r, g, b;
} rgb24;
typedef struct packed
{
logic[9:0] r, g, b;
} rgb30;
typedef struct packed
{
logic[7:0] a, r, g, b;
} rgb32;
`define FIXED_FRAC 16
`define FIXED_FMA_STAGES 5
`define FIXED_FMA_DOT_STAGES (2 * `FIXED_FMA_STAGES)
typedef logic signed[31:0] fixed;
typedef fixed[2:0] fixed_tri;
typedef struct packed
{
fixed x, y;
} raster_xy;
typedef logic[7:0] coarse_dim;
`define GFX_MASK_SRAM_STAGES 3
`define GFX_MASK_STAGES (1 + `GFX_MASK_SRAM_STAGES + 1)
`define GFX_SCAN_STAGES 3 // Ajustable
`define GFX_SETUP_BOUNDS_STAGES 3
`define GFX_SETUP_EDGE_STAGES (1 + `FIXED_FMA_DOT_STAGES)
`define GFX_SETUP_OFFSETS_STAGES 2
`define GFX_SETUP_STAGES (`GFX_SETUP_BOUNDS_STAGES \
+ `GFX_SETUP_EDGE_STAGES \
+ `GFX_SETUP_OFFSETS_STAGES)
`define GFX_FINE_STAGES 2
`define GFX_RASTER_BITS 2
`define GFX_RASTER_SUB_BITS 4
`define GFX_RASTER_PAD_BITS ($bits(fixed) - $bits(coarse_dim) - `FIXED_FRAC - `GFX_RASTER_BITS - 1)
`define GFX_RASTER_SIZE (1 << `GFX_RASTER_BITS)
`define GFX_RASTER_OFFSETS (1 << (2 * `GFX_RASTER_BITS))
typedef struct packed
{
logic[`GFX_RASTER_SUB_BITS - 1:0] num;
logic[`FIXED_FRAC - `GFX_RASTER_SUB_BITS - 1:0] prec;
} raster_sub;
typedef struct packed
{
logic sign;
logic[`GFX_RASTER_PAD_BITS - 1:0] padding;
coarse_dim coarse;
logic[`GFX_RASTER_BITS - 1:0] fine;
raster_sub sub;
} raster_prec;
typedef struct packed
{
raster_prec x, y;
} raster_xy_prec;
typedef fixed[`GFX_RASTER_OFFSETS - 1:0] raster_offsets;
typedef raster_offsets[2:0] raster_offsets_tri;
`define GFX_FINE_LANES (`GFX_RASTER_SIZE * `GFX_RASTER_SIZE)
typedef struct packed
{
xy_coord x, y;
} frag_xy;
typedef frag_xy[`GFX_FINE_LANES - 1:0] frag_xy_lanes;
typedef logic[`GFX_FINE_LANES - 1:0] paint_lanes;
typedef struct packed
{
linear_coord addr;
rgb32 color;
} frag_paint;
`define GFX_FRAG_ADDR_STAGES 3
`endif
|