OpenCores
URL https://opencores.org/ocsvn/orsoc_graphics_accelerator/orsoc_graphics_accelerator/trunk

Subversion Repositories orsoc_graphics_accelerator

[/] [orsoc_graphics_accelerator/] [tags/] [version1.0/] [rtl/] [verilog/] [gfx/] [gfx_top.v] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 maiden
/*
2
ORSoC GFX accelerator core
3
Copyright 2012, ORSoC, Per Lenander, Anton Fosselius.
4
 
5
TOP MODULE
6
 
7
 This file is part of orgfx.
8
 
9
 orgfx is free software: you can redistribute it and/or modify
10
 it under the terms of the GNU Lesser General Public License as published by
11
 the Free Software Foundation, either version 3 of the License, or
12
 (at your option) any later version.
13
 
14
 orgfx is distributed in the hope that it will be useful,
15
 but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
 GNU Lesser General Public License for more details.
18
 
19
 You should have received a copy of the GNU Lesser General Public License
20
 along with orgfx.  If not, see <http://www.gnu.org/licenses/>.
21
 
22
*/
23
 
24
module gfx_top (wb_clk_i, wb_rst_i, wb_inta_o,
25
  // Wishbone master signals (interfaces with video memory, write)
26
  wbm_write_cyc_o, wbm_write_stb_o, wbm_write_cti_o, wbm_write_bte_o, wbm_write_we_o, wbm_write_adr_o, wbm_write_sel_o, wbm_write_ack_i, wbm_write_err_i, wbm_write_dat_o,
27
  // Wishbone master signals (interfaces with video memory, read)
28
  wbm_read_cyc_o, wbm_read_stb_o, wbm_read_cti_o, wbm_read_bte_o, wbm_read_we_o, wbm_read_adr_o, wbm_read_sel_o, wbm_read_ack_i, wbm_read_err_i, wbm_read_dat_i,
29
  // Wishbone slave signals (interfaces with main bus/CPU)
30
  wbs_cyc_i, wbs_stb_i, wbs_cti_i, wbs_bte_i, wbs_we_i, wbs_adr_i, wbs_sel_i, wbs_ack_o, wbs_err_o, wbs_dat_i, wbs_dat_o
31
);
32
 
33
// Common wishbone signals
34
input         wb_clk_i;    // master clock input
35
input         wb_rst_i;    // Asynchronous active high reset
36
output        wb_inta_o;   // interrupt
37
 
38
// Wishbone master signals (write)
39
output        wbm_write_cyc_o;    // cycle output
40
output        wbm_write_stb_o;    // strobe output
41
output [ 2:0] wbm_write_cti_o;    // cycle type id
42
output [ 1:0] wbm_write_bte_o;    // burst type extension
43
output        wbm_write_we_o;     // write enable output
44
output [31:0] wbm_write_adr_o;    // address output
45
output [ 3:0] wbm_write_sel_o;    // byte select outputs (only 32bits accesses are supported)
46
input         wbm_write_ack_i;    // wishbone cycle acknowledge
47
input         wbm_write_err_i;    // wishbone cycle error
48
output [31:0] wbm_write_dat_o;    // wishbone data out
49
 
50
// Wishbone master signals (read)
51
output        wbm_read_cyc_o;    // cycle output
52
output        wbm_read_stb_o;    // strobe output
53
output [ 2:0] wbm_read_cti_o;    // cycle type id
54
output [ 1:0] wbm_read_bte_o;    // burst type extension
55
output        wbm_read_we_o;     // write enable output
56
output [31:0] wbm_read_adr_o;    // address output
57
output [ 3:0] wbm_read_sel_o;    // byte select outputs (only 32bits accesses are supported)
58
input         wbm_read_ack_i;    // wishbone cycle acknowledge
59
input         wbm_read_err_i;    // wishbone cycle error
60
input [31:0]  wbm_read_dat_i;    // wishbone data in
61
 
62
// Wishbone slave signals
63
input         wbs_cyc_i;    // cycle input
64
input         wbs_stb_i;    // strobe input
65
input [ 2:0]  wbs_cti_i;    // cycle type id
66
input [ 1:0]  wbs_bte_i;    // burst type extension
67
input         wbs_we_i;     // write enable input
68
input [31:0]  wbs_adr_i;    // address input
69
input [ 3:0]  wbs_sel_i;    // byte select input (only 32bits accesses are supported)
70
output        wbs_ack_o;    // wishbone cycle acknowledge
71
output        wbs_err_o;    // wishbone cycle error
72
input  [31:0] wbs_dat_i;    // wishbone data in
73
output [31:0] wbs_dat_o;    // wishbone data out
74
 
75
// Wires and variables
76
 
77
wire wbmwriter_sint; // connect to slave interface
78
wire wbmreader_sint;
79
 
80
wire raster_wbs_pipeline_ack;
81
 
82
wire [31:2] target_base_reg;
83
wire [15:0] wbs_raster_target_size_x;
84
wire [15:0] wbs_raster_target_size_y;
85
wire [15:0] target_size_x_reg;
86
wire [15:0] target_size_y_reg;
87
 
88
assign target_size_x_reg = wbs_raster_target_size_x;
89
assign target_size_y_reg = wbs_raster_target_size_y;
90
 
91
wire [31:2] wbs_fragment_tex0_base;
92
wire [15:0] wbs_fragment_tex0_size_x;
93
wire [15:0] wbs_fragment_tex0_size_y;
94
 
95
wire [31:2] render_wbmwriter_addr;
96
wire [3:0]  render_wbmwriter_sel;
97
wire [31:0] render_wbmwriter_dat;
98
 
99
wire [1:0] color_depth_reg;
100
 
101
wire render_wbmwriter_memory_pixel_write;
102
wire wbs_raster_rect_write;
103
wire wbs_raster_line_write;
104
wire wbmwriter_render_ack;
105
 
106
// src pixel
107
wire [15:0] wbs_raster_src_pixel0_x;
108
wire [15:0] wbs_raster_src_pixel0_y;
109
wire [15:0] wbs_raster_src_pixel1_x;
110
wire [15:0] wbs_raster_src_pixel1_y;
111
 
112
// dest pixel
113
wire [15:0] wbs_raster_dest_pixel0_x;
114
wire [15:0] wbs_raster_dest_pixel0_y;
115
wire [15:0] wbs_raster_dest_pixel1_x;
116
wire [15:0] wbs_raster_dest_pixel1_y;
117
 
118
// clip pixel
119
wire [15:0] wbs_raster_clip_pixel0_x;
120
wire [15:0] wbs_raster_clip_pixel0_y;
121
wire [15:0] wbs_raster_clip_pixel1_x;
122
wire [15:0] wbs_raster_clip_pixel1_y;
123
 
124
wire [31:0] wbs_fragment_color;
125
 
126
wire texture_enable_reg;
127
 
128
wire        blending_enable_reg;
129
wire [7:0]  global_alpha_reg;
130
wire        colorkey_enable_reg;
131
wire [31:0] colorkey_reg;
132
 
133
// Slave wishbone interface. Reads wishbone bus and fills registers
134
gfx_wbs wb_databus (
135
  .clk_i             (wb_clk_i),
136
  .rst_i             (wb_rst_i),
137
  .adr_i             (wbs_adr_i[9:0]),
138
  .dat_i             (wbs_dat_i),
139
  .dat_o             (wbs_dat_o),
140
  .sel_i             (wbs_sel_i),
141
  .we_i              (wbs_we_i),
142
  .stb_i             (wbs_stb_i),
143
  .cyc_i             (wbs_cyc_i),
144
  .ack_o             (wbs_ack_o),
145
  .rty_o             (),
146
  .err_o             (wbs_err_o),
147
  .inta_o            (wb_inta_o),
148
 
149
  //source pixel
150
  .src_pixel0_x_o    (wbs_raster_src_pixel0_x),
151
  .src_pixel0_y_o    (wbs_raster_src_pixel0_y),
152
  .src_pixel1_x_o    (wbs_raster_src_pixel1_x),
153
  .src_pixel1_y_o    (wbs_raster_src_pixel1_y),
154
  //destination pixel
155
  .dest_pixel0_x_o   (wbs_raster_dest_pixel0_x),
156
  .dest_pixel0_y_o   (wbs_raster_dest_pixel0_y),
157
  .dest_pixel1_x_o   (wbs_raster_dest_pixel1_x),
158
  .dest_pixel1_y_o   (wbs_raster_dest_pixel1_y),
159
  //clip pixel
160
  .clip_pixel0_x_o   (wbs_raster_clip_pixel0_x),
161
  .clip_pixel0_y_o   (wbs_raster_clip_pixel0_y),
162
  .clip_pixel1_x_o   (wbs_raster_clip_pixel1_x),
163
  .clip_pixel1_y_o   (wbs_raster_clip_pixel1_y),
164
 
165
  .color_o           (wbs_fragment_color),
166
 
167
  .target_base_o     (target_base_reg),
168
  .target_size_x_o   (wbs_raster_target_size_x),
169
  .target_size_y_o   (wbs_raster_target_size_y),
170
  .tex0_base_o       (wbs_fragment_tex0_base),
171
  .tex0_size_x_o     (wbs_fragment_tex0_size_x),
172
  .tex0_size_y_o     (wbs_fragment_tex0_size_y),
173
 
174
  .color_depth_o     (color_depth_reg),
175
 
176
  .rect_write_o      (wbs_raster_rect_write),
177
  .line_write_o      (wbs_raster_line_write),
178
 
179
  .sint_i            (wbmwriter_sint | wbmreader_sint),
180
 
181
  .pipeline_ack_i    (raster_wbs_pipeline_ack),
182
 
183
  .texture_enable_o  (texture_enable_reg),
184
  .blending_enable_o (blending_enable_reg),
185
  .global_alpha_o    (global_alpha_reg),
186
  .colorkey_enable_o (colorkey_enable_reg),
187
  .colorkey_o        (colorkey_reg)
188
  );
189
 
190
/*
191
// TODO: Remove temp wires
192
wire vector_in;
193
wire vector;
194
 
195
// Vector processor applies transforms to points
196
gfx_vector_processor vp0 (
197
  .clk_i        (wb_clk_i),
198
  .rst_i        (wb_rst_i),
199
  .vector_i     (vector_in),
200
  .vector_o     (vector)
201
  );
202
*/
203
 
204
wire raster_fragment_write_enable;
205
wire [15:0] raster_fragment_x_pixel;
206
wire [15:0] raster_fragment_y_pixel;
207
wire fragment_raster_ack;
208
wire [15:0] raster_fragment_u;
209
wire [15:0] raster_fragment_v;
210
 
211
// Rasterizer generates pixels to calculate
212
gfx_rasterizer rasterizer0 (
213
  .clk_i            (wb_clk_i),
214
  .rst_i            (wb_rst_i),
215
 
216
  .ack_i            (fragment_raster_ack),
217
  .ack_o            (raster_wbs_pipeline_ack),
218
  .rect_write_i     (wbs_raster_rect_write),
219
  .line_write_i     (wbs_raster_line_write),
220
  .texture_enable_i (texture_enable_reg),
221
  // source pixel coordinates
222
  .src_pixel0_x_i   (wbs_raster_src_pixel0_x),
223
  .src_pixel0_y_i   (wbs_raster_src_pixel0_y),
224
  .src_pixel1_x_i   (wbs_raster_src_pixel1_x),
225
  .src_pixel1_y_i   (wbs_raster_src_pixel1_y),
226
 
227
  // destination pixel coordinates
228
  .dest_pixel0_x_i  (wbs_raster_dest_pixel0_x),
229
  .dest_pixel0_y_i  (wbs_raster_dest_pixel0_y),
230
  .dest_pixel1_x_i  (wbs_raster_dest_pixel1_x),
231
  .dest_pixel1_y_i  (wbs_raster_dest_pixel1_y),
232
 
233
  // clip pixel coordinates
234
  .clip_pixel0_x_i  (wbs_raster_clip_pixel0_x),
235
  .clip_pixel0_y_i  (wbs_raster_clip_pixel0_y),
236
  .clip_pixel1_x_i  (wbs_raster_clip_pixel1_x),
237
  .clip_pixel1_y_i  (wbs_raster_clip_pixel1_y),
238
 
239
  // Screen size
240
  .target_size_x_i  (wbs_raster_target_size_x),
241
  .target_size_y_i  (wbs_raster_target_size_y),
242
 
243
  // Output pixel
244
  .x_counter_o      (raster_fragment_x_pixel),
245
  .y_counter_o      (raster_fragment_y_pixel),
246
  .u_o              (raster_fragment_u),
247
  .v_o              (raster_fragment_v),
248
  .write_o          (raster_fragment_write_enable)
249
  );
250
 
251
wire fragment_blender_write_enable;
252
wire [15:0] fragment_blender_x_pixel;
253
wire [15:0] fragment_blender_y_pixel;
254
wire blender_fragment_ack;
255
wire [31:0] fragment_blender_color;
256
wire [7:0] fragment_blender_alpha;
257
 
258
wire wbmreader_fragment_texture_ack;
259
wire [31:0] wbmreader_fragment_texture_data;
260
wire [31:2] fragment_wbmreader_texture_addr;
261
wire [3:0] fragment_wbmreader_texture_sel;
262
wire fragment_wbmreader_texture_request;
263
 
264
 
265
// Fragment processor generates color of pixel (requires RAM read for textures)
266
gfx_fragment_processor fp0 (
267
  .clk_i             (wb_clk_i),
268
  .rst_i             (wb_rst_i),
269
  .global_alpha_i    (global_alpha_reg),
270
  .x_counter_i       (raster_fragment_x_pixel),
271
  .y_counter_i       (raster_fragment_y_pixel),
272
  .u_i               (raster_fragment_u),
273
  .v_i               (raster_fragment_v),
274
  .ack_i             (blender_fragment_ack),
275
  .write_i           (raster_fragment_write_enable),
276
  .pixel_x_o         (fragment_blender_x_pixel),
277
  .pixel_y_o         (fragment_blender_y_pixel),
278
  .pixel_color_i     (wbs_fragment_color),
279
  .pixel_color_o     (fragment_blender_color),
280
  .pixel_alpha_o     (fragment_blender_alpha),
281
  .write_o           (fragment_blender_write_enable),
282
  .ack_o             (fragment_raster_ack),
283
  .texture_ack_i     (wbmreader_fragment_texture_ack),
284
  .texture_data_i    (wbmreader_fragment_texture_data),
285
  .texture_addr_o    (fragment_wbmreader_texture_addr),
286
  .texture_sel_o     (fragment_wbmreader_texture_sel),
287
  .texture_request_o (fragment_wbmreader_texture_request),
288
  .texture_enable_i  (texture_enable_reg),
289
  .tex0_base_i       (wbs_fragment_tex0_base),
290
  .tex0_size_x_i     (wbs_fragment_tex0_size_x),
291
  .tex0_size_y_i     (wbs_fragment_tex0_size_y),
292
  .color_depth_i     (color_depth_reg),
293
  .colorkey_enable_i (colorkey_enable_reg),
294
  .colorkey_i        (colorkey_reg)
295
  );
296
 
297
wire blender_render_write_enable;
298
wire [15:0] blender_render_x_pixel;
299
wire [15:0] blender_render_y_pixel;
300
wire render_blender_ack;
301
wire [31:0] blender_render_color;
302
 
303
// Connected through arbiter
304
wire wbmreader_blender_target_ack;
305
wire [31:2] blender_wbmreader_target_addr;
306
wire [31:0] wbmreader_blender_target_data;
307
wire [3:0] blender_wbmreader_target_sel;
308
wire blender_wbmreader_target_request;
309
wire wbmreader_blender_busy;
310
 
311
// Applies alpha blending if enabled (requires RAM read to get target pixel color)
312
// Fragment processor generates color of pixel (requires RAM read for textures)
313
gfx_blender blender0 (
314
  .clk_i            (wb_clk_i),
315
  .rst_i            (wb_rst_i),
316
  .blending_enable_i (blending_enable_reg),
317
  // Render target information
318
  .target_base_i    (target_base_reg),
319
  .target_size_x_i  (target_size_x_reg),
320
  .target_size_y_i  (target_size_y_reg),
321
  .color_depth_i    (color_depth_reg),
322
  .x_counter_i      (fragment_blender_x_pixel),
323
  .y_counter_i      (fragment_blender_y_pixel),
324
  .alpha_i          (fragment_blender_alpha),
325
  .ack_i            (render_blender_ack),
326
  .target_ack_i     (wbmreader_blender_target_ack),
327
  .target_addr_o    (blender_wbmreader_target_addr),
328
  .target_data_i    (wbmreader_blender_target_data),
329
  .target_sel_o     (blender_wbmreader_target_sel),
330
  .target_request_o (blender_wbmreader_target_request),
331
  .wbm_busy_i       (wbmreader_blender_busy),
332
  .write_i          (fragment_blender_write_enable),
333
  .pixel_x_o        (blender_render_x_pixel),
334
  .pixel_y_o        (blender_render_y_pixel),
335
  .pixel_color_i    (fragment_blender_color),
336
  .pixel_color_o    (blender_render_color),
337
  .write_o          (blender_render_write_enable),
338
  .ack_o            (blender_fragment_ack)
339
  );
340
 
341
// Write pixel to target (check for out of bounds)
342
gfx_renderer renderer (
343
  .clk_i           (wb_clk_i),
344
  .rst_i           (wb_rst_i),
345
  // Render target information
346
  .target_base_i   (target_base_reg),
347
  .target_size_x_i (target_size_x_reg),
348
  .target_size_y_i (target_size_y_reg),
349
  .color_depth_i   (color_depth_reg),
350
  // Input pixel
351
  .pixel_x_i       (blender_render_x_pixel),
352
  .pixel_y_i       (blender_render_y_pixel),
353
  .color_i         (blender_render_color),
354
 
355
  .render_addr_o   (render_wbmwriter_addr),
356
  .render_sel_o    (render_wbmwriter_sel),
357
  .render_dat_o    (render_wbmwriter_dat),
358
  .ack_o           (render_blender_ack),
359
  .ack_i           (wbmwriter_render_ack),
360
  .write_i         (blender_render_write_enable),
361
  .write_o         (render_wbmwriter_memory_pixel_write)
362
  );
363
 
364
// Instansiate wishbone master interface (write only)
365
gfx_wbm_write wbm_writer (
366
  .clk_i           (wb_clk_i),
367
  .rst_i           (wb_rst_i),
368
  .cyc_o           (wbm_write_cyc_o),
369
  .stb_o           (wbm_write_stb_o),
370
  .cti_o           (wbm_write_cti_o),
371
  .bte_o           (wbm_write_bte_o),
372
  .we_o            (wbm_write_we_o),
373
  .adr_o           (wbm_write_adr_o),
374
  .sel_o           (wbm_write_sel_o),
375
  .ack_i           (wbm_write_ack_i),
376
  .err_i           (wbm_write_err_i),
377
  .dat_o           (wbm_write_dat_o),
378
  .sint_o          (wbmwriter_sint),
379
 
380
  .write_i         (render_wbmwriter_memory_pixel_write),
381
  .ack_o           (wbmwriter_render_ack),
382
 
383
  // send ack to renderer when done writing to memory.
384
  .render_addr_i   (render_wbmwriter_addr),
385
  .render_sel_i    (render_wbmwriter_sel),
386
  .render_dat_i    (render_wbmwriter_dat)
387
  );
388
 
389
wire wbmreader_arbiter_ack;
390
wire [31:2] arbiter_wbmreader_addr;
391
wire [31:0] wbmreader_arbiter_data;
392
wire [3:0] arbiter_wbmreader_sel;
393
wire arbiter_wbmreader_request;
394
 
395
// Instansiate wbm reader arbiter
396
gfx_wbm_read_arbiter wbm_arbiter (
397
  .master_busy_o     (wbmreader_blender_busy),
398
  // Interface against the wbm read module
399
  .read_request_o    (arbiter_wbmreader_request),
400
  .addr_o            (arbiter_wbmreader_addr),
401
  .sel_o             (arbiter_wbmreader_sel),
402
  .dat_i             (wbmreader_arbiter_data),
403
  .ack_i             (wbmreader_arbiter_ack),
404
  // Interface against masters (fragment processor)
405
  .m0_read_request_i (fragment_wbmreader_texture_request),
406
  .m0_addr_i         (fragment_wbmreader_texture_addr),
407
  .m0_sel_i          (fragment_wbmreader_texture_sel),
408
  .m0_dat_o          (wbmreader_fragment_texture_data),
409
  .m0_ack_o          (wbmreader_fragment_texture_ack),
410
  // Interface against masters (blender)
411
  .m1_read_request_i (blender_wbmreader_target_request),
412
  .m1_addr_i         (blender_wbmreader_target_addr),
413
  .m1_sel_i          (blender_wbmreader_target_sel),
414
  .m1_dat_o          (wbmreader_blender_target_data),
415
  .m1_ack_o          (wbmreader_blender_target_ack)
416
  );
417
 
418
// Instansiate wishbone master interface (read only for textures)
419
gfx_wbm_read wbm_reader (
420
  .clk_i            (wb_clk_i),
421
  .rst_i            (wb_rst_i),
422
  .cyc_o            (wbm_read_cyc_o),
423
  .stb_o            (wbm_read_stb_o),
424
  .cti_o            (wbm_read_cti_o),
425
  .bte_o            (wbm_read_bte_o),
426
  .we_o             (wbm_read_we_o),
427
  .adr_o            (wbm_read_adr_o),
428
  .sel_o            (wbm_read_sel_o),
429
  .ack_i            (wbm_read_ack_i),
430
  .err_i            (wbm_read_err_i),
431
  .dat_i            (wbm_read_dat_i),
432
  .sint_o           (wbmreader_sint),
433
 
434
  // send ack to renderer when done writing to memory.
435
  .read_request_i   (arbiter_wbmreader_request),
436
  .texture_addr_i   (arbiter_wbmreader_addr),
437
  .texture_sel_i    (arbiter_wbmreader_sel),
438
  .texture_dat_o    (wbmreader_arbiter_data),
439
  .texture_data_ack (wbmreader_arbiter_ack)
440
  );
441
 
442
endmodule
443
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.