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

Subversion Repositories rtf68ksys

[/] [rtf68ksys/] [trunk/] [rtl/] [verilog/] [rtfGraphicsAccelerator.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 robfinch
`define NULL            8'd0
2
`define DRAW_PIXEL      8'd1
3
`define DRAW_LINE       8'd2
4
`define LINETO          8'd3
5
`define RECTANGLE       8'd4
6
`define RECTANGLE2      8'd5
7
`define RECTANGLE3      8'd6
8
`define RECTANGLE4      8'd7
9
 
10
module rtfGraphicsAccelerator (
11
rst_i,
12
clk_i,
13
 
14
s_cyc_i,
15
s_stb_i,
16
s_we_i,
17
s_ack_o,
18
s_sel_i,
19
s_adr_i,
20
s_dat_i,
21
s_dat_o,
22
 
23
m_cyc_o,
24
m_stb_o,
25
m_we_o,
26
m_ack_i,
27
m_sel_o,
28
m_adr_o,
29
m_dat_i,
30
m_dat_o
31
);
32
parameter PPL = 16'd416;                // pixels per line
33
parameter IDLE = 8'd0;
34
parameter DRAWPIXEL = 8'd1;
35
parameter DL_SETPIXEL = 8'd2;
36
parameter DL_CALCE2 = 8'd3;
37
parameter DL_TEST = 8'd4;
38
parameter DL_TEST2 = 8'd5;
39
 
40
input rst_i;
41
input clk_i;
42
 
43
input s_cyc_i;
44
input s_stb_i;
45
output s_ack_o;
46
input s_we_i;
47
input [1:0] s_sel_i;
48
input [31:0] s_adr_i;
49
input [15:0] s_dat_i;
50
output [15:0] s_dat_o;
51
 
52
output m_cyc_o;
53
reg m_cyc_o;
54
output m_stb_o;
55
reg m_stb_o;
56
output m_we_o;
57
reg m_we_o;
58
input m_ack_i;
59
output [1:0] m_sel_o;
60
reg [1:0] m_sel_o;
61
output [31:0] m_adr_o;
62
reg [31:0] m_adr_o;
63
input [15:0] m_dat_i;
64
output [15:0] m_dat_o;
65
reg [15:0] m_dat_o;
66
 
67
reg [7:0] cmd;
68
reg ps;                                         // pen select
69
reg [7:0] PenColor8;
70
reg [7:0] FillColor8;
71
reg [31:0] PenColor;
72
reg [31:0] FillColor;
73
reg [15:0] x0,y0,x1,y1;
74
reg [15:0] x0a,y0a,x1a,y1a;
75
 
76
reg [15:0] cx,cy;                        // graphics cursor position
77
wire [31:0] ma = 32'h020000 + cy * PPL + cx;
78
reg signed [15:0] dx,dy;
79
reg signed [15:0] sx,sy;
80
reg signed [15:0] err;
81
wire signed [15:0] e2 = err << 1;
82
reg [7:0] state;
83
 
84
wire cs = s_cyc_i && s_stb_i && (s_adr_i[31:8]==24'hFFDA_E0);
85
assign s_ack_o = cs;
86
 
87
always @(posedge clk_i)
88
if (rst_i) begin
89
        x0 <= 16'd0;
90
        y0 <= 16'd0;
91
        x1 <= 16'd0;
92
        y1 <= 16'd0;
93
        cx <= 16'd0;
94
        cy <= 16'd0;
95
        state <= IDLE;
96
end
97
else begin
98
        if (cs & s_we_i) begin
99
                case(s_adr_i[4:1])
100
                8'd0:   begin PenColor[31:16] <= s_dat_i; PenColor8[7:5] <= s_dat_i[7:5]; end
101
                8'd1:   begin PenColor[15: 0] <= s_dat_i; PenColor8[4:2] <= s_dat_i[15:13]; PenColor8[1:0] <= s_dat_i[7:6]; end
102
                8'd2:   begin FillColor[31:16] <= s_dat_i; FillColor8[7:5] <= s_dat_i[7:5]; end
103
                8'd3:   begin FillColor[15: 0] <= s_dat_i; FillColor8[4:2] <= s_dat_i[15:13]; FillColor8[1:0] <= s_dat_i[7:6]; end
104
                8'd4:   x0 <= s_dat_i;
105
                8'd5:   y0 <= s_dat_i;
106
                8'd6:   x1 <= s_dat_i;
107
                8'd7:   y1 <= s_dat_i;
108
                8'd15:  cmd <= s_dat_i;
109
                endcase
110
        end
111
 
112
case(state)
113
IDLE:
114
        begin
115
                cx <= x0;
116
                cy <= y0;
117
                dx <= x1 < x0 ? x0-x1 : x1-x0;
118
                dy <= y1 < y0 ? y0-y1 : y1-y0;
119
                sx <= x0 < x1 ? 1 : -1;
120
                sy <= y0 < y1 ? 1 : -1;
121
                err <= dx-dy;
122
                if (cmd==`DRAW_PIXEL) begin
123
                        state <= DRAWPIXEL;
124
                        cmd <= `NULL;
125
                end
126
                else if (cmd==`DRAW_LINE) begin
127
                        state <= DL_SETPIXEL;
128
                        cmd <= `NULL;
129
                end
130
                else if (cmd==`LINETO) begin
131
                        x1 <= x0;
132
                        y1 <= y0;
133
                        x0 <= cx;
134
                        y0 <= cy;
135
                        cmd <= `DRAW_LINE;
136
                end
137
                else if (cmd==`RECTANGLE) begin
138
                        x0a <= x0;
139
                        y0a <= y0;
140
                        x1a <= x1;
141
                        y1a <= y1;
142
                        y1 <= y0;
143
                        cmd <= `RECTANGLE2;
144
                        state <= DL_SETPIXEL;
145
                end
146
                else if (cmd==`RECTANGLE2) begin
147
                        x0 <= x1a;
148
                        y0 <= y0a;
149
                        x1 <= x1a;
150
                        y1 <= y1a;
151
                        cmd <= `RECTANGLE3;
152
                        state <= DL_SETPIXEL;
153
                end
154
                else if (cmd==`RECTANGLE3) begin
155
                        y0 <= y1a;
156
                        x0 <= x1a;
157
                        x1 <= x0a;
158
                        y1 <= y1a;
159
                        cmd <= `RECTANGLE4;
160
                        state <= DL_SETPIXEL;
161
                end
162
                else if (cmd==`RECTANGLE4) begin
163
                        x0 <= x0a;
164
                        y0 <= y1a;
165
                        x1 <= x0a;
166
                        y1 <= y0a;
167
                        cmd <= `NULL;
168
                        state <= DL_SETPIXEL;
169
                end
170
        end
171
 
172
DRAWPIXEL:
173
        if (!m_cyc_o) begin
174
                m_cyc_o <= 1'b1;
175
                m_stb_o <= 1'b1;
176
                m_we_o <= 1'b1;
177
                m_sel_o <= {cx[0],~cx[0]};
178
                m_adr_o <= ma;
179
                m_dat_o <= {2{PenColor8}};
180
        end
181
        else if (m_ack_i) begin
182
                m_cyc_o <= 1'b0;
183
                m_stb_o <= 1'b0;
184
                m_sel_o <= 2'b00;
185
                m_we_o <= 1'b0;
186
                state <= IDLE;
187
        end
188
 
189
DL_SETPIXEL:
190
        if (!m_cyc_o) begin
191
                m_cyc_o <= 1'b1;
192
                m_stb_o <= 1'b1;
193
                m_we_o <= 1'b1;
194
                m_sel_o <= {cx[0],~cx[0]};
195
                m_adr_o <= ma;
196
                m_dat_o <= {2{PenColor8}};
197
        end
198
        else if (m_ack_i) begin
199
                m_cyc_o <= 1'b0;
200
                m_stb_o <= 1'b0;
201
                m_sel_o <= 2'b00;
202
                m_we_o <= 1'b0;
203
                if (cx==x1 && cy==y1)
204
                        state <= IDLE;
205
                else
206
                        state <= DL_TEST;
207
        end
208
DL_TEST:
209
        begin
210
                err <= err - ((e2 > -dy) ? dy : 16'd0) + ((e2 < dx) ? dx : 16'd0);
211
                cx <= (e2 > -dy) ? cx + sx : cx;
212
                cy <= (e2 <  dx) ? cy + sy : cy;
213
                state <= DL_SETPIXEL;
214
        end
215
 
216
endcase
217
end
218
 
219
endmodule
220
 
221
//function line(x0, y0, x1, y1)
222
//   dx := abs(x1-x0)
223
//   dy := abs(y1-y0) 
224
//;   if x0 < x1 then sx := 1 else sx := -1
225
//;   if y0 < y1 then sy := 1 else sy := -1
226
//;   err := dx-dy
227
//; 
228
//;//   loop
229
//;     setPixel(x0,y0)
230
//;     if x0 = x1 and y0 = y1 exit loop
231
//;     e2 := 2*err
232
//;     if e2 > -dy then 
233
//;       err := err - dy
234
//;       x0 := x0 + sx
235
//;     end if
236
//;     if e2 <  dx then 
237
//;       err := err + dx
238
//;       y0 := y0 + sy 
239
//;     end if
240
//;   end loop

powered by: WebSVN 2.1.0

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