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

Subversion Repositories aoocs

[/] [aoocs/] [trunk/] [tests/] [ps2_mouse_test/] [ps2_mouse_test.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 alfik
module ps2_mouse_test(
2
    input clk_50,
3
    input reset_ext_n,
4
 
5
    inout ps2_mouseclk,
6
    inout ps2_mousedat,
7
 
8
    output [7:0] debug,
9
    output [7:0] debug2
10
);
11
 
12
wire CLK_I;
13
wire pll_locked;
14
 
15
altpll pll_inst(
16
    .inclk( {1'b0, clk_50} ),
17
    .clk( CLK_I ), //{5'b0, clk_30} ),
18
    .locked(pll_locked)
19
);
20
defparam    pll_inst.clk0_divide_by = 5,
21
            pll_inst.clk0_duty_cycle = 50,
22
            pll_inst.clk0_multiply_by = 3,
23
            pll_inst.clk0_phase_shift = "0",
24
            pll_inst.compensate_clock = "CLK0",
25
            pll_inst.gate_lock_counter = 1048575,
26
            pll_inst.gate_lock_signal = "YES",
27
            pll_inst.inclk0_input_frequency = 20000,
28
            pll_inst.intended_device_family = "Cyclone II",
29
            pll_inst.invalid_lock_multiplier = 5,
30
            pll_inst.lpm_hint = "CBX_MODULE_PREFIX=pll30",
31
            pll_inst.lpm_type = "altpll",
32
            pll_inst.operation_mode = "NORMAL",
33
            pll_inst.valid_lock_multiplier = 1;
34
 
35
wire reset_n;
36
assign reset_n = pll_locked & reset_ext_n;
37
 
38
assign debug = send_counter[7:0];
39
assign debug2 = ctrl_counter[7:0];
40
 
41
// ----------------------------------------------------------------------------- PS/2 mouse
42
assign ps2_mouseclk = (send_counter >= 12'd1 && send_counter < 12'd4000) ? 1'b0 : 1'bZ;
43
assign ps2_mousedat = (send_counter >= 12'd4000 && send_counter <= 12'd4009) ? send_shift[0] : 1'bZ;
44
 
45
reg [15:0] mv;
46
reg mv_wait;
47
reg was_ps2_mouseclk;
48
always @(posedge CLK_I or negedge reset_n) begin
49
    if(reset_n == 1'b0) begin
50
        mv                  <= 16'd0;
51
        mv_wait             <= 1'b0;
52
        was_ps2_mouseclk    <= 1'b0;
53
    end
54
    else begin
55
        mv <= { mv[14:0], ps2_mouseclk };
56
 
57
        if(mv_wait == 1'b0 && mv[15:12] == 4'b1111 && mv[3:0] == 4'b0000) begin
58
            was_ps2_mouseclk <= 1'b1;
59
            mv_wait <= 1'b1;
60
        end
61
        else if(mv_wait == 1'b1 && mv[15:0] == 16'h0000) begin
62
            mv_wait <= 1'b0;
63
            was_ps2_mouseclk <= 1'b0;
64
        end
65
        else begin
66
            was_ps2_mouseclk <= 1'b0;
67
        end
68
    end
69
end
70
 
71
reg [11:0] send_counter;
72
reg [9:0] send_shift;
73
always @(posedge CLK_I or negedge reset_n) begin
74
    if(reset_n == 1'b0) begin
75
        send_counter    <= 12'd0;
76
        send_shift      <= 10'd0;
77
    end
78
    else if(send_start == 1'b1) begin
79
        send_counter <= 12'd1;
80
        send_shift <= send_contents;
81
    end
82
    else if(send_counter > 12'd0 && send_counter < 12'd4000) begin
83
        send_counter <= send_counter + 12'd1;
84
    end
85
    else if(send_counter >= 12'd4000 && send_counter <= 12'd4009 && was_ps2_mouseclk == 1'b1) begin
86
        send_counter <= send_counter + 12'd1;
87
        if(send_counter <= 12'd4007) begin
88
            send_shift <= { send_shift[9] ^ send_shift[0], 1'b0, send_shift[8:1] };
89
        end
90
        else if(send_counter == 12'd4008) begin
91
            send_shift <= { 9'd0, send_shift[9] ^ send_shift[0] };
92
        end
93
    end
94
    else if(send_counter == 12'd4010 && was_ps2_mouseclk == 1'b1) begin
95
        if(ps2_mousedat == 1'b0) send_counter <= send_counter + 12'd1;
96
    end
97
    else if(send_counter == 12'd4011 && ps2_mouseclk == 1'b1 && ps2_mousedat == 1'b1) begin
98
        send_counter <= 12'd0;
99
    end
100
end
101
 
102
reg send_start;
103
reg [9:0] send_contents;
104
reg [23:0] ctrl_counter;
105
always @(posedge CLK_I or negedge reset_n) begin
106
    if(reset_n == 1'b0) begin
107
        send_start      <= 1'b0;
108
        send_contents   <= 10'd0;
109
        ctrl_counter    <= 24'd0;
110
    end
111
    else if(ctrl_counter < 24'hFFFFF0) begin
112
        ctrl_counter <= ctrl_counter + 16'd1;
113
    end
114
    else if(ctrl_counter == 24'hFFFFF0) begin
115
        send_contents <= { 1'b1, 8'hF4, 1'b0 };
116
        send_start <= 1'b1;
117
        ctrl_counter <= ctrl_counter + 24'd1;
118
    end
119
    else if(ctrl_counter == 24'hFFFFF1) begin
120
        send_start <= 1'b0;
121
        ctrl_counter <= ctrl_counter + 24'd1;
122
    end
123
    else if(ctrl_counter == 24'hFFFFF2 && send_counter == 12'd0) begin
124
        ctrl_counter <= ctrl_counter + 24'd1;
125
    end
126
    else if(ctrl_counter == 24'hFFFFF3 && new_ps2 == 1'b1 && mousedat[8:1] == 8'hFA) begin
127
        ctrl_counter <= 24'hFFFFFF;
128
    end
129
    else if(ctrl_counter == 24'hFFFFFF && (mousedat_timeout == 24'hFFFFFF || movement_timeout == 24'hFFFFFF)) begin
130
        ctrl_counter <= 24'h0;
131
    end
132
end
133
 
134
wire new_ps2;
135
assign new_ps2 = (was_ps2_mouseclk == 1'b1 && mousedat_counter == 4'd10 && mousedat[0] == 1'b0 && ps2_mousedat == 1'b1 && mousedat_parity == 1'b1);
136
 
137
reg [9:0] mousedat;
138
reg [3:0] mousedat_counter;
139
reg [23:0] mousedat_timeout;
140
reg mousedat_parity;
141
 
142
always @(posedge CLK_I or negedge reset_n) begin
143
    if(reset_n == 1'b0) begin
144
        mousedat            <= 10'd0;
145
        mousedat_counter    <= 4'd0;
146
        mousedat_parity     <= 1'b0;
147
        mousedat_timeout    <= 24'd0;
148
    end
149
    else if(ctrl_counter >= 24'hFFFFF3 && mousedat_timeout != 24'hFFFFFF) begin
150
 
151
        if(mousedat_counter != 4'd0)        mousedat_timeout <= mousedat_timeout + 24'd1;
152
        else if(mousedat_counter == 4'd0)   mousedat_timeout <= 24'd0;
153
 
154
        if(was_ps2_mouseclk == 1'b1) begin
155
            mousedat <= { ps2_mousedat, mousedat[9:1] };
156
 
157
            if(mousedat_counter == 4'd10) begin
158
                mousedat_counter <= 4'd0;
159
            end
160
            else begin
161
                mousedat_counter <= mousedat_counter + 4'd1;
162
                if(mousedat_counter == 4'd0)   mousedat_parity <= 1'b0;
163
                else if(ps2_mousedat == 1'b1)  mousedat_parity <= ~mousedat_parity;
164
            end
165
        end
166
    end
167
    else begin
168
        mousedat            <= 10'd0;
169
        mousedat_counter    <= 4'd0;
170
        mousedat_parity     <= 1'b0;
171
        mousedat_timeout    <= 24'd0;
172
    end
173
end
174
 
175
//assign mouse_y_move = (movement[23] == 1'b0)? { movement[21], movement[7:0] }  : 9'd0;
176
//assign mouse_x_move = (movement[22] == 1'b0)? { movement[20], movement[15:8] }  : 9'd0;
177
//assign mouse_left_button    = movement[16];
178
//assign mouse_right_button   = movement[17];
179
//assign mouse_middle_button  = movement[18];
180
 
181
reg mouse_moved;
182
 
183
reg [1:0] movement_counter;
184
reg [23:0] movement;
185
reg [23:0] movement_timeout;
186
 
187
always @(posedge CLK_I or negedge reset_n) begin
188
    if(reset_n == 1'b0) begin
189
        movement_counter    <= 2'd0;
190
        movement            <= 24'd0;
191
        mouse_moved         <= 1'b0;
192
        movement_timeout    <= 24'd0;
193
    end
194
    else if(ctrl_counter == 24'hFFFFFF && movement_timeout != 24'hFFFFFF) begin
195
 
196
        if(movement_counter != 4'd0)        movement_timeout <= movement_timeout + 24'd1;
197
        else if(movement_counter == 4'd0)   movement_timeout <= 24'd0;
198
 
199
        if(mouse_moved == 1'b1) mouse_moved <= 1'b0;
200
 
201
        if(new_ps2 == 1'b1) begin
202
            movement <= { movement[15:0], mousedat[8:1] };
203
            if(movement_counter == 2'd2) begin
204
                movement_counter <= 2'd0;
205
 
206
                if(movement[11] == 1'b1)    mouse_moved <= 1'b1;
207
                else                        movement_timeout <= 24'hFFFFFF;
208
            end
209
            else movement_counter <= movement_counter + 2'd1;
210
        end
211
    end
212
    else begin
213
        movement_counter    <= 2'd0;
214
        movement            <= 24'd0;
215
        mouse_moved         <= 1'b0;
216
        movement_timeout    <= 24'd0;
217
    end
218
end
219
// ----------------------------------------------------------------------------- PS/2 mouse END
220
 
221
wire write_ena;
222
assign write_ena = (mouse_moved == 1'b1); //(was_ps2_mouseclk == 1'b1 && ctrl_counter >= 24'hFFFF00 && (ctrl_counter[3:0] == 4'h3 || ctrl_counter[3:0] == 4'h4));
223
 
224
reg [7:0] debug_addr;
225
always @(posedge CLK_I) if(write_ena && debug_addr < 8'd255) debug_addr <= debug_addr + 8'd1;
226
 
227
altsyncram debug_ram_inst(
228
    .clock0(CLK_I),
229
    .wren_a(write_ena),
230
    .address_a(debug_addr),
231
    .data_a( movement )
232
);
233
defparam debug_ram_inst.operation_mode = "SINGLE_PORT";
234
defparam debug_ram_inst.width_a = 24;
235
defparam debug_ram_inst.widthad_a = 8;
236
defparam debug_ram_inst.lpm_hint = "ENABLE_RUNTIME_MOD=YES,INSTANCE_NAME=mouse";
237
 
238
endmodule

powered by: WebSVN 2.1.0

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