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

Subversion Repositories alternascope

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

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

Line No. Rev Author Line
1 2 smpickett
//==================================================================
2
// File:    d_VGAdriver.v
3
// Version: 0.01
4
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5
// Copyright Stephen Pickett
6
//   April 28, 2005
7
//------------------------------------------------------------------
8
// Revisions:
9
// Ver 0.01     Apr 28, 2005    Initial Release
10
//
11
//==================================================================
12
module Driver_VGA(
13
    CLK_50MHZ, MASTER_RST,
14
    VGA_RAM_DATA, VGA_RAM_ADDR,
15
    VGA_RAM_OE, VGA_RAM_WE, VGA_RAM_CS,
16
    VGA_RAM_ACCESS_OK,
17
    H_SYNC, V_SYNC, VGA_OUTPUT,
18
    XCOORD, YCOORD, ram_vshift,
19
    TRIGGER_LEVEL,
20
    SHOW_LEVELS
21
    );
22
 
23
//==================================================================//
24
// PARAMETER DEFINITIONS                                            //
25
//==================================================================//
26
parameter P_black   = 3'b000;
27
parameter P_yellow  = 3'b110;
28
parameter P_cyan    = 3'b011;
29
parameter P_green   = 3'b010;
30
parameter P_white   = 3'b111;
31
 
32
//==================================================================//
33
// VARIABLE DEFINITIONS                                             //
34
//==================================================================//
35
//----------------------//
36
// INPUTS / OUTPUTS     //
37
//----------------------//
38
input CLK_50MHZ;                // System wide clock
39
input MASTER_RST;               // System wide reset
40
output H_SYNC;                  // The H_SYNC timing signal to the VGA monitor
41
output V_SYNC;                  // The V_SYNC timing signal to the VGA monitor
42
output[2:0]  VGA_OUTPUT;        // The 3-bit VGA output
43
input[11:0]  XCOORD, YCOORD;
44
input[15:0]  VGA_RAM_DATA;
45
output[17:0] VGA_RAM_ADDR;
46
output VGA_RAM_OE, VGA_RAM_WE, VGA_RAM_CS;
47
output VGA_RAM_ACCESS_OK;
48
input[8:0] TRIGGER_LEVEL;
49
input SHOW_LEVELS;
50
 
51
output[15:0] ram_vshift;
52
 
53
 
54
 
55
//----------------------//
56
// WIRES / NODES        //
57
//----------------------//
58
reg H_SYNC, V_SYNC;
59
reg [2:0]  VGA_OUTPUT;
60
wire CLK_50MHZ, MASTER_RST;
61
wire[11:0] XCOORD, YCOORD;
62
wire[15:0] VGA_RAM_DATA;
63
reg[17:0]  VGA_RAM_ADDR;
64
reg VGA_RAM_OE, VGA_RAM_WE, VGA_RAM_CS;
65
reg VGA_RAM_ACCESS_OK;
66
wire[8:0] TRIGGER_LEVEL;
67
wire SHOW_LEVELS;
68
 
69
 
70
//----------------------//
71
// REGISTERS            //
72
//----------------------//
73
reg CLK_25MHZ;      // General system clock for VGA timing
74
reg [9:0] hcnt;     // Counter - generates the H_SYNC signal
75
reg [9:0] vcnt;     // Counter - counts the H_SYNC pulses to generate V_SYNC signal
76
reg[2:0]  vga_out;
77
 
78
//==================================================================//
79
// FUNCTIONAL DEFINITIONS                                           //
80
//==================================================================//
81
 
82
//------------------------------------------------------------------//
83
// CLOCK FUNCTIONS                                                  //
84
//------------------------------------------------------------------//
85
always @ (posedge CLK_50MHZ or posedge MASTER_RST)
86
        if (MASTER_RST == 1'b1)
87
            CLK_25MHZ <= 1'b0;
88
        else
89
            CLK_25MHZ <= ~CLK_25MHZ;
90
 
91
 
92
//------------------------------------------------------------------//
93
// SYNC TIMING COUNTERS                                             //
94
//------------------------------------------------------------------//
95
always @ (posedge CLK_25MHZ or posedge MASTER_RST) begin
96
    if (MASTER_RST == 1'b1) begin
97
        hcnt <= 10'd0;
98
        vcnt <= 10'd0;
99
    end else if (hcnt == 10'd0799) begin
100
        hcnt <= 10'd0;
101
        if (vcnt == 10'd0520)
102
            vcnt <= 10'd0;
103
        else
104
            vcnt <= vcnt + 1'b1;
105
    end else
106
        hcnt <= hcnt + 1'b1;
107
end
108
 
109
 
110
//------------------------------------------------------------------//
111
// HORIZONTAL SYNC TIMING                                           //
112
//------------------------------------------------------------------//
113
always @ (hcnt)
114
    if (hcnt <= 10'd0095)
115
        H_SYNC = 1'b0;
116
    else
117
        H_SYNC = 1'b1;
118
 
119
 
120
//------------------------------------------------------------------//
121
// VERTICAL SYNC TIMING                                             //
122
//------------------------------------------------------------------//
123
always @ (vcnt)
124
    if (vcnt <= 10'd0001)
125
        V_SYNC = 1'b0;
126
    else
127
        V_SYNC = 1'b1;
128
 
129
 
130
//------------------------------------------------------------------//
131
// VGA DATA SIGNAL TIMING                                           //
132
//------------------------------------------------------------------//
133
always @ (hcnt or vcnt or XCOORD or YCOORD or MASTER_RST or vga_out or SHOW_LEVELS or TRIGGER_LEVEL) begin
134
    if(MASTER_RST == 1'b1) begin
135
        VGA_OUTPUT = P_black;
136
    //------------------------------------------------------------------------------//
137
    // UNSEEN BORDERS                                                               //
138
    end else if( (vcnt <= 10'd30) || (vcnt >= 10'd511) ) begin
139
        VGA_OUTPUT = P_black;
140
    end else if( (hcnt <= 10'd143) || (hcnt >= 10'd784) ) begin
141
        VGA_OUTPUT = P_black;
142
    //------------------------------------------------------------------------------//
143
    // MOUSE CURSORS                                                                //
144
    end else if(vcnt == (YCOORD+10'd31)) begin
145
        VGA_OUTPUT = P_green;
146
    end else if(hcnt == (XCOORD+10'd144)) begin
147
        VGA_OUTPUT = P_green;
148
    //------------------------------------------------------------------------------//
149
    // TRIGGER SPRITE         (shows as ------T------ )                             //
150
    end else if(SHOW_LEVELS == 1'b1 && vcnt == (TRIGGER_LEVEL+10'd31) && hcnt != 10'd700 && hcnt != 10'd702) begin
151
        VGA_OUTPUT = P_yellow;
152
    end else if(SHOW_LEVELS == 1'b1 && vcnt == (TRIGGER_LEVEL+1'b1+10'd31) && hcnt >= 10'd700 && hcnt <= 10'd702) begin
153
        VGA_OUTPUT = P_yellow;
154
    end else if(SHOW_LEVELS == 1'b1 && vcnt == (TRIGGER_LEVEL-1'b1+10'd31) && hcnt == 10'd701) begin
155
        VGA_OUTPUT = P_yellow;
156
///*
157
    //------------------------------------------------------------------------------//
158
    // MOVE THE WAVEFORM TO THE 'TOP'                                               //
159
    end else if(vga_out != 0 && (vcnt < 10'd431)) begin
160
        VGA_OUTPUT = vga_out;
161
//*/
162
    //------------------------------------------------------------------------------//
163
    // TOP, BOTTOM, LEFT AND RIGHT GRID LINES                                       //
164
    end else if( vcnt == 10'd031 || vcnt == 10'd431 || vcnt == 10'd510) begin
165
        VGA_OUTPUT = P_cyan;
166
    end else if( hcnt == 10'd144 || hcnt == 10'd783) begin
167
        VGA_OUTPUT = P_cyan;
168
    //------------------------------------------------------------------------------//
169
    // MIDDLE GRID LINES (dashed at 8pxls)                                          //
170
    end else if(vcnt == 10'd231 && hcnt[3] == 1'b1) begin
171
        VGA_OUTPUT = P_cyan;
172
    end else if((hcnt == 10'd464) && (vcnt <= 10'd431) && (vcnt[3] == 1'b1)) begin
173
        VGA_OUTPUT = P_cyan;
174
    //------------------------------------------------------------------------------//
175
    // OTHER HORIZONTAL LINES (dashed at 4pxls)                                     //
176
    end else if((vcnt == 10'd071 || vcnt == 10'd111 || vcnt == 10'd151 || vcnt == 10'd191 || vcnt == 10'd271 || vcnt == 10'd311 || vcnt == 10'd351 || vcnt == 10'd391) && (hcnt[2] == 1'b1)) begin
177
        VGA_OUTPUT = P_cyan;
178
    //------------------------------------------------------------------------------//
179
    // OTHER VERTICAL LINES (dashed at 4pxls)                                       //
180
    end else if(((hcnt[5:0] == 6'b010000) && (vcnt <= 10'd431)) && (vcnt[2] == 1'b1)) begin
181
        VGA_OUTPUT = P_cyan;
182
    //------------------------------------------------------------------------------//
183
    // OTHERWISE...                                                                 //
184
    end else
185
        VGA_OUTPUT = P_black;
186
/*
187
    //------------------------------------------------------------------------------//
188
    // DISPLAY DATA                                                                 //
189
    end else if(vcnt >= 10'd431) begin
190
        VGA_OUTPUT = P_black;
191
    end else begin
192
        VGA_OUTPUT = vga_out;
193
    end
194
*/
195
end
196
 
197
//------------------------------------------------------------------//
198
// RAM DATA READING                                                 //
199
//------------------------------------------------------------------//
200
// on reset, ram_addr = 24 and add 25 on each pxl
201
//     row 0: ram_addr = 24 and 25 for each pxl
202
//     row 1: ram_addr = 24 and 25 for each pxl
203
//       ...
204
//     row 15: ram_addr = 24 and 25 for each pxl
205
//     row 16: ram_addr = 23 and 25 for each pxl *
206
//     row 17: ram_addr = 23 and 25 for each pxl *
207
//       ...
208
reg[9:0]  ram_hcnt;
209
reg[4:0]  ram_vcnt;
210
reg[15:0] ram_vshift;
211
 
212
 
213
always @ (posedge CLK_25MHZ or posedge MASTER_RST) begin
214
    if(MASTER_RST == 1'b1) begin
215
        ram_hcnt <= 10'd639;
216
    end else if(hcnt >= 10'd143 && hcnt <= 782) begin
217
        if(ram_hcnt == 10'd639)
218
            ram_hcnt <= 10'b0;
219
        else
220
            ram_hcnt <= ram_hcnt + 1'b1;
221
    end else begin
222
        ram_hcnt <= 10'd639;
223
    end
224
end
225
 
226
always @ (posedge CLK_25MHZ or posedge MASTER_RST) begin
227
    if(MASTER_RST == 1'b1) begin
228
        ram_vshift <= 16'h8000;
229
    end else if(vcnt < 10'd31) begin
230
        ram_vshift <= 16'h8000;
231
    end else if((vcnt >= 10'd31) && (hcnt == 10'd0799)) begin
232
        if(ram_vshift == 16'h0001)
233
            ram_vshift <= 16'h8000;
234
        else
235
            ram_vshift <= (ram_vshift >> 1);
236
    end else
237
        ram_vshift <= ram_vshift;
238
end
239
 
240
always @ (posedge CLK_25MHZ or posedge MASTER_RST) begin
241
    if(MASTER_RST == 1'b1) begin
242
        ram_vcnt <= 5'd0;
243
    end else if(vcnt < 10'd30) begin
244
        ram_vcnt <= 5'd0;
245
    end else if((vcnt >= 10'd30) && (hcnt == 10'd0799) && (ram_vshift == 16'h0001)) begin
246
        if(ram_vcnt == 5'd0)
247
            ram_vcnt <= 5'd24;
248
        else
249
            ram_vcnt <= ram_vcnt - 1'b1;
250
    end else begin
251
        ram_vcnt <= ram_vcnt;
252
    end
253
end
254
 
255
 
256
 
257
always @ (ram_hcnt or ram_vcnt) begin
258
    VGA_RAM_ADDR = ram_vcnt + (ram_hcnt * 7'd025);
259
end
260
 
261
 
262
always @ (VGA_RAM_DATA or ram_vshift) begin
263
    if((VGA_RAM_DATA & ram_vshift) != 16'b0)
264
        vga_out = P_white;
265
    else
266
        vga_out = 3'b0;
267
end
268
 
269
 
270
always begin
271
    VGA_RAM_CS = 1'b0;  // #CS
272
    VGA_RAM_OE = 1'b0;  // #OE
273
    VGA_RAM_WE = 1'b1;  // #WE
274
end
275
 
276
 
277
//------------------------------------------------------------------//
278
// ALL CLEAR?                                                       //
279
//------------------------------------------------------------------//
280
always @ (vcnt) begin
281
    if(vcnt >= 10'd512 || vcnt < 10'd30)
282
        VGA_RAM_ACCESS_OK = 1'b1;
283
    else
284
        VGA_RAM_ACCESS_OK = 1'b0;
285
end
286
 
287
 
288
endmodule

powered by: WebSVN 2.1.0

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