Stefan Schuermans commited on 2012-04-03 20:23:39
Showing 2 changed files, with 141 additions and 37 deletions.
... | ... |
@@ -15,49 +15,110 @@ END ENTITY e_io_switches; |
15 | 15 |
|
16 | 16 |
ARCHITECTURE a_io_switches OF e_io_switches IS |
17 | 17 |
|
18 |
- SIGNAL n_sample: std_logic_vector(1 DOWNTO 0); |
|
19 |
- SIGNAL r_sample: std_logic_vector(1 DOWNTO 0) := (OTHERS => '0'); |
|
20 |
- SIGNAL r_prev: std_logic_vector(1 DOWNTO 0) := (OTHERS => '0'); |
|
21 |
- SIGNAL n_cnt: std_logic_vector(31 DOWNTO 0); |
|
22 |
- SIGNAL r_cnt: std_logic_vector(31 DOWNTO 0) := (OTHERS => '0'); |
|
18 |
+ CONSTANT c_scale: natural := 50000; |
|
19 |
+ CONSTANT c_states: natural := 5; |
|
23 | 20 |
|
21 |
+ SUBTYPE t_state IS std_logic_vector(31 DOWNTO 0); |
|
22 |
+ TYPE t_states IS ARRAY(0 TO c_states - 1) OF t_state; |
|
23 |
+ |
|
24 |
+ CONSTANT c_state_def: t_state := io_switches_to_slv( |
|
25 |
+ c_io_switches_pins_default); |
|
26 |
+ CONSTANT c_states_def: t_states := (OTHERS => c_state_def); |
|
27 |
+ |
|
28 |
+ SIGNAL n_scale: natural RANGE 0 TO c_scale - 1; |
|
29 |
+ SIGNAL r_scale: natural RANGE 0 TO c_scale - 1 := 0; |
|
30 |
+ |
|
31 |
+ SIGNAL n_states: t_states; |
|
32 |
+ SIGNAL r_states: t_states := c_states_def; |
|
33 |
+ |
|
34 |
+ SIGNAL n_debounced: t_state; |
|
35 |
+ SIGNAL r_debounced: t_state := c_state_def; |
|
36 |
+ |
|
37 |
+ SIGNAL n_rot_val: std_logic_vector( 1 DOWNTO 0); |
|
38 |
+ SIGNAL r_rot_val: std_logic_vector( 1 DOWNTO 0) := (OTHERS => '0'); |
|
39 |
+ SIGNAL r_rot_prev: std_logic_vector( 1 DOWNTO 0) := (OTHERS => '0'); |
|
40 |
+ SIGNAL n_rot_cnt: std_logic_vector(31 DOWNTO 0); |
|
41 |
+ SIGNAL r_rot_cnt: std_logic_vector(31 DOWNTO 0) := (OTHERS => '0'); |
|
42 |
+ |
|
43 |
+BEGIN |
|
44 |
+ |
|
45 |
+ p_scale: PROCESS(r_scale) |
|
46 |
+ BEGIN |
|
47 |
+ IF r_scale >= c_scale - 1 THEN |
|
48 |
+ n_scale <= 0; |
|
49 |
+ ELSE |
|
50 |
+ n_scale <= r_scale + 1; |
|
51 |
+ END IF; |
|
52 |
+ END PROCESS p_scale; |
|
53 |
+ |
|
54 |
+ p_sample: PROCESS(pin_i_switches, r_scale, r_states) |
|
24 | 55 |
BEGIN |
56 |
+ IF r_scale = 0 THEN |
|
57 |
+ n_states(0) <= io_switches_to_slv(pin_i_switches); |
|
58 |
+ FOR i IN 1 TO c_states - 1 LOOP |
|
59 |
+ n_states(i) <= r_states(i - 1); |
|
60 |
+ END LOOP; |
|
61 |
+ ELSE |
|
62 |
+ n_states <= r_states; |
|
63 |
+ END IF; |
|
64 |
+ END PROCESS p_sample; |
|
65 |
+ |
|
66 |
+ p_debounce: PROCESS(r_states, r_debounced) |
|
67 |
+ VARIABLE v_or: t_state; |
|
68 |
+ VARIABLE v_and: t_state; |
|
69 |
+ BEGIN |
|
70 |
+ v_or := r_states(0); |
|
71 |
+ v_and := r_states(0); |
|
72 |
+ FOR i IN 1 TO c_states - 1 LOOP |
|
73 |
+ v_or := v_or OR r_states(i); |
|
74 |
+ v_and := v_and AND r_states(i); |
|
75 |
+ END LOOP; |
|
76 |
+ n_debounced <= (r_debounced AND v_or) OR v_and; |
|
77 |
+ END PROCESS p_debounce; |
|
25 | 78 |
|
26 |
- p_sample: PROCESS(pin_i_switches) |
|
79 |
+ p_de_gray: PROCESS(r_debounced) |
|
80 |
+ VARIABLE v_debounced: t_io_switches_pins; |
|
27 | 81 |
BEGIN |
28 | 82 |
-- de-gray-code rotary inputs |
29 |
- IF pin_i_switches.rot_b = '1' THEN |
|
30 |
- IF pin_i_switches.rot_a = '1' THEN |
|
31 |
- n_sample <= "00"; |
|
83 |
+ v_debounced := io_switches_from_slv(r_debounced); |
|
84 |
+ IF v_debounced.rot_b = '1' THEN |
|
85 |
+ IF v_debounced.rot_a = '1' THEN |
|
86 |
+ n_rot_val <= "00"; |
|
32 | 87 |
ELSE |
33 |
- n_sample <= "11"; |
|
88 |
+ n_rot_val <= "11"; |
|
34 | 89 |
END IF; |
35 | 90 |
ELSE |
36 |
- IF pin_i_switches.rot_a = '1' THEN |
|
37 |
- n_sample <= "01"; |
|
91 |
+ IF v_debounced.rot_a = '1' THEN |
|
92 |
+ n_rot_val <= "01"; |
|
38 | 93 |
ELSE |
39 |
- n_sample <= "10"; |
|
94 |
+ n_rot_val <= "10"; |
|
40 | 95 |
END IF; |
41 | 96 |
END IF; |
42 |
- END PROCESS p_sample; |
|
97 |
+ END PROCESS p_de_gray; |
|
43 | 98 |
|
44 |
- p_cnt: PROCESS(r_sample, r_prev, r_cnt) |
|
99 |
+ p_rot_cnt: PROCESS(r_rot_val, r_rot_prev, r_rot_cnt) |
|
45 | 100 |
VARIABLE v_delta: signed(1 DOWNTO 0); |
46 | 101 |
BEGIN |
47 |
- v_delta := signed(r_sample) - signed(r_prev); |
|
48 |
- n_cnt <= std_logic_vector(signed(r_cnt) + v_delta); |
|
49 |
- END PROCESS p_cnt; |
|
102 |
+ v_delta := signed(r_rot_val) - signed(r_rot_prev); |
|
103 |
+ n_rot_cnt <= std_logic_vector(signed(r_rot_cnt) + v_delta); |
|
104 |
+ END PROCESS p_rot_cnt; |
|
50 | 105 |
|
51 | 106 |
p_sync: PROCESS(rst, clk) |
52 | 107 |
BEGIN |
53 | 108 |
IF rst = '1' THEN |
54 |
- r_sample <= (OTHERS => '0'); |
|
55 |
- r_prev <= (OTHERS => '0'); |
|
56 |
- r_cnt <= (OTHERS => '0'); |
|
109 |
+ r_scale <= 0; |
|
110 |
+ r_states <= c_states_def; |
|
111 |
+ r_debounced <= c_state_def; |
|
112 |
+ r_rot_val <= (OTHERS => '0'); |
|
113 |
+ r_rot_prev <= (OTHERS => '0'); |
|
114 |
+ r_rot_cnt <= (OTHERS => '0'); |
|
57 | 115 |
ELSIF rising_edge(clk) THEN |
58 |
- r_sample <= n_sample; |
|
59 |
- r_prev <= r_sample; |
|
60 |
- r_cnt <= n_cnt; |
|
116 |
+ r_scale <= n_scale; |
|
117 |
+ r_states <= n_states; |
|
118 |
+ r_debounced <= n_debounced; |
|
119 |
+ r_rot_val <= n_rot_val; |
|
120 |
+ r_rot_prev <= r_rot_val; |
|
121 |
+ r_rot_cnt <= n_rot_cnt; |
|
61 | 122 |
END IF; |
62 | 123 |
END PROCESS p_sync; |
63 | 124 |
|
... | ... |
@@ -67,20 +128,9 @@ BEGIN |
67 | 128 |
o_rd_data <= (OTHERS => '0'); |
68 | 129 |
ELSIF rising_edge(clk) THEN |
69 | 130 |
IF i_addr = "0" THEN |
70 |
- o_rd_data( 3 DOWNTO 0) <= pin_i_switches.sw; |
|
71 |
- o_rd_data( 7 DOWNTO 4) <= (OTHERS => '0'); |
|
72 |
- o_rd_data( 8) <= pin_i_switches.east; |
|
73 |
- o_rd_data( 9) <= pin_i_switches.north; |
|
74 |
- o_rd_data(10) <= pin_i_switches.south; |
|
75 |
- o_rd_data(11) <= pin_i_switches.west; |
|
76 |
- o_rd_data(15 DOWNTO 12) <= (OTHERS => '0'); |
|
77 |
- o_rd_data(16) <= pin_i_switches.center; |
|
78 |
- o_rd_data(23 DOWNTO 17) <= (OTHERS => '0'); |
|
79 |
- o_rd_data(24) <= pin_i_switches.rot_a; |
|
80 |
- o_rd_data(25) <= pin_i_switches.rot_b; |
|
81 |
- o_rd_data(31 DOWNTO 26) <= (OTHERS => '0'); |
|
131 |
+ o_rd_data <= r_debounced; |
|
82 | 132 |
ELSE |
83 |
- o_rd_data <= r_cnt; |
|
133 |
+ o_rd_data <= r_rot_cnt; |
|
84 | 134 |
END IF; |
85 | 135 |
END IF; |
86 | 136 |
END PROCESS p_read; |
... | ... |
@@ -16,5 +16,59 @@ PACKAGE io_switches_pins IS |
16 | 16 |
rot_b: std_logic; |
17 | 17 |
END RECORD; |
18 | 18 |
|
19 |
+ CONSTANT c_io_switches_pins_default: t_io_switches_pins := ( |
|
20 |
+ sw => "0000", |
|
21 |
+ east => '0', |
|
22 |
+ north => '0', |
|
23 |
+ south => '0', |
|
24 |
+ west => '0', |
|
25 |
+ center => '0', |
|
26 |
+ rot_a => '1', |
|
27 |
+ rot_b => '1' |
|
28 |
+ ); |
|
29 |
+ |
|
30 |
+ FUNCTION io_switches_to_slv(switches: t_io_switches_pins) |
|
31 |
+ RETURN std_logic_vector; |
|
32 |
+ |
|
33 |
+ FUNCTION io_switches_from_slv(slv: std_logic_vector(31 DOWNTO 0)) |
|
34 |
+ RETURN t_io_switches_pins; |
|
35 |
+ |
|
19 | 36 |
END PACKAGE io_switches_pins; |
20 | 37 |
|
38 |
+PACKAGE BODY io_switches_pins IS |
|
39 |
+ |
|
40 |
+ FUNCTION io_switches_to_slv(switches: t_io_switches_pins) |
|
41 |
+ RETURN std_logic_vector IS |
|
42 |
+ VARIABLE v_slv: std_logic_vector(31 DOWNTO 0); |
|
43 |
+ BEGIN |
|
44 |
+ v_slv( 3 DOWNTO 0) := switches.sw; |
|
45 |
+ v_slv( 7 DOWNTO 4) := (OTHERS => '0'); |
|
46 |
+ v_slv( 8) := switches.east; |
|
47 |
+ v_slv( 9) := switches.north; |
|
48 |
+ v_slv(10) := switches.south; |
|
49 |
+ v_slv(11) := switches.west; |
|
50 |
+ v_slv(15 DOWNTO 12) := (OTHERS => '0'); |
|
51 |
+ v_slv(16) := switches.center; |
|
52 |
+ v_slv(23 DOWNTO 17) := (OTHERS => '0'); |
|
53 |
+ v_slv(24) := switches.rot_a; |
|
54 |
+ v_slv(25) := switches.rot_b; |
|
55 |
+ v_slv(31 DOWNTO 26) := (OTHERS => '0'); |
|
56 |
+ RETURN v_slv; |
|
57 |
+ END FUNCTION io_switches_to_slv; |
|
58 |
+ |
|
59 |
+ FUNCTION io_switches_from_slv(slv: std_logic_vector(31 DOWNTO 0)) |
|
60 |
+ RETURN t_io_switches_pins IS |
|
61 |
+ VARIABLE v_switches: t_io_switches_pins; |
|
62 |
+ BEGIN |
|
63 |
+ v_switches.sw := slv( 3 DOWNTO 0); |
|
64 |
+ v_switches.east := slv( 8); |
|
65 |
+ v_switches.north := slv( 9); |
|
66 |
+ v_switches.south := slv(10); |
|
67 |
+ v_switches.west := slv(11); |
|
68 |
+ v_switches.center := slv(16); |
|
69 |
+ v_switches.rot_a := slv(24); |
|
70 |
+ v_switches.rot_b := slv(25); |
|
71 |
+ RETURN v_switches; |
|
72 |
+ END FUNCTION io_switches_from_slv; |
|
73 |
+ |
|
74 |
+END PACKAGE BODY io_switches_pins; |
|
21 | 75 |