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

Subversion Repositories alternascope

[/] [alternascope/] [trunk/] [Mouse/] [.#d_DriverMouse.v.1.1] - Blame information for rev 32

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

Line No. Rev Author Line
1 11 smpickett
//==================================================================
2
// File:    d_MouseDriver.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
 
13
module Driver_mouse(
14
    CLK_50MHZ, MASTER_RST,
15
    PS2C, PS2D,
16
    XCOORD, YCOORD,
17
    L_BUTTON, R_BUTTON, M_BUTTON
18
    );
19
 
20
//==================================================================//
21
// DEFINITIONS                                                      //
22
//==================================================================//
23
parameter ss_CLK_LOW_100US    = 4'b0000;
24
parameter ss_DATA_LOW         = 4'b0001;
25
parameter ss_SET_BIT_0        = 4'b0011;
26
parameter ss_SET_BIT_1        = 4'b0010;
27
parameter ss_SET_BIT_2        = 4'b0110;
28
parameter ss_SET_BIT_3        = 4'b0111;
29
parameter ss_SET_BIT_4        = 4'b0101;
30
parameter ss_SET_BIT_5        = 4'b0100;
31
parameter ss_SET_BIT_6        = 4'b1100;
32
parameter ss_SET_BIT_7        = 4'b1101;
33
parameter ss_SET_BIT_PARITY   = 4'b1111;
34
parameter ss_SET_BIT_STOP     = 4'b1110;
35
parameter ss_WAIT_BIT_ACK     = 4'b1010;
36
parameter ss_GET_MOVEMENT     = 4'b1000;
37
 
38
parameter P_Lbut_index  = 1;
39
parameter P_Mbut_index  = 2;
40
parameter P_Rbut_index  = 3;
41
 
42
 
43
//==================================================================//
44
// VARIABLE DEFINITIONS                                             //
45
//==================================================================//
46
//----------------------//
47
// INPUTS               //
48
//----------------------//
49
input CLK_50MHZ;            // System wide clock
50
input MASTER_RST;           // System wide reset
51
inout PS2C;                 // PS2 clock
52
inout PS2D;                 // PS2 data
53
 
54
//----------------------//
55
// OUTPUTS              //
56
//----------------------//
57
output[11:0] XCOORD;        // X coordinate of the cursor
58
output[11:0] YCOORD;        // Y coordinate of the cursor
59
output L_BUTTON, R_BUTTON, M_BUTTON;
60
 
61
//----------------------//
62
// WIRES / NODES        //
63
//----------------------//
64
wire CLK_50MHZ, MASTER_RST;
65
wire PS2C, PS2D;
66
reg[11:0] XCOORD;
67
reg[11:0] YCOORD;
68
reg L_BUTTON, R_BUTTON, M_BUTTON;
69
 
70
//----------------------//
71
// REGISTERS            //
72
//----------------------//
73
reg[12:0] Counter_timer;
74
reg[5:0]  Counter_bits;
75
reg[3:0]  sm_ps2mouse;
76
reg[32:0] data_in_buf;
77
 
78
 
79
 
80
 
81
//==================================================================//
82
// FUNCTIONAL DEFINITIONS                                           //
83
//==================================================================//
84
 
85
//------------------------------------------------------------------//
86
// INTERMEDIATE VALUES                                              //
87
//------------------------------------------------------------------//
88
reg[7:0]  Counter_PS2C;
89
reg       CLK_ps2c_debounced;
90
 
91
// Debounce the PS2C line.
92
//  The mouse is generally not outputting a nice rising clock edge.
93
//  To eliminate the false edge detection, make sure it is high/low
94
//  for at least 256 counts before triggering the CLK.
95
always @ (posedge CLK_50MHZ or posedge MASTER_RST) begin
96
    if(MASTER_RST == 1'b1) begin
97
        Counter_PS2C <= 8'b0;
98
    end else begin
99
        if(PS2C == 1'b1) begin
100
            if(Counter_PS2C == 8'hFF)
101
                Counter_PS2C <= Counter_PS2C;
102
            else
103
                Counter_PS2C <= Counter_PS2C + 1;
104
        end else begin
105
            if(Counter_PS2C == 8'b0)
106
                Counter_PS2C <= Counter_PS2C;
107
            else
108
                Counter_PS2C <= Counter_PS2C - 1;
109
        end
110
    end
111
end
112
 
113
always @ (posedge CLK_50MHZ or posedge MASTER_RST) begin
114
    if(MASTER_RST == 1'b1)
115
        CLK_ps2c_debounced <= 1'b0;
116
    else if(Counter_PS2C == 8'b0)
117
        CLK_ps2c_debounced <= 1'b0;
118
    else if(Counter_PS2C == 8'hFF)
119
        CLK_ps2c_debounced <= 1'b1;
120
    else
121
        CLK_ps2c_debounced <= CLK_ps2c_debounced;
122
end
123
 
124
 
125
//------------------------------------------------------------------//
126
// INTERPRETING MOVEMENTS                                           //
127
//------------------------------------------------------------------//
128
reg[7:0] xcoord_buf;
129
reg[7:0] ycoord_buf;
130
 
131
always @ (posedge CLK_50MHZ or posedge MASTER_RST) begin
132
    if(MASTER_RST == 1'b1) begin
133
        xcoord_buf <= 8'b0;
134
    end else if(data_in_buf[5] == 1'b0) begin
135
        xcoord_buf <= data_in_buf[19:12];
136
    end else begin
137
        xcoord_buf <= ((~(data_in_buf[19:12]))+1);
138
    end
139
end
140
 
141
always @ (posedge CLK_50MHZ or posedge MASTER_RST) begin
142
    if(MASTER_RST == 1'b1) begin
143
        ycoord_buf <= 8'b0;
144
    end else if(data_in_buf[6] == 1'b0) begin
145
        ycoord_buf <= data_in_buf[30:23];
146
    end else begin
147
        ycoord_buf <= ((~(data_in_buf[30:23]))+1);
148
    end
149
end
150
 
151
 
152
always @ (posedge CLK_ps2c_debounced or posedge MASTER_RST) begin
153
    if(MASTER_RST == 1'b1) begin
154
        XCOORD <= 12'd320;
155
    end else if(Counter_bits == 6'd32 && (data_in_buf[7] == 1'b0)) begin
156
        if(data_in_buf[5] == 1'b1) begin    // NEGITIVE
157
            if(XCOORD <= xcoord_buf)
158
                XCOORD <= 12'b0;
159
            else
160
                XCOORD <= XCOORD - xcoord_buf;
161
        end else begin  // POSITIVE
162
            if((XCOORD + xcoord_buf) >= 11'd639)
163
                XCOORD <= 12'd639;
164
            else
165
                XCOORD <= XCOORD + xcoord_buf;
166
        end
167
    end else begin
168
        XCOORD <= XCOORD;
169
    end
170
end
171
 
172
always @ (posedge CLK_ps2c_debounced or posedge MASTER_RST) begin
173
    if(MASTER_RST == 1'b1) begin
174
        YCOORD <= 12'd100;
175
    end else if(Counter_bits == 6'd32 && (data_in_buf[8] == 1'b0)) begin
176
        if(data_in_buf[6] == 1'b1) begin    // POSITIVE
177
            if((YCOORD + ycoord_buf) >= 11'd479)
178
                YCOORD <= 12'd479;
179
            else
180
                YCOORD <= YCOORD + ycoord_buf;
181
        end else begin  // POSITIVE
182
            if(YCOORD <= ycoord_buf)
183
                YCOORD <= 12'd0;
184
            else
185
                YCOORD <= YCOORD - ycoord_buf;
186
        end
187
    end else begin
188
        YCOORD <= YCOORD;
189
    end
190
end
191
 
192
//------------------------------------------------------------------//
193
// INTERPRETING BUTTONS                                             //
194
//------------------------------------------------------------------//
195
always @ (posedge CLK_50MHZ or posedge MASTER_RST) begin
196
    if(MASTER_RST == 1'b1) begin
197
        L_BUTTON <= 1'b0;
198
        M_BUTTON <= 1'b0;
199
        R_BUTTON <= 1'b0;
200
    end else if(Counter_bits == 6'd32) begin
201
        L_BUTTON <= data_in_buf[P_Lbut_index];
202
        M_BUTTON <= data_in_buf[P_Mbut_index];
203
        R_BUTTON <= data_in_buf[P_Rbut_index];
204
    end else begin
205
        L_BUTTON <= L_BUTTON;
206
        M_BUTTON <= M_BUTTON;
207
        R_BUTTON <= R_BUTTON;
208
    end
209
end
210
 
211
 
212
 
213
 
214
//------------------------------------------------------------------//
215
// SENDING DATA                                                     //
216
//------------------------------------------------------------------//
217
reg PS2C_out, PS2D_out;
218
 
219
assign PS2C = PS2C_out;
220
assign PS2D = PS2D_out;
221
 
222
 
223
always @ (Counter_timer or MASTER_RST) begin
224
    if(MASTER_RST == 1'b1) begin
225
        PS2C_out = 1'bZ;
226
    end else if((Counter_timer <= 13'd5500) && (MASTER_RST == 1'b0))
227
        PS2C_out = 1'b0;
228
    else
229
        PS2C_out = 1'bZ;
230
end
231
 
232
always @ (sm_ps2mouse or Counter_timer or MASTER_RST) begin
233
    if(MASTER_RST == 1'b1) begin
234
        PS2D_out = 1'bZ;
235
    end else if(Counter_timer >= 13'd5000 && sm_ps2mouse == ss_DATA_LOW) begin
236
        PS2D_out = 1'b0;
237
    end else if(sm_ps2mouse == ss_SET_BIT_0) begin
238
        PS2D_out = 1'b0;
239
    end else if(sm_ps2mouse == ss_SET_BIT_1) begin
240
        PS2D_out = 1'b0;
241
    end else if(sm_ps2mouse == ss_SET_BIT_2) begin
242
        PS2D_out = 1'b1;
243
    end else if(sm_ps2mouse == ss_SET_BIT_3) begin
244
        PS2D_out = 1'b0;
245
    end else if(sm_ps2mouse == ss_SET_BIT_4) begin
246
        PS2D_out = 1'b1;
247
    end else if(sm_ps2mouse == ss_SET_BIT_5) begin
248
        PS2D_out = 1'b1;
249
    end else if(sm_ps2mouse == ss_SET_BIT_6) begin
250
        PS2D_out = 1'b1;
251
    end else if(sm_ps2mouse == ss_SET_BIT_7) begin
252
        PS2D_out = 1'b1;
253
    end else if(sm_ps2mouse == ss_SET_BIT_PARITY) begin
254
        PS2D_out = 1'b0;
255
    end else if(sm_ps2mouse == ss_SET_BIT_STOP) begin
256
        PS2D_out = 1'b1;
257
    end else begin
258
        PS2D_out = 1'bZ;
259
    end
260
end
261
 
262
//------------------------------------------------------------------//
263
// RECIEVING DATA                                                   //
264
//------------------------------------------------------------------//
265
always @ (negedge CLK_ps2c_debounced or posedge MASTER_RST) begin
266
    if(MASTER_RST == 1'b1) begin
267
        data_in_buf <= 33'b0;
268
    end else if(sm_ps2mouse == ss_GET_MOVEMENT) begin
269
        data_in_buf <= data_in_buf >> 1;
270
        data_in_buf[32] <= PS2D;
271
    end else
272
        data_in_buf <= data_in_buf;
273
end
274
 
275
 
276
 
277
//------------------------------------------------------------------//
278
// COUNTERS FOR STATE MACHINE                                       //
279
//------------------------------------------------------------------//
280
// COUNTER: timer
281
always @ (posedge CLK_50MHZ or posedge MASTER_RST) begin
282
    if(MASTER_RST == 1'b1)
283
        Counter_timer <= 13'b0;
284
    else if(Counter_timer == 13'd6000)
285
        Counter_timer <= Counter_timer;
286
    else
287
        Counter_timer <= Counter_timer + 1;
288
end
289
 
290
// COUNTER: rec_data_bit_cnt
291
always @ (negedge CLK_ps2c_debounced or posedge MASTER_RST) begin
292
    if(MASTER_RST == 1'b1) begin
293
        Counter_bits <= 6'd22;
294
    end else if(sm_ps2mouse == ss_GET_MOVEMENT) begin
295
        if(Counter_bits == 6'd32)
296
            Counter_bits <= 6'd0;
297
        else
298
            Counter_bits <= Counter_bits + 1;
299
    end else begin
300
        Counter_bits <= Counter_bits;
301
    end
302
end
303
 
304
 
305
//------------------------------------------------------------------//
306
// MOUSE STATE MACHINE                                              //
307
//------------------------------------------------------------------//
308
always @ (negedge CLK_ps2c_debounced or posedge MASTER_RST) begin
309
    if(MASTER_RST == 1'b1) begin
310
            sm_ps2mouse <= ss_DATA_LOW;
311
    end else if(sm_ps2mouse == ss_DATA_LOW) begin
312
            sm_ps2mouse <= ss_SET_BIT_0;
313
    end else if(sm_ps2mouse == ss_SET_BIT_0) begin
314
            sm_ps2mouse <= ss_SET_BIT_1;
315
    end else if(sm_ps2mouse == ss_SET_BIT_1) begin
316
            sm_ps2mouse <= ss_SET_BIT_2;
317
    end else if(sm_ps2mouse == ss_SET_BIT_2) begin
318
            sm_ps2mouse <= ss_SET_BIT_3;
319
    end else if(sm_ps2mouse == ss_SET_BIT_3) begin
320
            sm_ps2mouse <= ss_SET_BIT_4;
321
    end else if(sm_ps2mouse == ss_SET_BIT_4) begin
322
            sm_ps2mouse <= ss_SET_BIT_5;
323
    end else if(sm_ps2mouse == ss_SET_BIT_5) begin
324
            sm_ps2mouse <= ss_SET_BIT_6;
325
    end else if(sm_ps2mouse == ss_SET_BIT_6) begin
326
            sm_ps2mouse <= ss_SET_BIT_7;
327
    end else if(sm_ps2mouse == ss_SET_BIT_7) begin
328
            sm_ps2mouse <= ss_SET_BIT_PARITY;
329
    end else if(sm_ps2mouse == ss_SET_BIT_PARITY) begin
330
            sm_ps2mouse <= ss_SET_BIT_STOP;
331
    end else if(sm_ps2mouse == ss_SET_BIT_STOP) begin
332
            sm_ps2mouse <= ss_WAIT_BIT_ACK;
333
    end else if(sm_ps2mouse == ss_WAIT_BIT_ACK) begin
334
            sm_ps2mouse <= ss_GET_MOVEMENT;
335
    end else if(sm_ps2mouse == ss_GET_MOVEMENT) begin
336
            sm_ps2mouse <= sm_ps2mouse;
337
    end else begin
338
        sm_ps2mouse <= ss_DATA_LOW;
339
    end
340
end
341
 
342
 
343
 
344
 
345
 
346
 
347
 
348
 
349
 
350
 
351
 
352
 
353
 
354
 
355
 
356
 
357
 
358
endmodule
359
 

powered by: WebSVN 2.1.0

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