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

Subversion Repositories wf3d

[/] [wf3d/] [trunk/] [scenario/] [3d/] [simple_triangle.v] - Blame information for rev 9

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 specular
//=======================================================================
2
// Project Monophony
3
//   Wire-Frame 3D Graphics Accelerator IP Core
4
//
5
// File:
6
//   simple_triangle.v
7
//
8
// Abstract:
9
//   simple cube rendering
10
//
11
// Author:
12 9 specular
//   Kenji Ishimaru (info.info.wf3d@gmail.com)
13 2 specular
//
14
//======================================================================
15
//
16
// Copyright (c) 2015, Kenji Ishimaru
17
// All rights reserved.
18
//
19
// Redistribution and use in source and binary forms, with or without
20
// modification, are permitted provided that the following conditions are met:
21
//
22
//  -Redistributions of source code must retain the above copyright notice,
23
//   this list of conditions and the following disclaimer.
24
//  -Redistributions in binary form must reproduce the above copyright notice,
25
//   this list of conditions and the following disclaimer in the documentation
26
//   and/or other materials provided with the distribution.
27
//
28
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
29
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
30
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
31
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
32
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
33
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
34
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
35
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
36
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
37
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
38
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39
//
40
// Revision History
41
 
42
`timescale 1ns/1ns
43
`include "fm_3d_define.v"
44
module top();
45
 
46
`define VERBOSE
47
//`define WAVE_OUT
48
`ifdef D3D_WISHBONE
49
`include "tb_instance_wb.v"
50
`else
51
`include "tb_instance.v"
52
`endif
53
`include "tb_init.v"
54
`include "tb_task.v"
55
 
56
`define PP_BASE_ADDR 'h0
57
 
58
`ifdef WAVE_OUT
59
initial begin
60
    $dumpvars;
61
end
62
`endif
63
 
64
reg [31:0] rd;
65
 
66
// VGA
67
localparam P_SCREEN_WIDTH=640;
68
localparam P_SCREEN_HEIGHT=480;
69
// SVGA
70
//localparam P_SCREEN_WIDTH=800;
71
//localparam P_SCREEN_HEIGHT=600;
72
// XGA
73
//localparam P_SCREEN_WIDTH=1024;
74
//localparam P_SCREEN_HEIGHT=768;
75
// SXGA
76
//localparam P_SCREEN_WIDTH=1280;
77
//localparam P_SCREEN_HEIGHT=1024;
78
// UXGA
79
//localparam P_SCREEN_WIDTH=1600;
80
//localparam P_SCREEN_HEIGHT=1200;
81
// QXGA
82
//localparam P_SCREEN_WIDTH=2048;
83
//localparam P_SCREEN_HEIGHT=1536;
84
 
85
 
86
localparam P_FB_TOP_ADDR='h8_0000;
87
 
88
 
89
/***********************************************
90
  Main test routine
91
***********************************************/
92
 
93
integer i,j;
94
integer pm;
95
initial pm = 0;
96
 
97
initial begin
98
  reset;
99
  repeat (100) @(posedge clk_core);
100
   for (i=0;i<3;i=i+1) begin
101
     for (j=0;j<3;j=j+1) begin
102
       render_triangle(j,i);
103
     end
104
   end
105
  save_frame_buffer(P_FB_TOP_ADDR, P_SCREEN_WIDTH,P_SCREEN_HEIGHT,"frame_buffer.dat");
106
  repeat (100) @(posedge clk_core);
107
  $finish;
108
end
109
 
110
 
111
task reset;
112
  begin
113
    rst_x = 0;
114
    repeat (10) @(posedge clk_core);
115
    @(negedge clk_core);
116
    rst_x = 1;
117
    @(posedge clk_core);
118
  end
119
endtask
120
 
121
task render_triangle;
122
  input [1:0] x_pos;
123
  input [1:0] y_pos;
124
  real x_bias;
125
  real y_bias;
126
  real z_bias;
127
  reg [31:0] r_32;
128
  reg [21:0] r_22;
129
   begin
130
  reg_write('h08,'hf,'h000_0000);  // DMA top address
131
  $to_float32(rd,2.79903817);
132
  reg_write('h10,'hf,rd);  // m00
133
  $to_float32(rd,0.0);
134
  reg_write('h14,'hf,rd);  // m01
135
  $to_float32(rd,0.0);
136
  reg_write('h18,'hf,rd);  // m02
137
  $to_float32(rd,0.0);
138
  reg_write('h1c,'hf,rd);  // m03
139
  $to_float32(rd,0.0);
140
  reg_write('h20,'hf,rd);  // m10
141
  $to_float32(rd,3.73205090);
142
  reg_write('h24,'hf,rd);  // m11
143
  $to_float32(rd,0.0);
144
  reg_write('h28,'hf,rd);  // m12
145
  $to_float32(rd,0.0);
146
  reg_write('h2c,'hf,rd);  // m13
147
  $to_float32(rd,0.0);
148
  reg_write('h30,'hf,rd);  // m20
149
  $to_float32(rd,0.0);
150
  reg_write('h34,'hf,rd);  // m21
151
  $to_float32(rd,-1.02020204);
152
  reg_write('h38,'hf,rd);  // m22
153
  $to_float32(rd,1.04040408);
154
  reg_write('h3c,'hf,rd);  // m23
155
  $to_float32(rd,0.0);
156
  reg_write('h40,'hf,rd);  // m30
157
  $to_float32(rd,0.0);
158
  reg_write('h44,'hf,rd);  // m31
159
  $to_float32(rd,-1.00000000);
160
  reg_write('h48,'hf,rd);  // m32
161
  $to_float32(rd,3.0);
162
  reg_write('h4c,'hf,rd);  // m33
163
  reg_write('h64,'hf,P_FB_TOP_ADDR);  // Pixel top address
164
  reg_write('h68,'hf,'hff);           // Pixel color
165
 
166
  // screen width/height
167
  $to_float32(rd,P_SCREEN_WIDTH);
168
  reg_write('h50,'hf,rd);   // Screen Width (Floating point)
169
  $to_float32(rd,P_SCREEN_HEIGHT);
170
  reg_write('h54,'hf,rd);   // Screen Height (Floating point)
171
 
172
  reg_write('h58,'hf,P_SCREEN_WIDTH-1);  // Screen Width-1 (Integer)
173
  reg_write('h5c,'hf,P_SCREEN_HEIGHT-1); // Screen Width-1 (Integer)
174
  reg_write('h60,'hf,P_SCREEN_WIDTH);    // Screen Width (Integer)
175
  // simple test
176
  x_bias = 0.0;
177
  y_bias = 0.0;
178
  z_bias = 0.0;
179
  // bias
180
  case (x_pos)
181
    'd0: x_bias = -0.7;
182
    'd1: x_bias = 0.0;
183
    'd2: x_bias = 0.7;
184
  endcase
185
  case (y_pos)
186
    'd0: y_bias = -0.7;
187
    'd1: y_bias = 0.0;
188
    'd2: y_bias = 0.7;
189
  endcase
190
  // pixel color RGB = 2:3:3
191
  case (y_pos)
192
    'd0: reg_write('h68,'hf,'h0c0);  // R y-flip:bit8
193
    'd1: reg_write('h68,'hf,'h038);  // G
194
    'd2: reg_write('h68,'hf,'h007);  // B
195
  endcase
196
 
197
 
198
  pm = 0;
199
 
200
  // triangle0
201
    $to_float32(rd,0.25+x_bias);
202
    $display("rd %h",rd);
203
    u_sram_slave.u_memory.mem[pm] = rd;
204
    pm = pm + 1;
205
    $to_float32(rd,0.25+y_bias);
206
    $display("rd %h",rd);
207
    u_sram_slave.u_memory.mem[pm] = rd;
208
    pm = pm + 1;
209
    $to_float32(rd,0.25);
210
    $display("rd %h",rd);
211
    u_sram_slave.u_memory.mem[pm] = rd;
212
    pm = pm + 1;
213
    $to_float32(rd,-0.25+x_bias);
214
    $display("rd %h",rd);
215
    u_sram_slave.u_memory.mem[pm] = rd;
216
    pm = pm + 1;
217
    $to_float32(rd,0.25+y_bias);
218
    $display("rd %h",rd);
219
    u_sram_slave.u_memory.mem[pm] = rd;
220
    pm = pm + 1;
221
    $to_float32(rd,0.25);
222
    $display("rd %h",rd);
223
    u_sram_slave.u_memory.mem[pm] = rd;
224
    pm = pm + 1;
225
    $to_float32(rd,-0.25+x_bias);
226
    $display("rd %h",rd);
227
    u_sram_slave.u_memory.mem[pm] = rd;
228
    pm = pm + 1;
229
    $to_float32(rd,-0.25+y_bias);
230
    $display("rd %h",rd);
231
    u_sram_slave.u_memory.mem[pm] = rd;
232
    pm = pm + 1;
233
    $to_float32(rd,0.25);
234
    $display("rd %h",rd);
235
    u_sram_slave.u_memory.mem[pm] = rd;
236
    pm = pm + 1;
237
  // triangle1
238
    $to_float32(rd,0.25+x_bias);
239
    $display("rd %h",rd);
240
    u_sram_slave.u_memory.mem[pm] = rd;
241
    pm = pm + 1;
242
    $to_float32(rd,0.25+y_bias);
243
    $display("rd %h",rd);
244
    u_sram_slave.u_memory.mem[pm] = rd;
245
    pm = pm + 1;
246
    $to_float32(rd,0.25);
247
    $display("rd %h",rd);
248
    u_sram_slave.u_memory.mem[pm] = rd;
249
    pm = pm + 1;
250
    $to_float32(rd,-0.25+x_bias);
251
    $display("rd %h",rd);
252
    u_sram_slave.u_memory.mem[pm] = rd;
253
    pm = pm + 1;
254
    $to_float32(rd,-0.25+y_bias);
255
    $display("rd %h",rd);
256
    u_sram_slave.u_memory.mem[pm] = rd;
257
    pm = pm + 1;
258
    $to_float32(rd,0.25);
259
    $display("rd %h",rd);
260
    u_sram_slave.u_memory.mem[pm] = rd;
261
    pm = pm + 1;
262
    $to_float32(rd,0.25+x_bias);
263
    $display("rd %h",rd);
264
    u_sram_slave.u_memory.mem[pm] = rd;
265
    pm = pm + 1;
266
    $to_float32(rd,-0.25+y_bias);
267
    $display("rd %h",rd);
268
    u_sram_slave.u_memory.mem[pm] = rd;
269
    pm = pm + 1;
270
    $to_float32(rd,0.25);
271
    $display("rd %h",rd);
272
    u_sram_slave.u_memory.mem[pm] = rd;
273
    pm = pm + 1;
274
  // triangle2
275
    $to_float32(rd,0.25+x_bias);
276
    $display("rd %h",rd);
277
    u_sram_slave.u_memory.mem[pm] = rd;
278
    pm = pm + 1;
279
    $to_float32(rd,0.25+y_bias);
280
    $display("rd %h",rd);
281
    u_sram_slave.u_memory.mem[pm] = rd;
282
    pm = pm + 1;
283
    $to_float32(rd,0.0);
284
    $display("rd %h",rd);
285
    u_sram_slave.u_memory.mem[pm] = rd;
286
    pm = pm + 1;
287
    $to_float32(rd,-0.25+x_bias);
288
    $display("rd %h",rd);
289
    u_sram_slave.u_memory.mem[pm] = rd;
290
    pm = pm + 1;
291
    $to_float32(rd,0.25+y_bias);
292
    $display("rd %h",rd);
293
    u_sram_slave.u_memory.mem[pm] = rd;
294
    pm = pm + 1;
295
    $to_float32(rd,0.0);
296
    $display("rd %h",rd);
297
    u_sram_slave.u_memory.mem[pm] = rd;
298
    pm = pm + 1;
299
    $to_float32(rd,-0.25+x_bias);
300
    $display("rd %h",rd);
301
    u_sram_slave.u_memory.mem[pm] = rd;
302
    pm = pm + 1;
303
    $to_float32(rd,0.25+y_bias);
304
    $display("rd %h",rd);
305
    u_sram_slave.u_memory.mem[pm] = rd;
306
    pm = pm + 1;
307
    $to_float32(rd,0.25);
308
    $display("rd %h",rd);
309
    u_sram_slave.u_memory.mem[pm] = rd;
310
    pm = pm + 1;
311
  // triangle3
312
    $to_float32(rd,0.25+x_bias);
313
    $display("rd %h",rd);
314
    u_sram_slave.u_memory.mem[pm] = rd;
315
    pm = pm + 1;
316
    $to_float32(rd,0.25+y_bias);
317
    $display("rd %h",rd);
318
    u_sram_slave.u_memory.mem[pm] = rd;
319
    pm = pm + 1;
320
    $to_float32(rd,0.0);
321
    $display("rd %h",rd);
322
    u_sram_slave.u_memory.mem[pm] = rd;
323
    pm = pm + 1;
324
    $to_float32(rd,-0.25+x_bias);
325
    $display("rd %h",rd);
326
    u_sram_slave.u_memory.mem[pm] = rd;
327
    pm = pm + 1;
328
    $to_float32(rd,0.25+y_bias);
329
    $display("rd %h",rd);
330
    u_sram_slave.u_memory.mem[pm] = rd;
331
    pm = pm + 1;
332
    $to_float32(rd,0.25);
333
    $display("rd %h",rd);
334
    u_sram_slave.u_memory.mem[pm] = rd;
335
    pm = pm + 1;
336
    $to_float32(rd,0.25+x_bias);
337
    $display("rd %h",rd);
338
    u_sram_slave.u_memory.mem[pm] = rd;
339
    pm = pm + 1;
340
    $to_float32(rd,0.25+y_bias);
341
    $display("rd %h",rd);
342
    u_sram_slave.u_memory.mem[pm] = rd;
343
    pm = pm + 1;
344
    $to_float32(rd,0.25);
345
    $display("rd %h",rd);
346
    u_sram_slave.u_memory.mem[pm] = rd;
347
    pm = pm + 1;
348
  // triangle4
349
    $to_float32(rd,0.25+x_bias);
350
    $display("rd %h",rd);
351
    u_sram_slave.u_memory.mem[pm] = rd;
352
    pm = pm + 1;
353
    $to_float32(rd,-0.25+y_bias);
354
    $display("rd %h",rd);
355
    u_sram_slave.u_memory.mem[pm] = rd;
356
    pm = pm + 1;
357
    $to_float32(rd,0.25);
358
    $display("rd %h",rd);
359
    u_sram_slave.u_memory.mem[pm] = rd;
360
    pm = pm + 1;
361
    $to_float32(rd,-0.25+x_bias);
362
    $display("rd %h",rd);
363
    u_sram_slave.u_memory.mem[pm] = rd;
364
    pm = pm + 1;
365
    $to_float32(rd,-0.25+y_bias);
366
    $display("rd %h",rd);
367
    u_sram_slave.u_memory.mem[pm] = rd;
368
    pm = pm + 1;
369
    $to_float32(rd,0.25);
370
    $display("rd %h",rd);
371
    u_sram_slave.u_memory.mem[pm] = rd;
372
    pm = pm + 1;
373
    $to_float32(rd,-0.25+x_bias);
374
    $display("rd %h",rd);
375
    u_sram_slave.u_memory.mem[pm] = rd;
376
    pm = pm + 1;
377
    $to_float32(rd,-0.25+y_bias);
378
    $display("rd %h",rd);
379
    u_sram_slave.u_memory.mem[pm] = rd;
380
    pm = pm + 1;
381
    $to_float32(rd,0.0);
382
    $display("rd %h",rd);
383
    u_sram_slave.u_memory.mem[pm] = rd;
384
    pm = pm + 1;
385
  // triangle5
386
    $to_float32(rd,0.25+x_bias);
387
    $display("rd %h",rd);
388
    u_sram_slave.u_memory.mem[pm] = rd;
389
    pm = pm + 1;
390
    $to_float32(rd,-0.25+y_bias);
391
    $display("rd %h",rd);
392
    u_sram_slave.u_memory.mem[pm] = rd;
393
    pm = pm + 1;
394
    $to_float32(rd,0.25);
395
    $display("rd %h",rd);
396
    u_sram_slave.u_memory.mem[pm] = rd;
397
    pm = pm + 1;
398
    $to_float32(rd,-0.25+x_bias);
399
    $display("rd %h",rd);
400
    u_sram_slave.u_memory.mem[pm] = rd;
401
    pm = pm + 1;
402
    $to_float32(rd,-0.25+y_bias);
403
    $display("rd %h",rd);
404
    u_sram_slave.u_memory.mem[pm] = rd;
405
    pm = pm + 1;
406
    $to_float32(rd,0.0);
407
    $display("rd %h",rd);
408
    u_sram_slave.u_memory.mem[pm] = rd;
409
    pm = pm + 1;
410
    $to_float32(rd,0.25+x_bias);
411
    $display("rd %h",rd);
412
    u_sram_slave.u_memory.mem[pm] = rd;
413
    pm = pm + 1;
414
    $to_float32(rd,-0.25+y_bias);
415
    $display("rd %h",rd);
416
    u_sram_slave.u_memory.mem[pm] = rd;
417
    pm = pm + 1;
418
    $to_float32(rd,0.0);
419
    $display("rd %h",rd);
420
    u_sram_slave.u_memory.mem[pm] = rd;
421
    pm = pm + 1;
422
  // triangle6
423
    $to_float32(rd,-0.25+x_bias);
424
    $display("rd %h",rd);
425
    u_sram_slave.u_memory.mem[pm] = rd;
426
    pm = pm + 1;
427
    $to_float32(rd,0.25+y_bias);
428
    $display("rd %h",rd);
429
    u_sram_slave.u_memory.mem[pm] = rd;
430
    pm = pm + 1;
431
    $to_float32(rd,0.25);
432
    $display("rd %h",rd);
433
    u_sram_slave.u_memory.mem[pm] = rd;
434
    pm = pm + 1;
435
    $to_float32(rd,-0.25+x_bias);
436
    $display("rd %h",rd);
437
    u_sram_slave.u_memory.mem[pm] = rd;
438
    pm = pm + 1;
439
    $to_float32(rd,0.25+y_bias);
440
    $display("rd %h",rd);
441
    u_sram_slave.u_memory.mem[pm] = rd;
442
    pm = pm + 1;
443
    $to_float32(rd,0.0);
444
    $display("rd %h",rd);
445
    u_sram_slave.u_memory.mem[pm] = rd;
446
    pm = pm + 1;
447
    $to_float32(rd,-0.25+x_bias);
448
    $display("rd %h",rd);
449
    u_sram_slave.u_memory.mem[pm] = rd;
450
    pm = pm + 1;
451
    $to_float32(rd,-0.25+y_bias);
452
    $display("rd %h",rd);
453
    u_sram_slave.u_memory.mem[pm] = rd;
454
    pm = pm + 1;
455
    $to_float32(rd,0.0);
456
    $display("rd %h",rd);
457
    u_sram_slave.u_memory.mem[pm] = rd;
458
    pm = pm + 1;
459
  // triangle7
460
    $to_float32(rd,-0.25+x_bias);
461
    $display("rd %h",rd);
462
    u_sram_slave.u_memory.mem[pm] = rd;
463
    pm = pm + 1;
464
    $to_float32(rd,0.25+y_bias);
465
    $display("rd %h",rd);
466
    u_sram_slave.u_memory.mem[pm] = rd;
467
    pm = pm + 1;
468
    $to_float32(rd,0.25);
469
    $display("rd %h",rd);
470
    u_sram_slave.u_memory.mem[pm] = rd;
471
    pm = pm + 1;
472
    $to_float32(rd,-0.25+x_bias);
473
    $display("rd %h",rd);
474
    u_sram_slave.u_memory.mem[pm] = rd;
475
    pm = pm + 1;
476
    $to_float32(rd,-0.25+y_bias);
477
    $display("rd %h",rd);
478
    u_sram_slave.u_memory.mem[pm] = rd;
479
    pm = pm + 1;
480
    $to_float32(rd,0.0);
481
    $display("rd %h",rd);
482
    u_sram_slave.u_memory.mem[pm] = rd;
483
    pm = pm + 1;
484
    $to_float32(rd,-0.25+x_bias);
485
    $display("rd %h",rd);
486
    u_sram_slave.u_memory.mem[pm] = rd;
487
    pm = pm + 1;
488
    $to_float32(rd,-0.25+y_bias);
489
    $display("rd %h",rd);
490
    u_sram_slave.u_memory.mem[pm] = rd;
491
    pm = pm + 1;
492
    $to_float32(rd,0.0);
493
    $display("rd %h",rd);
494
    u_sram_slave.u_memory.mem[pm] = rd;
495
    pm = pm + 1;
496
  // triangle8
497
    $to_float32(rd,0.25+x_bias);
498
    $display("rd %h",rd);
499
    u_sram_slave.u_memory.mem[pm] = rd;
500
    pm = pm + 1;
501
    $to_float32(rd,0.25+y_bias);
502
    $display("rd %h",rd);
503
    u_sram_slave.u_memory.mem[pm] = rd;
504
    pm = pm + 1;
505
    $to_float32(rd,0.0);
506
    $display("rd %h",rd);
507
    u_sram_slave.u_memory.mem[pm] = rd;
508
    pm = pm + 1;
509
    $to_float32(rd,0.25+x_bias);
510
    $display("rd %h",rd);
511
    u_sram_slave.u_memory.mem[pm] = rd;
512
    pm = pm + 1;
513
    $to_float32(rd,0.25+y_bias);
514
    $display("rd %h",rd);
515
    u_sram_slave.u_memory.mem[pm] = rd;
516
    pm = pm + 1;
517
    $to_float32(rd,0.25);
518
    $display("rd %h",rd);
519
    u_sram_slave.u_memory.mem[pm] = rd;
520
    pm = pm + 1;
521
    $to_float32(rd,0.25+x_bias);
522
    $display("rd %h",rd);
523
    u_sram_slave.u_memory.mem[pm] = rd;
524
    pm = pm + 1;
525
    $to_float32(rd,-0.25+y_bias);
526
    $display("rd %h",rd);
527
    u_sram_slave.u_memory.mem[pm] = rd;
528
    pm = pm + 1;
529
    $to_float32(rd,0.25);
530
    $display("rd %h",rd);
531
    u_sram_slave.u_memory.mem[pm] = rd;
532
    pm = pm + 1;
533
  // triangle9
534
    $to_float32(rd,0.25+x_bias);
535
    $display("rd %h",rd);
536
    u_sram_slave.u_memory.mem[pm] = rd;
537
    pm = pm + 1;
538
    $to_float32(rd,0.25+y_bias);
539
    $display("rd %h",rd);
540
    u_sram_slave.u_memory.mem[pm] = rd;
541
    pm = pm + 1;
542
    $to_float32(rd,0.0);
543
    $display("rd %h",rd);
544
    u_sram_slave.u_memory.mem[pm] = rd;
545
    pm = pm + 1;
546
    $to_float32(rd,0.25+x_bias);
547
    $display("rd %h",rd);
548
    u_sram_slave.u_memory.mem[pm] = rd;
549
    pm = pm + 1;
550
    $to_float32(rd,-0.25+y_bias);
551
    $display("rd %h",rd);
552
    u_sram_slave.u_memory.mem[pm] = rd;
553
    pm = pm + 1;
554
    $to_float32(rd,0.25);
555
    $display("rd %h",rd);
556
    u_sram_slave.u_memory.mem[pm] = rd;
557
    pm = pm + 1;
558
    $to_float32(rd,0.25+x_bias);
559
    $display("rd %h",rd);
560
    u_sram_slave.u_memory.mem[pm] = rd;
561
    pm = pm + 1;
562
    $to_float32(rd,-0.25+y_bias);
563
    $display("rd %h",rd);
564
    u_sram_slave.u_memory.mem[pm] = rd;
565
    pm = pm + 1;
566
    $to_float32(rd,0.0);
567
    $display("rd %h",rd);
568
    u_sram_slave.u_memory.mem[pm] = rd;
569
    pm = pm + 1;
570
  // triangle10
571
    $to_float32(rd,-0.25+x_bias);
572
    $display("rd %h",rd);
573
    u_sram_slave.u_memory.mem[pm] = rd;
574
    pm = pm + 1;
575
    $to_float32(rd,0.25+y_bias);
576
    $display("rd %h",rd);
577
    u_sram_slave.u_memory.mem[pm] = rd;
578
    pm = pm + 1;
579
    $to_float32(rd,0.0);
580
    $display("rd %h",rd);
581
    u_sram_slave.u_memory.mem[pm] = rd;
582
    pm = pm + 1;
583
    $to_float32(rd,0.25+x_bias);
584
    $display("rd %h",rd);
585
    u_sram_slave.u_memory.mem[pm] = rd;
586
    pm = pm + 1;
587
    $to_float32(rd,0.25+y_bias);
588
    $display("rd %h",rd);
589
    u_sram_slave.u_memory.mem[pm] = rd;
590
    pm = pm + 1;
591
    $to_float32(rd,0.0);
592
    $display("rd %h",rd);
593
    u_sram_slave.u_memory.mem[pm] = rd;
594
    pm = pm + 1;
595
    $to_float32(rd,0.25+x_bias);
596
    $display("rd %h",rd);
597
    u_sram_slave.u_memory.mem[pm] = rd;
598
    pm = pm + 1;
599
    $to_float32(rd,-0.25+y_bias);
600
    $display("rd %h",rd);
601
    u_sram_slave.u_memory.mem[pm] = rd;
602
    pm = pm + 1;
603
    $to_float32(rd,0.0);
604
    $display("rd %h",rd);
605
    u_sram_slave.u_memory.mem[pm] = rd;
606
    pm = pm + 1;
607
  // triangle11
608
    $to_float32(rd,-0.25+x_bias);
609
    $display("rd %h",rd);
610
    u_sram_slave.u_memory.mem[pm] = rd;
611
    pm = pm + 1;
612
    $to_float32(rd,0.25+y_bias);
613
    $display("rd %h",rd);
614
    u_sram_slave.u_memory.mem[pm] = rd;
615
    pm = pm + 1;
616
    $to_float32(rd,0.0);
617
    $display("rd %h",rd);
618
    u_sram_slave.u_memory.mem[pm] = rd;
619
    pm = pm + 1;
620
    $to_float32(rd,0.25+x_bias);
621
    $display("rd %h",rd);
622
    u_sram_slave.u_memory.mem[pm] = rd;
623
    pm = pm + 1;
624
    $to_float32(rd,-0.25+y_bias);
625
    $display("rd %h",rd);
626
    u_sram_slave.u_memory.mem[pm] = rd;
627
    pm = pm + 1;
628
    $to_float32(rd,0.0);
629
    $display("rd %h",rd);
630
    u_sram_slave.u_memory.mem[pm] = rd;
631
    pm = pm + 1;
632
    $to_float32(rd,-0.25+x_bias);
633
    $display("rd %h",rd);
634
    u_sram_slave.u_memory.mem[pm] = rd;
635
    pm = pm + 1;
636
    $to_float32(rd,-0.25+y_bias);
637
    $display("rd %h",rd);
638
    u_sram_slave.u_memory.mem[pm] = rd;
639
    pm = pm + 1;
640
    $to_float32(rd,0.0);
641
    $display("rd %h",rd);
642
    u_sram_slave.u_memory.mem[pm] = rd;
643
    pm = pm + 1;
644
  reg_write('h0c,'hf,12*3*3);  // DMA size 12triangle *3vertex*3
645
  reg_write('h04,'hf,'h10);  // DMA mask
646
  reg_write('h01,'hf,1);  // DMA start
647
  while (!o_int)
648
    @(posedge clk_core);
649
  reg_write('h04,'hf,0);  // int clear
650
  end
651
endtask
652
 
653
 
654
task save_frame_buffer;
655
    input [25:0] adrs;
656
    input [15:0] width;
657
    input [15:0] height;
658
    input [64*8:1] file_name;
659
    integer x;
660
    integer y;
661
    integer fp;
662
    reg [1:0]  stat;
663
    reg        hw_sel;
664
    reg [1:0]  bank_sel;
665
    reg [25:0] adr_pix;
666
 
667
    reg [31:0] tmp_data32;
668
    reg [7:0] tmp_data;
669
    reg [7:0]  cr;
670
    reg [7:0]  cg;
671
    reg [7:0]  cb;
672
    reg [7:0]  ca;
673
    begin
674
        $display("saving rendering result...");
675
        fp = $fopen(file_name);
676
        for (y = 0; y < height; y = y + 1) begin
677
            for (x = 0; x < width; x = x + 1) begin
678
               adr_pix = adrs + width * y + x;  // per 8bit (per pixel)
679
 
680
               tmp_data32 = top.u_sram_slave.u_memory.mem[adr_pix[25:2]];
681
                case (adr_pix[1:0])
682
                  2'b00:tmp_data = tmp_data32[7:0];
683
                  2'b01:tmp_data = tmp_data32[15:8];
684
                  2'b10:tmp_data = tmp_data32[23:16];
685
                  2'b11:tmp_data = tmp_data32[31:24];
686
                endcase // case (adr_pix[1:0])
687
                //RGB = 2:3:3
688
                cr = {4{tmp_data[7:6]}};
689
                cg = {tmp_data[5:3],tmp_data[5:3],tmp_data[5:2]};
690
                cb = {tmp_data[2:0],tmp_data[2:0],tmp_data[2:1]};
691
                ca = 8'hff;
692
                $fwrite(fp,"%h\n", {ca,cb,cg,cr});
693
            end
694
       end
695
       $fclose(fp);
696
    end
697
endtask
698
endmodule

powered by: WebSVN 2.1.0

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