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

Subversion Repositories ps2

[/] [ps2/] [tags/] [rel_6/] [bench/] [verilog/] [ps2_keyboard_model.v] - Blame information for rev 10

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

Line No. Rev Author Line
1 2 mihad
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  ps2_keyboard_model.v                                        ////
4
////                                                              ////
5
////  This file is part of the "ps2" project                      ////
6
////  http://www.opencores.org/cores/ps2/                         ////
7
////                                                              ////
8
////  Author(s):                                                  ////
9
////      - mihad@opencores.org                                   ////
10
////      - Miha Dolenc                                           ////
11
////                                                              ////
12
////  All additional information is avaliable in the README.txt   ////
13
////  file.                                                       ////
14
////                                                              ////
15
////                                                              ////
16
//////////////////////////////////////////////////////////////////////
17
////                                                              ////
18
//// Copyright (C) 2000 Miha Dolenc, mihad@opencores.org          ////
19
////                                                              ////
20
//// This source file may be used and distributed without         ////
21
//// restriction provided that this copyright statement is not    ////
22
//// removed from the file and that any derivative work contains  ////
23
//// the original copyright notice and the associated disclaimer. ////
24
////                                                              ////
25
//// This source file is free software; you can redistribute it   ////
26
//// and/or modify it under the terms of the GNU Lesser General   ////
27
//// Public License as published by the Free Software Foundation; ////
28
//// either version 2.1 of the License, or (at your option) any   ////
29
//// later version.                                               ////
30
////                                                              ////
31
//// This source is distributed in the hope that it will be       ////
32
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
33
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
34
//// PURPOSE.  See the GNU Lesser General Public License for more ////
35
//// details.                                                     ////
36
////                                                              ////
37
//// You should have received a copy of the GNU Lesser General    ////
38
//// Public License along with this source; if not, download it   ////
39
//// from http://www.opencores.org/lgpl.shtml                     ////
40
////                                                              ////
41
//////////////////////////////////////////////////////////////////////
42
//
43
// CVS Revision History
44
//
45
// $Log: not supported by cvs2svn $
46 10 mihad
// Revision 1.1.1.1  2002/02/18 16:16:55  mihad
47
// Initial project import - working
48 2 mihad
//
49 10 mihad
//
50 2 mihad
 
51
`include "timescale.v"
52
 
53
module ps2_keyboard_model
54
(
55
    kbd_clk_io,
56
    kbd_data_io,
57
    last_char_received_o,
58
    char_valid_o
59
);
60
 
61
parameter [31:0] kbd_clk_period = 50000; // chould be between 33 and 50 us to generate the clock between 30 and 20 kHz
62
 
63
inout kbd_clk_io,
64
      kbd_data_io ;
65
 
66
output [7:0] last_char_received_o ;
67
reg    [7:0] last_char_received_o ;
68
 
69
output char_valid_o ;
70
reg    char_valid_o ;
71
 
72
reg kbd_clk,
73
    kbd_data ;
74
 
75
assign kbd_clk_io  = kbd_clk ? 1'bz : 1'b0 ;
76
assign kbd_data_io = kbd_data ? 1'bz : 1'b0 ;
77
 
78
reg receiving ;
79
initial
80
begin
81
    kbd_clk  = 1'b1 ;
82
    kbd_data = 1'b1 ;
83
 
84
    last_char_received_o = 0 ;
85
    char_valid_o         = 0 ;
86
 
87
    receiving = 0 ;
88
end
89
 
90
always@(kbd_data_io or kbd_clk_io)
91
begin
92
    // check if host is driving keyboard data low and doesn't drive clock
93
    if ( !kbd_data_io && kbd_data && kbd_clk_io)
94
    begin
95
        // wait for half of clock period
96
        #(kbd_clk_period/2) ;
97
 
98
        // state hasn't changed - host wishes to send data - go receiving
99
        if ( !kbd_data_io && kbd_data && kbd_clk_io)
100
            kbd_receive_char(last_char_received_o) ;
101
    end
102
end
103
 
104
task kbd_send_char ;
105
    input [7:0] char ;
106
    output      transmited_ok ;
107
    output      severe_error ;
108
    reg   [10:0] tx_reg ;
109
    integer i ;
110
begin:main
111
    severe_error  = 1'b0 ;
112
    transmited_ok = 1'b0 ;
113
 
114
    wait ( !receiving ) ;
115
 
116
    tx_reg = { 1'b1, !(^char), char, 1'b0 } ;
117
 
118
    fork
119
    begin:wait_for_idle
120
        wait( (kbd_clk_io === 1'b1) && (kbd_data_io === 1'b1) ) ;
121
    //    disable timeout ;
122
    end
123
    /*begin:timeout
124
        #(256 * kbd_clk_period) ;
125
        $display("Error! Keyboard bus did not go idle in 256 keyboard clock cycles time!") ;
126
        severe_error  = 1'b1 ;
127
        transmited_ok = 1'b0 ;
128
        disable main ;
129
    end*/
130
    join
131
 
132
    #(kbd_clk_period/2) ;
133
    if ( !kbd_clk_io )
134
    begin
135
        transmited_ok = 1'b0 ;
136
        kbd_data = 1'b1 ;
137
        disable main ;
138
    end
139
 
140
    i = 0 ;
141
    while ( i < 11 )
142
    begin
143
        kbd_data = tx_reg[i] ;
144
 
145
        #(kbd_clk_period/2) ;
146
 
147
        if ( !kbd_clk_io )
148
        begin
149
            transmited_ok = 1'b0 ;
150
            kbd_data = 1'b1 ;
151
            disable main ;
152
        end
153
 
154
        kbd_clk = 1'b0 ;
155
 
156
        i = i + 1 ;
157
 
158
        #(kbd_clk_period/2) ;
159
        kbd_clk = 1'b1 ;
160
    end
161
 
162
    if ( i == 11 )
163
        transmited_ok = 1'b1 ;
164
end
165
endtask // kbd_send_char
166
 
167
task kbd_receive_char;
168
    output [7:0] char ;
169
    reg          parity ;
170
    integer i ;
171 10 mihad
    reg          stop_clocking ;
172 2 mihad
begin:main
173
    i = 0 ;
174
    receiving = 1 ;
175 10 mihad
    stop_clocking = 1'b0 ;
176
 
177 2 mihad
    #(kbd_clk_period/2) ;
178
 
179 10 mihad
    while ( !stop_clocking )
180 2 mihad
    begin
181
 
182
        if ( !kbd_clk_io )
183
        begin
184
            receiving = 0 ;
185
            disable main ;
186
        end
187
 
188
        kbd_clk = 1'b0 ;
189
 
190
        #(kbd_clk_period/2) ;
191
 
192
        kbd_clk = 1'b1 ;
193
 
194
        if ( i > 0 )
195
        begin
196
            if ( i <= 8 )
197
                char[i - 1] = kbd_data_io ;
198
            else if ( i == 9 )
199
            begin
200
                parity = kbd_data_io ;
201
                if ( parity !== ( !(^char) ) )
202
                    $display("Invalid parity bit received") ;
203
            end
204 10 mihad
        end
205
 
206
        i = i + 1 ;
207
        #(kbd_clk_period/4) ;
208
        if ( i > 9 )
209
        begin
210
            if ( kbd_data_io === 1'b1 )
211 2 mihad
            begin
212 10 mihad
                kbd_data <= 1'b0 ;
213
                stop_clocking = 1'b1 ;
214 2 mihad
            end
215
        end
216
 
217 10 mihad
        #(kbd_clk_period/4) ;
218 2 mihad
    end
219
 
220
    kbd_clk  = 1'b0 ;
221
 
222
    #(kbd_clk_period/2) ;
223
    kbd_clk  <= 1'b1 ;
224
    kbd_data <= 1'b1 ;
225
 
226 10 mihad
    receiving = 0 ;
227
 
228
    if ( i === 10 )
229 2 mihad
    begin
230
        char_valid_o = !char_valid_o ;
231
    end
232
end
233
endtask // kbd_receive_char
234
 
235
endmodule // ps2_keyboard_model

powered by: WebSVN 2.1.0

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