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

Subversion Repositories alternascope

[/] [alternascope/] [trunk/] [VGA/] [d_VGAdriver.v] - Blame information for rev 11

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 8 smpickett
//==================================================================//
2
// File:    d_VGAdriver.v                                           //
3
// Version: 0.0.0.2                                                 //
4
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -//
5
// Copyright (C) Stephen Pickett                                    //
6
//   Jun 09, 2005                                                   //
7
//                                                                  //
8
// This program is free software; you can redistribute it and/or    //
9
// modify it under the terms of the GNU General Public License      //
10
// as published by the Free Software Foundation; either version 2   //
11
// of the License, or (at your option) any later version.           //
12
//                                                                  //
13
// This program is distributed in the hope that it will be useful,  //
14
// but WITHOUT ANY WARRANTY; without even the implied warranty of   //
15
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    //
16
// GNU General Public License for more details.                     //
17
//                                                                  //
18
// If you have not received a copy of the GNU General Public License//
19
// along with this program; write to:                               //
20
//     Free Software Foundation, Inc.,                              //
21
//     51 Franklin Street, Fifth Floor,                             //
22
//     Boston, MA  02110-1301, USA.                                 //
23
//                                                                  //
24
//------------------------------------------------------------------//
25
// Revisions:                                                       //
26
// Ver 0.0.0.1     Apr 28, 2005   Under Development                 //
27
//     0.0.0.2     Jun 09, 2005   Cleaning                          //
28 11 smpickett
//     0.0.0.3     Jun 10, 2005   Re-structuerd the VCNT and HCNT   //
29
//                                so they line up with the PXLs.    //
30 8 smpickett
//                                                                  //
31
//==================================================================//
32
 
33 2 smpickett
module Driver_VGA(
34
    CLK_50MHZ, MASTER_RST,
35 11 smpickett
    CLK_VGA,
36 2 smpickett
    VGA_RAM_DATA, VGA_RAM_ADDR,
37
    VGA_RAM_OE, VGA_RAM_WE, VGA_RAM_CS,
38
    VGA_RAM_ACCESS_OK,
39
    H_SYNC, V_SYNC, VGA_OUTPUT,
40
    XCOORD, YCOORD, ram_vshift,
41
    TRIGGER_LEVEL,
42 11 smpickett
    SHOW_LEVELS,
43
    HCNT, VCNT,
44
    RGB_CHAR
45 2 smpickett
    );
46
 
47
//==================================================================//
48
// PARAMETER DEFINITIONS                                            //
49
//==================================================================//
50
parameter P_black   = 3'b000;
51
parameter P_yellow  = 3'b110;
52
parameter P_cyan    = 3'b011;
53
parameter P_green   = 3'b010;
54
parameter P_white   = 3'b111;
55
 
56
//==================================================================//
57
// VARIABLE DEFINITIONS                                             //
58
//==================================================================//
59
//----------------------//
60
// INPUTS / OUTPUTS     //
61
//----------------------//
62
input CLK_50MHZ;                // System wide clock
63
input MASTER_RST;               // System wide reset
64 11 smpickett
input CLK_VGA;
65 2 smpickett
output H_SYNC;                  // The H_SYNC timing signal to the VGA monitor
66
output V_SYNC;                  // The V_SYNC timing signal to the VGA monitor
67
output[2:0]  VGA_OUTPUT;        // The 3-bit VGA output
68
input[11:0]  XCOORD, YCOORD;
69
input[15:0]  VGA_RAM_DATA;
70
output[17:0] VGA_RAM_ADDR;
71
output VGA_RAM_OE, VGA_RAM_WE, VGA_RAM_CS;
72
output VGA_RAM_ACCESS_OK;
73
input[8:0] TRIGGER_LEVEL;
74
input SHOW_LEVELS;
75 11 smpickett
output[9:0] HCNT, VCNT;
76
input[2:0] RGB_CHAR;
77 2 smpickett
 
78
output[15:0] ram_vshift;
79
 
80
 
81
 
82 11 smpickett
 
83 2 smpickett
//----------------------//
84
// WIRES / NODES        //
85
//----------------------//
86
reg H_SYNC, V_SYNC;
87
reg [2:0]  VGA_OUTPUT;
88
wire CLK_50MHZ, MASTER_RST;
89 11 smpickett
wire CLK_VGA;
90 2 smpickett
wire[11:0] XCOORD, YCOORD;
91
wire[15:0] VGA_RAM_DATA;
92
reg[17:0]  VGA_RAM_ADDR;
93
reg VGA_RAM_OE, VGA_RAM_WE, VGA_RAM_CS;
94
reg VGA_RAM_ACCESS_OK;
95
wire[8:0] TRIGGER_LEVEL;
96
wire SHOW_LEVELS;
97 11 smpickett
wire[9:0] HCNT, VCNT;
98
wire[2:0] RGB_CHAR;
99 2 smpickett
 
100
 
101
//----------------------//
102
// REGISTERS            //
103
//----------------------//
104 11 smpickett
//reg CLK_25MHZ;      // General system clock for VGA timing
105
wire CLK_25MHZ = CLK_VGA;
106 2 smpickett
reg [9:0] hcnt;     // Counter - generates the H_SYNC signal
107
reg [9:0] vcnt;     // Counter - counts the H_SYNC pulses to generate V_SYNC signal
108
reg[2:0]  vga_out;
109
 
110
//==================================================================//
111
// FUNCTIONAL DEFINITIONS                                           //
112
//==================================================================//
113 11 smpickett
assign HCNT = hcnt;
114
assign VCNT = vcnt;
115 2 smpickett
 
116
//------------------------------------------------------------------//
117
// CLOCK FUNCTIONS                                                  //
118
//------------------------------------------------------------------//
119 11 smpickett
//always @ (posedge CLK_50MHZ or posedge MASTER_RST)
120
//        if (MASTER_RST == 1'b1)
121
//            CLK_25MHZ <= 1'b0;
122
//        else
123
//            CLK_25MHZ <= ~CLK_25MHZ;
124 2 smpickett
 
125
 
126
//------------------------------------------------------------------//
127
// SYNC TIMING COUNTERS                                             //
128
//------------------------------------------------------------------//
129
always @ (posedge CLK_25MHZ or posedge MASTER_RST) begin
130
    if (MASTER_RST == 1'b1) begin
131
        hcnt <= 10'd0;
132 11 smpickett
        vcnt <= 10'd430;
133 2 smpickett
    end else if (hcnt == 10'd0799) begin
134
        hcnt <= 10'd0;
135 11 smpickett
        if (vcnt == 10'd0)
136
            vcnt <= 10'd520;
137 2 smpickett
        else
138 11 smpickett
            vcnt <= vcnt - 1'b1;
139 2 smpickett
    end else
140
        hcnt <= hcnt + 1'b1;
141
end
142
 
143
 
144
//------------------------------------------------------------------//
145
// HORIZONTAL SYNC TIMING                                           //
146
//------------------------------------------------------------------//
147
always @ (hcnt)
148 11 smpickett
    if (hcnt >= 10'd656 && hcnt <= 10'd751)
149 2 smpickett
        H_SYNC = 1'b0;
150
    else
151
        H_SYNC = 1'b1;
152
 
153
 
154
//------------------------------------------------------------------//
155
// VERTICAL SYNC TIMING                                             //
156
//------------------------------------------------------------------//
157
always @ (vcnt)
158 11 smpickett
    if (vcnt == 10'd430 || vcnt == 10'd429)
159 2 smpickett
        V_SYNC = 1'b0;
160
    else
161
        V_SYNC = 1'b1;
162
 
163
 
164
//------------------------------------------------------------------//
165
// VGA DATA SIGNAL TIMING                                           //
166
//------------------------------------------------------------------//
167
always @ (hcnt or vcnt or XCOORD or YCOORD or MASTER_RST or vga_out or SHOW_LEVELS or TRIGGER_LEVEL) begin
168
    if(MASTER_RST == 1'b1) begin
169
        VGA_OUTPUT = P_black;
170
    //------------------------------------------------------------------------------//
171
    // UNSEEN BORDERS                                                               //
172 11 smpickett
    end else if( (vcnt >= 10'd400) && (vcnt <= 10'd440) ) begin
173 2 smpickett
        VGA_OUTPUT = P_black;
174 11 smpickett
    end else if( (hcnt >= 10'd640) ) begin
175 2 smpickett
        VGA_OUTPUT = P_black;
176
    //------------------------------------------------------------------------------//
177
    // MOUSE CURSORS                                                                //
178 11 smpickett
    end else if(vcnt == YCOORD) begin
179 2 smpickett
        VGA_OUTPUT = P_green;
180 11 smpickett
    end else if(hcnt == XCOORD) begin
181 2 smpickett
        VGA_OUTPUT = P_green;
182
    //------------------------------------------------------------------------------//
183
    // TRIGGER SPRITE         (shows as ------T------ )                             //
184 11 smpickett
    end else if(SHOW_LEVELS == 1'b1 && vcnt == (TRIGGER_LEVEL) && hcnt != 10'd556 && hcnt != 10'd558) begin
185 2 smpickett
        VGA_OUTPUT = P_yellow;
186 11 smpickett
    end else if(SHOW_LEVELS == 1'b1 && vcnt == (TRIGGER_LEVEL+1'b1) && hcnt >= 10'd556 && hcnt <= 10'd558) begin
187 2 smpickett
        VGA_OUTPUT = P_yellow;
188 11 smpickett
    end else if(SHOW_LEVELS == 1'b1 && vcnt == (TRIGGER_LEVEL-1'b1) && hcnt == 10'd557) begin
189 2 smpickett
        VGA_OUTPUT = P_yellow;
190
///*
191
    //------------------------------------------------------------------------------//
192
    // MOVE THE WAVEFORM TO THE 'TOP'                                               //
193 11 smpickett
    end else if(vga_out != 0) begin
194 2 smpickett
        VGA_OUTPUT = vga_out;
195
//*/
196
    //------------------------------------------------------------------------------//
197
    // TOP, BOTTOM, LEFT AND RIGHT GRID LINES                                       //
198 11 smpickett
    end else if(vcnt == 10'd0 || vcnt == 10'd399 || vcnt == 10'd441) begin
199 2 smpickett
        VGA_OUTPUT = P_cyan;
200 11 smpickett
    end else if(hcnt == 10'd0 || hcnt == 10'd639) begin
201 2 smpickett
        VGA_OUTPUT = P_cyan;
202
    //------------------------------------------------------------------------------//
203
    // MIDDLE GRID LINES (dashed at 8pxls)                                          //
204 11 smpickett
    end else if(vcnt == 10'd199 && hcnt[3] == 1'b1) begin
205 2 smpickett
        VGA_OUTPUT = P_cyan;
206 11 smpickett
    end else if((hcnt == 10'd319) && (vcnt <= 10'd399) && (vcnt[3] == 1'b1)) begin
207 2 smpickett
        VGA_OUTPUT = P_cyan;
208
    //------------------------------------------------------------------------------//
209
    // OTHER HORIZONTAL LINES (dashed at 4pxls)                                     //
210 11 smpickett
    end else if((vcnt == 10'd39 || vcnt == 10'd79 || vcnt == 10'd119 || vcnt == 10'd159 || vcnt == 10'd239 || vcnt == 10'd279 || vcnt == 10'd319 || vcnt == 10'd359) && (hcnt[2] == 1'b1)) begin
211 2 smpickett
        VGA_OUTPUT = P_cyan;
212
    //------------------------------------------------------------------------------//
213
    // OTHER VERTICAL LINES (dashed at 4pxls)                                       //
214 11 smpickett
    end else if(((hcnt[5:0] == 6'b111111) && (vcnt <= 10'd399)) && (vcnt[2] == 1'b1)) begin
215 2 smpickett
        VGA_OUTPUT = P_cyan;
216
    //------------------------------------------------------------------------------//
217 11 smpickett
    // CHARACTER DISPLAY
218
    end else if(vcnt <= 10'd520 && vcnt >= 10'd441) begin
219
        VGA_OUTPUT = RGB_CHAR;
220
    //------------------------------------------------------------------------------//
221 2 smpickett
    // OTHERWISE...                                                                 //
222
    end else
223
        VGA_OUTPUT = P_black;
224
end
225
 
226
//------------------------------------------------------------------//
227
// RAM DATA READING                                                 //
228
//------------------------------------------------------------------//
229
// on reset, ram_addr = 24 and add 25 on each pxl
230
//     row 0: ram_addr = 24 and 25 for each pxl
231
//     row 1: ram_addr = 24 and 25 for each pxl
232
//       ...
233
//     row 15: ram_addr = 24 and 25 for each pxl
234
//     row 16: ram_addr = 23 and 25 for each pxl *
235
//     row 17: ram_addr = 23 and 25 for each pxl *
236
//       ...
237 11 smpickett
/*reg[9:0]  ram_hcnt;*/
238 2 smpickett
reg[4:0]  ram_vcnt;
239
reg[15:0] ram_vshift;
240
 
241 11 smpickett
/*
242 2 smpickett
always @ (posedge CLK_25MHZ or posedge MASTER_RST) begin
243
    if(MASTER_RST == 1'b1) begin
244
        ram_hcnt <= 10'd639;
245
    end else if(hcnt >= 10'd143 && hcnt <= 782) begin
246
        if(ram_hcnt == 10'd639)
247
            ram_hcnt <= 10'b0;
248
        else
249
            ram_hcnt <= ram_hcnt + 1'b1;
250
    end else begin
251
        ram_hcnt <= 10'd639;
252
    end
253
end
254 11 smpickett
*/
255 2 smpickett
 
256
always @ (posedge CLK_25MHZ or posedge MASTER_RST) begin
257
    if(MASTER_RST == 1'b1) begin
258
        ram_vshift <= 16'h8000;
259 11 smpickett
    end else if(vcnt > 10'd399) begin
260 2 smpickett
        ram_vshift <= 16'h8000;
261 11 smpickett
    end else if((vcnt <= 10'd399) && (hcnt == 10'd655)) begin
262 2 smpickett
        if(ram_vshift == 16'h0001)
263
            ram_vshift <= 16'h8000;
264
        else
265
            ram_vshift <= (ram_vshift >> 1);
266
    end else
267
        ram_vshift <= ram_vshift;
268
end
269
 
270
always @ (posedge CLK_25MHZ or posedge MASTER_RST) begin
271
    if(MASTER_RST == 1'b1) begin
272
        ram_vcnt <= 5'd0;
273
    end else if(vcnt < 10'd30) begin
274
        ram_vcnt <= 5'd0;
275 11 smpickett
    end else if((vcnt >= 10'd30) && (hcnt == 10'd655) && (ram_vshift == 16'h0001)) begin
276 2 smpickett
        if(ram_vcnt == 5'd0)
277
            ram_vcnt <= 5'd24;
278 11 smpickett
else
279 2 smpickett
            ram_vcnt <= ram_vcnt - 1'b1;
280
    end else begin
281
        ram_vcnt <= ram_vcnt;
282
    end
283
end
284
 
285
 
286
 
287 11 smpickett
always @ (hcnt or ram_vcnt) begin
288
    VGA_RAM_ADDR = ram_vcnt + (hcnt * 7'd25);
289 2 smpickett
end
290
 
291
 
292
always @ (VGA_RAM_DATA or ram_vshift) begin
293
    if((VGA_RAM_DATA & ram_vshift) != 16'b0)
294
        vga_out = P_white;
295
    else
296
        vga_out = 3'b0;
297
end
298
 
299
 
300
always begin
301
    VGA_RAM_CS = 1'b0;  // #CS
302
    VGA_RAM_OE = 1'b0;  // #OE
303
    VGA_RAM_WE = 1'b1;  // #WE
304
end
305
 
306
 
307
//------------------------------------------------------------------//
308
// ALL CLEAR?                                                       //
309
//------------------------------------------------------------------//
310
always @ (vcnt) begin
311 11 smpickett
    if((vcnt >= 10'd400) && (vcnt <= 10'd440))
312 2 smpickett
        VGA_RAM_ACCESS_OK = 1'b1;
313
    else
314
        VGA_RAM_ACCESS_OK = 1'b0;
315
end
316
 
317
 
318
endmodule

powered by: WebSVN 2.1.0

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