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

Subversion Repositories zx_ula

[/] [zx_ula/] [branches/] [xilinx/] [spectrum_48k_spartan3a_for_gameduino_mod_vga_timex_hicolor_ulaplus/] [ps2keyboard.vhd] - Blame information for rev 29

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 29 mcleod_ide
-- ZX Spectrum for Altera DE1
2
--
3
-- Copyright (c) 2009-2011 Mike Stirling
4
--
5
-- All rights reserved
6
--
7
-- Redistribution and use in source and synthezised forms, with or without
8
-- modification, are permitted provided that the following conditions are met:
9
--
10
-- * Redistributions of source code must retain the above copyright notice,
11
--   this list of conditions and the following disclaimer.
12
--
13
-- * Redistributions in synthesized form must reproduce the above copyright
14
--   notice, this list of conditions and the following disclaimer in the
15
--   documentation and/or other materials provided with the distribution.
16
--
17
-- * Neither the name of the author nor the names of other contributors may
18
--   be used to endorse or promote products derived from this software without
19
--   specific prior written agreement from the author.
20
--
21
-- * License is granted for non-commercial use only.  A fee may not be charged
22
--   for redistributions as source code or in synthesized/hardware form without 
23
--   specific prior written agreement from the author.
24
--
25
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
26
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
27
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
29
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35
-- POSSIBILITY OF SUCH DAMAGE.
36
--
37
 
38
-- PS/2 scancode to Spectrum matrix conversion
39
library IEEE;
40
use IEEE.STD_LOGIC_1164.ALL;
41
use IEEE.NUMERIC_STD.ALL;
42
 
43
--entity keyboard is
44
entity ps2keyboard is
45
port (
46
        CLK                     :       in      std_logic;
47
        nRESET          :       in      std_logic;
48
 
49
        -- PS/2 interface
50
        PS2_CLK         :       in      std_logic;
51
        PS2_DATA        :       in      std_logic;
52
 
53
        -- CPU address bus (row)
54
        A                       :       in      std_logic_vector(15 downto 0);
55
        -- Column outputs to ULA
56
        KEYB            :       out     std_logic_vector(4 downto 0)
57
        );
58
--end keyboard;
59
end ps2keyboard;
60
 
61
architecture rtl of ps2keyboard is
62
 
63
-- PS/2 interface
64
component ps2_intf is
65
generic (filter_length : positive := 8);
66
port(
67
        CLK                     :       in      std_logic;
68
        nRESET          :       in      std_logic;
69
 
70
        -- PS/2 interface (could be bi-dir)
71
        PS2_CLK         :       in      std_logic;
72
        PS2_DATA        :       in      std_logic;
73
 
74
        -- Byte-wide data interface - only valid for one clock
75
        -- so must be latched externally if required
76
        DATA            :       out     std_logic_vector(7 downto 0);
77
        VALID           :       out     std_logic;
78
        ERROR           :       out     std_logic
79
        );
80
end component;
81
 
82
-- Interface to PS/2 block
83
signal keyb_data        :       std_logic_vector(7 downto 0);
84
signal keyb_valid       :       std_logic;
85
signal keyb_error       :       std_logic;
86
 
87
-- Internal signals
88
type key_matrix is array (7 downto 0) of std_logic_vector(4 downto 0);
89
signal keys             :       key_matrix;
90
signal release  :       std_logic;
91
signal extended :       std_logic;
92
begin
93
 
94
        ps2 : ps2_intf port map (
95
                CLK, nRESET,
96
                PS2_CLK, PS2_DATA,
97
                keyb_data, keyb_valid, keyb_error
98
                );
99
 
100
        -- Output addressed row to ULA
101
        KEYB <= keys(0) when A(8) = '0' else
102
                keys(1) when A(9) = '0' else
103
                keys(2) when A(10) = '0' else
104
                keys(3) when A(11) = '0' else
105
                keys(4) when A(12) = '0' else
106
                keys(5) when A(13) = '0' else
107
                keys(6) when A(14) = '0' else
108
                keys(7) when A(15) = '0' else
109
                (others => '1');
110
 
111
        process(nRESET,CLK)
112
        begin
113
                if nRESET = '0' then
114
                        release <= '0';
115
                        extended <= '0';
116
 
117
                        keys(0) <= (others => '1');
118
                        keys(1) <= (others => '1');
119
                        keys(2) <= (others => '1');
120
                        keys(3) <= (others => '1');
121
                        keys(4) <= (others => '1');
122
                        keys(5) <= (others => '1');
123
                        keys(6) <= (others => '1');
124
                        keys(7) <= (others => '1');
125
                elsif rising_edge(CLK) then
126
                        if keyb_valid = '1' then
127
                                if keyb_data = X"e0" then
128
                                        -- Extended key code follows
129
                                        extended <= '1';
130
                                elsif keyb_data = X"f0" then
131
                                        -- Release code follows
132
                                        release <= '1';
133
                                else
134
                                        -- Cancel extended/release flags for next time
135
                                        release <= '0';
136
                                        extended <= '0';
137
 
138
                                        case keyb_data is
139
                                        when X"12" => keys(0)(0) <= release; -- Left shift (CAPS SHIFT)
140
                                        when X"59" => keys(0)(0) <= release; -- Right shift (CAPS SHIFT)
141
                                        when X"1a" => keys(0)(1) <= release; -- Z
142
                                        when X"22" => keys(0)(2) <= release; -- X
143
                                        when X"21" => keys(0)(3) <= release; -- C
144
                                        when X"2a" => keys(0)(4) <= release; -- V
145
 
146
                                        when X"1c" => keys(1)(0) <= release; -- A
147
                                        when X"1b" => keys(1)(1) <= release; -- S
148
                                        when X"23" => keys(1)(2) <= release; -- D
149
                                        when X"2b" => keys(1)(3) <= release; -- F
150
                                        when X"34" => keys(1)(4) <= release; -- G
151
 
152
                                        when X"15" => keys(2)(0) <= release; -- Q
153
                                        when X"1d" => keys(2)(1) <= release; -- W
154
                                        when X"24" => keys(2)(2) <= release; -- E
155
                                        when X"2d" => keys(2)(3) <= release; -- R
156
                                        when X"2c" => keys(2)(4) <= release; -- T                               
157
 
158
                                        when X"16" => keys(3)(0) <= release; -- 1
159
                                        when X"1e" => keys(3)(1) <= release; -- 2
160
                                        when X"26" => keys(3)(2) <= release; -- 3
161
                                        when X"25" => keys(3)(3) <= release; -- 4
162
                                        when X"2e" => keys(3)(4) <= release; -- 5                       
163
 
164
                                        when X"45" => keys(4)(0) <= release; -- 0
165
                                        when X"46" => keys(4)(1) <= release; -- 9
166
                                        when X"3e" => keys(4)(2) <= release; -- 8
167
                                        when X"3d" => keys(4)(3) <= release; -- 7
168
                                        when X"36" => keys(4)(4) <= release; -- 6
169
 
170
                                        when X"4d" => keys(5)(0) <= release; -- P
171
                                        when X"44" => keys(5)(1) <= release; -- O
172
                                        when X"43" => keys(5)(2) <= release; -- I
173
                                        when X"3c" => keys(5)(3) <= release; -- U
174
                                        when X"35" => keys(5)(4) <= release; -- Y
175
 
176
                                        when X"5a" => keys(6)(0) <= release; -- ENTER
177
                                        when X"4b" => keys(6)(1) <= release; -- L
178
                                        when X"42" => keys(6)(2) <= release; -- K
179
                                        when X"3b" => keys(6)(3) <= release; -- J
180
                                        when X"33" => keys(6)(4) <= release; -- H
181
 
182
                                        when X"29" => keys(7)(0) <= release; -- SPACE
183
                                        when X"14" => keys(7)(1) <= release; -- CTRL (Symbol Shift)
184
                                        when X"3a" => keys(7)(2) <= release; -- M
185
                                        when X"31" => keys(7)(3) <= release; -- N
186
                                        when X"32" => keys(7)(4) <= release; -- B
187
 
188
                                        -- Cursor keys - these are actually extended (E0 xx), but
189
                                        -- the scancodes for the numeric keypad cursor keys are
190
                                        -- are the same but without the extension, so we'll accept
191
                                        -- the codes whether they are extended or not
192
                                        when X"6B" =>   keys(0)(0) <= release; -- Left (CAPS 5)
193
                                                                        keys(3)(4) <= release;
194
                                        when X"72" =>   keys(0)(0) <= release; -- Down (CAPS 6)
195
                                                                        keys(4)(4) <= release;
196
                                        when X"75" =>   keys(0)(0) <= release; -- Up (CAPS 7)
197
                                                                        keys(4)(3) <= release;
198
                                        when X"74" =>   keys(0)(0) <= release; -- Right (CAPS 8)
199
                                                                        keys(4)(2) <= release;
200
 
201
                                        -- Other special keys sent to the ULA as key combinations
202
                                        when X"66" =>   keys(0)(0) <= release; -- Backspace (CAPS 0)
203
                                                                        keys(4)(0) <= release;
204
                                        when X"58" =>   keys(0)(0) <= release; -- Caps lock (CAPS 2)
205
                                                                        keys(3)(1) <= release;
206
                                        when X"76" =>   keys(0)(0) <= release; -- Escape (CAPS SPACE)
207
                                                                        keys(7)(0) <= release;
208
 
209
                                        when others =>
210
                                                null;
211
                                        end case;
212
                                end if;
213
                        end if;
214
                end if;
215
        end process;
216
 
217
end architecture;

powered by: WebSVN 2.1.0

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