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

Subversion Repositories orsoc_graphics_accelerator

[/] [orsoc_graphics_accelerator/] [trunk/] [rtl/] [verilog/] [gfx/] [gfx_renderer.v] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 6 Orka
/*
2
ORSoC GFX accelerator core
3
Copyright 2012, ORSoC, Per Lenander, Anton Fosselius.
4
 
5
RENDERING 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_renderer(clk_i, rst_i,
25
        target_base_i, zbuffer_base_i, target_size_x_i, target_size_y_i, color_depth_i,
26
        pixel_x_i, pixel_y_i, pixel_z_i, zbuffer_enable_i, color_i,
27
        render_addr_o, render_sel_o, render_dat_o,
28
        ack_o, ack_i,
29
        write_i, write_o
30
        );
31
 
32
parameter point_width = 16;
33
 
34
input clk_i;
35
input rst_i;
36
 
37
// Render target information, used for checking out of bounds and stride when writing pixels
38
input            [31:2] target_base_i;
39
input            [31:2] zbuffer_base_i;
40
input [point_width-1:0] target_size_x_i;
41
input [point_width-1:0] target_size_y_i;
42
 
43
input             [1:0] color_depth_i;
44
 
45
input [point_width-1:0] pixel_x_i;
46
input [point_width-1:0] pixel_y_i;
47
input [point_width-1:0] pixel_z_i;
48
input                   zbuffer_enable_i;
49
input            [31:0] color_i;
50
 
51
input      write_i;
52
output reg write_o;
53
 
54
// Output registers connected to the wbm
55
output reg [31:2] render_addr_o;
56
output reg  [3:0] render_sel_o;
57
output reg [31:0] render_dat_o;
58
 
59
wire        [3:0] target_sel;
60
wire       [31:0] target_dat;
61
wire        [3:0] zbuffer_sel;
62
wire       [31:0] zbuffer_dat;
63
 
64
output reg ack_o;
65
input      ack_i;
66
 
67
// TODO: Fifo for incoming pixel data?
68
 
69
 
70
 
71
// Define memory address
72
// Addr[31:2] = Base + (Y*width + X) * ppb
73
wire [31:0] pixel_offset;
74
assign pixel_offset = (color_depth_i == 2'b00) ? (target_size_x_i*pixel_y_i + pixel_x_i)      : // 8  bit
75
                      (color_depth_i == 2'b01) ? (target_size_x_i*pixel_y_i + pixel_x_i) << 1 : // 16 bit
76
                                                 (target_size_x_i*pixel_y_i + pixel_x_i) << 2 ; // 32 bit
77
 
78
wire [31:2] target_addr = target_base_i + pixel_offset[31:2];
79
wire [31:2] zbuffer_addr = zbuffer_base_i + pixel_offset[31:2];
80
 
81
// Color to memory converter
82
color_to_memory color_proc(
83
.color_depth_i  (color_depth_i),
84
.color_i        (color_i),
85
.x_lsb_i        (pixel_x_i[1:0]),
86
.mem_o          (target_dat),
87
.sel_o          (target_sel)
88
);
89
 
90
 
91
 
92
// Color to memory converter
93
color_to_memory depth_proc(
94
.color_depth_i  (2'b01),
95
// Note: Padding because z_i is only [15:0]
96
.color_i        ({ {point_width{1'b0}}, pixel_z_i[point_width-1:0] }),
97
.x_lsb_i        (pixel_x_i[1:0]),
98
.mem_o          (zbuffer_dat),
99
.sel_o          (zbuffer_sel)
100
);
101
 
102
// State machine
103
reg [1:0] state;
104
parameter wait_state        = 2'b00,
105
          write_pixel_state = 2'b01,
106
          write_z_state     = 2'b10;
107
 
108
// Acknowledge when a command has completed
109
always @(posedge clk_i or posedge rst_i)
110
begin
111
  //  reset, init component
112
  if(rst_i)
113
  begin
114
    write_o       <= 1'b0;
115
    ack_o         <= 1'b0;
116
    render_addr_o <= 1'b0;
117
    render_sel_o  <= 1'b0;
118
    render_dat_o  <= 1'b0;
119
  end
120
  // Else, set outputs for next cycle
121
  else
122
  begin
123
    case (state)
124
 
125
      wait_state:
126
      begin
127
        ack_o   <= 1'b0;
128
        if(write_i)
129
        begin
130
          render_addr_o <= target_addr;
131
          render_sel_o  <= target_sel;
132
          render_dat_o  <= target_dat;
133
          write_o <= 1'b1;
134
        end
135
      end
136
 
137
      // Write pixel to memory. If depth buffering is enabled, write z value too
138
      write_pixel_state:
139
      begin
140
        if(ack_i)
141
        begin
142
          render_addr_o <= zbuffer_addr;
143
          render_sel_o  <= zbuffer_sel;
144
          render_dat_o  <= zbuffer_dat;
145
 
146
          write_o       <= zbuffer_enable_i;
147
          ack_o         <= ~zbuffer_enable_i;
148
        end
149
        else
150
          write_o       <= 1'b0;
151
      end
152
 
153
      write_z_state:
154
      begin
155
        write_o       <= 1'b0;
156
        ack_o         <= ack_i;
157
      end
158
 
159
    endcase
160
  end
161
end
162
 
163
// State machine
164
always @(posedge clk_i or posedge rst_i)
165
begin
166
  // reset, init component
167
  if(rst_i)
168
    state <= wait_state;
169
  // Move in statemachine
170
  else
171
    case (state)
172
 
173
      wait_state:
174
        if(write_i)
175
          state <= write_pixel_state;
176
 
177
      write_pixel_state:
178
        if(ack_i & zbuffer_enable_i)
179
          state <= write_z_state;
180
        else if(ack_i)
181
          state <= wait_state;
182
 
183
      write_z_state:
184
        if(ack_i)
185
          state <= wait_state;
186
 
187
    endcase
188
end
189
 
190
endmodule
191
 

powered by: WebSVN 2.1.0

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