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

Subversion Repositories gecko4

[/] [gecko4/] [trunk/] [GECKO4com/] [spartan200_an/] [vhdl/] [cmd_23_24_if/] [hexswitch-behavior.vhdl] - Blame information for rev 5

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 5 ktt1
--------------------------------------------------------------------------------
2
--            _   _            __   ____                                      --
3
--           / / | |          / _| |  __|                                     --
4
--           | |_| |  _   _  / /   | |_                                       --
5
--           |  _  | | | | | | |   |  _|                                      --
6
--           | | | | | |_| | \ \_  | |__                                      --
7
--           |_| |_| \_____|  \__| |____| microLab                            --
8
--                                                                            --
9
--           Bern University of Applied Sciences (BFH)                        --
10
--           Quellgasse 21                                                    --
11
--           Room HG 4.33                                                     --
12
--           2501 Biel/Bienne                                                 --
13
--           Switzerland                                                      --
14
--                                                                            --
15
--           http://www.microlab.ch                                           --
16
--------------------------------------------------------------------------------
17
--   GECKO4com
18
--  
19
--   2010/2011 Dr. Theo Kluter
20
--  
21
--   This VHDL code is free code: you can redistribute it and/or modify
22
--   it under the terms of the GNU General Public License as published by
23
--   the Free Software Foundation, either version 3 of the License, or
24
--   (at your option) any later version.
25
--  
26
--   This VHDL code is distributed in the hope that it will be useful,
27
--   but WITHOUT ANY WARRANTY; without even the implied warranty of
28
--   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
29
--   GNU General Public License for more details. 
30
--   You should have received a copy of the GNU General Public License
31
--   along with these sources.  If not, see <http://www.gnu.org/licenses/>.
32
--
33
 
34
ARCHITECTURE no_platform_specific OF hexswitch IS
35
 
36
   TYPE HEX_STATE_TYPE IS ( IDLE , SEND_SIZE , SEND_VALUE , SEND_END , GET_VALUE ,
37
                            SIGNAL_DONE , SIGNAL_ERROR );
38
 
39
   SIGNAL s_override_reg      : std_logic;
40
   SIGNAL s_hexswitch_reg     : std_logic_vector( 3 DOWNTO 0 );
41
   SIGNAL s_hex_state_reg     : HEX_STATE_TYPE;
42
   SIGNAL s_push              : std_logic;
43
   SIGNAL s_fetched_value     : std_logic_vector( 4 DOWNTO 0 );
44
   SIGNAL s_pop               : std_logic;
45
   SIGNAL s_update            : std_logic;
46
 
47
BEGIN
48
--------------------------------------------------------------------------------
49
--- Here the outputs are defined                                             ---
50
--------------------------------------------------------------------------------
51
   hex_value     <= s_hexswitch_reg;
52
   done          <= '1' WHEN s_hex_state_reg = SIGNAL_DONE ELSE '0';
53
   command_error <= '1' WHEN s_hex_state_reg = SIGNAL_ERROR ELSE '0';
54
   push_size     <= '1' WHEN s_hex_state_reg = SEND_SIZE ELSE '0';
55
   push          <= s_push;
56
   pop           <= s_pop;
57
 
58
   make_push_data : PROCESS( s_hex_state_reg , s_hexswitch_reg )
59
   BEGIN
60
      CASE (s_hex_state_reg) IS
61
         WHEN SEND_SIZE    => push_data <= X"02";
62
         WHEN SEND_VALUE   => CASE (s_hexswitch_reg) IS
63
                                 WHEN  X"0"  => push_data <= X"30";
64
                                 WHEN  X"1"  => push_data <= X"31";
65
                                 WHEN  X"2"  => push_data <= X"32";
66
                                 WHEN  X"3"  => push_data <= X"33";
67
                                 WHEN  X"4"  => push_data <= X"34";
68
                                 WHEN  X"5"  => push_data <= X"35";
69
                                 WHEN  X"6"  => push_data <= X"36";
70
                                 WHEN  X"7"  => push_data <= X"37";
71
                                 WHEN  X"8"  => push_data <= X"38";
72
                                 WHEN  X"9"  => push_data <= X"39";
73
                                 WHEN  X"A"  => push_data <= X"41";
74
                                 WHEN  X"B"  => push_data <= X"42";
75
                                 WHEN  X"C"  => push_data <= X"43";
76
                                 WHEN  X"D"  => push_data <= X"44";
77
                                 WHEN  X"E"  => push_data <= X"45";
78
                                 WHEN OTHERS => push_data <= X"46";
79
                              END CASE;
80
         WHEN SEND_END     => push_data <= X"0A";
81
         WHEN OTHERS       => push_data <= X"00";
82
      END CASE;
83
   END PROCESS make_push_data;
84
 
85
--------------------------------------------------------------------------------
86
--- Here the control signals are defined                                     ---
87
--------------------------------------------------------------------------------
88
   s_push    <= '1' WHEN push_full = '0' AND
89
                         (s_hex_state_reg = SEND_SIZE OR
90
                          s_hex_state_reg = SEND_VALUE OR
91
                          s_hex_state_reg = SEND_END) ELSE '0';
92
   s_pop     <= '1' WHEN pop_empty = '0' AND
93
                         s_hex_state_reg = GET_VALUE ELSE '0';
94
   s_update  <= s_pop AND s_fetched_value(4);
95
 
96
   make_fetched_value : PROCESS( pop_data )
97
   BEGIN
98
      CASE (pop_data) IS
99
         WHEN  X"30"  => s_fetched_value <= "1"&X"0";
100
         WHEN  X"31"  => s_fetched_value <= "1"&X"1";
101
         WHEN  X"32"  => s_fetched_value <= "1"&X"2";
102
         WHEN  X"33"  => s_fetched_value <= "1"&X"3";
103
         WHEN  X"34"  => s_fetched_value <= "1"&X"4";
104
         WHEN  X"35"  => s_fetched_value <= "1"&X"5";
105
         WHEN  X"36"  => s_fetched_value <= "1"&X"6";
106
         WHEN  X"37"  => s_fetched_value <= "1"&X"7";
107
         WHEN  X"38"  => s_fetched_value <= "1"&X"8";
108
         WHEN  X"39"  => s_fetched_value <= "1"&X"9";
109
         WHEN  X"41"  => s_fetched_value <= "1"&X"A";
110
         WHEN  X"42"  => s_fetched_value <= "1"&X"B";
111
         WHEN  X"43"  => s_fetched_value <= "1"&X"C";
112
         WHEN  X"44"  => s_fetched_value <= "1"&X"D";
113
         WHEN  X"45"  => s_fetched_value <= "1"&X"E";
114
         WHEN  X"46"  => s_fetched_value <= "1"&X"F";
115
         WHEN  X"61"  => s_fetched_value <= "1"&X"A";
116
         WHEN  X"62"  => s_fetched_value <= "1"&X"B";
117
         WHEN  X"63"  => s_fetched_value <= "1"&X"C";
118
         WHEN  X"64"  => s_fetched_value <= "1"&X"D";
119
         WHEN  X"65"  => s_fetched_value <= "1"&X"E";
120
         WHEN  X"66"  => s_fetched_value <= "1"&X"F";
121
         WHEN OTHERS  => s_fetched_value <= "0"&X"0";
122
      END CASE;
123
   END PROCESS make_fetched_value;
124
 
125
--------------------------------------------------------------------------------
126
--- Here the state machine is defined                                        ---
127
--------------------------------------------------------------------------------
128
   make_state_machine : PROCESS( clock , reset , s_hex_state_reg , start ,
129
                                 command , s_push )
130
      VARIABLE v_next_state : HEX_STATE_TYPE;
131
   BEGIN
132
      CASE (s_hex_state_reg) IS
133
         WHEN IDLE                  => IF (start = '1') THEN
134
                                          CASE (command) IS
135
                                             WHEN "0100011" => v_next_state := GET_VALUE;
136
                                             WHEN "0100100" => v_next_state := SEND_SIZE;
137
                                             WHEN OTHERS    => v_next_state := IDLE;
138
                                          END CASE;
139
                                                        ELSE
140
                                          v_next_state := IDLE;
141
                                       END IF;
142
         WHEN SEND_SIZE             => IF (s_push = '1') THEN
143
                                          v_next_state := SEND_VALUE;
144
                                                         ELSE
145
                                          v_next_state := SEND_SIZE;
146
                                       END IF;
147
         WHEN SEND_VALUE            => IF (s_push = '1') THEN
148
                                          v_next_state := SEND_END;
149
                                                         ELSE
150
                                          v_next_state := SEND_VALUE;
151
                                       END IF;
152
         WHEN SEND_END              => IF (s_push = '1') THEN
153
                                          v_next_state := SIGNAL_DONE;
154
                                                         ELSE
155
                                          v_next_state := SEND_END;
156
                                       END IF;
157
         WHEN GET_VALUE             => IF (s_pop = '1') THEN
158
                                          IF (s_fetched_value(4) = '1') THEN
159
                                             v_next_state := SIGNAL_DONE;
160
                                          ELSIF (pop_data = X"20" AND
161
                                                 pop_last = '0') THEN
162
                                             v_next_state := GET_VALUE;
163
                                                                 ELSE
164
                                             v_next_state := SIGNAL_ERROR;
165
                                          END IF;
166
                                                        ELSE
167
                                          v_next_state := GET_VALUE;
168
                                       END IF;
169
         WHEN OTHERS                => v_next_state := IDLE;
170
      END CASE;
171
      IF (clock'event AND (clock = '1')) THEN
172
         IF (reset = '1') THEN s_hex_state_reg <= IDLE;
173
                          ELSE s_hex_state_reg <= v_next_state;
174
         END IF;
175
      END IF;
176
   END PROCESS make_state_machine;
177
 
178
--------------------------------------------------------------------------------
179
--- Here the base registers are defined                                      ---
180
--------------------------------------------------------------------------------
181
   make_override_reg : PROCESS( clock , reset )
182
   BEGIN
183
      IF (clock'event AND (clock = '1')) THEN
184
         IF (reset = '1') THEN s_override_reg <= '0';
185
         ELSIF (s_update = '1') THEN s_override_reg <= '1';
186
         END IF;
187
      END IF;
188
   END PROCESS make_override_reg;
189
 
190
   make_hexswitch_reg : PROCESS( clock , s_override_reg , n_hex_sw )
191
   BEGIN
192
      IF (clock'event AND (clock = '1')) THEN
193
         IF (s_update = '1') THEN
194
            s_hexswitch_reg <= s_fetched_value( 3 DOWNTO 0 );
195
         ELSIF (s_override_reg = '0') THEN s_hexswitch_reg <= NOT(n_hex_sw);
196
         END IF;
197
      END IF;
198
   END PROCESS make_hexswitch_reg;
199
END no_platform_specific;

powered by: WebSVN 2.1.0

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