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

Subversion Repositories gecko4

[/] [gecko4/] [trunk/] [GECKO4com/] [spartan200_an/] [vhdl/] [fpga_if/] [bitfile_interpreter-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 bitfile_interpreter IS
35
 
36
   TYPE INTERPRETER_STATES IS (IDLE , SIGNAL_DONE , INIT_GET_LENGTH , GET_LENGTH ,
37
                               MAKE_FIELD_DESC , INIT_DUMMY_READ , DUMMY_READ ,
38
                               GET_FIELD_CHAR , UPDATE_FIELD_ID ,
39
                               CHECK_FIELD_CHAR , FLUSH_FIFO , INIT_GET_B_LENGTH ,
40
                               GET_B_LENGTH , CHECK_B_LENGTH , INIT_WRITE_STR ,
41
                               WRITE_STR , COPY_BITSTREAM , SIGNAL_ERROR ,
42
                               EXECUTE_FLUSH_FIFO );
43
   TYPE FIELD_TYPES IS (FIELD_1,FIELD_2,FIELD_3,FIELD_4,FIELD_5,FIELD_6,
44
                        FIELD_7,RAW_DATA,HEADER_ERROR);
45
 
46
   SIGNAL s_interpreter_state_reg   : INTERPRETER_STATES;
47
   SIGNAL s_current_field_reg       : FIELD_TYPES;
48
   SIGNAL s_down_counter_reg        : std_logic_vector( 16 DOWNTO 0 );
49
   SIGNAL s_down_counter_load       : std_logic;
50
   SIGNAL s_down_counter_ena        : std_logic;
51
   SIGNAL s_down_counter_load_value : std_logic_vector( 16 DOWNTO 0 );
52
   SIGNAL s_field_length_reg        : std_logic_vector( 15 DOWNTO 0 );
53
   SIGNAL s_pop_a_byte              : std_logic;
54
   SIGNAL s_data_reg                : std_logic_vector(  7 DOWNTO 0 );
55
   SIGNAL s_ena_data_reg            : std_logic;
56
   SIGNAL s_we_char_reg             : std_logic;
57
   SIGNAL s_bitstream_length_reg    : std_logic_vector( 31 DOWNTO 0 );
58
   SIGNAL s_push_reg                : std_logic;
59
   SIGNAL s_bitstream_count_reg     : std_logic_vector( 32 DOWNTO 0 );
60
   SIGNAL s_bitstream_count_next    : std_logic_vector( 32 DOWNTO 0 );
61
   SIGNAL s_bitstream_count_ena     : std_logic;
62
   SIGNAL s_error_reg               : std_logic;
63
   SIGNAL s_watchdog_timer_reg      : std_logic_vector( 11 DOWNTO 0 );
64
   SIGNAL s_bitstream_size_reg      : std_logic_vector( 31 DOWNTO 0 );
65
   SIGNAL s_write_flash_reg         : std_logic;
66
 
67
BEGIN
68
--------------------------------------------------------------------------------
69
--- Here the outputs are defined                                             ---
70
--------------------------------------------------------------------------------
71
   pop            <= s_pop_a_byte;
72
   done           <= '1' WHEN s_interpreter_state_reg = SIGNAL_DONE ELSE '0';
73
   ascii_data     <= s_data_reg WHEN s_we_char_reg = '1' ELSE (OTHERS => '0');
74
   we_char        <= s_we_char_reg;
75
   push           <= s_push_reg AND NOT(s_write_flash_reg);
76
   push_data      <= s_data_reg WHEN s_push_reg = '1' ELSE (OTHERS => '0');
77
   last_byte      <= s_bitstream_count_reg(32);
78
   error_detected <= s_error_reg WHEN s_interpreter_state_reg = SIGNAL_DONE ELSE '0';
79
   reset_fpga_if  <= reset OR s_error_reg;
80
   bitfile_size   <= s_bitstream_size_reg;
81
   we_data        <= s_data_reg;
82
   we_fifo        <= s_push_reg AND s_write_flash_reg;
83
   we_last        <= s_bitstream_count_reg(32) WHEN
84
                        s_interpreter_state_reg = COPY_BITSTREAM ELSE '0';
85
   start_write    <= '1' WHEN s_interpreter_state_reg = CHECK_B_LENGTH AND
86
                              s_write_flash_reg = '1' ELSE '0';
87
 
88
--------------------------------------------------------------------------------
89
--- Here the control signals are defined                                     ---
90
--------------------------------------------------------------------------------
91
   s_pop_a_byte        <= '1' WHEN
92
                                 ((s_interpreter_state_reg = GET_LENGTH OR
93
                                   s_interpreter_state_reg = DUMMY_READ OR
94
                                   s_interpreter_state_reg = WRITE_STR OR
95
                                   s_interpreter_state_reg = GET_B_LENGTH) AND
96
                                  fifo_empty = '0' AND
97
                                  we_fifo_full = '0' AND
98
                                  s_down_counter_reg(16) = '0') OR
99
                                 (s_interpreter_state_reg = GET_FIELD_CHAR AND
100
                                  fifo_empty = '0' AND
101
                                  we_fifo_full = '0') OR
102
                                 (s_interpreter_state_reg = COPY_BITSTREAM AND
103
                                  fifo_empty = '0' AND
104
                                  fifo_full = '0' AND
105
                                  we_fifo_full = '0' AND
106
                                  s_bitstream_count_reg(32) = '0') OR
107
                                 (s_interpreter_state_reg = EXECUTE_FLUSH_FIFO AND
108
                                  fifo_empty = '0' AND
109
                                  s_bitstream_count_reg(32) = '0')
110
                              ELSE '0';
111
 
112
--------------------------------------------------------------------------------
113
--- Here the intermediate data buffer is defined                             ---
114
--------------------------------------------------------------------------------
115
   s_ena_data_reg <= s_pop_a_byte;
116
 
117
   make_data_reg : PROCESS( clock , reset , s_ena_data_reg , pop_data )
118
   BEGIN
119
      IF (clock'event AND (clock = '1')) THEN
120
         IF (reset = '1') THEN s_data_reg <= X"FF";
121
         ELSIF (s_ena_data_reg = '1') THEN s_data_reg <= pop_data;
122
         END IF;
123
      END IF;
124
   END PROCESS make_data_reg;
125
 
126
   make_we_char : PROCESS( clock , s_interpreter_state_reg , s_pop_a_byte )
127
   BEGIN
128
      IF (clock'event AND (clock = '1')) THEN
129
         IF (s_interpreter_state_reg = WRITE_STR) THEN
130
            s_we_char_reg <= s_pop_a_byte;
131
                                                  ELSE
132
            s_we_char_reg <= '0';
133
         END IF;
134
      END IF;
135
   END PROCESS make_we_char;
136
 
137
   make_push_reg : PROCESS( clock , s_interpreter_state_reg , s_pop_a_byte )
138
   BEGIN
139
      IF (clock'event AND (clock = '1')) THEN
140
         IF (s_interpreter_state_reg = COPY_BITSTREAM OR
141
             (s_interpreter_state_reg /= EXECUTE_FLUSH_FIFO AND
142
              s_write_flash_reg = '1')) THEN
143
            s_push_reg <= s_pop_a_byte;
144
                                                 ELSE
145
            s_push_reg <= '0';
146
         END IF;
147
      END IF;
148
   END PROCESS make_push_reg;
149
 
150
--------------------------------------------------------------------------------
151
--- Here the general purpose down counter is defined                         ---
152
--------------------------------------------------------------------------------
153
   s_down_counter_load <= '1' WHEN
154
                                 s_interpreter_state_reg = INIT_GET_LENGTH OR
155
                                 s_interpreter_state_reg = INIT_DUMMY_READ OR
156
                                 s_interpreter_state_reg = INIT_WRITE_STR OR
157
                                 s_interpreter_state_reg = INIT_GET_B_LENGTH
158
                              ELSE '0';
159
   s_down_counter_ena  <= '1' WHEN
160
                                 ((s_interpreter_state_reg = GET_LENGTH OR
161
                                   s_interpreter_state_reg = DUMMY_READ OR
162
                                   s_interpreter_state_reg = WRITE_STR OR
163
                                   s_interpreter_state_reg = GET_B_LENGTH) AND
164
                                  s_pop_a_byte = '1')
165
                              ELSE '0';
166
 
167
   make_down_counter_load_value : PROCESS( s_interpreter_state_reg ,
168
                                           s_field_length_reg )
169
      VARIABLE v_length : std_logic_vector( 16 DOWNTO 0 );
170
   BEGIN
171
      CASE (s_interpreter_state_reg) IS
172
         WHEN INIT_GET_LENGTH       => s_down_counter_load_value <= "0"&X"0001";
173
         WHEN INIT_GET_B_LENGTH     => s_down_counter_load_value <= "0"&X"0003";
174
         WHEN OTHERS                => v_length := "0"&s_field_length_reg;
175
                                       s_down_counter_load_value <=
176
                                          unsigned(v_length) - 1;
177
      END CASE;
178
   END PROCESS make_down_counter_load_value;
179
 
180
   make_down_counter : PROCESS( clock , s_down_counter_reg ,
181
                                s_down_counter_load , s_down_counter_ena ,
182
                                s_down_counter_load_value )
183
   BEGIN
184
      IF (clock'event AND (clock = '1')) THEN
185
         IF (s_down_counter_load = '1') THEN
186
            s_down_counter_reg <= s_down_counter_load_value;
187
         ELSIF (s_down_counter_ena = '1') THEN
188
            s_down_counter_reg <= unsigned(s_down_counter_reg) - 1;
189
         END IF;
190
      END IF;
191
   END PROCESS make_down_counter;
192
 
193
--------------------------------------------------------------------------------
194
--- Here the field length reg is defined                                     ---
195
--------------------------------------------------------------------------------
196
   make_field_reg : PROCESS( clock , reset , s_interpreter_state_reg , pop_data ,
197
                             s_down_counter_reg , s_pop_a_byte )
198
   BEGIN
199
      IF (clock'event AND (clock = '1')) THEN
200
         IF (reset = '1') THEN s_field_length_reg <= (OTHERS => '0');
201
         ELSIF (s_interpreter_state_reg = GET_LENGTH AND
202
                s_pop_a_byte = '1') THEN
203
            IF (s_down_counter_reg(0) = '1') THEN
204
               s_field_length_reg(15 DOWNTO 8) <= pop_data;
205
                                                    ELSE
206
               s_field_length_reg( 7 DOWNTO 0) <= pop_data;
207
            END IF;
208
         END IF;
209
      END IF;
210
   END PROCESS make_field_reg;
211
 
212
--------------------------------------------------------------------------------
213
--- Here the state machine is defined                                        ---
214
--------------------------------------------------------------------------------
215
   make_state_machine : PROCESS( clock , reset , s_interpreter_state_reg ,
216
                                 start , s_down_counter_reg ,
217
                                 s_current_field_reg ,
218
                                 s_bitstream_count_reg , s_watchdog_timer_reg )
219
      VARIABLE v_next_state : INTERPRETER_STATES;
220
   BEGIN
221
      CASE (s_interpreter_state_reg) IS
222
         WHEN IDLE                  => IF (start = '1') THEN
223
                                          v_next_state := INIT_GET_LENGTH;
224
                                                        ELSE
225
                                          v_next_state := IDLE;
226
                                       END IF;
227
         WHEN INIT_GET_LENGTH       => v_next_state := GET_LENGTH;
228
         WHEN GET_LENGTH            => IF (s_down_counter_reg(16) = '1') THEN
229
                                          v_next_state := MAKE_FIELD_DESC;
230
                                                                         ELSE
231
                                          v_next_state := GET_LENGTH;
232
                                       END IF;
233
         WHEN MAKE_FIELD_DESC       => CASE (s_current_field_reg) IS
234
                                          WHEN FIELD_1 => v_next_state := INIT_DUMMY_READ;
235
                                          WHEN FIELD_2 => v_next_state := GET_FIELD_CHAR;
236
                                          WHEN FIELD_3 |
237
                                               FIELD_4 |
238
                                               FIELD_5 |
239
                                               FIELD_6 => v_next_state := INIT_WRITE_STR;
240
                                          WHEN OTHERS  => v_next_state := FLUSH_FIFO;
241
                                       END CASE;
242
         WHEN INIT_DUMMY_READ       => v_next_state := DUMMY_READ;
243
         WHEN DUMMY_READ            => IF (s_down_counter_reg(16) = '1') THEN
244
                                          v_next_state := INIT_GET_LENGTH;
245
                                                                         ELSE
246
                                          v_next_state := DUMMY_READ;
247
                                       END IF;
248
         WHEN GET_FIELD_CHAR        => IF (s_pop_a_byte = '1') THEN
249
                                          v_next_state := UPDATE_FIELD_ID;
250
                                                               ELSE
251
                                          v_next_state := GET_FIELD_CHAR;
252
                                       END IF;
253
         WHEN UPDATE_FIELD_ID       => v_next_state := CHECK_FIELD_CHAR;
254
         WHEN CHECK_FIELD_CHAR      => CASE (s_current_field_reg) IS
255
                                          WHEN HEADER_ERROR => v_next_state := FLUSH_FIFO;
256
                                          WHEN FIELD_7      => v_next_state := INIT_GET_B_LENGTH;
257
                                          WHEN OTHERS       => v_next_state := INIT_GET_LENGTH;
258
                                       END CASE;
259
         WHEN INIT_GET_B_LENGTH     => v_next_state := GET_B_LENGTH;
260
         WHEN GET_B_LENGTH          => IF(s_down_counter_reg(16) = '1') THEN
261
                                          v_next_state := CHECK_B_LENGTH;
262
                                                                        ELSE
263
                                          v_next_state := GET_B_LENGTH;
264
                                       END IF;
265
         WHEN CHECK_B_LENGTH        => v_next_state := COPY_BITSTREAM;
266
         WHEN COPY_BITSTREAM        => IF (size_error = '1') THEN
267
                                          v_next_state := IDLE;
268
                                       ELSIF (s_bitstream_count_reg(32) = '1') THEN
269
                                          v_next_state := SIGNAL_DONE;
270
                                                                            ELSE
271
                                          v_next_state := COPY_BITSTREAM;
272
                                       END IF;
273
         WHEN INIT_WRITE_STR        => v_next_state := WRITE_STR;
274
         WHEN WRITE_STR             => IF (s_down_counter_reg(16) = '1') THEN
275
                                          v_next_state := GET_FIELD_CHAR;
276
                                                                         ELSE
277
                                          v_next_state := WRITE_STR;
278
                                       END IF;
279
         WHEN FLUSH_FIFO            => v_next_state := EXECUTE_FLUSH_FIFO;
280
         WHEN SIGNAL_ERROR          => v_next_state := SIGNAL_DONE;
281
         WHEN EXECUTE_FLUSH_FIFO    => IF (pop_last = '1' AND
282
                                           s_pop_a_byte = '1') THEN
283
                                          v_next_state := SIGNAL_ERROR;
284
                                                                            ELSE
285
                                          v_next_state := EXECUTE_FLUSH_FIFO;
286
                                       END IF;
287
         WHEN OTHERS                => v_next_state := IDLE;
288
      END CASE;
289
      IF (clock'event AND (clock = '1')) THEN
290
         IF (reset = '1') THEN s_interpreter_state_reg <= IDLE;
291
         ELSIF (s_watchdog_timer_reg(11) = '1') THEN
292
            s_interpreter_state_reg <= SIGNAL_ERROR;
293
                                                ELSE
294
            s_interpreter_state_reg <= v_next_state;
295
         END IF;
296
      END IF;
297
   END PROCESS make_state_machine;
298
 
299
--------------------------------------------------------------------------------
300
--- Here the current field identifier is defined                             ---
301
--------------------------------------------------------------------------------
302
   make_field_id : PROCESS( clock , s_interpreter_state_reg , s_data_reg )
303
   BEGIN
304
      IF (clock'event AND (clock = '1')) THEN
305
         CASE (s_interpreter_state_reg) IS
306
            WHEN IDLE                  => s_current_field_reg <= FIELD_1;
307
            WHEN INIT_DUMMY_READ       => s_current_field_reg <= FIELD_2;
308
            WHEN UPDATE_FIELD_ID       => CASE (s_data_reg) IS
309
                                             WHEN X"61" => s_current_field_reg <= FIELD_3;
310
                                             WHEN X"62" => s_current_field_reg <= FIELD_4;
311
                                             WHEN X"63" => s_current_field_reg <= FIELD_5;
312
                                             WHEN X"64" => s_current_field_reg <= FIELD_6;
313
                                             WHEN X"65" => s_current_field_reg <= FIELD_7;
314
                                             WHEN OTHERS=> s_current_field_reg <= HEADER_ERROR;
315
                                          END CASE;
316
            WHEN OTHERS                => NULL;
317
         END CASE;
318
      END IF;
319
   END PROCESS make_field_id;
320
 
321
--------------------------------------------------------------------------------
322
--- Here the bitstream length reg is defined                                 ---
323
--------------------------------------------------------------------------------
324
   make_bitstream_length_reg : PROCESS( clock , s_interpreter_state_reg ,
325
                                        s_pop_a_byte , s_down_counter_reg ,
326
                                        pop_data )
327
   BEGIN
328
      IF (clock'event AND (clock = '1')) THEN
329
         IF (s_interpreter_state_reg = GET_B_LENGTH AND
330
             s_pop_a_byte = '1') THEN
331
            CASE (s_down_counter_reg(1 DOWNTO 0)) IS
332
               WHEN  "11"  => s_bitstream_length_reg( 31 DOWNTO 24 ) <= pop_data;
333
               WHEN  "10"  => s_bitstream_length_reg( 23 DOWNTO 16 ) <= pop_data;
334
               WHEN  "01"  => s_bitstream_length_reg( 15 DOWNTO  8 ) <= pop_data;
335
               WHEN OTHERS => s_bitstream_length_reg(  7 DOWNTO  0 ) <= pop_data;
336
            END CASE;
337
         END IF;
338
      END IF;
339
   END PROCESS make_bitstream_length_reg;
340
 
341
--------------------------------------------------------------------------------
342
--- Here the bitstream counter is defined                                    ---
343
--------------------------------------------------------------------------------
344
   s_bitstream_count_ena <= '1' WHEN (s_interpreter_state_reg = COPY_BITSTREAM OR
345
                                      s_interpreter_state_reg = EXECUTE_FLUSH_FIFO) AND
346
                                     s_pop_a_byte = '1' ELSE '0';
347
 
348
   s_bitstream_count_next <= unsigned(s_bitstream_count_reg) - 1;
349
 
350
   make_bitstream_count_reg : PROCESS( clock , s_interpreter_state_reg ,
351
                                       s_bitstream_count_ena ,
352
                                       s_bitstream_count_next )
353
      VARIABLE v_length : std_logic_vector( 32 DOWNTO 0 );
354
   BEGIN
355
      IF (clock'event AND (clock = '1')) THEN
356
         IF (s_interpreter_state_reg = GET_B_LENGTH AND
357
             s_pop_a_byte = '1') THEN
358
            CASE (s_down_counter_reg(1 DOWNTO 0)) IS
359
               WHEN  "11"  => s_bitstream_count_reg( 32 DOWNTO 24 ) <= "0"&pop_data;
360
               WHEN  "10"  => s_bitstream_count_reg( 23 DOWNTO 16 ) <= pop_data;
361
               WHEN  "01"  => s_bitstream_count_reg( 15 DOWNTO  8 ) <= pop_data;
362
               WHEN OTHERS => s_bitstream_count_reg(  7 DOWNTO  0 ) <= pop_data;
363
            END CASE;
364
         ELSIF (s_bitstream_count_ena = '1' OR
365
                s_interpreter_state_reg = CHECK_B_LENGTH) THEN
366
            s_bitstream_count_reg <= s_bitstream_count_next;
367
         END IF;
368
      END IF;
369
   END PROCESS make_bitstream_count_reg;
370
 
371
--------------------------------------------------------------------------------
372
--- Here the error reg is defined                                            ---
373
--------------------------------------------------------------------------------
374
   make_error_reg : PROCESS( clock , s_interpreter_state_reg )
375
   BEGIN
376
      IF (clock'event AND (clock = '1')) THEN
377
         IF (s_interpreter_state_reg = IDLE) THEN s_error_reg <= '0';
378
         ELSIF (s_interpreter_state_reg = SIGNAL_ERROR) THEN s_error_reg <= '1';
379
         END IF;
380
      END IF;
381
   END PROCESS make_error_reg;
382
 
383
--------------------------------------------------------------------------------
384
--- Here the watchdog timer is defined                                       ---
385
--------------------------------------------------------------------------------
386
   make_watchdog_timer_reg : PROCESS( clock , s_interpreter_state_reg ,
387
                                      s_pop_a_byte , s_watchdog_timer_reg )
388
   BEGIN
389
      IF (clock'event AND (clock = '1')) THEN
390
         IF (s_interpreter_state_reg = IDLE OR
391
             s_interpreter_state_reg = SIGNAL_ERROR OR
392
             s_pop_a_byte = '1') THEN
393
            s_watchdog_timer_reg <= (11=>'0' , OTHERS => '1');
394
         ELSIF (s_watchdog_timer_reg(11) = '0' AND
395
                msec_tick = '1') THEN
396
            s_watchdog_timer_reg <= unsigned(s_watchdog_timer_reg) - 1;
397
         END IF;
398
      END IF;
399
   END PROCESS make_watchdog_timer_reg;
400
 
401
--------------------------------------------------------------------------------
402
--- Here the bitstream size count reg is defined                             ---
403
--------------------------------------------------------------------------------
404
   make_bitstream_size_reg : PROCESS( clock , s_pop_a_byte ,
405
                                      s_interpreter_state_reg )
406
   BEGIN
407
      IF (clock'event AND (clock = '1')) THEN
408
         IF (s_interpreter_state_reg = IDLE) THEN
409
            s_bitstream_size_reg <= (OTHERS => '0');
410
         ELSIF (s_interpreter_state_reg /= COPY_BITSTREAM AND
411
                s_interpreter_state_reg /= FLUSH_FIFO AND
412
                s_pop_a_byte = '1') THEN
413
            s_bitstream_size_reg <= unsigned(s_bitstream_size_reg) + 1;
414
         ELSIF (s_interpreter_state_reg = CHECK_B_LENGTH) THEN
415
            s_bitstream_size_reg <= unsigned(s_bitstream_size_reg) +
416
                                    unsigned(s_bitstream_length_reg);
417
         END IF;
418
      END IF;
419
   END PROCESS make_bitstream_size_reg;
420
 
421
   make_write_flash_reg : PROCESS( clock , reset , start , write_flash )
422
   BEGIN
423
      IF (clock'event AND (clock = '1')) THEN
424
         IF (reset = '1') THEN s_write_flash_reg <= '0';
425
         ELSIF (start = '1') THEN s_write_flash_reg <= write_flash;
426
         END IF;
427
      END IF;
428
   END PROCESS make_write_flash_reg;
429
 
430
END no_platform_specific;

powered by: WebSVN 2.1.0

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