1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
package key_pkg is
type key_action is (pressed, released);
type key_status_mat is array (natural range <>, natural range <>) of key_action;
end key_pkg;
library IEEE;
use IEEE.std_logic_1164.all;
use work.key_pkg.all;
entity key is
port(
in_terminal : in std_logic;
out_terminal : out std_logic;
key_status : in key_action);
end key;
architecture key_bhv of key is
begin
bounce_io: process(key_status, in_terminal) is
begin
if key_status = pressed then
out_terminal <= in_terminal;
else
out_terminal <= 'Z';
end if;
end process bounce_io;
end architecture key_bhv;
library IEEE;
use IEEE.std_logic_1164.all;
use work.key_pkg.all;
entity scaleable_matrix_keyboard is
generic(
nr_rows : positive;
nr_cols : positive);
port(
col_inputs : in std_logic_vector(nr_cols-1 downto 0);
row_outputs : out std_logic_vector(nr_rows-1 downto 0);
key_status_all : in key_status_mat(nr_rows-1 downto 0, nr_cols-1 downto 0));
end scaleable_matrix_keyboard;
architecture scaleable_matrix_keyboard_bhv of scaleable_matrix_keyboard is
begin
key_matrix : for row in row_outputs'range generate
begin
key_row: for col in col_inputs'range generate
begin
key_col: entity work.key(key_bhv)
port map(
in_terminal => col_inputs(col),
out_terminal => row_outputs(row),
key_status => key_status_all(row, col));
end generate key_row;
end generate key_matrix;
end architecture scaleable_matrix_keyboard_bhv;
library IEEE;
use IEEE.std_logic_1164.all;
use work.key_pkg.all;
entity mat_key_tb is
end mat_key_tb;
architecture mat_key_tb_bhv of mat_key_tb is
signal key_0 : key_action := released;
signal key_1 : key_action := released;
signal key_2 : key_action := released;
signal key_3 : key_action := released;
signal col1 : std_logic := 'Z';
signal col2 : std_logic := 'Z';
signal row1 : std_logic;
signal row2 : std_logic;
begin
key_DUT: entity work.scaleable_matrix_keyboard(scaleable_matrix_keyboard_bhv)
generic map(
nr_rows => 2,
nr_cols => 2
)
port map(
col_inputs(0) => col1,
col_inputs(1) => col2,
row_outputs(0) => row1,
row_outputs(1) => row2,
key_status_all(0, 0) => key_0,
key_status_all(0, 1) => key_1,
key_status_all(1, 0) => key_1,
key_status_all(1, 1) => key_1
);
end architecture mat_key_tb_bhv;
|